From 0ca3306429b048864c4a98b0e9f8480ef0363341 Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Fri, 23 Nov 2018 11:53:22 +0100 Subject: [PATCH 1/7] re-init dep because of error in systray package that seemed so outdated --- Gopkg.lock | 228 +- Gopkg.toml | 115 +- vendor/github.com/Sirupsen/logrus/.gitignore | 2 + vendor/github.com/Sirupsen/logrus/.travis.yml | 51 + .../github.com/Sirupsen/logrus/CHANGELOG.md | 165 + vendor/github.com/Sirupsen/logrus/README.md | 493 + .../github.com/Sirupsen/logrus/appveyor.yml | 14 + vendor/github.com/Sirupsen/logrus/entry.go | 118 +- vendor/github.com/Sirupsen/logrus/exported.go | 21 + .../github.com/Sirupsen/logrus/formatter.go | 18 +- vendor/github.com/Sirupsen/logrus/go.mod | 11 + vendor/github.com/Sirupsen/logrus/go.sum | 15 + .../Sirupsen/logrus/json_formatter.go | 13 +- vendor/github.com/Sirupsen/logrus/logger.go | 62 +- vendor/github.com/Sirupsen/logrus/logrus.go | 30 +- .../Sirupsen/logrus/text_formatter.go | 35 +- vendor/github.com/Sirupsen/logrus/writer.go | 2 + vendor/github.com/blang/semver/.travis.yml | 21 + vendor/github.com/blang/semver/README.md | 194 + vendor/github.com/blang/semver/package.json | 17 + vendor/github.com/creack/goselect/.gitignore | 29 + vendor/github.com/creack/goselect/Dockerfile | 5 + vendor/github.com/creack/goselect/README.md | 30 + .../creack/goselect/test_crosscompile.sh | 17 + .../github.com/davidmz/go-pageant/README.md | 9 + .../github.com/getlantern/context/.travis.yml | 15 + .../github.com/getlantern/context/README.md | 6 + .../github.com/getlantern/context/context.go | 29 +- .../github.com/getlantern/golog/.travis.yml | 14 + vendor/github.com/getlantern/golog/README.md | 6 + .../github.com/getlantern/systray/.gitignore | 11 + .../github.com/getlantern/systray/README.md | 50 + .../getlantern/systray/systray_darwin.m | 8 + vendor/github.com/gin-contrib/sse/.travis.yml | 15 + vendor/github.com/gin-contrib/sse/README.md | 58 + vendor/github.com/gin-gonic/gin/.gitignore | 5 + vendor/github.com/gin-gonic/gin/.travis.yml | 35 + vendor/github.com/gin-gonic/gin/BENCHMARKS.md | 604 + vendor/github.com/gin-gonic/gin/CHANGELOG.md | 213 + .../gin-gonic/gin/CODE_OF_CONDUCT.md | 46 + .../github.com/gin-gonic/gin/CONTRIBUTING.md | 13 + vendor/github.com/gin-gonic/gin/Makefile | 62 + vendor/github.com/gin-gonic/gin/README.md | 1820 + vendor/github.com/gin-gonic/gin/codecov.yml | 5 + vendor/github.com/gin-gonic/gin/coverage.sh | 13 + vendor/github.com/gin-gonic/gin/wercker.yml | 1 + vendor/github.com/go-ini/ini/.gitignore | 6 + vendor/github.com/go-ini/ini/.travis.yml | 17 + vendor/github.com/go-ini/ini/Makefile | 15 + vendor/github.com/go-ini/ini/README.md | 46 + vendor/github.com/go-ole/go-ole/.travis.yml | 9 + vendor/github.com/go-ole/go-ole/ChangeLog.md | 49 + vendor/github.com/go-ole/go-ole/README.md | 46 + vendor/github.com/go-ole/go-ole/appveyor.yml | 54 + vendor/github.com/go-stack/stack/.travis.yml | 15 + vendor/github.com/go-stack/stack/README.md | 38 + vendor/github.com/go-stack/stack/go.mod | 1 + vendor/github.com/golang/protobuf/LICENSE | 3 + .../github.com/golang/protobuf/proto/Makefile | 43 + .../github.com/golang/protobuf/proto/clone.go | 46 +- .../golang/protobuf/proto/decode.go | 668 +- .../golang/protobuf/proto/discard.go | 350 - .../golang/protobuf/proto/encode.go | 1207 +- .../github.com/golang/protobuf/proto/equal.go | 30 +- .../golang/protobuf/proto/extensions.go | 204 +- .../github.com/golang/protobuf/proto/lib.go | 128 +- .../golang/protobuf/proto/message_set.go | 81 +- .../golang/protobuf/proto/pointer_reflect.go | 595 +- .../golang/protobuf/proto/pointer_unsafe.go | 366 +- .../golang/protobuf/proto/properties.go | 442 +- .../golang/protobuf/proto/table_marshal.go | 2767 - .../golang/protobuf/proto/table_merge.go | 654 - .../golang/protobuf/proto/table_unmarshal.go | 2051 - .../github.com/golang/protobuf/proto/text.go | 65 +- .../golang/protobuf/proto/text_parser.go | 81 +- .../googollee/go-engine.io/.travis.yml | 7 + .../googollee/go-engine.io/README.md | 78 + .../googollee/go-socket.io/.gitignore | 4 + .../googollee/go-socket.io/.travis.yml | 7 + .../googollee/go-socket.io/README.md | 127 + .../github.com/gorilla/websocket/.gitignore | 25 + .../github.com/gorilla/websocket/.travis.yml | 19 + vendor/github.com/gorilla/websocket/README.md | 64 + .../github.com/itsjamie/gin-cors/.gitignore | 24 + .../github.com/itsjamie/gin-cors/.travis.yml | 10 + vendor/github.com/itsjamie/gin-cors/README.md | 50 + .../github.com/json-iterator/go/.codecov.yml | 3 + vendor/github.com/json-iterator/go/.gitignore | 3 + .../github.com/json-iterator/go/.travis.yml | 13 + vendor/github.com/json-iterator/go/README.md | 80 + vendor/github.com/json-iterator/go/config.go | 375 - .../go/{adapter.go => feature_adapter.go} | 55 +- .../go/{any.go => feature_any.go} | 85 +- .../go/{any_array.go => feature_any_array.go} | 0 .../go/{any_bool.go => feature_any_bool.go} | 0 .../go/{any_float.go => feature_any_float.go} | 0 .../go/{any_int32.go => feature_any_int32.go} | 0 .../go/{any_int64.go => feature_any_int64.go} | 0 ...{any_invalid.go => feature_any_invalid.go} | 0 .../go/{any_nil.go => feature_any_nil.go} | 0 .../{any_number.go => feature_any_number.go} | 37 +- .../{any_object.go => feature_any_object.go} | 0 .../go/{any_str.go => feature_any_string.go} | 2 +- .../{any_uint32.go => feature_any_uint32.go} | 0 .../{any_uint64.go => feature_any_uint64.go} | 0 .../json-iterator/go/feature_config.go | 312 + .../go/{iter.go => feature_iter.go} | 23 +- .../{iter_array.go => feature_iter_array.go} | 6 +- .../{iter_float.go => feature_iter_float.go} | 6 - .../go/{iter_int.go => feature_iter_int.go} | 87 - ...{iter_object.go => feature_iter_object.go} | 125 +- .../go/{iter_skip.go => feature_iter_skip.go} | 6 +- ..._sloppy.go => feature_iter_skip_sloppy.go} | 2 +- ..._strict.go => feature_iter_skip_strict.go} | 4 +- .../{iter_str.go => feature_iter_string.go} | 10 +- .../json-iterator/go/feature_json_number.go | 15 + .../go/{pool.go => feature_pool.go} | 37 +- .../json-iterator/go/feature_reflect.go | 691 + .../json-iterator/go/feature_reflect_array.go | 99 + ...ension.go => feature_reflect_extension.go} | 298 +- .../json-iterator/go/feature_reflect_map.go | 244 + .../go/feature_reflect_native.go | 672 + ...t_encoder.go => feature_reflect_object.go} | 158 +- .../json-iterator/go/feature_reflect_slice.go | 149 + ...r.go => feature_reflect_struct_decoder.go} | 528 +- .../go/{stream.go => feature_stream.go} | 168 +- ...tream_float.go => feature_stream_float.go} | 14 +- .../json-iterator/go/feature_stream_int.go | 320 + ...stream_str.go => feature_stream_string.go} | 40 +- .../go/fuzzy_mode_convert_table.md | 7 + vendor/github.com/json-iterator/go/reflect.go | 332 - .../json-iterator/go/reflect_array.go | 104 - .../json-iterator/go/reflect_dynamic.go | 70 - .../json-iterator/go/reflect_json_number.go | 112 - .../go/reflect_json_raw_message.go | 60 - .../json-iterator/go/reflect_map.go | 326 - .../json-iterator/go/reflect_marshaler.go | 218 - .../json-iterator/go/reflect_native.go | 451 - .../json-iterator/go/reflect_optional.go | 133 - .../json-iterator/go/reflect_slice.go | 99 - .../go/skip_tests/array/skip_test.go | 1 + .../go/skip_tests/object/skip_test.go | 1 + .../go/skip_tests/string/skip_test.go | 1 + .../github.com/json-iterator/go/stream_int.go | 190 - vendor/github.com/json-iterator/go/test.sh | 12 + vendor/github.com/kardianos/osext/README.md | 21 + .../go-windows-terminal-sequences/README.md | 40 + .../go-windows-terminal-sequences/go.mod | 1 + vendor/github.com/kr/binarydist/.gitignore | 1 + vendor/github.com/kr/binarydist/Readme.md | 7 + vendor/github.com/kr/binarydist/go.mod | 1 + vendor/github.com/kr/fs/Readme | 3 + vendor/github.com/kr/fs/go.mod | 1 + vendor/github.com/mattn/go-isatty/.travis.yml | 9 + vendor/github.com/mattn/go-isatty/README.md | 50 + .../mattn/go-isatty/isatty_linux.go | 2 +- .../mattn/go-isatty/isatty_linux_ppc64x.go | 19 - .../mattn/go-isatty/isatty_others.go | 2 +- .../mattn/go-shellwords/.travis.yml | 8 + .../github.com/mattn/go-shellwords/README.md | 47 + vendor/github.com/miekg/dns/.codecov.yml | 8 + vendor/github.com/miekg/dns/.gitignore | 4 + vendor/github.com/miekg/dns/.travis.yml | 18 + vendor/github.com/miekg/dns/Gopkg.lock | 57 + vendor/github.com/miekg/dns/Gopkg.toml | 38 + vendor/github.com/miekg/dns/Makefile.fuzz | 33 + vendor/github.com/miekg/dns/Makefile.release | 52 + vendor/github.com/miekg/dns/README.md | 172 + vendor/github.com/miekg/dns/client.go | 83 +- vendor/github.com/miekg/dns/server.go | 34 +- vendor/github.com/miekg/dns/version.go | 2 +- .../github.com/mitchellh/go-homedir/README.md | 14 + vendor/github.com/mitchellh/go-homedir/go.mod | 1 + .../github.com/modern-go/concurrent/LICENSE | 201 - .../modern-go/concurrent/executor.go | 14 - .../modern-go/concurrent/go_above_19.go | 15 - .../modern-go/concurrent/go_below_19.go | 33 - vendor/github.com/modern-go/concurrent/log.go | 13 - .../concurrent/unbounded_executor.go | 119 - vendor/github.com/modern-go/reflect2/LICENSE | 201 - .../modern-go/reflect2/go_above_17.go | 8 - .../modern-go/reflect2/go_above_19.go | 14 - .../modern-go/reflect2/go_below_17.go | 9 - .../modern-go/reflect2/go_below_19.go | 14 - .../github.com/modern-go/reflect2/reflect2.go | 298 - .../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 | 103 - .../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 | 70 - .../modern-go/reflect2/unsafe_map.go | 138 - .../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 - .../github.com/oleksandr/bonjour/.gitignore | 24 + vendor/github.com/oleksandr/bonjour/README.md | 165 + vendor/github.com/oxtoacart/bpool/README.md | 65 + vendor/github.com/pkg/errors/.gitignore | 24 + vendor/github.com/pkg/errors/.travis.yml | 11 + vendor/github.com/pkg/errors/README.md | 52 + vendor/github.com/pkg/errors/appveyor.yml | 32 + vendor/github.com/pkg/sftp/.gitignore | 7 + vendor/github.com/pkg/sftp/.travis.yml | 38 + vendor/github.com/pkg/sftp/README.md | 44 + vendor/github.com/pkg/sftp/request-readme.md | 53 + .../github.com/sfreiberg/simplessh/README.md | 47 + vendor/github.com/ugorji/go/codec/0doc.go | 173 +- vendor/github.com/ugorji/go/codec/README.md | 148 + vendor/github.com/ugorji/go/codec/binc.go | 447 +- vendor/github.com/ugorji/go/codec/cbor.go | 350 +- vendor/github.com/ugorji/go/codec/decode.go | 2670 +- .../github.com/ugorji/go/codec/decode_go.go | 16 + .../github.com/ugorji/go/codec/decode_go14.go | 14 + vendor/github.com/ugorji/go/codec/encode.go | 1648 +- .../ugorji/go/codec/fast-path.generated.go | 49680 +++++++++------- .../ugorji/go/codec/fast-path.go.tmpl | 527 + .../ugorji/go/codec/fast-path.not.go | 17 +- .../ugorji/go/codec/gen-dec-array.go.tmpl | 104 + .../ugorji/go/codec/gen-dec-map.go.tmpl | 58 + .../ugorji/go/codec/gen-helper.generated.go | 210 +- .../ugorji/go/codec/gen-helper.go.tmpl | 372 + .../ugorji/go/codec/gen.generated.go | 181 +- vendor/github.com/ugorji/go/codec/gen.go | 1151 +- vendor/github.com/ugorji/go/codec/gen_15.go | 12 + vendor/github.com/ugorji/go/codec/gen_16.go | 12 + ...goversion_vendor_gte_go17.go => gen_17.go} | 6 +- .../go/codec/goversion_arrayof_gte_go15.go | 14 - .../go/codec/goversion_arrayof_lt_go15.go | 14 - .../go/codec/goversion_makemap_gte_go19.go | 15 - .../go/codec/goversion_makemap_lt_go19.go | 12 - ...version_unexportedembeddedptr_gte_go110.go | 8 - ...oversion_unexportedembeddedptr_lt_go110.go | 8 - .../go/codec/goversion_unsupported_lt_go14.go | 17 - .../go/codec/goversion_vendor_eq_go15.go | 10 - .../go/codec/goversion_vendor_eq_go16.go | 10 - .../go/codec/goversion_vendor_lt_go15.go | 8 - vendor/github.com/ugorji/go/codec/helper.go | 2014 +- .../ugorji/go/codec/helper_internal.go | 139 +- .../ugorji/go/codec/helper_not_unsafe.go | 256 +- .../ugorji/go/codec/helper_unsafe.go | 622 +- vendor/github.com/ugorji/go/codec/json.go | 1748 +- vendor/github.com/ugorji/go/codec/msgpack.go | 462 +- vendor/github.com/ugorji/go/codec/noop.go | 213 + vendor/github.com/ugorji/go/codec/prebuild.go | 3 + vendor/github.com/ugorji/go/codec/prebuild.sh | 199 + vendor/github.com/ugorji/go/codec/rpc.go | 200 +- vendor/github.com/ugorji/go/codec/simple.go | 272 +- .../ugorji/go/codec/test-cbor-goldens.json | 639 + vendor/github.com/ugorji/go/codec/test.py | 126 + vendor/github.com/ugorji/go/codec/tests.sh | 107 + vendor/github.com/ugorji/go/codec/time.go | 233 + vendor/github.com/ugorji/go/codec/xml.go | 508 - vendor/github.com/xrash/smetrics/.travis.yml | 8 + .../github.com/xrash/smetrics/InfCont85.PDF | Bin 0 -> 1989666 bytes vendor/github.com/xrash/smetrics/README.md | 120 + vendor/go.bug.st/serial.v1/.travis.yml | 70 + vendor/go.bug.st/serial.v1/README.md | 35 + vendor/golang.org/x/crypto/ssh/server.go | 1 + .../golang.org/x/net/internal/socket/empty.s | 7 + .../net/internal/socket/sys_go1_11_darwin.go | 33 + .../net/internal/socket/sys_go1_12_darwin.go | 42 + .../x/net/internal/socket/sys_posix.go | 36 +- .../x/net/internal/socket/sys_unix.go | 2 +- vendor/golang.org/x/net/ipv4/doc.go | 3 +- vendor/golang.org/x/net/ipv4/payload_cmsg.go | 2 +- .../x/net/ipv4/payload_cmsg_go1_8.go | 2 +- .../x/net/ipv4/payload_cmsg_go1_9.go | 2 +- .../golang.org/x/net/ipv4/payload_nocmsg.go | 2 +- vendor/golang.org/x/net/ipv6/doc.go | 3 +- vendor/golang.org/x/net/ipv6/payload_cmsg.go | 2 +- .../x/net/ipv6/payload_cmsg_go1_8.go | 2 +- .../x/net/ipv6/payload_cmsg_go1_9.go | 2 +- .../golang.org/x/net/ipv6/payload_nocmsg.go | 2 +- vendor/golang.org/x/sys/unix/.gitignore | 2 + vendor/golang.org/x/sys/unix/README.md | 173 + .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 12 - vendor/golang.org/x/sys/unix/mkall.sh | 204 + vendor/golang.org/x/sys/unix/mkerrors.sh | 658 + vendor/golang.org/x/sys/unix/mkpost.go | 8 + vendor/golang.org/x/sys/unix/mksyscall.pl | 341 + .../x/sys/unix/mksyscall_aix_ppc.pl | 384 + .../x/sys/unix/mksyscall_aix_ppc64.pl | 579 + .../x/sys/unix/mksyscall_solaris.pl | 294 + .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 265 + .../golang.org/x/sys/unix/mksysnum_darwin.pl | 39 + .../x/sys/unix/mksysnum_dragonfly.pl | 50 + .../golang.org/x/sys/unix/mksysnum_freebsd.pl | 50 + .../golang.org/x/sys/unix/mksysnum_netbsd.pl | 58 + .../golang.org/x/sys/unix/mksysnum_openbsd.pl | 50 + vendor/golang.org/x/sys/unix/syscall_linux.go | 72 + .../golang.org/x/sys/unix/syscall_netbsd.go | 8 + .../golang.org/x/sys/unix/syscall_unix_gc.go | 2 +- .../x/sys/unix/syscall_unix_gc_ppc64x.go | 24 + vendor/golang.org/x/sys/unix/types_freebsd.go | 2 +- vendor/golang.org/x/sys/unix/types_netbsd.go | 2 + .../x/sys/unix/zerrors_linux_386.go | 34 + .../x/sys/unix/zerrors_linux_amd64.go | 34 + .../x/sys/unix/zerrors_linux_arm.go | 34 + .../x/sys/unix/zerrors_linux_arm64.go | 34 + .../x/sys/unix/zerrors_linux_mips.go | 34 + .../x/sys/unix/zerrors_linux_mips64.go | 34 + .../x/sys/unix/zerrors_linux_mips64le.go | 34 + .../x/sys/unix/zerrors_linux_mipsle.go | 34 + .../x/sys/unix/zerrors_linux_ppc64.go | 34 + .../x/sys/unix/zerrors_linux_ppc64le.go | 34 + .../x/sys/unix/zerrors_linux_riscv64.go | 34 + .../x/sys/unix/zerrors_linux_s390x.go | 34 + .../x/sys/unix/ztypes_freebsd_386.go | 2 +- .../x/sys/unix/ztypes_freebsd_amd64.go | 2 +- .../x/sys/unix/ztypes_freebsd_arm.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 3 + .../x/sys/unix/ztypes_linux_amd64.go | 3 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 3 + .../x/sys/unix/ztypes_linux_arm64.go | 3 + .../x/sys/unix/ztypes_linux_mips.go | 3 + .../x/sys/unix/ztypes_linux_mips64.go | 3 + .../x/sys/unix/ztypes_linux_mips64le.go | 3 + .../x/sys/unix/ztypes_linux_mipsle.go | 3 + .../x/sys/unix/ztypes_linux_ppc64.go | 3 + .../x/sys/unix/ztypes_linux_ppc64le.go | 3 + .../x/sys/unix/ztypes_linux_riscv64.go | 3 + .../x/sys/unix/ztypes_linux_s390x.go | 3 + .../x/sys/unix/ztypes_netbsd_386.go | 7 + .../x/sys/unix/ztypes_netbsd_amd64.go | 7 + .../x/sys/unix/ztypes_netbsd_arm.go | 7 + .../go-playground/validator.v8/.gitignore | 29 + .../go-playground/validator.v8/README.md | 367 + .../go-playground/validator.v8/logo.png | Bin 0 -> 13443 bytes .../inconshreveable/go-update.v0/README.md | 37 + vendor/gopkg.in/yaml.v2/.travis.yml | 9 + vendor/gopkg.in/yaml.v2/LICENSE | 208 +- vendor/gopkg.in/yaml.v2/NOTICE | 13 - vendor/gopkg.in/yaml.v2/README.md | 131 + vendor/gopkg.in/yaml.v2/apic.go | 55 +- vendor/gopkg.in/yaml.v2/decode.go | 246 +- vendor/gopkg.in/yaml.v2/emitterc.go | 20 +- vendor/gopkg.in/yaml.v2/encode.go | 136 +- vendor/gopkg.in/yaml.v2/parserc.go | 1 + vendor/gopkg.in/yaml.v2/readerc.go | 20 +- vendor/gopkg.in/yaml.v2/resolve.go | 91 +- vendor/gopkg.in/yaml.v2/scannerc.go | 40 +- vendor/gopkg.in/yaml.v2/sorter.go | 9 - vendor/gopkg.in/yaml.v2/writerc.go | 65 +- vendor/gopkg.in/yaml.v2/yaml.go | 136 +- vendor/gopkg.in/yaml.v2/yamlh.go | 32 +- 362 files changed, 52211 insertions(+), 44788 deletions(-) create mode 100644 vendor/github.com/Sirupsen/logrus/.gitignore create mode 100644 vendor/github.com/Sirupsen/logrus/.travis.yml create mode 100644 vendor/github.com/Sirupsen/logrus/CHANGELOG.md create mode 100644 vendor/github.com/Sirupsen/logrus/README.md create mode 100644 vendor/github.com/Sirupsen/logrus/appveyor.yml create mode 100644 vendor/github.com/Sirupsen/logrus/go.mod create mode 100644 vendor/github.com/Sirupsen/logrus/go.sum create mode 100644 vendor/github.com/blang/semver/.travis.yml create mode 100644 vendor/github.com/blang/semver/README.md create mode 100644 vendor/github.com/blang/semver/package.json create mode 100644 vendor/github.com/creack/goselect/.gitignore create mode 100644 vendor/github.com/creack/goselect/Dockerfile create mode 100644 vendor/github.com/creack/goselect/README.md create mode 100755 vendor/github.com/creack/goselect/test_crosscompile.sh create mode 100644 vendor/github.com/davidmz/go-pageant/README.md create mode 100644 vendor/github.com/getlantern/context/.travis.yml create mode 100644 vendor/github.com/getlantern/context/README.md create mode 100644 vendor/github.com/getlantern/golog/.travis.yml create mode 100644 vendor/github.com/getlantern/golog/README.md create mode 100644 vendor/github.com/getlantern/systray/.gitignore create mode 100644 vendor/github.com/getlantern/systray/README.md create mode 100644 vendor/github.com/gin-contrib/sse/.travis.yml create mode 100644 vendor/github.com/gin-contrib/sse/README.md create mode 100644 vendor/github.com/gin-gonic/gin/.gitignore create mode 100644 vendor/github.com/gin-gonic/gin/.travis.yml 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/Makefile create mode 100644 vendor/github.com/gin-gonic/gin/README.md create mode 100644 vendor/github.com/gin-gonic/gin/codecov.yml create mode 100644 vendor/github.com/gin-gonic/gin/coverage.sh create mode 100644 vendor/github.com/gin-gonic/gin/wercker.yml create mode 100644 vendor/github.com/go-ini/ini/.gitignore create mode 100644 vendor/github.com/go-ini/ini/.travis.yml create mode 100644 vendor/github.com/go-ini/ini/Makefile create mode 100644 vendor/github.com/go-ini/ini/README.md create mode 100644 vendor/github.com/go-ole/go-ole/.travis.yml create mode 100644 vendor/github.com/go-ole/go-ole/ChangeLog.md create mode 100644 vendor/github.com/go-ole/go-ole/README.md create mode 100644 vendor/github.com/go-ole/go-ole/appveyor.yml create mode 100644 vendor/github.com/go-stack/stack/.travis.yml create mode 100644 vendor/github.com/go-stack/stack/README.md create mode 100644 vendor/github.com/go-stack/stack/go.mod create mode 100644 vendor/github.com/golang/protobuf/proto/Makefile delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_marshal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_merge.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/googollee/go-engine.io/.travis.yml create mode 100644 vendor/github.com/googollee/go-engine.io/README.md create mode 100644 vendor/github.com/googollee/go-socket.io/.gitignore create mode 100644 vendor/github.com/googollee/go-socket.io/.travis.yml create mode 100644 vendor/github.com/googollee/go-socket.io/README.md create mode 100644 vendor/github.com/gorilla/websocket/.gitignore create mode 100644 vendor/github.com/gorilla/websocket/.travis.yml create mode 100644 vendor/github.com/gorilla/websocket/README.md create mode 100644 vendor/github.com/itsjamie/gin-cors/.gitignore create mode 100644 vendor/github.com/itsjamie/gin-cors/.travis.yml create mode 100644 vendor/github.com/itsjamie/gin-cors/README.md 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/README.md delete mode 100644 vendor/github.com/json-iterator/go/config.go rename vendor/github.com/json-iterator/go/{adapter.go => feature_adapter.go} (70%) rename vendor/github.com/json-iterator/go/{any.go => feature_any.go} (74%) rename vendor/github.com/json-iterator/go/{any_array.go => feature_any_array.go} (100%) rename vendor/github.com/json-iterator/go/{any_bool.go => feature_any_bool.go} (100%) rename vendor/github.com/json-iterator/go/{any_float.go => feature_any_float.go} (100%) rename vendor/github.com/json-iterator/go/{any_int32.go => feature_any_int32.go} (100%) rename vendor/github.com/json-iterator/go/{any_int64.go => feature_any_int64.go} (100%) rename vendor/github.com/json-iterator/go/{any_invalid.go => feature_any_invalid.go} (100%) rename vendor/github.com/json-iterator/go/{any_nil.go => feature_any_nil.go} (100%) rename vendor/github.com/json-iterator/go/{any_number.go => feature_any_number.go} (76%) rename vendor/github.com/json-iterator/go/{any_object.go => feature_any_object.go} (100%) rename vendor/github.com/json-iterator/go/{any_str.go => feature_any_string.go} (97%) rename vendor/github.com/json-iterator/go/{any_uint32.go => feature_any_uint32.go} (100%) rename vendor/github.com/json-iterator/go/{any_uint64.go => feature_any_uint64.go} (100%) create mode 100644 vendor/github.com/json-iterator/go/feature_config.go rename vendor/github.com/json-iterator/go/{iter.go => feature_iter.go} (89%) rename vendor/github.com/json-iterator/go/{iter_array.go => feature_iter_array.go} (84%) rename vendor/github.com/json-iterator/go/{iter_float.go => feature_iter_float.go} (98%) rename vendor/github.com/json-iterator/go/{iter_int.go => feature_iter_int.go} (72%) rename vendor/github.com/json-iterator/go/{iter_object.go => feature_iter_object.go} (53%) rename vendor/github.com/json-iterator/go/{iter_skip.go => feature_iter_skip.go} (95%) rename vendor/github.com/json-iterator/go/{iter_skip_sloppy.go => feature_iter_skip_sloppy.go} (99%) rename vendor/github.com/json-iterator/go/{iter_skip_strict.go => feature_iter_skip_strict.go} (96%) rename vendor/github.com/json-iterator/go/{iter_str.go => feature_iter_string.go} (92%) create mode 100644 vendor/github.com/json-iterator/go/feature_json_number.go rename vendor/github.com/json-iterator/go/{pool.go => feature_pool.go} (62%) create mode 100644 vendor/github.com/json-iterator/go/feature_reflect.go create mode 100644 vendor/github.com/json-iterator/go/feature_reflect_array.go rename vendor/github.com/json-iterator/go/{reflect_extension.go => feature_reflect_extension.go} (53%) create mode 100644 vendor/github.com/json-iterator/go/feature_reflect_map.go create mode 100644 vendor/github.com/json-iterator/go/feature_reflect_native.go rename vendor/github.com/json-iterator/go/{reflect_struct_encoder.go => feature_reflect_object.go} (50%) create mode 100644 vendor/github.com/json-iterator/go/feature_reflect_slice.go rename vendor/github.com/json-iterator/go/{reflect_struct_decoder.go => feature_reflect_struct_decoder.go} (65%) rename vendor/github.com/json-iterator/go/{stream.go => feature_stream.go} (60%) rename vendor/github.com/json-iterator/go/{stream_float.go => feature_stream_float.go} (85%) create mode 100644 vendor/github.com/json-iterator/go/feature_stream_int.go rename vendor/github.com/json-iterator/go/{stream_str.go => feature_stream_string.go} (91%) create mode 100644 vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md delete mode 100644 vendor/github.com/json-iterator/go/reflect.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_array.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_map.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_native.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go create mode 120000 vendor/github.com/json-iterator/go/skip_tests/array/skip_test.go create mode 120000 vendor/github.com/json-iterator/go/skip_tests/object/skip_test.go create mode 120000 vendor/github.com/json-iterator/go/skip_tests/string/skip_test.go delete mode 100644 vendor/github.com/json-iterator/go/stream_int.go create mode 100755 vendor/github.com/json-iterator/go/test.sh create mode 100644 vendor/github.com/kardianos/osext/README.md create mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/README.md create mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod create mode 100644 vendor/github.com/kr/binarydist/.gitignore create mode 100644 vendor/github.com/kr/binarydist/Readme.md create mode 100644 vendor/github.com/kr/binarydist/go.mod create mode 100644 vendor/github.com/kr/fs/Readme create mode 100644 vendor/github.com/kr/fs/go.mod create mode 100644 vendor/github.com/mattn/go-isatty/.travis.yml create mode 100644 vendor/github.com/mattn/go-isatty/README.md delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go create mode 100644 vendor/github.com/mattn/go-shellwords/.travis.yml create mode 100644 vendor/github.com/mattn/go-shellwords/README.md create mode 100644 vendor/github.com/miekg/dns/.codecov.yml create mode 100644 vendor/github.com/miekg/dns/.gitignore create mode 100644 vendor/github.com/miekg/dns/.travis.yml create mode 100644 vendor/github.com/miekg/dns/Gopkg.lock create mode 100644 vendor/github.com/miekg/dns/Gopkg.toml create mode 100644 vendor/github.com/miekg/dns/Makefile.fuzz create mode 100644 vendor/github.com/miekg/dns/Makefile.release create mode 100644 vendor/github.com/miekg/dns/README.md create mode 100644 vendor/github.com/mitchellh/go-homedir/README.md create mode 100644 vendor/github.com/mitchellh/go-homedir/go.mod delete mode 100644 vendor/github.com/modern-go/concurrent/LICENSE delete mode 100644 vendor/github.com/modern-go/concurrent/executor.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/log.go delete mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go delete mode 100644 vendor/github.com/modern-go/reflect2/LICENSE delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s delete mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go delete mode 100644 vendor/github.com/modern-go/reflect2/type_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go create mode 100644 vendor/github.com/oleksandr/bonjour/.gitignore create mode 100644 vendor/github.com/oleksandr/bonjour/README.md create mode 100644 vendor/github.com/oxtoacart/bpool/README.md create mode 100644 vendor/github.com/pkg/errors/.gitignore create mode 100644 vendor/github.com/pkg/errors/.travis.yml create mode 100644 vendor/github.com/pkg/errors/README.md create mode 100644 vendor/github.com/pkg/errors/appveyor.yml create mode 100644 vendor/github.com/pkg/sftp/.gitignore create mode 100644 vendor/github.com/pkg/sftp/.travis.yml create mode 100644 vendor/github.com/pkg/sftp/README.md create mode 100644 vendor/github.com/pkg/sftp/request-readme.md create mode 100644 vendor/github.com/sfreiberg/simplessh/README.md create mode 100644 vendor/github.com/ugorji/go/codec/README.md create mode 100644 vendor/github.com/ugorji/go/codec/decode_go.go create mode 100644 vendor/github.com/ugorji/go/codec/decode_go14.go create mode 100644 vendor/github.com/ugorji/go/codec/fast-path.go.tmpl 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-helper.go.tmpl create mode 100644 vendor/github.com/ugorji/go/codec/gen_15.go create mode 100644 vendor/github.com/ugorji/go/codec/gen_16.go rename vendor/github.com/ugorji/go/codec/{goversion_vendor_gte_go17.go => gen_17.go} (53%) delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go delete mode 100644 vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go create mode 100644 vendor/github.com/ugorji/go/codec/noop.go create mode 100644 vendor/github.com/ugorji/go/codec/prebuild.go create mode 100755 vendor/github.com/ugorji/go/codec/prebuild.sh create mode 100644 vendor/github.com/ugorji/go/codec/test-cbor-goldens.json create mode 100755 vendor/github.com/ugorji/go/codec/test.py create mode 100755 vendor/github.com/ugorji/go/codec/tests.sh create mode 100644 vendor/github.com/ugorji/go/codec/time.go delete mode 100644 vendor/github.com/ugorji/go/codec/xml.go create mode 100644 vendor/github.com/xrash/smetrics/.travis.yml create mode 100644 vendor/github.com/xrash/smetrics/InfCont85.PDF create mode 100644 vendor/github.com/xrash/smetrics/README.md create mode 100644 vendor/go.bug.st/serial.v1/.travis.yml create mode 100644 vendor/go.bug.st/serial.v1/README.md create mode 100644 vendor/golang.org/x/net/internal/socket/empty.s create mode 100644 vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go create mode 100644 vendor/golang.org/x/net/internal/socket/sys_go1_12_darwin.go create mode 100644 vendor/golang.org/x/sys/unix/.gitignore create mode 100644 vendor/golang.org/x/sys/unix/README.md create mode 100755 vendor/golang.org/x/sys/unix/mkall.sh create mode 100755 vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100755 vendor/golang.org/x/sys/unix/mksyscall.pl create mode 100755 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.pl create mode 100755 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.pl create mode 100755 vendor/golang.org/x/sys/unix/mksyscall_solaris.pl create mode 100755 vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl create mode 100755 vendor/golang.org/x/sys/unix/mksysnum_darwin.pl create mode 100755 vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl create mode 100755 vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl create mode 100755 vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl create mode 100755 vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl create mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go create mode 100644 vendor/gopkg.in/go-playground/validator.v8/.gitignore create mode 100644 vendor/gopkg.in/go-playground/validator.v8/README.md create mode 100644 vendor/gopkg.in/go-playground/validator.v8/logo.png create mode 100644 vendor/gopkg.in/inconshreveable/go-update.v0/README.md create mode 100644 vendor/gopkg.in/yaml.v2/.travis.yml delete mode 100644 vendor/gopkg.in/yaml.v2/NOTICE create mode 100644 vendor/gopkg.in/yaml.v2/README.md diff --git a/Gopkg.lock b/Gopkg.lock index 02553eca6..877378d5b 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,59 +2,59 @@ [[projects]] - digest = "1:ecf78eacf406c42f07f66d6b79fda24d2b92dc711bfd0760d0c931678f9621fe" + digest = "1:69b1cc331fca23d702bd72f860c6a647afd0aa9fcbc1d0659b1365e26546dd70" name = "github.com/Sirupsen/logrus" packages = ["."] - pruneopts = "NUT" - revision = "ad15b42461921f1fb3529b058c6786c6a45d5162" - version = "v1.1.1" + pruneopts = "UT" + revision = "bcd833dfe83d3cebad139e4a29ed79cb2318bf95" + version = "v1.2.0" [[projects]] - digest = "1:aba270497eb2d49f5cba6f4162d524b9a1195a24cbce8be20bf56a0051f47deb" + digest = "1:705c40022f5c03bf96ffeb6477858d88565064485a513abcd0f11a0911546cb6" name = "github.com/blang/semver" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "2ee87856327ba09384cabd113bc6b5d174e9ec0f" version = "v3.5.1" [[projects]] branch = "master" - digest = "1:dd9ac3f14c49f44e3921aeafa38653e04ae44e219eebc6e0757c04e19098ca40" + digest = "1:210dd3b6f30ebc5ff2e0b4795b5141ee4578c29b38df0326fb140863d45c01fa" name = "github.com/creack/goselect" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "58854f77ee8d858ce751b0a9bcc5533fef7bfa9e" [[projects]] - digest = "1:d57500f681aba6bbb064c4b885995fd2e3521a7b9ef05f19feedd3b8e72a020e" + digest = "1:ce303e1d83a733bda89c5bad61fcf7e86b9f68b97bf783509192090ddd3919cb" name = "github.com/davidmz/go-pageant" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "30ad2d03e9fe97a029a6a6dc87bff319e0bb6bc4" version = "v1.0.1" [[projects]] branch = "master" - digest = "1:9a8c267811e3b6fae377040b8bf050fcee59fdb8cade14ad3f929d924e08093d" + digest = "1:c3c09c0f941175181747b2d6948fd1add3ba82e66215aae78ec9b44d97d8ed40" name = "github.com/getlantern/context" packages = ["."] - pruneopts = "NUT" - revision = "624d99b1798d7c5375ea1d3ca4c5b04d58f7c775" + pruneopts = "UT" + revision = "539649cc311886ee3604204cfab46f72b5f40950" [[projects]] branch = "master" digest = "1:56460acc7affba18fa344130886a6f841988d1368a051759d2e0c03ef6255f54" name = "github.com/getlantern/errors" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "e24b7f4ff7c70be59bbefca6b7695d68cda8b399" [[projects]] branch = "master" - digest = "1:785bb882679010d1fe5b6b456f3e28b16d54e8418e33cd769e3322c49c47a2e8" + digest = "1:128515bf48085482f3b1269701a0be1b119087447d8f666a27211bdacf0b5dc9" name = "github.com/getlantern/golog" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "cca714f7feb5df8e455f409b549d384441ac4578" [[projects]] @@ -62,7 +62,7 @@ digest = "1:f12c7103ba4c446c6822f331ada3e5f0c3626be111a115e92700cd2724bca9ed" name = "github.com/getlantern/hex" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "083fba3033ad473db3dd31c9bb368473d37581a7" [[projects]] @@ -70,7 +70,7 @@ digest = "1:916634881c70eb3c2201419786896254d601a786a9124e662a079d4649df160d" name = "github.com/getlantern/hidden" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "d52a649ab33af200943bb599898dbdcfdbc94cb7" [[projects]] @@ -78,27 +78,27 @@ digest = "1:f84e2692edf40301ae0ce718695cde032f5c6964e4fad812749eb1eaefa95785" name = "github.com/getlantern/ops" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "37353306c90844c8e0591956f56611f46299d202" [[projects]] branch = "master" - digest = "1:0060263f361770203e8bc253fc45ed71a7ba092f7fe632f2148e9e95453ea32b" + digest = "1:24b1213b120b37fa3edb567e4e052abd05a54ebfaef43443c76a5f75afe5ae58" name = "github.com/getlantern/systray" packages = ["."] - pruneopts = "NUT" - revision = "e31397f8c6928d98a8a9a7e80087aebcf0090beb" + pruneopts = "UT" + revision = "19c034af4717bf1737fc722e1804f5eb57e3bec5" [[projects]] branch = "master" - digest = "1:23edf5aaca7a1f15d68215ac41595c0732152757e9d7b3f282821222784049f1" + digest = "1:36fe9527deed01d2a317617e59304eb2c4ce9f8a24115bcc5c2e37b3aee5bae4" name = "github.com/gin-contrib/sse" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae" [[projects]] - digest = "1:7f029513a3c64c1fc923af79bf27d4fd0ce4fafdd13b421c1884d52c84e9c600" + digest = "1:d5083934eb25e45d17f72ffa86cae3814f4a9d6c073c4f16b64147169b245606" name = "github.com/gin-gonic/gin" packages = [ ".", @@ -106,48 +106,47 @@ "json", "render", ] - pruneopts = "NUT" + pruneopts = "UT" revision = "b869fe1415e4b9eb52f247441830d502aece2d4d" version = "v1.3.0" [[projects]] - digest = "1:c204ec81f754234f2c3c4093cc8cc42151aadedd1129b32539a472fd7881e689" + digest = "1:15e27372d379b45b18ac917b9dafc45c45485239490ece18cca97a12f9591146" name = "github.com/go-ini/ini" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "9c8236e659b76e87bf02044d06fde8683008ff3e" version = "v1.39.0" [[projects]] - digest = "1:cb4e216bd9f58866f42dc65893455b24f879b026fdaa1ecc3aafff625fdb5a66" + digest = "1:64a5a67c69b70c2420e607a8545d674a23778ed9c3e80607bfd17b77c6c87f6a" name = "github.com/go-ole/go-ole" packages = [ ".", "oleutil", ] - pruneopts = "NUT" + pruneopts = "UT" revision = "a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506" version = "v1.2.1" [[projects]] - digest = "1:91358b3a314c1ddfd4d6445ca9c1fb846842c31c153e626730594b3c95f73f4a" + digest = "1:586ea76dbd0374d6fb649a91d70d652b7fe0ccffb8910a77468e7702e7901f3d" name = "github.com/go-stack/stack" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "2fee6af1a9795aafbe0253a0cfbdf668e1fb8a9a" version = "v1.8.0" [[projects]] - digest = "1:97df918963298c287643883209a2c3f642e6593379f97ab400c2a2e219ab647d" + digest = "1:6ba96a683441984156b05568b9d31dbc846d3336d21ac220fcc819a367dc1f65" name = "github.com/golang/protobuf" packages = ["proto"] - pruneopts = "NUT" - revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" - version = "v1.2.0" + pruneopts = "UT" + revision = "5a0f697c9ed9d68fef0116532c6e05cfeae00e55" [[projects]] branch = "master" - digest = "1:46223f4c05549a4f57fe78cbe3348d905f0d91ae7ab8fa4ac1751281dfa52aac" + digest = "1:324591cd9122f94cc39a87bd44ec71153672c239e2cff5743bfad96b60be3749" name = "github.com/googollee/go-engine.io" packages = [ ".", @@ -157,159 +156,142 @@ "transport", "websocket", ] - pruneopts = "NUT" + pruneopts = "UT" revision = "e2f255711dcb2ea41e42c6d9d98c172d7edf6509" [[projects]] branch = "master" - digest = "1:5e9a122f51197a970db03a82944e9344201e68f0abd6d66016911cb9ed735572" + digest = "1:3eb026ba34d6dd12b45bb6abd63b4e917ebca8d8f3022a139c0881d900ad1bee" name = "github.com/googollee/go-socket.io" packages = ["."] - pruneopts = "NUT" - revision = "25e1f67559cf5d0e41efbc3e0157bb952596ffc3" + pruneopts = "UT" + revision = "c8aeb1ed9b49d7de8fef8662efb18f1d289c5f2e" [[projects]] - digest = "1:4a0c072e44da763409da72d41492373a034baf2e6d849c76d239b4abdfbb6c49" + digest = "1:7b5c6e2eeaa9ae5907c391a91c132abfd5c9e8a784a341b5625e750c67e6825d" name = "github.com/gorilla/websocket" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "66b9c49e59c6c48f0ffce28c2d8b8a5678502c6d" version = "v1.4.0" [[projects]] - digest = "1:06d89db601972cb01beee33ea815839d29ba8048c4b0d71a79a3e6af96063acf" + digest = "1:a3986520f4fa5d398a1407186b1d53e3d56825033dc70c681bd05ca6f47e7c4b" name = "github.com/itsjamie/gin-cors" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "97b4a9da79331dfa2b6d35f4cdd1e50f5148859c" version = "1.0.0" [[projects]] - digest = "1:8e36686e8b139f8fe240c1d5cf3a145bc675c22ff8e707857cdd3ae17b00d728" + digest = "1:be97e109f627d3ba8edfef50c9c74f0d0c17cbe3a2e924a8985e4804a894f282" name = "github.com/json-iterator/go" packages = ["."] - pruneopts = "NUT" - revision = "1624edc4454b8682399def8740d46db5e4362ba4" - version = "v1.1.5" + pruneopts = "UT" + revision = "36b14963da70d11297d313183d7e6388c8510e1e" + version = "1.0.0" [[projects]] branch = "master" - digest = "1:263f9b0a0bcbfff9d5e7d9f2aa11f53995d98214fe0fb97e429e7a5f4534a0f9" + digest = "1:caf6db28595425c0e0f2301a00257d11712f65c1878e12cffc42f6b9a9cf3f23" name = "github.com/kardianos/osext" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "ae77be60afb1dcacde03767a8c37337fad28ac14" [[projects]] - digest = "1:4059c14e87a2de3a434430340521b5feece186c1469eff0834c29a63870de3ed" + digest = "1:0a69a1c0db3591fcefb47f115b224592c8dfa4368b7ba9fae509d5e16cdc95c8" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "5c8c8bd35d3832f5d134ae1e1e375b69a4d25242" version = "v1.0.1" [[projects]] - digest = "1:48306f3ac75da2e9facec89df74e5ac14737402af373171bc4b91655e7d7d097" + digest = "1:7ad278b575635babef38e4ad4219500c299a58ea14b30eb21383d0efca00b369" name = "github.com/kr/binarydist" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "88f551ae580780cc79d12ab4c218ba1ca346b83a" version = "v0.1.0" [[projects]] - digest = "1:47fa0ef6ae6b0387dacb77c7ab8827b4ef621650fd613e43ece61de4cb3f5019" + digest = "1:9cedee824c21326bd26950bd9e1ffe9dc4e7ca03dc8634d0e6f954ee6a383172" name = "github.com/kr/fs" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "1455def202f6e05b95cc7bfc7e8ae67ae5141eba" version = "v0.1.0" [[projects]] - digest = "1:bffa444ca07c69c599ae5876bc18b25bfd5fa85b297ca10a25594d284a7e9c5d" + digest = "1:fa610f9fe6a93f4a75e64c83673dfff9bf1a34bbb21e6102021b6bc7850834a3" name = "github.com/mattn/go-isatty" packages = ["."] - pruneopts = "NUT" - revision = "6ca4dbf54d38eea1a992b3c722a76a5d1c4cb25c" - version = "v0.0.4" + pruneopts = "UT" + revision = "57fdcb988a5c543893cc61bce354a6e24ab70022" [[projects]] - digest = "1:d0164259ed17929689df11205194d80288e8ae25351778f7a3421a24774c36f8" + digest = "1:7efe48dea4db6b35dcc15e15394b627247e5b3fb814242de986b746ba8e0abf0" name = "github.com/mattn/go-shellwords" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "02e3cf038dcea8290e44424da473dd12be796a8a" version = "v1.0.3" [[projects]] - digest = "1:a4b80152551d55dbb835dd81ffa33157f0224b313ae94640c64c9ae5403098db" + digest = "1:b20d8767957e40b9302a8caaee88caa698513fbd972509a54555302c3aebfa04" name = "github.com/miekg/dns" packages = ["."] - pruneopts = "NUT" - revision = "915ca3d5ffd945235828a097c917311a9d86ebb4" - version = "v1.0.14" + pruneopts = "UT" + revision = "7064f7248f5fa5fd79382a76328b4e200b79e4ae" + version = "v1.0.15" [[projects]] - branch = "master" - digest = "1:a4df73029d2c42fabcb6b41e327d2f87e685284ec03edf76921c267d9cfc9c23" + digest = "1:78bbb1ba5b7c3f2ed0ea1eab57bdd3859aec7e177811563edc41198a760b06af" name = "github.com/mitchellh/go-homedir" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "ae18d6b8b3205b561c79e8e5f69bff09736185f4" - -[[projects]] - digest = "1:2f42fa12d6911c7b7659738758631bec870b7e9b4c6be5444f963cdcfccc191f" - name = "github.com/modern-go/concurrent" - packages = ["."] - pruneopts = "NUT" - revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" - version = "1.0.3" - -[[projects]] - digest = "1:c6aca19413b13dc59c220ad7430329e2ec454cc310bc6d8de2c7e2b93c18a0f6" - name = "github.com/modern-go/reflect2" - packages = ["."] - pruneopts = "NUT" - revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" - version = "1.0.1" + version = "v1.0.0" [[projects]] branch = "master" - digest = "1:8b8b71239fc5851930ed3d267a2d310f100d2f3d340d55eff74b210730d75125" + digest = "1:1a0539f293ad62dd34cce1c5cc11b0aa2c1c322b2352682e22ecf5aecaf4a8bd" name = "github.com/oleksandr/bonjour" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "5dcf00d8b228be86307f952f550f2191d956b9e2" [[projects]] branch = "master" - digest = "1:8fe179a5468c41a57dd75dcb283c1a81c4ca38a934380ff996437033d7d9509a" + digest = "1:df63a8ddf6fd32f2cdf09db1ada151c8a27f5fe2516ee977b72d6a0707e94910" name = "github.com/oxtoacart/bpool" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "4e1c5567d7c2dd59fa4c7c83d34c2f3528b025d6" [[projects]] - digest = "1:5cf3f025cbee5951a4ee961de067c8a89fc95a5adabead774f82822efabab121" + digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" [[projects]] - digest = "1:3d8d113726023d6c1dd1f29a19f13266d33a0746fe6f14df8da17eb7409a9aa2" + digest = "1:98c46dbde8c257608669d6827aacb8c8722d6ea7b4ffd7c4d1ea32ead21bfea9" name = "github.com/pkg/sftp" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "08de04f133f27844173471167014e1a753655ac8" version = "v1.8.3" [[projects]] branch = "master" - digest = "1:ba0f377f1482789a3d8a398ee01f642bd2d6ec97bec11268ccde92677ed1fb5c" + digest = "1:e244ec9ef8a91f5d0f640c4d14db6d65938182bb976c07f01f0f6e8f4605c4e9" name = "github.com/sfreiberg/simplessh" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "495cbb862a9c6348e0fff479ed1e7b70c871b372" [[projects]] @@ -317,40 +299,39 @@ digest = "1:39853e1ae46a02816e2419e1f590e00682b1a6b60bb988597cf2efb84314da45" name = "github.com/skratchdot/open-golang" packages = ["open"] - pruneopts = "NUT" + pruneopts = "UT" revision = "75fb7ed4208cf72d323d7d02fd1a5964a7a9073c" [[projects]] - digest = "1:919fc2a81add8ac4a7a236dceaf3e4c29ba4df96d13c3f2ce13a4d0132ebefb8" + digest = "1:c268acaa4a4d94a467980e5e91452eb61c460145765293dc0aed48e5e9919cc6" name = "github.com/ugorji/go" packages = ["codec"] - pruneopts = "NUT" - revision = "b4c50a2b199d93b13dc15e78929cfb23bfdf21ab" - version = "v1.1.1" + pruneopts = "UT" + revision = "c88ee250d0221a57af388746f5cf03768c21d6e2" [[projects]] branch = "master" - digest = "1:c205236572ddcd0988a24c06be96a179982e870d2b7d746c95e06d9803cd9462" + digest = "1:85ceb7046447e3f5cf21c621ec137b23eb8d02ae9b585dd5c22d65543a0f3020" name = "github.com/xrash/smetrics" packages = ["."] - pruneopts = "NUT" + pruneopts = "UT" revision = "a3153f7040e90324c58c6287535e26a0ac5c1cc1" [[projects]] branch = "master" - digest = "1:572a6fb10b136109bd380f283682a2eb05551f3e193ff95a3d4d08d7060fa441" + digest = "1:49b892f63d6b54df49cc35901eba38acc3c5309f919b40b3d1e2ff859c8108ba" name = "go.bug.st/serial.v1" packages = [ ".", "enumerator", "unixutils", ] - pruneopts = "NUT" + pruneopts = "UT" revision = "5f7892a7bb453066bdc6683b9b5d24d9dee03ec1" [[projects]] branch = "master" - digest = "1:a0704c8502c6004cbc247cb339c66270cf5f6cfbb032b25237faf93875abeefa" + digest = "1:04c834d4d75b1e3c678ffadb336e4c5f8b58786cb7bd1f3ee19a166d76aa9b56" name = "golang.org/x/crypto" packages = [ "cast5", @@ -370,12 +351,12 @@ "ssh/agent", "ssh/terminal", ] - pruneopts = "NUT" - revision = "4d3f4d9ffa16a13f451c3b2999e9c49e9750bf06" + pruneopts = "UT" + revision = "3d3f9f413869b949e48070b5bc593aa22cc2b8f2" [[projects]] branch = "master" - digest = "1:40a3cfcb660b2f6354f669eb8cbea46b5a308b42f349782147301ab66fb57184" + digest = "1:223e261c2e2506efad9737b5df18738e3dd0ad05b6d446ec8bcfa3576845183d" name = "golang.org/x/net" packages = [ "bpf", @@ -384,46 +365,45 @@ "ipv4", "ipv6", ] - pruneopts = "NUT" - revision = "c44066c5c816ec500d459a2a324a753f78531ae0" + pruneopts = "UT" + revision = "adae6a3d119ae4890b46832a2e88a95adc62b8e7" [[projects]] branch = "master" - digest = "1:3bcf6eb3757db3e22c41d212f886b86d0f940f86e1af85b13cd31122ac341193" + digest = "1:f343f077a5b0bc3a3788b3a04e24dd417e3e25b2acb529c413e212d2c42416ef" name = "golang.org/x/sys" packages = [ "unix", "windows", ] - pruneopts = "NUT" - revision = "9b800f95dbbc54abff0acf7ee32d88ba4e328c89" + pruneopts = "UT" + revision = "62eef0e2fa9b2c385f7b2778e763486da6880d37" [[projects]] - digest = "1:0215407129c5f116ae8f6d3af64df59c39d3f606a72ef77a1e6ed874f92a8d9c" + digest = "1:1b4724d3c8125f6044925f02b485b74bfec9905cbf579d95aafd1a6c8f8447d3" name = "gopkg.in/go-playground/validator.v8" packages = ["."] - pruneopts = "NUT" - revision = "5f1438d3fca68893a817e4a66806cea46a9e4ebf" - version = "v8.18.2" + pruneopts = "UT" + revision = "5f57d2222ad794d0dffb07e664ea05e2ee07d60c" + version = "v8.18.1" [[projects]] branch = "v0" - digest = "1:299a25c4ee90eb917553bb4d51e04b75f1b56bc1b4f5c63ed21e5369fb533855" + digest = "1:580aa4af38b87e235950c3a09841bb7f9f329e2495ec5d43c42d7f7fb7f5a464" name = "gopkg.in/inconshreveable/go-update.v0" packages = [ ".", "download", ] - pruneopts = "NUT" + pruneopts = "UT" revision = "d8b0b1d421aa1cbf392c05869f8abbc669bb7066" [[projects]] - digest = "1:7c95b35057a0ff2e19f707173cc1a947fa43a6eb5c4d300d196ece0334046082" + digest = "1:cacb98d52c60c337c2ce95a7af83ba0313a93ce5e73fa9e99a96aff70776b9d3" name = "gopkg.in/yaml.v2" packages = ["."] - pruneopts = "NUT" - revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" - version = "v2.2.1" + pruneopts = "UT" + revision = "a5b47d31c556af34a302ce5d659e6fea44d90de0" [solve-meta] analyzer-name = "dep" diff --git a/Gopkg.toml b/Gopkg.toml index 44e310071..d9a57a3c0 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -27,76 +27,28 @@ [[constraint]] name = "github.com/Sirupsen/logrus" - version = "1.0.6" + version = "1.2.0" [[constraint]] name = "github.com/blang/semver" version = "3.5.1" -[[constraint]] - branch = "master" - name = "github.com/creack/goselect" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/context" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/errors" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/filepersist" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/golog" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/hex" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/hidden" - -[[constraint]] - branch = "master" - name = "github.com/getlantern/ops" - -[[constraint]] - name = "github.com/getlantern/stack" - version = "1.5.1" - [[constraint]] branch = "master" name = "github.com/getlantern/systray" [[constraint]] name = "github.com/gin-gonic/gin" - version = "1.2.0" + version = "1.3.0" [[constraint]] name = "github.com/go-ini/ini" - version = "1.38.1" - -[[constraint]] - branch = "master" - name = "github.com/googollee/go-engine.io" + version = "1.39.0" [[constraint]] branch = "master" name = "github.com/googollee/go-socket.io" -[[constraint]] - name = "github.com/gorilla/websocket" - version = "1.2.0" - -[[constraint]] - branch = "filemode" - name = "github.com/inconshreveable/go-update" - [[constraint]] name = "github.com/itsjamie/gin-cors" version = "1.0.0" @@ -109,37 +61,13 @@ name = "github.com/kr/binarydist" version = "0.1.0" -[[constraint]] - name = "github.com/kr/fs" - version = "0.1.0" - -[[constraint]] - branch = "master" - name = "github.com/manucorporat/sse" - -[[constraint]] - name = "github.com/mattn/go-colorable" - version = "0.0.9" - -[[constraint]] - name = "github.com/mattn/go-isatty" - version = "0.0.3" - -[[constraint]] - name = "github.com/mattn/go-ole" - version = "1.2.1" - [[constraint]] name = "github.com/mattn/go-shellwords" version = "1.0.3" [[constraint]] - name = "github.com/miekg/dns" - version = "1.0.8" - -[[constraint]] - branch = "master" name = "github.com/mitchellh/go-homedir" + version = "1.0.0" [[constraint]] branch = "master" @@ -149,10 +77,6 @@ name = "github.com/pkg/errors" version = "0.8.0" -[[constraint]] - name = "github.com/pkg/sftp" - version = "1.8.0" - [[constraint]] branch = "master" name = "github.com/sfreiberg/simplessh" @@ -161,18 +85,6 @@ branch = "master" name = "github.com/skratchdot/open-golang" -[[constraint]] - name = "github.com/smartystreets/goconvey" - version = "1.6.3" - -[[constraint]] - name = "github.com/stretchr/testify" - version = "1.2.2" - -[[constraint]] - branch = "master" - name = "github.com/vharitonsky/iniflags" - [[constraint]] branch = "master" name = "github.com/xrash/smetrics" @@ -185,27 +97,10 @@ branch = "master" name = "golang.org/x/crypto" -[[constraint]] - branch = "master" - name = "golang.org/x/net" - -[[constraint]] - branch = "master" - name = "golang.org/x/sys" - -[[constraint]] - name = "gopkg.in/bluesuncorp/validator.v5" - version = "5.12.0" - [[constraint]] branch = "v0" name = "gopkg.in/inconshreveable/go-update.v0" -[[constraint]] - name = "gopkg.in/ini.v1" - version = "1.38.1" - [prune] - non-go = true go-tests = true - unused-packages = true \ No newline at end of file + unused-packages = true diff --git a/vendor/github.com/Sirupsen/logrus/.gitignore b/vendor/github.com/Sirupsen/logrus/.gitignore new file mode 100644 index 000000000..6b7d7d1e8 --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/.gitignore @@ -0,0 +1,2 @@ +logrus +vendor diff --git a/vendor/github.com/Sirupsen/logrus/.travis.yml b/vendor/github.com/Sirupsen/logrus/.travis.yml new file mode 100644 index 000000000..1f953bebd --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/.travis.yml @@ -0,0 +1,51 @@ +language: go +env: + - GOMAXPROCS=4 GORACE=halt_on_error=1 +matrix: + include: + - go: 1.10.x + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v ./... + - go: 1.11.x + env: GO111MODULE=on + install: + - go mod download + script: + - go test -race -v ./... + - go: 1.11.x + env: GO111MODULE=off + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v ./... + - go: 1.10.x + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v -tags appengine ./... + - go: 1.11.x + env: GO111MODULE=on + install: + - go mod download + script: + - go test -race -v -tags appengine ./... + - go: 1.11.x + env: GO111MODULE=off + install: + - go get github.com/stretchr/testify/assert + - go get golang.org/x/crypto/ssh/terminal + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows + script: + - go test -race -v -tags appengine ./... diff --git a/vendor/github.com/Sirupsen/logrus/CHANGELOG.md b/vendor/github.com/Sirupsen/logrus/CHANGELOG.md new file mode 100644 index 000000000..cb85d9f9f --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/CHANGELOG.md @@ -0,0 +1,165 @@ +# 1.2.0 +This new release introduces: + * A new method `SetReportCaller` in the `Logger` to enable the file, line and calling function from which the trace has been issued + * A new trace level named `Trace` whose level is below `Debug` + * A configurable exit function to be called upon a Fatal trace + * The `Level` object now implements `encoding.TextUnmarshaler` interface + +# 1.1.1 +This is a bug fix release. + * fix the build break on Solaris + * don't drop a whole trace in JSONFormatter when a field param is a function pointer which can not be serialized + +# 1.1.0 +This new release introduces: + * several fixes: + * a fix for a race condition on entry formatting + * proper cleanup of previously used entries before putting them back in the pool + * the extra new line at the end of message in text formatter has been removed + * a new global public API to check if a level is activated: IsLevelEnabled + * the following methods have been added to the Logger object + * IsLevelEnabled + * SetFormatter + * SetOutput + * ReplaceHooks + * introduction of go module + * an indent configuration for the json formatter + * output colour support for windows + * the field sort function is now configurable for text formatter + * the CLICOLOR and CLICOLOR\_FORCE environment variable support in text formater + +# 1.0.6 + +This new release introduces: + * a new api WithTime which allows to easily force the time of the log entry + which is mostly useful for logger wrapper + * a fix reverting the immutability of the entry given as parameter to the hooks + a new configuration field of the json formatter in order to put all the fields + in a nested dictionnary + * a new SetOutput method in the Logger + * a new configuration of the textformatter to configure the name of the default keys + * a new configuration of the text formatter to disable the level truncation + +# 1.0.5 + +* Fix hooks race (#707) +* Fix panic deadlock (#695) + +# 1.0.4 + +* Fix race when adding hooks (#612) +* Fix terminal check in AppEngine (#635) + +# 1.0.3 + +* Replace example files with testable examples + +# 1.0.2 + +* bug: quote non-string values in text formatter (#583) +* Make (*Logger) SetLevel a public method + +# 1.0.1 + +* bug: fix escaping in text formatter (#575) + +# 1.0.0 + +* Officially changed name to lower-case +* bug: colors on Windows 10 (#541) +* bug: fix race in accessing level (#512) + +# 0.11.5 + +* feature: add writer and writerlevel to entry (#372) + +# 0.11.4 + +* bug: fix undefined variable on solaris (#493) + +# 0.11.3 + +* formatter: configure quoting of empty values (#484) +* formatter: configure quoting character (default is `"`) (#484) +* bug: fix not importing io correctly in non-linux environments (#481) + +# 0.11.2 + +* bug: fix windows terminal detection (#476) + +# 0.11.1 + +* bug: fix tty detection with custom out (#471) + +# 0.11.0 + +* performance: Use bufferpool to allocate (#370) +* terminal: terminal detection for app-engine (#343) +* feature: exit handler (#375) + +# 0.10.0 + +* feature: Add a test hook (#180) +* feature: `ParseLevel` is now case-insensitive (#326) +* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) +* performance: avoid re-allocations on `WithFields` (#335) + +# 0.9.0 + +* logrus/text_formatter: don't emit empty msg +* logrus/hooks/airbrake: move out of main repository +* logrus/hooks/sentry: move out of main repository +* logrus/hooks/papertrail: move out of main repository +* logrus/hooks/bugsnag: move out of main repository +* logrus/core: run tests with `-race` +* logrus/core: detect TTY based on `stderr` +* logrus/core: support `WithError` on logger +* logrus/core: Solaris support + +# 0.8.7 + +* logrus/core: fix possible race (#216) +* logrus/doc: small typo fixes and doc improvements + + +# 0.8.6 + +* hooks/raven: allow passing an initialized client + +# 0.8.5 + +* logrus/core: revert #208 + +# 0.8.4 + +* formatter/text: fix data race (#218) + +# 0.8.3 + +* logrus/core: fix entry log level (#208) +* logrus/core: improve performance of text formatter by 40% +* logrus/core: expose `LevelHooks` type +* logrus/core: add support for DragonflyBSD and NetBSD +* formatter/text: print structs more verbosely + +# 0.8.2 + +* logrus: fix more Fatal family functions + +# 0.8.1 + +* logrus: fix not exiting on `Fatalf` and `Fatalln` + +# 0.8.0 + +* logrus: defaults to stderr instead of stdout +* hooks/sentry: add special field for `*http.Request` +* formatter/text: ignore Windows for colors + +# 0.7.3 + +* formatter/\*: allow configuration of timestamp layout + +# 0.7.2 + +* formatter/text: Add configuration option for time format (#158) diff --git a/vendor/github.com/Sirupsen/logrus/README.md b/vendor/github.com/Sirupsen/logrus/README.md new file mode 100644 index 000000000..093bb13f8 --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/README.md @@ -0,0 +1,493 @@ +# Logrus :walrus: [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) + +Logrus is a structured logger for Go (golang), completely API compatible with +the standard library logger. + +**Seeing weird case-sensitive problems?** It's in the past been possible to +import Logrus as both upper- and lower-case. Due to the Go package environment, +this caused issues in the community and we needed a standard. Some environments +experienced problems with the upper-case variant, so the lower-case was decided. +Everything using `logrus` will need to use the lower-case: +`github.com/sirupsen/logrus`. Any package that isn't, should be changed. + +To fix Glide, see [these +comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437). +For an in-depth explanation of the casing issue, see [this +comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276). + +**Are you interested in assisting in maintaining Logrus?** Currently I have a +lot of obligations, and I am unable to provide Logrus with the maintainership it +needs. If you'd like to help, please reach out to me at `simon at author's +username dot com`. + +Nicely color-coded in development (when a TTY is attached, otherwise just +plain text): + +![Colored](http://i.imgur.com/PY7qMwd.png) + +With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash +or Splunk: + +```json +{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the +ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} + +{"level":"warning","msg":"The group's number increased tremendously!", +"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} + +{"animal":"walrus","level":"info","msg":"A giant walrus appears!", +"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} + +{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", +"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} + +{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, +"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} +``` + +With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not +attached, the output is compatible with the +[logfmt](http://godoc.org/github.com/kr/logfmt) format: + +```text +time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8 +time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 +time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true +time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4 +time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009 +time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true +``` +To ensure this behaviour even if a TTY is attached, set your formatter as follows: + +```go + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) +``` + +#### Logging Method Name + +If you wish to add the calling method as a field, instruct the logger via: +```go +log.SetReportCaller(true) +``` +This adds the caller as 'method' like so: + +```json +{"animal":"penguin","level":"fatal","method":"github.com/sirupsen/arcticcreatures.migrate","msg":"a penguin swims by", +"time":"2014-03-10 19:57:38.562543129 -0400 EDT"} +``` + +```text +time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcreatures.migrate msg="a penguin swims by" animal=penguin +``` +Note that this does add measurable overhead - the cost will depend on the version of Go, but is +between 20 and 40% in recent tests with 1.6 and 1.7. You can validate this in your +environment via benchmarks: +``` +go test -bench=.*CallerTracing +``` + + +#### Case-sensitivity + +The organization's name was changed to lower-case--and this will not be changed +back. If you are getting import conflicts due to case sensitivity, please use +the lower-case import: `github.com/sirupsen/logrus`. + +#### Example + +The simplest way to use Logrus is simply the package-level exported logger: + +```go +package main + +import ( + log "github.com/sirupsen/logrus" +) + +func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + }).Info("A walrus appears") +} +``` + +Note that it's completely api-compatible with the stdlib logger, so you can +replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"` +and you'll now have the flexibility of Logrus. You can customize it all you +want: + +```go +package main + +import ( + "os" + log "github.com/sirupsen/logrus" +) + +func init() { + // Log as JSON instead of the default ASCII formatter. + log.SetFormatter(&log.JSONFormatter{}) + + // Output to stdout instead of the default stderr + // Can be any io.Writer, see below for File example + log.SetOutput(os.Stdout) + + // Only log the warning severity or above. + log.SetLevel(log.WarnLevel) +} + +func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "size": 10, + }).Info("A group of walrus emerges from the ocean") + + log.WithFields(log.Fields{ + "omg": true, + "number": 122, + }).Warn("The group's number increased tremendously!") + + log.WithFields(log.Fields{ + "omg": true, + "number": 100, + }).Fatal("The ice breaks!") + + // A common pattern is to re-use fields between logging statements by re-using + // the logrus.Entry returned from WithFields() + contextLogger := log.WithFields(log.Fields{ + "common": "this is a common field", + "other": "I also should be logged always", + }) + + contextLogger.Info("I'll be logged with common and other field") + contextLogger.Info("Me too") +} +``` + +For more advanced usage such as logging to multiple locations from the same +application, you can also create an instance of the `logrus` Logger: + +```go +package main + +import ( + "os" + "github.com/sirupsen/logrus" +) + +// Create a new instance of the logger. You can have any number of instances. +var log = logrus.New() + +func main() { + // The API for setting attributes is a little different than the package level + // exported logger. See Godoc. + log.Out = os.Stdout + + // You could set this to any `io.Writer` such as a file + // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666) + // if err == nil { + // log.Out = file + // } else { + // log.Info("Failed to log to file, using default stderr") + // } + + log.WithFields(logrus.Fields{ + "animal": "walrus", + "size": 10, + }).Info("A group of walrus emerges from the ocean") +} +``` + +#### Fields + +Logrus encourages careful, structured logging through logging fields instead of +long, unparseable error messages. For example, instead of: `log.Fatalf("Failed +to send event %s to topic %s with key %d")`, you should log the much more +discoverable: + +```go +log.WithFields(log.Fields{ + "event": event, + "topic": topic, + "key": key, +}).Fatal("Failed to send event") +``` + +We've found this API forces you to think about logging in a way that produces +much more useful logging messages. We've been in countless situations where just +a single added field to a log statement that was already there would've saved us +hours. The `WithFields` call is optional. + +In general, with Logrus using any of the `printf`-family functions should be +seen as a hint you should add a field, however, you can still use the +`printf`-family functions with Logrus. + +#### Default Fields + +Often it's helpful to have fields _always_ attached to log statements in an +application or parts of one. For example, you may want to always log the +`request_id` and `user_ip` in the context of a request. Instead of writing +`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on +every line, you can create a `logrus.Entry` to pass around instead: + +```go +requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) +requestLogger.Info("something happened on that request") # will log request_id and user_ip +requestLogger.Warn("something not great happened") +``` + +#### Hooks + +You can add hooks for logging levels. For example to send errors to an exception +tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to +multiple places simultaneously, e.g. syslog. + +Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in +`init`: + +```go +import ( + log "github.com/sirupsen/logrus" + "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake" + logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" + "log/syslog" +) + +func init() { + + // Use the Airbrake hook to report errors that have Error severity or above to + // an exception tracker. You can create custom hooks, see the Hooks section. + log.AddHook(airbrake.NewHook(123, "xyz", "production")) + + hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") + if err != nil { + log.Error("Unable to connect to local syslog daemon") + } else { + log.AddHook(hook) + } +} +``` +Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). + +A list of currently known of service hook can be found in this wiki [page](https://github.com/sirupsen/logrus/wiki/Hooks) + + +#### Level logging + +Logrus has seven logging levels: Trace, Debug, Info, Warning, Error, Fatal and Panic. + +```go +log.Trace("Something very low level.") +log.Debug("Useful debugging information.") +log.Info("Something noteworthy happened!") +log.Warn("You should probably take a look at this.") +log.Error("Something failed but I'm not quitting.") +// Calls os.Exit(1) after logging +log.Fatal("Bye.") +// Calls panic() after logging +log.Panic("I'm bailing.") +``` + +You can set the logging level on a `Logger`, then it will only log entries with +that severity or anything above it: + +```go +// Will log anything that is info or above (warn, error, fatal, panic). Default. +log.SetLevel(log.InfoLevel) +``` + +It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose +environment if your application has that. + +#### Entries + +Besides the fields added with `WithField` or `WithFields` some fields are +automatically added to all logging events: + +1. `time`. The timestamp when the entry was created. +2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after + the `AddFields` call. E.g. `Failed to send event.` +3. `level`. The logging level. E.g. `info`. + +#### Environments + +Logrus has no notion of environment. + +If you wish for hooks and formatters to only be used in specific environments, +you should handle that yourself. For example, if your application has a global +variable `Environment`, which is a string representation of the environment you +could do: + +```go +import ( + log "github.com/sirupsen/logrus" +) + +init() { + // do something here to set environment depending on an environment variable + // or command-line flag + if Environment == "production" { + log.SetFormatter(&log.JSONFormatter{}) + } else { + // The TextFormatter is default, you don't actually have to do this. + log.SetFormatter(&log.TextFormatter{}) + } +} +``` + +This configuration is how `logrus` was intended to be used, but JSON in +production is mostly only useful if you do log aggregation with tools like +Splunk or Logstash. + +#### Formatters + +The built-in logging formatters are: + +* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise + without colors. + * *Note:* to force colored output when there is no TTY, set the `ForceColors` + field to `true`. To force no colored output even if there is a TTY set the + `DisableColors` field to `true`. For Windows, see + [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable). + * When colors are enabled, levels are truncated to 4 characters by default. To disable + truncation set the `DisableLevelTruncation` field to `true`. + * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter). +* `logrus.JSONFormatter`. Logs fields as JSON. + * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter). + +Third party logging formatters: + +* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine. +* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events. +* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout. +* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦. + +You can define your formatter by implementing the `Formatter` interface, +requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a +`Fields` type (`map[string]interface{}`) with all your fields as well as the +default ones (see Entries section above): + +```go +type MyJSONFormatter struct { +} + +log.SetFormatter(new(MyJSONFormatter)) + +func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { + // Note this doesn't include Time, Level and Message which are available on + // the Entry. Consult `godoc` on information about those fields or read the + // source of the official loggers. + serialized, err := json.Marshal(entry.Data) + if err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + return append(serialized, '\n'), nil +} +``` + +#### Logger as an `io.Writer` + +Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it. + +```go +w := logger.Writer() +defer w.Close() + +srv := http.Server{ + // create a stdlib log.Logger that writes to + // logrus.Logger. + ErrorLog: log.New(w, "", 0), +} +``` + +Each line written to that writer will be printed the usual way, using formatters +and hooks. The level for those entries is `info`. + +This means that we can override the standard library logger easily: + +```go +logger := logrus.New() +logger.Formatter = &logrus.JSONFormatter{} + +// Use logrus for standard log output +// Note that `log` here references stdlib's log +// Not logrus imported under the name `log`. +log.SetOutput(logger.Writer()) +``` + +#### Rotation + +Log rotation is not provided with Logrus. Log rotation should be done by an +external program (like `logrotate(8)`) that can compress and delete old log +entries. It should not be a feature of the application-level logger. + +#### Tools + +| Tool | Description | +| ---- | ----------- | +|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.| +|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) | + +#### Testing + +Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides: + +* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook +* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any): + +```go +import( + "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus/hooks/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSomething(t*testing.T){ + logger, hook := test.NewNullLogger() + logger.Error("Helloerror") + + assert.Equal(t, 1, len(hook.Entries)) + assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level) + assert.Equal(t, "Helloerror", hook.LastEntry().Message) + + hook.Reset() + assert.Nil(t, hook.LastEntry()) +} +``` + +#### Fatal handlers + +Logrus can register one or more functions that will be called when any `fatal` +level message is logged. The registered handlers will be executed before +logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need +to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted. + +``` +... +handler := func() { + // gracefully shutdown something... +} +logrus.RegisterExitHandler(handler) +... +``` + +#### Thread safety + +By default, Logger is protected by a mutex for concurrent writes. The mutex is held when calling hooks and writing logs. +If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking. + +Situation when locking is not needed includes: + +* You have no hooks registered, or hooks calling is already thread-safe. + +* Writing to logger.Out is already thread-safe, for example: + + 1) logger.Out is protected by locks. + + 2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing) + + (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/) diff --git a/vendor/github.com/Sirupsen/logrus/appveyor.yml b/vendor/github.com/Sirupsen/logrus/appveyor.yml new file mode 100644 index 000000000..96c2ce15f --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/appveyor.yml @@ -0,0 +1,14 @@ +version: "{build}" +platform: x64 +clone_folder: c:\gopath\src\github.com\sirupsen\logrus +environment: + GOPATH: c:\gopath +branches: + only: + - master +install: + - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% + - go version +build_script: + - go get -t + - go test diff --git a/vendor/github.com/Sirupsen/logrus/entry.go b/vendor/github.com/Sirupsen/logrus/entry.go index ca634a609..cc85d3aab 100644 --- a/vendor/github.com/Sirupsen/logrus/entry.go +++ b/vendor/github.com/Sirupsen/logrus/entry.go @@ -5,11 +5,29 @@ import ( "fmt" "os" "reflect" + "runtime" + "strings" "sync" "time" ) -var bufferPool *sync.Pool +var ( + bufferPool *sync.Pool + + // qualified package name, cached at first use + logrusPackage string + + // Positions in the call stack when tracing to report the calling method + minimumCallerDepth int + + // Used for caller information initialisation + callerInitOnce sync.Once +) + +const ( + maximumCallerDepth int = 25 + knownLogrusFrames int = 4 +) func init() { bufferPool = &sync.Pool{ @@ -17,15 +35,18 @@ func init() { return new(bytes.Buffer) }, } + + // start at the bottom of the stack before the package-name cache is primed + minimumCallerDepth = 1 } // Defines the key when adding errors using WithError. var ErrorKey = "error" // An entry is the final or intermediate Logrus logging entry. It contains all -// the fields passed with WithField{,s}. It's finally logged when Debug, Info, -// Warn, Error, Fatal or Panic is called on it. These objects can be reused and -// passed around as much as you wish to avoid field duplication. +// the fields passed with WithField{,s}. It's finally logged when Trace, Debug, +// Info, Warn, Error, Fatal or Panic is called on it. These objects can be +// reused and passed around as much as you wish to avoid field duplication. type Entry struct { Logger *Logger @@ -35,11 +56,14 @@ type Entry struct { // Time at which the log entry was created Time time.Time - // Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic + // Level the log entry was logged at: Trace, Debug, Info, Warn, Error, Fatal or Panic // This field will be set on entry firing and the value will be equal to the one in Logger struct field. Level Level - // Message passed to Debug, Info, Warn, Error, Fatal or Panic + // Calling method, with package name + Caller *runtime.Frame + + // Message passed to Trace, Debug, Info, Warn, Error, Fatal or Panic Message string // When formatter is called in entry.log(), a Buffer may be set to entry @@ -52,8 +76,8 @@ type Entry struct { func NewEntry(logger *Logger) *Entry { return &Entry{ Logger: logger, - // Default is five fields, give a little extra room - Data: make(Fields, 5), + // Default is three fields, plus one optional. Give a little extra room. + Data: make(Fields, 6), } } @@ -103,6 +127,57 @@ func (entry *Entry) WithTime(t time.Time) *Entry { return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t} } +// getPackageName reduces a fully qualified function name to the package name +// There really ought to be to be a better way... +func getPackageName(f string) string { + for { + lastPeriod := strings.LastIndex(f, ".") + lastSlash := strings.LastIndex(f, "/") + if lastPeriod > lastSlash { + f = f[:lastPeriod] + } else { + break + } + } + + return f +} + +// getCaller retrieves the name of the first non-logrus calling function +func getCaller() *runtime.Frame { + // Restrict the lookback frames to avoid runaway lookups + pcs := make([]uintptr, maximumCallerDepth) + depth := runtime.Callers(minimumCallerDepth, pcs) + frames := runtime.CallersFrames(pcs[:depth]) + + // cache this package's fully-qualified name + callerInitOnce.Do(func() { + logrusPackage = getPackageName(runtime.FuncForPC(pcs[0]).Name()) + + // now that we have the cache, we can skip a minimum count of known-logrus functions + // XXX this is dubious, the number of frames may vary store an entry in a logger interface + minimumCallerDepth = knownLogrusFrames + }) + + for f, again := frames.Next(); again; f, again = frames.Next() { + pkg := getPackageName(f.Function) + + // If the caller isn't part of this package, we're done + if pkg != logrusPackage { + return &f + } + } + + // if we got here, we failed to find the caller's context + return nil +} + +func (entry Entry) HasCaller() (has bool) { + return entry.Logger != nil && + entry.Logger.ReportCaller && + entry.Caller != nil +} + // This function is not declared with a pointer value because otherwise // race conditions will occur when using multiple goroutines func (entry Entry) log(level Level, msg string) { @@ -119,6 +194,9 @@ func (entry Entry) log(level Level, msg string) { entry.Level = level entry.Message = msg + if entry.Logger.ReportCaller { + entry.Caller = getCaller() + } entry.fireHooks() @@ -162,6 +240,12 @@ func (entry *Entry) write() { } } +func (entry *Entry) Trace(args ...interface{}) { + if entry.Logger.IsLevelEnabled(TraceLevel) { + entry.log(TraceLevel, fmt.Sprint(args...)) + } +} + func (entry *Entry) Debug(args ...interface{}) { if entry.Logger.IsLevelEnabled(DebugLevel) { entry.log(DebugLevel, fmt.Sprint(args...)) @@ -198,7 +282,7 @@ func (entry *Entry) Fatal(args ...interface{}) { if entry.Logger.IsLevelEnabled(FatalLevel) { entry.log(FatalLevel, fmt.Sprint(args...)) } - Exit(1) + entry.Logger.Exit(1) } func (entry *Entry) Panic(args ...interface{}) { @@ -210,6 +294,12 @@ func (entry *Entry) Panic(args ...interface{}) { // Entry Printf family functions +func (entry *Entry) Tracef(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(TraceLevel) { + entry.Trace(fmt.Sprintf(format, args...)) + } +} + func (entry *Entry) Debugf(format string, args ...interface{}) { if entry.Logger.IsLevelEnabled(DebugLevel) { entry.Debug(fmt.Sprintf(format, args...)) @@ -246,7 +336,7 @@ func (entry *Entry) Fatalf(format string, args ...interface{}) { if entry.Logger.IsLevelEnabled(FatalLevel) { entry.Fatal(fmt.Sprintf(format, args...)) } - Exit(1) + entry.Logger.Exit(1) } func (entry *Entry) Panicf(format string, args ...interface{}) { @@ -257,6 +347,12 @@ func (entry *Entry) Panicf(format string, args ...interface{}) { // Entry Println family functions +func (entry *Entry) Traceln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(TraceLevel) { + entry.Trace(entry.sprintlnn(args...)) + } +} + func (entry *Entry) Debugln(args ...interface{}) { if entry.Logger.IsLevelEnabled(DebugLevel) { entry.Debug(entry.sprintlnn(args...)) @@ -293,7 +389,7 @@ func (entry *Entry) Fatalln(args ...interface{}) { if entry.Logger.IsLevelEnabled(FatalLevel) { entry.Fatal(entry.sprintlnn(args...)) } - Exit(1) + entry.Logger.Exit(1) } func (entry *Entry) Panicln(args ...interface{}) { diff --git a/vendor/github.com/Sirupsen/logrus/exported.go b/vendor/github.com/Sirupsen/logrus/exported.go index fb2a7a1f0..7342613c3 100644 --- a/vendor/github.com/Sirupsen/logrus/exported.go +++ b/vendor/github.com/Sirupsen/logrus/exported.go @@ -24,6 +24,12 @@ func SetFormatter(formatter Formatter) { std.SetFormatter(formatter) } +// SetReportCaller sets whether the standard logger will include the calling +// method as a field. +func SetReportCaller(include bool) { + std.SetReportCaller(include) +} + // SetLevel sets the standard logger level. func SetLevel(level Level) { std.SetLevel(level) @@ -77,6 +83,11 @@ func WithTime(t time.Time) *Entry { return std.WithTime(t) } +// Trace logs a message at level Trace on the standard logger. +func Trace(args ...interface{}) { + std.Trace(args...) +} + // Debug logs a message at level Debug on the standard logger. func Debug(args ...interface{}) { std.Debug(args...) @@ -117,6 +128,11 @@ func Fatal(args ...interface{}) { std.Fatal(args...) } +// Tracef logs a message at level Trace on the standard logger. +func Tracef(format string, args ...interface{}) { + std.Tracef(format, args...) +} + // Debugf logs a message at level Debug on the standard logger. func Debugf(format string, args ...interface{}) { std.Debugf(format, args...) @@ -157,6 +173,11 @@ func Fatalf(format string, args ...interface{}) { std.Fatalf(format, args...) } +// Traceln logs a message at level Trace on the standard logger. +func Traceln(args ...interface{}) { + std.Traceln(args...) +} + // Debugln logs a message at level Debug on the standard logger. func Debugln(args ...interface{}) { std.Debugln(args...) diff --git a/vendor/github.com/Sirupsen/logrus/formatter.go b/vendor/github.com/Sirupsen/logrus/formatter.go index be2f3fcee..408883773 100644 --- a/vendor/github.com/Sirupsen/logrus/formatter.go +++ b/vendor/github.com/Sirupsen/logrus/formatter.go @@ -9,6 +9,8 @@ const ( FieldKeyLevel = "level" FieldKeyTime = "time" FieldKeyLogrusError = "logrus_error" + FieldKeyFunc = "func" + FieldKeyFile = "file" ) // The Formatter interface is used to implement a custom Formatter. It takes an @@ -25,7 +27,7 @@ type Formatter interface { Format(*Entry) ([]byte, error) } -// This is to not silently overwrite `time`, `msg` and `level` fields when +// This is to not silently overwrite `time`, `msg`, `func` and `level` fields when // dumping it. If this code wasn't there doing: // // logrus.WithField("level", 1).Info("hello") @@ -37,7 +39,7 @@ type Formatter interface { // // It's not exported because it's still using Data in an opinionated way. It's to // avoid code duplication between the two default formatters. -func prefixFieldClashes(data Fields, fieldMap FieldMap) { +func prefixFieldClashes(data Fields, fieldMap FieldMap, reportCaller bool) { timeKey := fieldMap.resolve(FieldKeyTime) if t, ok := data[timeKey]; ok { data["fields."+timeKey] = t @@ -61,4 +63,16 @@ func prefixFieldClashes(data Fields, fieldMap FieldMap) { data["fields."+logrusErrKey] = l delete(data, logrusErrKey) } + + // If reportCaller is not set, 'func' will not conflict. + if reportCaller { + funcKey := fieldMap.resolve(FieldKeyFunc) + if l, ok := data[funcKey]; ok { + data["fields."+funcKey] = l + } + fileKey := fieldMap.resolve(FieldKeyFile) + if l, ok := data[fileKey]; ok { + data["fields."+fileKey] = l + } + } } diff --git a/vendor/github.com/Sirupsen/logrus/go.mod b/vendor/github.com/Sirupsen/logrus/go.mod new file mode 100644 index 000000000..94574cc63 --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/go.mod @@ -0,0 +1,11 @@ +module github.com/sirupsen/logrus + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.1 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.1.1 // indirect + github.com/stretchr/testify v1.2.2 + golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 + golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 +) diff --git a/vendor/github.com/Sirupsen/logrus/go.sum b/vendor/github.com/Sirupsen/logrus/go.sum new file mode 100644 index 000000000..133d34ae1 --- /dev/null +++ b/vendor/github.com/Sirupsen/logrus/go.sum @@ -0,0 +1,15 @@ +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/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs= +github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +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/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/Sirupsen/logrus/json_formatter.go b/vendor/github.com/Sirupsen/logrus/json_formatter.go index ef8d07460..260575359 100644 --- a/vendor/github.com/Sirupsen/logrus/json_formatter.go +++ b/vendor/github.com/Sirupsen/logrus/json_formatter.go @@ -34,9 +34,10 @@ type JSONFormatter struct { // As an example: // formatter := &JSONFormatter{ // FieldMap: FieldMap{ - // FieldKeyTime: "@timestamp", + // FieldKeyTime: "@timestamp", // FieldKeyLevel: "@level", - // FieldKeyMsg: "@message", + // FieldKeyMsg: "@message", + // FieldKeyFunc: "@caller", // }, // } FieldMap FieldMap @@ -47,7 +48,7 @@ type JSONFormatter struct { // Format renders a single log entry func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { - data := make(Fields, len(entry.Data)+3) + data := make(Fields, len(entry.Data)+4) for k, v := range entry.Data { switch v := v.(type) { case error: @@ -65,7 +66,7 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { data = newData } - prefixFieldClashes(data, f.FieldMap) + prefixFieldClashes(data, f.FieldMap, entry.HasCaller()) timestampFormat := f.TimestampFormat if timestampFormat == "" { @@ -80,6 +81,10 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { } data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() + if entry.HasCaller() { + data[f.FieldMap.resolve(FieldKeyFunc)] = entry.Caller.Function + data[f.FieldMap.resolve(FieldKeyFile)] = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) + } var b *bytes.Buffer if entry.Buffer != nil { diff --git a/vendor/github.com/Sirupsen/logrus/logger.go b/vendor/github.com/Sirupsen/logrus/logger.go index b67bfcbd3..5ceca0eab 100644 --- a/vendor/github.com/Sirupsen/logrus/logger.go +++ b/vendor/github.com/Sirupsen/logrus/logger.go @@ -24,6 +24,10 @@ type Logger struct { // own that implements the `Formatter` interface, see the `README` or included // formatters for examples. Formatter Formatter + + // Flag for whether to log caller info (off by default) + ReportCaller bool + // The logging level the logger should log at. This is typically (and defaults // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be // logged. @@ -32,8 +36,12 @@ type Logger struct { mu MutexWrap // Reusable empty entry entryPool sync.Pool + // Function to exit the application, defaults to `os.Exit()` + ExitFunc exitFunc } +type exitFunc func(int) + type MutexWrap struct { lock sync.Mutex disabled bool @@ -69,10 +77,12 @@ func (mw *MutexWrap) Disable() { // It's recommended to make this a global instance called `log`. func New() *Logger { return &Logger{ - Out: os.Stderr, - Formatter: new(TextFormatter), - Hooks: make(LevelHooks), - Level: InfoLevel, + Out: os.Stderr, + Formatter: new(TextFormatter), + Hooks: make(LevelHooks), + Level: InfoLevel, + ExitFunc: os.Exit, + ReportCaller: false, } } @@ -121,6 +131,14 @@ func (logger *Logger) WithTime(t time.Time) *Entry { return entry.WithTime(t) } +func (logger *Logger) Tracef(format string, args ...interface{}) { + if logger.IsLevelEnabled(TraceLevel) { + entry := logger.newEntry() + entry.Tracef(format, args...) + logger.releaseEntry(entry) + } +} + func (logger *Logger) Debugf(format string, args ...interface{}) { if logger.IsLevelEnabled(DebugLevel) { entry := logger.newEntry() @@ -173,7 +191,7 @@ func (logger *Logger) Fatalf(format string, args ...interface{}) { entry.Fatalf(format, args...) logger.releaseEntry(entry) } - Exit(1) + logger.Exit(1) } func (logger *Logger) Panicf(format string, args ...interface{}) { @@ -184,6 +202,14 @@ func (logger *Logger) Panicf(format string, args ...interface{}) { } } +func (logger *Logger) Trace(args ...interface{}) { + if logger.IsLevelEnabled(TraceLevel) { + entry := logger.newEntry() + entry.Trace(args...) + logger.releaseEntry(entry) + } +} + func (logger *Logger) Debug(args ...interface{}) { if logger.IsLevelEnabled(DebugLevel) { entry := logger.newEntry() @@ -236,7 +262,7 @@ func (logger *Logger) Fatal(args ...interface{}) { entry.Fatal(args...) logger.releaseEntry(entry) } - Exit(1) + logger.Exit(1) } func (logger *Logger) Panic(args ...interface{}) { @@ -247,6 +273,14 @@ func (logger *Logger) Panic(args ...interface{}) { } } +func (logger *Logger) Traceln(args ...interface{}) { + if logger.IsLevelEnabled(TraceLevel) { + entry := logger.newEntry() + entry.Traceln(args...) + logger.releaseEntry(entry) + } +} + func (logger *Logger) Debugln(args ...interface{}) { if logger.IsLevelEnabled(DebugLevel) { entry := logger.newEntry() @@ -299,7 +333,7 @@ func (logger *Logger) Fatalln(args ...interface{}) { entry.Fatalln(args...) logger.releaseEntry(entry) } - Exit(1) + logger.Exit(1) } func (logger *Logger) Panicln(args ...interface{}) { @@ -310,6 +344,14 @@ func (logger *Logger) Panicln(args ...interface{}) { } } +func (logger *Logger) Exit(code int) { + runHandlers() + if logger.ExitFunc == nil { + logger.ExitFunc = os.Exit + } + logger.ExitFunc(code) +} + //When file is opened with appending mode, it's safe to //write concurrently to a file (within 4k message on Linux). //In these cases user can choose to disable the lock. @@ -357,6 +399,12 @@ func (logger *Logger) SetOutput(output io.Writer) { logger.Out = output } +func (logger *Logger) SetReportCaller(reportCaller bool) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.ReportCaller = reportCaller +} + // ReplaceHooks replaces the logger hooks and returns the old ones func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks { logger.mu.Lock() diff --git a/vendor/github.com/Sirupsen/logrus/logrus.go b/vendor/github.com/Sirupsen/logrus/logrus.go index fa0b9dea8..4ef451866 100644 --- a/vendor/github.com/Sirupsen/logrus/logrus.go +++ b/vendor/github.com/Sirupsen/logrus/logrus.go @@ -15,6 +15,8 @@ type Level uint32 // Convert the Level to a string. E.g. PanicLevel becomes "panic". func (level Level) String() string { switch level { + case TraceLevel: + return "trace" case DebugLevel: return "debug" case InfoLevel: @@ -47,12 +49,26 @@ func ParseLevel(lvl string) (Level, error) { return InfoLevel, nil case "debug": return DebugLevel, nil + case "trace": + return TraceLevel, nil } var l Level return l, fmt.Errorf("not a valid logrus Level: %q", lvl) } +// UnmarshalText implements encoding.TextUnmarshaler. +func (level *Level) UnmarshalText(text []byte) error { + l, err := ParseLevel(string(text)) + if err != nil { + return err + } + + *level = Level(l) + + return nil +} + // A constant exposing all logging levels var AllLevels = []Level{ PanicLevel, @@ -61,6 +77,7 @@ var AllLevels = []Level{ WarnLevel, InfoLevel, DebugLevel, + TraceLevel, } // These are the different logging levels. You can set the logging level to log @@ -69,7 +86,7 @@ const ( // PanicLevel level, highest level of severity. Logs and then calls panic with the // message passed to Debug, Info, ... PanicLevel Level = iota - // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the + // FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the // logging level is set to Panic. FatalLevel // ErrorLevel level. Logs. Used for errors that should definitely be noted. @@ -82,6 +99,8 @@ const ( InfoLevel // DebugLevel level. Usually only enabled when debugging. Very verbose logging. DebugLevel + // TraceLevel level. Designates finer-grained informational events than the Debug. + TraceLevel ) // Won't compile if StdLogger can't be realized by a log.Logger @@ -148,3 +167,12 @@ type FieldLogger interface { // IsFatalEnabled() bool // IsPanicEnabled() bool } + +// Ext1FieldLogger (the first extension to FieldLogger) is superfluous, it is +// here for consistancy. Do not use. Use Logger or Entry instead. +type Ext1FieldLogger interface { + FieldLogger + Tracef(format string, args ...interface{}) + Trace(args ...interface{}) + Traceln(args ...interface{}) +} diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter.go b/vendor/github.com/Sirupsen/logrus/text_formatter.go index d4663b8c2..49ec92f17 100644 --- a/vendor/github.com/Sirupsen/logrus/text_formatter.go +++ b/vendor/github.com/Sirupsen/logrus/text_formatter.go @@ -107,7 +107,7 @@ func (f *TextFormatter) isColored() bool { // Format renders a single log entry func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { - prefixFieldClashes(entry.Data, f.FieldMap) + prefixFieldClashes(entry.Data, f.FieldMap, entry.HasCaller()) keys := make([]string, 0, len(entry.Data)) for k := range entry.Data { @@ -125,6 +125,10 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { if entry.err != "" { fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError)) } + if entry.HasCaller() { + fixedKeys = append(fixedKeys, + f.FieldMap.resolve(FieldKeyFunc), f.FieldMap.resolve(FieldKeyFile)) + } if !f.DisableSorting { if f.SortingFunc == nil { @@ -160,15 +164,19 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { } else { for _, key := range fixedKeys { var value interface{} - switch key { - case f.FieldMap.resolve(FieldKeyTime): + switch { + case key == f.FieldMap.resolve(FieldKeyTime): value = entry.Time.Format(timestampFormat) - case f.FieldMap.resolve(FieldKeyLevel): + case key == f.FieldMap.resolve(FieldKeyLevel): value = entry.Level.String() - case f.FieldMap.resolve(FieldKeyMsg): + case key == f.FieldMap.resolve(FieldKeyMsg): value = entry.Message - case f.FieldMap.resolve(FieldKeyLogrusError): + case key == f.FieldMap.resolve(FieldKeyLogrusError): value = entry.err + case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller(): + value = entry.Caller.Function + case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller(): + value = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) default: value = entry.Data[key] } @@ -183,7 +191,7 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) { var levelColor int switch entry.Level { - case DebugLevel: + case DebugLevel, TraceLevel: levelColor = gray case WarnLevel: levelColor = yellow @@ -202,12 +210,19 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin // the behavior of logrus text_formatter the same as the stdlib log package entry.Message = strings.TrimSuffix(entry.Message, "\n") + caller := "" + + if entry.HasCaller() { + caller = fmt.Sprintf("%s:%d %s()", + entry.Caller.File, entry.Caller.Line, entry.Caller.Function) + } + if f.DisableTimestamp { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message) + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m%s %-44s ", levelColor, levelText, caller, entry.Message) } else if !f.FullTimestamp { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message) + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d]%s %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), caller, entry.Message) } else { - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message) + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]%s %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), caller, entry.Message) } for _, k := range keys { v := entry.Data[k] diff --git a/vendor/github.com/Sirupsen/logrus/writer.go b/vendor/github.com/Sirupsen/logrus/writer.go index 7bdebedc6..9e1f75135 100644 --- a/vendor/github.com/Sirupsen/logrus/writer.go +++ b/vendor/github.com/Sirupsen/logrus/writer.go @@ -24,6 +24,8 @@ func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { var printFunc func(args ...interface{}) switch level { + case TraceLevel: + printFunc = entry.Trace case DebugLevel: printFunc = entry.Debug case InfoLevel: diff --git a/vendor/github.com/blang/semver/.travis.yml b/vendor/github.com/blang/semver/.travis.yml new file mode 100644 index 000000000..102fb9a69 --- /dev/null +++ b/vendor/github.com/blang/semver/.travis.yml @@ -0,0 +1,21 @@ +language: go +matrix: + include: + - go: 1.4.3 + - go: 1.5.4 + - go: 1.6.3 + - go: 1.7 + - go: tip + allow_failures: + - go: tip +install: +- go get golang.org/x/tools/cmd/cover +- go get github.com/mattn/goveralls +script: +- echo "Test and track coverage" ; $HOME/gopath/bin/goveralls -package "." -service=travis-ci + -repotoken $COVERALLS_TOKEN +- echo "Build examples" ; cd examples && go build +- echo "Check if gofmt'd" ; diff -u <(echo -n) <(gofmt -d -s .) +env: + global: + secure: HroGEAUQpVq9zX1b1VIkraLiywhGbzvNnTZq2TMxgK7JHP8xqNplAeF1izrR2i4QLL9nsY+9WtYss4QuPvEtZcVHUobw6XnL6radF7jS1LgfYZ9Y7oF+zogZ2I5QUMRLGA7rcxQ05s7mKq3XZQfeqaNts4bms/eZRefWuaFZbkw= diff --git a/vendor/github.com/blang/semver/README.md b/vendor/github.com/blang/semver/README.md new file mode 100644 index 000000000..08b2e4a3d --- /dev/null +++ b/vendor/github.com/blang/semver/README.md @@ -0,0 +1,194 @@ +semver for golang [![Build Status](https://travis-ci.org/blang/semver.svg?branch=master)](https://travis-ci.org/blang/semver) [![GoDoc](https://godoc.org/github.com/blang/semver?status.png)](https://godoc.org/github.com/blang/semver) [![Coverage Status](https://img.shields.io/coveralls/blang/semver.svg)](https://coveralls.io/r/blang/semver?branch=master) +====== + +semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`. + +Usage +----- +```bash +$ go get github.com/blang/semver +``` +Note: Always vendor your dependencies or fix on a specific version tag. + +```go +import github.com/blang/semver +v1, err := semver.Make("1.0.0-beta") +v2, err := semver.Make("2.0.0-beta") +v1.Compare(v2) +``` + +Also check the [GoDocs](http://godoc.org/github.com/blang/semver). + +Why should I use this lib? +----- + +- Fully spec compatible +- No reflection +- No regex +- Fully tested (Coverage >99%) +- Readable parsing/validation errors +- Fast (See [Benchmarks](#benchmarks)) +- Only Stdlib +- Uses values instead of pointers +- Many features, see below + + +Features +----- + +- Parsing and validation at all levels +- Comparator-like comparisons +- Compare Helper Methods +- InPlace manipulation +- Ranges `>=1.0.0 <2.0.0 || >=3.0.0 !3.0.1-beta.1` +- Wildcards `>=1.x`, `<=2.5.x` +- Sortable (implements sort.Interface) +- database/sql compatible (sql.Scanner/Valuer) +- encoding/json compatible (json.Marshaler/Unmarshaler) + +Ranges +------ + +A `Range` is a set of conditions which specify which versions satisfy the range. + +A condition is composed of an operator and a version. The supported operators are: + +- `<1.0.0` Less than `1.0.0` +- `<=1.0.0` Less than or equal to `1.0.0` +- `>1.0.0` Greater than `1.0.0` +- `>=1.0.0` Greater than or equal to `1.0.0` +- `1.0.0`, `=1.0.0`, `==1.0.0` Equal to `1.0.0` +- `!1.0.0`, `!=1.0.0` Not equal to `1.0.0`. Excludes version `1.0.0`. + +Note that spaces between the operator and the version will be gracefully tolerated. + +A `Range` can link multiple `Ranges` separated by space: + +Ranges can be linked by logical AND: + + - `>1.0.0 <2.0.0` would match between both ranges, so `1.1.1` and `1.8.7` but not `1.0.0` or `2.0.0` + - `>1.0.0 <3.0.0 !2.0.3-beta.2` would match every version between `1.0.0` and `3.0.0` except `2.0.3-beta.2` + +Ranges can also be linked by logical OR: + + - `<2.0.0 || >=3.0.0` would match `1.x.x` and `3.x.x` but not `2.x.x` + +AND has a higher precedence than OR. It's not possible to use brackets. + +Ranges can be combined by both AND and OR + + - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1` + +Range usage: + +``` +v, err := semver.Parse("1.2.3") +range, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0") +if range(v) { + //valid +} + +``` + +Example +----- + +Have a look at full examples in [examples/main.go](examples/main.go) + +```go +import github.com/blang/semver + +v, err := semver.Make("0.0.1-alpha.preview+123.github") +fmt.Printf("Major: %d\n", v.Major) +fmt.Printf("Minor: %d\n", v.Minor) +fmt.Printf("Patch: %d\n", v.Patch) +fmt.Printf("Pre: %s\n", v.Pre) +fmt.Printf("Build: %s\n", v.Build) + +// Prerelease versions array +if len(v.Pre) > 0 { + fmt.Println("Prerelease versions:") + for i, pre := range v.Pre { + fmt.Printf("%d: %q\n", i, pre) + } +} + +// Build meta data array +if len(v.Build) > 0 { + fmt.Println("Build meta data:") + for i, build := range v.Build { + fmt.Printf("%d: %q\n", i, build) + } +} + +v001, err := semver.Make("0.0.1") +// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE +v001.GT(v) == true +v.LT(v001) == true +v.GTE(v) == true +v.LTE(v) == true + +// Or use v.Compare(v2) for comparisons (-1, 0, 1): +v001.Compare(v) == 1 +v.Compare(v001) == -1 +v.Compare(v) == 0 + +// Manipulate Version in place: +v.Pre[0], err = semver.NewPRVersion("beta") +if err != nil { + fmt.Printf("Error parsing pre release version: %q", err) +} + +fmt.Println("\nValidate versions:") +v.Build[0] = "?" + +err = v.Validate() +if err != nil { + fmt.Printf("Validation failed: %s\n", err) +} +``` + + +Benchmarks +----- + + BenchmarkParseSimple-4 5000000 390 ns/op 48 B/op 1 allocs/op + BenchmarkParseComplex-4 1000000 1813 ns/op 256 B/op 7 allocs/op + BenchmarkParseAverage-4 1000000 1171 ns/op 163 B/op 4 allocs/op + BenchmarkStringSimple-4 20000000 119 ns/op 16 B/op 1 allocs/op + BenchmarkStringLarger-4 10000000 206 ns/op 32 B/op 2 allocs/op + BenchmarkStringComplex-4 5000000 324 ns/op 80 B/op 3 allocs/op + BenchmarkStringAverage-4 5000000 273 ns/op 53 B/op 2 allocs/op + BenchmarkValidateSimple-4 200000000 9.33 ns/op 0 B/op 0 allocs/op + BenchmarkValidateComplex-4 3000000 469 ns/op 0 B/op 0 allocs/op + BenchmarkValidateAverage-4 5000000 256 ns/op 0 B/op 0 allocs/op + BenchmarkCompareSimple-4 100000000 11.8 ns/op 0 B/op 0 allocs/op + BenchmarkCompareComplex-4 50000000 30.8 ns/op 0 B/op 0 allocs/op + BenchmarkCompareAverage-4 30000000 41.5 ns/op 0 B/op 0 allocs/op + BenchmarkSort-4 3000000 419 ns/op 256 B/op 2 allocs/op + BenchmarkRangeParseSimple-4 2000000 850 ns/op 192 B/op 5 allocs/op + BenchmarkRangeParseAverage-4 1000000 1677 ns/op 400 B/op 10 allocs/op + BenchmarkRangeParseComplex-4 300000 5214 ns/op 1440 B/op 30 allocs/op + BenchmarkRangeMatchSimple-4 50000000 25.6 ns/op 0 B/op 0 allocs/op + BenchmarkRangeMatchAverage-4 30000000 56.4 ns/op 0 B/op 0 allocs/op + BenchmarkRangeMatchComplex-4 10000000 153 ns/op 0 B/op 0 allocs/op + +See benchmark cases at [semver_test.go](semver_test.go) + + +Motivation +----- + +I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like. + + +Contribution +----- + +Feel free to make a pull request. For bigger changes create a issue first to discuss about it. + + +License +----- + +See [LICENSE](LICENSE) file. diff --git a/vendor/github.com/blang/semver/package.json b/vendor/github.com/blang/semver/package.json new file mode 100644 index 000000000..1cf8ebdd9 --- /dev/null +++ b/vendor/github.com/blang/semver/package.json @@ -0,0 +1,17 @@ +{ + "author": "blang", + "bugs": { + "URL": "https://github.com/blang/semver/issues", + "url": "https://github.com/blang/semver/issues" + }, + "gx": { + "dvcsimport": "github.com/blang/semver" + }, + "gxVersion": "0.10.0", + "language": "go", + "license": "MIT", + "name": "semver", + "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", + "version": "3.5.1" +} + diff --git a/vendor/github.com/creack/goselect/.gitignore b/vendor/github.com/creack/goselect/.gitignore new file mode 100644 index 000000000..6f4dacea8 --- /dev/null +++ b/vendor/github.com/creack/goselect/.gitignore @@ -0,0 +1,29 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof + +go-select* +goselect* +example-* +example/example diff --git a/vendor/github.com/creack/goselect/Dockerfile b/vendor/github.com/creack/goselect/Dockerfile new file mode 100644 index 000000000..d03b5a9d9 --- /dev/null +++ b/vendor/github.com/creack/goselect/Dockerfile @@ -0,0 +1,5 @@ +FROM google/golang:stable +MAINTAINER Guillaume J. Charmes +CMD /tmp/a.out +ADD . /src +RUN cd /src && go build -o /tmp/a.out diff --git a/vendor/github.com/creack/goselect/README.md b/vendor/github.com/creack/goselect/README.md new file mode 100644 index 000000000..d5d06510e --- /dev/null +++ b/vendor/github.com/creack/goselect/README.md @@ -0,0 +1,30 @@ +# go-select + +select(2) implementation in Go + +## Supported platforms + +| | 386 | amd64 | arm | arm64 | +|---------------|-----|-------|-----|-------| +| **linux** | yes | yes | yes | yes | +| **darwin** | yes | yes | n/a | ?? | +| **freebsd** | yes | yes | yes | ?? | +| **openbsd** | yes | yes | yes | ?? | +| **netbsd** | yes | yes | yes | ?? | +| **dragonfly** | n/a | yes | n/a | ?? | +| **solaris** | n/a | no | n/a | ?? | +| **plan9** | no | no | n/a | ?? | +| **windows** | yes | yes | n/a | ?? | +| **android** | n/a | n/a | no | ?? | + +*n/a: platform not supported by Go + +Go on `plan9` and `solaris` do not implement `syscall.Select` not `syscall.SYS_SELECT`. + +## Cross compile + +Using davecheney's https://github.com/davecheney/golang-crosscompile + +``` +export PLATFORMS="darwin/386 darwin/amd64 freebsd/386 freebsd/amd64 freebsd/arm linux/386 linux/amd64 linux/arm windows/386 windows/amd64 openbsd/386 openbsd/amd64 netbsd/386 netbsd/amd64 dragonfly/amd64 plan9/386 plan9/amd64 solaris/amd64" +``` diff --git a/vendor/github.com/creack/goselect/test_crosscompile.sh b/vendor/github.com/creack/goselect/test_crosscompile.sh new file mode 100755 index 000000000..533ca6647 --- /dev/null +++ b/vendor/github.com/creack/goselect/test_crosscompile.sh @@ -0,0 +1,17 @@ +export GOOS=linux; export GOARCH=arm; echo $GOOS/$GOARCH; go build +export GOOS=linux; export GOARCH=arm64; echo $GOOS/$GOARCH; go build +export GOOS=linux; export GOARCH=amd64; echo $GOOS/$GOARCH; go build +export GOOS=linux; export GOARCH=386; echo $GOOS/$GOARCH; go build +export GOOS=darwin; export GOARCH=arm; echo $GOOS/$GOARCH; go build +export GOOS=darwin; export GOARCH=arm64; echo $GOOS/$GOARCH; go build +export GOOS=darwin; export GOARCH=amd64; echo $GOOS/$GOARCH; go build +export GOOS=darwin; export GOARCH=386; echo $GOOS/$GOARCH; go build +export GOOS=freebsd; export GOARCH=arm; echo $GOOS/$GOARCH; go build +export GOOS=freebsd; export GOARCH=amd64; echo $GOOS/$GOARCH; go build +export GOOS=freebsd; export GOARCH=386; echo $GOOS/$GOARCH; go build +export GOOS=openbsd; export GOARCH=arm; echo $GOOS/$GOARCH; go build +export GOOS=openbsd; export GOARCH=amd64; echo $GOOS/$GOARCH; go build +export GOOS=openbsd; export GOARCH=386; echo $GOOS/$GOARCH; go build +export GOOS=netbsd; export GOARCH=arm; echo $GOOS/$GOARCH; go build +export GOOS=netbsd; export GOARCH=amd64; echo $GOOS/$GOARCH; go build +export GOOS=netbsd; export GOARCH=386; echo $GOOS/$GOARCH; go build diff --git a/vendor/github.com/davidmz/go-pageant/README.md b/vendor/github.com/davidmz/go-pageant/README.md new file mode 100644 index 000000000..23a352e41 --- /dev/null +++ b/vendor/github.com/davidmz/go-pageant/README.md @@ -0,0 +1,9 @@ +[![GoDoc](https://godoc.org/github.com/davidmz/go-pageant?status.svg)](https://godoc.org/github.com/davidmz/go-pageant) + +Package pageant provides an interface to PyTTY pageant.exe utility. + +This package is windows-only. + +See documentation on [GoDoc](http://godoc.org/github.com/davidmz/go-pageant) + +License: MIT \ No newline at end of file diff --git a/vendor/github.com/getlantern/context/.travis.yml b/vendor/github.com/getlantern/context/.travis.yml new file mode 100644 index 000000000..cc2835a08 --- /dev/null +++ b/vendor/github.com/getlantern/context/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - 1.6.2 + +install: + - go get -d -t -v ./... + - go build -v ./... + - go get golang.org/x/tools/cmd/cover + - go get -v github.com/axw/gocov/gocov + - go get -v github.com/mattn/goveralls + +script: + - go test -race -v -covermode=atomic -coverprofile=profile.cov + - $HOME/gopath/bin/goveralls -coverprofile=profile.cov -service=travis-ci diff --git a/vendor/github.com/getlantern/context/README.md b/vendor/github.com/getlantern/context/README.md new file mode 100644 index 000000000..978c9e05a --- /dev/null +++ b/vendor/github.com/getlantern/context/README.md @@ -0,0 +1,6 @@ +# context [![Travis CI Status](https://travis-ci.org/getlantern/context.svg?branch=master)](https://travis-ci.org/getlantern/context) [![Coverage Status](https://coveralls.io/repos/getlantern/context/badge.png?branch=master)](https://coveralls.io/r/getlantern/context) + +Provides goroutine-based context state inspired by https://github.com/tylerb/gls +and https://github.com/jtolds/gls. It uses the same basic hack as tylerb's +library, but adds a stack abstraction that allows nested contexts similar to +jtolds' library, but using `Enter()` and `Exit()` instead of callback functions. diff --git a/vendor/github.com/getlantern/context/context.go b/vendor/github.com/getlantern/context/context.go index d84e35770..2a9cc33ad 100644 --- a/vendor/github.com/getlantern/context/context.go +++ b/vendor/github.com/getlantern/context/context.go @@ -16,11 +16,13 @@ type Manager interface { // the current goroutine (if it has one). Go(func()) - // PutGlobal puts the given key->value pair into the globalc context. + // PutGlobal puts the given key->value pair into the global context. PutGlobal(key string, value interface{}) - // PutGlobalDynamic puts a key->value pair into the global context wwhere the value is - // generated by a function that gets evaluated at every Read. + // PutGlobalDynamic puts a key->value pair into the global context where the + // value is generated by a function that gets evaluated at every Read. If the + // value is a map[string]interface{}, we will unpack the map and set each + // contained key->value pair independently. PutGlobalDynamic(key string, valueFN func() interface{}) // AsMap returns a map containing all values from the supplied obj if it is a @@ -78,8 +80,10 @@ type Context interface { // stack (including parent contexts). PutIfAbsent(key string, value interface{}) Context - // PutDynamic puts a key->value pair into the current level of the context stack - // where the value is generated by a function that gets evaluated at every Read. + // PutDynamic puts a key->value pair into the current level of the context + // stack where the value is generated by a function that gets evaluated at + // every Read. If the value is a map[string]interface{}, we will unpack the + // map and set each contained key->value pair independently. PutDynamic(key string, valueFN func() interface{}) Context // Fill fills the given map with data from this Context @@ -266,14 +270,25 @@ func (c *context) asMap(cm *manager, obj interface{}, includeGlobals bool) Map { func fill(m Map, from Map) { if m != nil { + doFill := func(key string, _value interface{}) { + switch value := _value.(type) { + case map[string]interface{}: + for k, v := range value { + m[k] = v + } + default: + m[key] = value + } + } + for key, value := range from { _, alreadyRead := m[key] if !alreadyRead { switch v := value.(type) { case *dynval: - m[key] = v.fn() + doFill(key, v.fn()) default: - m[key] = v + doFill(key, v) } } } diff --git a/vendor/github.com/getlantern/golog/.travis.yml b/vendor/github.com/getlantern/golog/.travis.yml new file mode 100644 index 000000000..ab6a7f91b --- /dev/null +++ b/vendor/github.com/getlantern/golog/.travis.yml @@ -0,0 +1,14 @@ +language: go + +go: + - 1.4.1 + +install: + - go get -d -t -v ./... + - go build -v ./... + - go get golang.org/x/tools/cmd/cover + - go get -v github.com/axw/gocov/gocov + - go get -v github.com/mattn/goveralls + +script: + - $HOME/gopath/bin/goveralls -v -service travis-ci github.com/getlantern/golog \ No newline at end of file diff --git a/vendor/github.com/getlantern/golog/README.md b/vendor/github.com/getlantern/golog/README.md new file mode 100644 index 000000000..88fe677d1 --- /dev/null +++ b/vendor/github.com/getlantern/golog/README.md @@ -0,0 +1,6 @@ +golog [![Travis CI Status](https://travis-ci.org/getlantern/golog.svg?branch=master)](https://travis-ci.org/getlantern/golog) [![Coverage Status](https://coveralls.io/repos/getlantern/golog/badge.png)](https://coveralls.io/r/getlantern/golog) [![GoDoc](https://godoc.org/github.com/getlantern/golog?status.png)](http://godoc.org/github.com/getlantern/golog) +========== +Provides logging used in many getlantern components. + +[GoDoc](https://godoc.org/github.com/getlantern/golog) + diff --git a/vendor/github.com/getlantern/systray/.gitignore b/vendor/github.com/getlantern/systray/.gitignore new file mode 100644 index 000000000..ae7e06bd5 --- /dev/null +++ b/vendor/github.com/getlantern/systray/.gitignore @@ -0,0 +1,11 @@ +example/example +*~ +*.swp +*.exe +Release +Debug +*.sdf +dll/systray_unsigned.dll +out.txt +.vs +on_exit*.txt diff --git a/vendor/github.com/getlantern/systray/README.md b/vendor/github.com/getlantern/systray/README.md new file mode 100644 index 000000000..626c132b1 --- /dev/null +++ b/vendor/github.com/getlantern/systray/README.md @@ -0,0 +1,50 @@ +Package systray is a cross platfrom Go library to place an icon and menu in the notification area. +Tested on Windows 8, Mac OSX, Ubuntu 14.10 and Debian 7.6. + +## Usage +```go +func main() { + // Should be called at the very beginning of main(). + systray.Run(onReady, onExit) +} + +func onReady() { + systray.SetIcon(icon.Data) + systray.SetTitle("Awesome App") + systray.SetTooltip("Pretty awesome超级棒") + mQuit := systray.AddMenuItem("Quit", "Quit the whole app") + + // Sets the icon of a menu item. Only available on Mac. + mQuit.SetIcon(icon.Data) +} + +func onExit() { + // clean up here +} +``` +Menu item can be checked and / or disabled. Methods except `Run()` can be invoked from any goroutine. See demo code under `example` folder. + +## Platform specific concerns + +### Linux + +```sh +sudo apt-get install libgtk-3-dev libappindicator3-dev +``` +Checked menu item not implemented on Linux yet. + +## Try + +Under `example` folder. +Place tray icon under `icon`, and use `make_icon.bat` or `make_icon.sh`, whichever suit for your os, to convert the icon to byte array. +Your icon should be .ico file under Windows, whereas .ico, .jpg and .png is supported on other platform. + +```sh +go get +go run main.go +``` + +## Credits + +- https://github.com/xilp/systray +- https://github.com/cratonica/trayhost diff --git a/vendor/github.com/getlantern/systray/systray_darwin.m b/vendor/github.com/getlantern/systray/systray_darwin.m index e46694882..3d9286859 100644 --- a/vendor/github.com/getlantern/systray/systray_darwin.m +++ b/vendor/github.com/getlantern/systray/systray_darwin.m @@ -1,6 +1,14 @@ #import #include "systray.h" +#ifndef NSControlStateValueOff + #define NSControlStateValueOff NSOffState +#endif + +#ifndef NSControlStateValueOn + #define NSControlStateValueOn NSOnState +#endif + @interface MenuItem : NSObject { @public diff --git a/vendor/github.com/gin-contrib/sse/.travis.yml b/vendor/github.com/gin-contrib/sse/.travis.yml new file mode 100644 index 000000000..a556ac09e --- /dev/null +++ b/vendor/github.com/gin-contrib/sse/.travis.yml @@ -0,0 +1,15 @@ +language: go +sudo: false +go: + - 1.6.4 + - 1.7.4 + - tip + +git: + depth: 3 + +script: + - go test -v -covermode=count -coverprofile=coverage.out + +after_success: + - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/vendor/github.com/gin-contrib/sse/README.md b/vendor/github.com/gin-contrib/sse/README.md new file mode 100644 index 000000000..c9c49cf94 --- /dev/null +++ b/vendor/github.com/gin-contrib/sse/README.md @@ -0,0 +1,58 @@ +# Server-Sent Events + +[![GoDoc](https://godoc.org/github.com/gin-contrib/sse?status.svg)](https://godoc.org/github.com/gin-contrib/sse) +[![Build Status](https://travis-ci.org/gin-contrib/sse.svg)](https://travis-ci.org/gin-contrib/sse) +[![codecov](https://codecov.io/gh/gin-contrib/sse/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/sse) +[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/sse)](https://goreportcard.com/report/github.com/gin-contrib/sse) + +Server-sent events (SSE) is a technology where a browser receives automatic updates from a server via HTTP connection. The Server-Sent Events EventSource API is [standardized as part of HTML5[1] by the W3C](http://www.w3.org/TR/2009/WD-eventsource-20091029/). + +- [Read this great SSE introduction by the HTML5Rocks guys](http://www.html5rocks.com/en/tutorials/eventsource/basics/) +- [Browser support](http://caniuse.com/#feat=eventsource) + +## Sample code + +```go +import "github.com/gin-contrib/sse" + +func httpHandler(w http.ResponseWriter, req *http.Request) { + // data can be a primitive like a string, an integer or a float + sse.Encode(w, sse.Event{ + Event: "message", + Data: "some data\nmore data", + }) + + // also a complex type, like a map, a struct or a slice + sse.Encode(w, sse.Event{ + Id: "124", + Event: "message", + Data: map[string]interface{}{ + "user": "manu", + "date": time.Now().Unix(), + "content": "hi!", + }, + }) +} +``` +``` +event: message +data: some data\\nmore data + +id: 124 +event: message +data: {"content":"hi!","date":1431540810,"user":"manu"} + +``` + +## Content-Type + +```go +fmt.Println(sse.ContentType) +``` +``` +text/event-stream +``` + +## Decoding support + +There is a client-side implementation of SSE coming soon. diff --git a/vendor/github.com/gin-gonic/gin/.gitignore b/vendor/github.com/gin-gonic/gin/.gitignore new file mode 100644 index 000000000..14dc8f20d --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/.gitignore @@ -0,0 +1,5 @@ +vendor/* +!vendor/vendor.json +coverage.out +count.out +test diff --git a/vendor/github.com/gin-gonic/gin/.travis.yml b/vendor/github.com/gin-gonic/gin/.travis.yml new file mode 100644 index 000000000..e91015685 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/.travis.yml @@ -0,0 +1,35 @@ +language: go +sudo: false +go: + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x + - master + +git: + depth: 10 + +install: + - make install + +go_import_path: github.com/gin-gonic/gin + +script: + - make vet + - make fmt-check + - make embedmd + - make misspell-check + - make test + +after_success: + - bash <(curl -s https://codecov.io/bash) + +notifications: + webhooks: + urls: + - https://webhooks.gitter.im/e/7f95bf605c4d356372f4 + on_success: change # options: [always|never|change] default: always + on_failure: always # options: [always|never|change] default: always + on_start: false # default: false diff --git a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md new file mode 100644 index 000000000..9a7df86a3 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md @@ -0,0 +1,604 @@ + +## Benchmark System + +**VM HOST:** DigitalOcean +**Machine:** 4 CPU, 8 GB RAM. Ubuntu 16.04.2 x64 +**Date:** July 19th, 2017 +**Go Version:** 1.8.3 linux/amd64 +**Source:** [Go HTTP Router Benchmark](https://github.com/julienschmidt/go-http-routing-benchmark) + +## Static Routes: 157 + +``` +Gin: 30512 Bytes + +HttpServeMux: 17344 Bytes +Ace: 30080 Bytes +Bear: 30472 Bytes +Beego: 96408 Bytes +Bone: 37904 Bytes +Denco: 10464 Bytes +Echo: 73680 Bytes +GocraftWeb: 55720 Bytes +Goji: 27200 Bytes +Gojiv2: 104464 Bytes +GoJsonRest: 136472 Bytes +GoRestful: 914904 Bytes +GorillaMux: 675568 Bytes +HttpRouter: 21128 Bytes +HttpTreeMux: 73448 Bytes +Kocha: 115072 Bytes +LARS: 30120 Bytes +Macaron: 37984 Bytes +Martini: 310832 Bytes +Pat: 20464 Bytes +Possum: 91328 Bytes +R2router: 23712 Bytes +Rivet: 23880 Bytes +Tango: 28008 Bytes +TigerTonic: 80368 Bytes +Traffic: 626480 Bytes +Vulcan: 369064 Bytes +``` + +## GithubAPI Routes: 203 + +``` +Gin: 52672 Bytes + +Ace: 48992 Bytes +Bear: 161592 Bytes +Beego: 147992 Bytes +Bone: 97728 Bytes +Denco: 36440 Bytes +Echo: 95672 Bytes +GocraftWeb: 95640 Bytes +Goji: 86088 Bytes +Gojiv2: 144392 Bytes +GoJsonRest: 134648 Bytes +GoRestful: 1410760 Bytes +GorillaMux: 1509488 Bytes +HttpRouter: 37464 Bytes +HttpTreeMux: 78800 Bytes +Kocha: 785408 Bytes +LARS: 49032 Bytes +Macaron: 132712 Bytes +Martini: 564352 Bytes +Pat: 21200 Bytes +Possum: 83888 Bytes +R2router: 47104 Bytes +Rivet: 42840 Bytes +Tango: 54584 Bytes +TigerTonic: 96384 Bytes +Traffic: 1061920 Bytes +Vulcan: 465296 Bytes +``` + +## GPlusAPI Routes: 13 + +``` +Gin: 3968 Bytes + +Ace: 3600 Bytes +Bear: 7112 Bytes +Beego: 10048 Bytes +Bone: 6480 Bytes +Denco: 3256 Bytes +Echo: 9000 Bytes +GocraftWeb: 7496 Bytes +Goji: 2912 Bytes +Gojiv2: 7376 Bytes +GoJsonRest: 11544 Bytes +GoRestful: 88776 Bytes +GorillaMux: 71488 Bytes +HttpRouter: 2712 Bytes +HttpTreeMux: 7440 Bytes +Kocha: 128880 Bytes +LARS: 3640 Bytes +Macaron: 8656 Bytes +Martini: 23936 Bytes +Pat: 1856 Bytes +Possum: 7248 Bytes +R2router: 3928 Bytes +Rivet: 3064 Bytes +Tango: 4912 Bytes +TigerTonic: 9408 Bytes +Traffic: 49472 Bytes +Vulcan: 25496 Bytes +``` + +## ParseAPI Routes: 26 + +``` +Gin: 6928 Bytes + +Ace: 6592 Bytes +Bear: 12320 Bytes +Beego: 18960 Bytes +Bone: 11024 Bytes +Denco: 4184 Bytes +Echo: 11168 Bytes +GocraftWeb: 12800 Bytes +Goji: 5232 Bytes +Gojiv2: 14464 Bytes +GoJsonRest: 14216 Bytes +GoRestful: 127368 Bytes +GorillaMux: 123016 Bytes +HttpRouter: 4976 Bytes +HttpTreeMux: 7848 Bytes +Kocha: 181712 Bytes +LARS: 6632 Bytes +Macaron: 13648 Bytes +Martini: 45952 Bytes +Pat: 2560 Bytes +Possum: 9200 Bytes +R2router: 7056 Bytes +Rivet: 5680 Bytes +Tango: 8664 Bytes +TigerTonic: 9840 Bytes +Traffic: 93480 Bytes +Vulcan: 44504 Bytes +``` + +## Static Routes + +``` +BenchmarkGin_StaticAll 50000 34506 ns/op 0 B/op 0 allocs/op + +BenchmarkAce_StaticAll 30000 49657 ns/op 0 B/op 0 allocs/op +BenchmarkHttpServeMux_StaticAll 2000 1183737 ns/op 96 B/op 8 allocs/op +BenchmarkBeego_StaticAll 5000 412621 ns/op 57776 B/op 628 allocs/op +BenchmarkBear_StaticAll 10000 149242 ns/op 20336 B/op 461 allocs/op +BenchmarkBone_StaticAll 10000 118583 ns/op 0 B/op 0 allocs/op +BenchmarkDenco_StaticAll 100000 13247 ns/op 0 B/op 0 allocs/op +BenchmarkEcho_StaticAll 20000 79914 ns/op 5024 B/op 157 allocs/op +BenchmarkGocraftWeb_StaticAll 10000 211823 ns/op 46440 B/op 785 allocs/op +BenchmarkGoji_StaticAll 10000 109390 ns/op 0 B/op 0 allocs/op +BenchmarkGojiv2_StaticAll 3000 415533 ns/op 145696 B/op 1099 allocs/op +BenchmarkGoJsonRest_StaticAll 5000 364403 ns/op 51653 B/op 1727 allocs/op +BenchmarkGoRestful_StaticAll 500 2578579 ns/op 314936 B/op 3144 allocs/op +BenchmarkGorillaMux_StaticAll 500 2704856 ns/op 115648 B/op 1578 allocs/op +BenchmarkHttpRouter_StaticAll 100000 18541 ns/op 0 B/op 0 allocs/op +BenchmarkHttpTreeMux_StaticAll 100000 22332 ns/op 0 B/op 0 allocs/op +BenchmarkKocha_StaticAll 50000 31176 ns/op 0 B/op 0 allocs/op +BenchmarkLARS_StaticAll 50000 40840 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_StaticAll 5000 517656 ns/op 120576 B/op 1413 allocs/op +BenchmarkMartini_StaticAll 300 4462289 ns/op 125442 B/op 1717 allocs/op +BenchmarkPat_StaticAll 500 2157275 ns/op 533904 B/op 11123 allocs/op +BenchmarkPossum_StaticAll 10000 254701 ns/op 65312 B/op 471 allocs/op +BenchmarkR2router_StaticAll 10000 133956 ns/op 22608 B/op 628 allocs/op +BenchmarkRivet_StaticAll 30000 46812 ns/op 0 B/op 0 allocs/op +BenchmarkTango_StaticAll 5000 390613 ns/op 39225 B/op 1256 allocs/op +BenchmarkTigerTonic_StaticAll 20000 88060 ns/op 7504 B/op 157 allocs/op +BenchmarkTraffic_StaticAll 500 2910236 ns/op 729736 B/op 14287 allocs/op +BenchmarkVulcan_StaticAll 5000 277366 ns/op 15386 B/op 471 allocs/op +``` + +## Micro Benchmarks + +``` +BenchmarkGin_Param 20000000 113 ns/op 0 B/op 0 allocs/op + +BenchmarkAce_Param 5000000 375 ns/op 32 B/op 1 allocs/op +BenchmarkBear_Param 1000000 1709 ns/op 456 B/op 5 allocs/op +BenchmarkBeego_Param 1000000 2484 ns/op 368 B/op 4 allocs/op +BenchmarkBone_Param 1000000 2391 ns/op 688 B/op 5 allocs/op +BenchmarkDenco_Param 10000000 240 ns/op 32 B/op 1 allocs/op +BenchmarkEcho_Param 5000000 366 ns/op 32 B/op 1 allocs/op +BenchmarkGocraftWeb_Param 1000000 2343 ns/op 648 B/op 8 allocs/op +BenchmarkGoji_Param 1000000 1197 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_Param 1000000 2771 ns/op 944 B/op 8 allocs/op +BenchmarkGoJsonRest_Param 1000000 2993 ns/op 649 B/op 13 allocs/op +BenchmarkGoRestful_Param 200000 8860 ns/op 2296 B/op 21 allocs/op +BenchmarkGorillaMux_Param 500000 4461 ns/op 1056 B/op 11 allocs/op +BenchmarkHttpRouter_Param 10000000 175 ns/op 32 B/op 1 allocs/op +BenchmarkHttpTreeMux_Param 1000000 1167 ns/op 352 B/op 3 allocs/op +BenchmarkKocha_Param 3000000 429 ns/op 56 B/op 3 allocs/op +BenchmarkLARS_Param 10000000 134 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_Param 500000 4635 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_Param 200000 9933 ns/op 1072 B/op 10 allocs/op +BenchmarkPat_Param 1000000 2929 ns/op 648 B/op 12 allocs/op +BenchmarkPossum_Param 1000000 2503 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_Param 1000000 1507 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_Param 5000000 297 ns/op 48 B/op 1 allocs/op +BenchmarkTango_Param 1000000 1862 ns/op 248 B/op 8 allocs/op +BenchmarkTigerTonic_Param 500000 5660 ns/op 992 B/op 17 allocs/op +BenchmarkTraffic_Param 200000 8408 ns/op 1960 B/op 21 allocs/op +BenchmarkVulcan_Param 2000000 963 ns/op 98 B/op 3 allocs/op +BenchmarkAce_Param5 2000000 740 ns/op 160 B/op 1 allocs/op +BenchmarkBear_Param5 1000000 2777 ns/op 501 B/op 5 allocs/op +BenchmarkBeego_Param5 1000000 3740 ns/op 368 B/op 4 allocs/op +BenchmarkBone_Param5 1000000 2950 ns/op 736 B/op 5 allocs/op +BenchmarkDenco_Param5 2000000 644 ns/op 160 B/op 1 allocs/op +BenchmarkEcho_Param5 3000000 558 ns/op 32 B/op 1 allocs/op +BenchmarkGin_Param5 10000000 198 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_Param5 500000 3870 ns/op 920 B/op 11 allocs/op +BenchmarkGoji_Param5 1000000 1746 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_Param5 1000000 3214 ns/op 1008 B/op 8 allocs/op +BenchmarkGoJsonRest_Param5 500000 5509 ns/op 1097 B/op 16 allocs/op +BenchmarkGoRestful_Param5 200000 11232 ns/op 2392 B/op 21 allocs/op +BenchmarkGorillaMux_Param5 300000 7777 ns/op 1184 B/op 11 allocs/op +BenchmarkHttpRouter_Param5 3000000 631 ns/op 160 B/op 1 allocs/op +BenchmarkHttpTreeMux_Param5 1000000 2800 ns/op 576 B/op 6 allocs/op +BenchmarkKocha_Param5 1000000 2053 ns/op 440 B/op 10 allocs/op +BenchmarkLARS_Param5 10000000 232 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_Param5 500000 5888 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_Param5 200000 12807 ns/op 1232 B/op 11 allocs/op +BenchmarkPat_Param5 300000 7320 ns/op 964 B/op 32 allocs/op +BenchmarkPossum_Param5 1000000 2495 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_Param5 1000000 1844 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_Param5 2000000 935 ns/op 240 B/op 1 allocs/op +BenchmarkTango_Param5 1000000 2327 ns/op 360 B/op 8 allocs/op +BenchmarkTigerTonic_Param5 100000 18514 ns/op 2551 B/op 43 allocs/op +BenchmarkTraffic_Param5 200000 11997 ns/op 2248 B/op 25 allocs/op +BenchmarkVulcan_Param5 1000000 1333 ns/op 98 B/op 3 allocs/op +BenchmarkAce_Param20 1000000 2031 ns/op 640 B/op 1 allocs/op +BenchmarkBear_Param20 200000 7285 ns/op 1664 B/op 5 allocs/op +BenchmarkBeego_Param20 300000 6224 ns/op 368 B/op 4 allocs/op +BenchmarkBone_Param20 200000 8023 ns/op 1903 B/op 5 allocs/op +BenchmarkDenco_Param20 1000000 2262 ns/op 640 B/op 1 allocs/op +BenchmarkEcho_Param20 1000000 1387 ns/op 32 B/op 1 allocs/op +BenchmarkGin_Param20 3000000 503 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_Param20 100000 14408 ns/op 3795 B/op 15 allocs/op +BenchmarkGoji_Param20 500000 5272 ns/op 1247 B/op 2 allocs/op +BenchmarkGojiv2_Param20 1000000 4163 ns/op 1248 B/op 8 allocs/op +BenchmarkGoJsonRest_Param20 100000 17866 ns/op 4485 B/op 20 allocs/op +BenchmarkGoRestful_Param20 100000 21022 ns/op 4724 B/op 23 allocs/op +BenchmarkGorillaMux_Param20 100000 17055 ns/op 3547 B/op 13 allocs/op +BenchmarkHttpRouter_Param20 1000000 1748 ns/op 640 B/op 1 allocs/op +BenchmarkHttpTreeMux_Param20 200000 12246 ns/op 3196 B/op 10 allocs/op +BenchmarkKocha_Param20 300000 6861 ns/op 1808 B/op 27 allocs/op +BenchmarkLARS_Param20 3000000 526 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_Param20 100000 13069 ns/op 2906 B/op 12 allocs/op +BenchmarkMartini_Param20 100000 23602 ns/op 3597 B/op 13 allocs/op +BenchmarkPat_Param20 50000 32143 ns/op 4688 B/op 111 allocs/op +BenchmarkPossum_Param20 1000000 2396 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_Param20 200000 8907 ns/op 2283 B/op 7 allocs/op +BenchmarkRivet_Param20 1000000 3280 ns/op 1024 B/op 1 allocs/op +BenchmarkTango_Param20 500000 4640 ns/op 856 B/op 8 allocs/op +BenchmarkTigerTonic_Param20 20000 67581 ns/op 10532 B/op 138 allocs/op +BenchmarkTraffic_Param20 50000 40313 ns/op 7941 B/op 45 allocs/op +BenchmarkVulcan_Param20 1000000 2264 ns/op 98 B/op 3 allocs/op +BenchmarkAce_ParamWrite 3000000 532 ns/op 40 B/op 2 allocs/op +BenchmarkBear_ParamWrite 1000000 1778 ns/op 456 B/op 5 allocs/op +BenchmarkBeego_ParamWrite 1000000 2596 ns/op 376 B/op 5 allocs/op +BenchmarkBone_ParamWrite 1000000 2519 ns/op 688 B/op 5 allocs/op +BenchmarkDenco_ParamWrite 5000000 411 ns/op 32 B/op 1 allocs/op +BenchmarkEcho_ParamWrite 2000000 718 ns/op 40 B/op 2 allocs/op +BenchmarkGin_ParamWrite 5000000 283 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_ParamWrite 1000000 2561 ns/op 656 B/op 9 allocs/op +BenchmarkGoji_ParamWrite 1000000 1378 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_ParamWrite 1000000 3128 ns/op 976 B/op 10 allocs/op +BenchmarkGoJsonRest_ParamWrite 500000 4446 ns/op 1128 B/op 18 allocs/op +BenchmarkGoRestful_ParamWrite 200000 10291 ns/op 2304 B/op 22 allocs/op +BenchmarkGorillaMux_ParamWrite 500000 5153 ns/op 1064 B/op 12 allocs/op +BenchmarkHttpRouter_ParamWrite 5000000 263 ns/op 32 B/op 1 allocs/op +BenchmarkHttpTreeMux_ParamWrite 1000000 1351 ns/op 352 B/op 3 allocs/op +BenchmarkKocha_ParamWrite 3000000 538 ns/op 56 B/op 3 allocs/op +BenchmarkLARS_ParamWrite 5000000 316 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_ParamWrite 500000 5756 ns/op 1160 B/op 14 allocs/op +BenchmarkMartini_ParamWrite 200000 13097 ns/op 1176 B/op 14 allocs/op +BenchmarkPat_ParamWrite 500000 4954 ns/op 1072 B/op 17 allocs/op +BenchmarkPossum_ParamWrite 1000000 2499 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_ParamWrite 1000000 1531 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_ParamWrite 3000000 570 ns/op 112 B/op 2 allocs/op +BenchmarkTango_ParamWrite 2000000 957 ns/op 136 B/op 4 allocs/op +BenchmarkTigerTonic_ParamWrite 200000 7025 ns/op 1424 B/op 23 allocs/op +BenchmarkTraffic_ParamWrite 200000 10112 ns/op 2384 B/op 25 allocs/op +BenchmarkVulcan_ParamWrite 1000000 1006 ns/op 98 B/op 3 allocs/op +``` + +## GitHub + +``` +BenchmarkGin_GithubStatic 10000000 156 ns/op 0 B/op 0 allocs/op + +BenchmarkAce_GithubStatic 5000000 294 ns/op 0 B/op 0 allocs/op +BenchmarkBear_GithubStatic 2000000 893 ns/op 120 B/op 3 allocs/op +BenchmarkBeego_GithubStatic 1000000 2491 ns/op 368 B/op 4 allocs/op +BenchmarkBone_GithubStatic 50000 25300 ns/op 2880 B/op 60 allocs/op +BenchmarkDenco_GithubStatic 20000000 76.0 ns/op 0 B/op 0 allocs/op +BenchmarkEcho_GithubStatic 2000000 516 ns/op 32 B/op 1 allocs/op +BenchmarkGocraftWeb_GithubStatic 1000000 1448 ns/op 296 B/op 5 allocs/op +BenchmarkGoji_GithubStatic 3000000 496 ns/op 0 B/op 0 allocs/op +BenchmarkGojiv2_GithubStatic 1000000 2941 ns/op 928 B/op 7 allocs/op +BenchmarkGoRestful_GithubStatic 100000 27256 ns/op 3224 B/op 22 allocs/op +BenchmarkGoJsonRest_GithubStatic 1000000 2196 ns/op 329 B/op 11 allocs/op +BenchmarkGorillaMux_GithubStatic 50000 31617 ns/op 736 B/op 10 allocs/op +BenchmarkHttpRouter_GithubStatic 20000000 88.4 ns/op 0 B/op 0 allocs/op +BenchmarkHttpTreeMux_GithubStatic 10000000 134 ns/op 0 B/op 0 allocs/op +BenchmarkKocha_GithubStatic 20000000 113 ns/op 0 B/op 0 allocs/op +BenchmarkLARS_GithubStatic 10000000 195 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GithubStatic 500000 3740 ns/op 768 B/op 9 allocs/op +BenchmarkMartini_GithubStatic 50000 27673 ns/op 768 B/op 9 allocs/op +BenchmarkPat_GithubStatic 100000 19470 ns/op 3648 B/op 76 allocs/op +BenchmarkPossum_GithubStatic 1000000 1729 ns/op 416 B/op 3 allocs/op +BenchmarkR2router_GithubStatic 2000000 879 ns/op 144 B/op 4 allocs/op +BenchmarkRivet_GithubStatic 10000000 231 ns/op 0 B/op 0 allocs/op +BenchmarkTango_GithubStatic 1000000 2325 ns/op 248 B/op 8 allocs/op +BenchmarkTigerTonic_GithubStatic 3000000 610 ns/op 48 B/op 1 allocs/op +BenchmarkTraffic_GithubStatic 20000 62973 ns/op 18904 B/op 148 allocs/op +BenchmarkVulcan_GithubStatic 1000000 1447 ns/op 98 B/op 3 allocs/op +BenchmarkAce_GithubParam 2000000 686 ns/op 96 B/op 1 allocs/op +BenchmarkBear_GithubParam 1000000 2155 ns/op 496 B/op 5 allocs/op +BenchmarkBeego_GithubParam 1000000 2713 ns/op 368 B/op 4 allocs/op +BenchmarkBone_GithubParam 100000 15088 ns/op 1760 B/op 18 allocs/op +BenchmarkDenco_GithubParam 2000000 629 ns/op 128 B/op 1 allocs/op +BenchmarkEcho_GithubParam 2000000 653 ns/op 32 B/op 1 allocs/op +BenchmarkGin_GithubParam 5000000 255 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_GithubParam 1000000 3145 ns/op 712 B/op 9 allocs/op +BenchmarkGoji_GithubParam 1000000 1916 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_GithubParam 1000000 3975 ns/op 1024 B/op 10 allocs/op +BenchmarkGoJsonRest_GithubParam 300000 4134 ns/op 713 B/op 14 allocs/op +BenchmarkGoRestful_GithubParam 50000 30782 ns/op 2360 B/op 21 allocs/op +BenchmarkGorillaMux_GithubParam 100000 17148 ns/op 1088 B/op 11 allocs/op +BenchmarkHttpRouter_GithubParam 3000000 523 ns/op 96 B/op 1 allocs/op +BenchmarkHttpTreeMux_GithubParam 1000000 1671 ns/op 384 B/op 4 allocs/op +BenchmarkKocha_GithubParam 1000000 1021 ns/op 128 B/op 5 allocs/op +BenchmarkLARS_GithubParam 5000000 283 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GithubParam 500000 4270 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_GithubParam 100000 21728 ns/op 1152 B/op 11 allocs/op +BenchmarkPat_GithubParam 200000 11208 ns/op 2464 B/op 48 allocs/op +BenchmarkPossum_GithubParam 1000000 2334 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_GithubParam 1000000 1487 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_GithubParam 2000000 782 ns/op 96 B/op 1 allocs/op +BenchmarkTango_GithubParam 1000000 2653 ns/op 344 B/op 8 allocs/op +BenchmarkTigerTonic_GithubParam 300000 14073 ns/op 1440 B/op 24 allocs/op +BenchmarkTraffic_GithubParam 50000 29164 ns/op 5992 B/op 52 allocs/op +BenchmarkVulcan_GithubParam 1000000 2529 ns/op 98 B/op 3 allocs/op +BenchmarkAce_GithubAll 10000 134059 ns/op 13792 B/op 167 allocs/op +BenchmarkBear_GithubAll 5000 534445 ns/op 86448 B/op 943 allocs/op +BenchmarkBeego_GithubAll 3000 592444 ns/op 74705 B/op 812 allocs/op +BenchmarkBone_GithubAll 200 6957308 ns/op 698784 B/op 8453 allocs/op +BenchmarkDenco_GithubAll 10000 158819 ns/op 20224 B/op 167 allocs/op +BenchmarkEcho_GithubAll 10000 154700 ns/op 6496 B/op 203 allocs/op +BenchmarkGin_GithubAll 30000 48375 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_GithubAll 3000 570806 ns/op 131656 B/op 1686 allocs/op +BenchmarkGoji_GithubAll 2000 818034 ns/op 56112 B/op 334 allocs/op +BenchmarkGojiv2_GithubAll 2000 1213973 ns/op 274768 B/op 3712 allocs/op +BenchmarkGoJsonRest_GithubAll 2000 785796 ns/op 134371 B/op 2737 allocs/op +BenchmarkGoRestful_GithubAll 300 5238188 ns/op 689672 B/op 4519 allocs/op +BenchmarkGorillaMux_GithubAll 100 10257726 ns/op 211840 B/op 2272 allocs/op +BenchmarkHttpRouter_GithubAll 20000 105414 ns/op 13792 B/op 167 allocs/op +BenchmarkHttpTreeMux_GithubAll 10000 319934 ns/op 65856 B/op 671 allocs/op +BenchmarkKocha_GithubAll 10000 209442 ns/op 23304 B/op 843 allocs/op +BenchmarkLARS_GithubAll 20000 62565 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GithubAll 2000 1161270 ns/op 204194 B/op 2000 allocs/op +BenchmarkMartini_GithubAll 200 9991713 ns/op 226549 B/op 2325 allocs/op +BenchmarkPat_GithubAll 200 5590793 ns/op 1499568 B/op 27435 allocs/op +BenchmarkPossum_GithubAll 10000 319768 ns/op 84448 B/op 609 allocs/op +BenchmarkR2router_GithubAll 10000 305134 ns/op 77328 B/op 979 allocs/op +BenchmarkRivet_GithubAll 10000 132134 ns/op 16272 B/op 167 allocs/op +BenchmarkTango_GithubAll 3000 552754 ns/op 63826 B/op 1618 allocs/op +BenchmarkTigerTonic_GithubAll 1000 1439483 ns/op 239104 B/op 5374 allocs/op +BenchmarkTraffic_GithubAll 100 11383067 ns/op 2659329 B/op 21848 allocs/op +BenchmarkVulcan_GithubAll 5000 394253 ns/op 19894 B/op 609 allocs/op +``` + +## Google+ + +``` +BenchmarkGin_GPlusStatic 10000000 183 ns/op 0 B/op 0 allocs/op + +BenchmarkAce_GPlusStatic 5000000 276 ns/op 0 B/op 0 allocs/op +BenchmarkBear_GPlusStatic 2000000 652 ns/op 104 B/op 3 allocs/op +BenchmarkBeego_GPlusStatic 1000000 2239 ns/op 368 B/op 4 allocs/op +BenchmarkBone_GPlusStatic 5000000 380 ns/op 32 B/op 1 allocs/op +BenchmarkDenco_GPlusStatic 30000000 45.8 ns/op 0 B/op 0 allocs/op +BenchmarkEcho_GPlusStatic 5000000 338 ns/op 32 B/op 1 allocs/op +BenchmarkGocraftWeb_GPlusStatic 1000000 1158 ns/op 280 B/op 5 allocs/op +BenchmarkGoji_GPlusStatic 5000000 331 ns/op 0 B/op 0 allocs/op +BenchmarkGojiv2_GPlusStatic 1000000 2106 ns/op 928 B/op 7 allocs/op +BenchmarkGoJsonRest_GPlusStatic 1000000 1626 ns/op 329 B/op 11 allocs/op +BenchmarkGoRestful_GPlusStatic 300000 7598 ns/op 1976 B/op 20 allocs/op +BenchmarkGorillaMux_GPlusStatic 1000000 2629 ns/op 736 B/op 10 allocs/op +BenchmarkHttpRouter_GPlusStatic 30000000 52.5 ns/op 0 B/op 0 allocs/op +BenchmarkHttpTreeMux_GPlusStatic 20000000 85.8 ns/op 0 B/op 0 allocs/op +BenchmarkKocha_GPlusStatic 20000000 89.2 ns/op 0 B/op 0 allocs/op +BenchmarkLARS_GPlusStatic 10000000 162 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GPlusStatic 500000 3479 ns/op 768 B/op 9 allocs/op +BenchmarkMartini_GPlusStatic 200000 9092 ns/op 768 B/op 9 allocs/op +BenchmarkPat_GPlusStatic 3000000 493 ns/op 96 B/op 2 allocs/op +BenchmarkPossum_GPlusStatic 1000000 1467 ns/op 416 B/op 3 allocs/op +BenchmarkR2router_GPlusStatic 2000000 788 ns/op 144 B/op 4 allocs/op +BenchmarkRivet_GPlusStatic 20000000 114 ns/op 0 B/op 0 allocs/op +BenchmarkTango_GPlusStatic 1000000 1534 ns/op 200 B/op 8 allocs/op +BenchmarkTigerTonic_GPlusStatic 5000000 282 ns/op 32 B/op 1 allocs/op +BenchmarkTraffic_GPlusStatic 500000 3798 ns/op 1192 B/op 15 allocs/op +BenchmarkVulcan_GPlusStatic 2000000 1125 ns/op 98 B/op 3 allocs/op +BenchmarkAce_GPlusParam 3000000 528 ns/op 64 B/op 1 allocs/op +BenchmarkBear_GPlusParam 1000000 1570 ns/op 480 B/op 5 allocs/op +BenchmarkBeego_GPlusParam 1000000 2369 ns/op 368 B/op 4 allocs/op +BenchmarkBone_GPlusParam 1000000 2028 ns/op 688 B/op 5 allocs/op +BenchmarkDenco_GPlusParam 5000000 385 ns/op 64 B/op 1 allocs/op +BenchmarkEcho_GPlusParam 3000000 441 ns/op 32 B/op 1 allocs/op +BenchmarkGin_GPlusParam 10000000 174 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_GPlusParam 1000000 2033 ns/op 648 B/op 8 allocs/op +BenchmarkGoji_GPlusParam 1000000 1399 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_GPlusParam 1000000 2641 ns/op 944 B/op 8 allocs/op +BenchmarkGoJsonRest_GPlusParam 1000000 2824 ns/op 649 B/op 13 allocs/op +BenchmarkGoRestful_GPlusParam 200000 8875 ns/op 2296 B/op 21 allocs/op +BenchmarkGorillaMux_GPlusParam 200000 6291 ns/op 1056 B/op 11 allocs/op +BenchmarkHttpRouter_GPlusParam 5000000 316 ns/op 64 B/op 1 allocs/op +BenchmarkHttpTreeMux_GPlusParam 1000000 1129 ns/op 352 B/op 3 allocs/op +BenchmarkKocha_GPlusParam 3000000 538 ns/op 56 B/op 3 allocs/op +BenchmarkLARS_GPlusParam 10000000 198 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GPlusParam 500000 3554 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_GPlusParam 200000 9831 ns/op 1072 B/op 10 allocs/op +BenchmarkPat_GPlusParam 1000000 2706 ns/op 688 B/op 12 allocs/op +BenchmarkPossum_GPlusParam 1000000 2297 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_GPlusParam 1000000 1318 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_GPlusParam 5000000 399 ns/op 48 B/op 1 allocs/op +BenchmarkTango_GPlusParam 1000000 2070 ns/op 264 B/op 8 allocs/op +BenchmarkTigerTonic_GPlusParam 500000 4853 ns/op 1056 B/op 17 allocs/op +BenchmarkTraffic_GPlusParam 200000 8278 ns/op 1976 B/op 21 allocs/op +BenchmarkVulcan_GPlusParam 1000000 1243 ns/op 98 B/op 3 allocs/op +BenchmarkAce_GPlus2Params 3000000 549 ns/op 64 B/op 1 allocs/op +BenchmarkBear_GPlus2Params 1000000 2112 ns/op 496 B/op 5 allocs/op +BenchmarkBeego_GPlus2Params 500000 2750 ns/op 368 B/op 4 allocs/op +BenchmarkBone_GPlus2Params 300000 7032 ns/op 1040 B/op 9 allocs/op +BenchmarkDenco_GPlus2Params 3000000 502 ns/op 64 B/op 1 allocs/op +BenchmarkEcho_GPlus2Params 3000000 641 ns/op 32 B/op 1 allocs/op +BenchmarkGin_GPlus2Params 5000000 250 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_GPlus2Params 1000000 2681 ns/op 712 B/op 9 allocs/op +BenchmarkGoji_GPlus2Params 1000000 1926 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_GPlus2Params 500000 3996 ns/op 1024 B/op 11 allocs/op +BenchmarkGoJsonRest_GPlus2Params 500000 3886 ns/op 713 B/op 14 allocs/op +BenchmarkGoRestful_GPlus2Params 200000 10376 ns/op 2360 B/op 21 allocs/op +BenchmarkGorillaMux_GPlus2Params 100000 14162 ns/op 1088 B/op 11 allocs/op +BenchmarkHttpRouter_GPlus2Params 5000000 336 ns/op 64 B/op 1 allocs/op +BenchmarkHttpTreeMux_GPlus2Params 1000000 1523 ns/op 384 B/op 4 allocs/op +BenchmarkKocha_GPlus2Params 2000000 970 ns/op 128 B/op 5 allocs/op +BenchmarkLARS_GPlus2Params 5000000 238 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GPlus2Params 500000 4016 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_GPlus2Params 100000 21253 ns/op 1200 B/op 13 allocs/op +BenchmarkPat_GPlus2Params 200000 8632 ns/op 2256 B/op 34 allocs/op +BenchmarkPossum_GPlus2Params 1000000 2171 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_GPlus2Params 1000000 1340 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_GPlus2Params 3000000 557 ns/op 96 B/op 1 allocs/op +BenchmarkTango_GPlus2Params 1000000 2186 ns/op 344 B/op 8 allocs/op +BenchmarkTigerTonic_GPlus2Params 200000 9060 ns/op 1488 B/op 24 allocs/op +BenchmarkTraffic_GPlus2Params 100000 20324 ns/op 3272 B/op 31 allocs/op +BenchmarkVulcan_GPlus2Params 1000000 2039 ns/op 98 B/op 3 allocs/op +BenchmarkAce_GPlusAll 300000 6603 ns/op 640 B/op 11 allocs/op +BenchmarkBear_GPlusAll 100000 22363 ns/op 5488 B/op 61 allocs/op +BenchmarkBeego_GPlusAll 50000 38757 ns/op 4784 B/op 52 allocs/op +BenchmarkBone_GPlusAll 20000 54916 ns/op 10336 B/op 98 allocs/op +BenchmarkDenco_GPlusAll 300000 4959 ns/op 672 B/op 11 allocs/op +BenchmarkEcho_GPlusAll 200000 6558 ns/op 416 B/op 13 allocs/op +BenchmarkGin_GPlusAll 500000 2757 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_GPlusAll 50000 34615 ns/op 8040 B/op 103 allocs/op +BenchmarkGoji_GPlusAll 100000 16002 ns/op 3696 B/op 22 allocs/op +BenchmarkGojiv2_GPlusAll 50000 35060 ns/op 12624 B/op 115 allocs/op +BenchmarkGoJsonRest_GPlusAll 50000 41479 ns/op 8117 B/op 170 allocs/op +BenchmarkGoRestful_GPlusAll 10000 131653 ns/op 32024 B/op 275 allocs/op +BenchmarkGorillaMux_GPlusAll 10000 101380 ns/op 13296 B/op 142 allocs/op +BenchmarkHttpRouter_GPlusAll 500000 3711 ns/op 640 B/op 11 allocs/op +BenchmarkHttpTreeMux_GPlusAll 100000 14438 ns/op 4032 B/op 38 allocs/op +BenchmarkKocha_GPlusAll 200000 8039 ns/op 976 B/op 43 allocs/op +BenchmarkLARS_GPlusAll 500000 2630 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_GPlusAll 30000 51123 ns/op 13152 B/op 128 allocs/op +BenchmarkMartini_GPlusAll 10000 176157 ns/op 14016 B/op 145 allocs/op +BenchmarkPat_GPlusAll 20000 69911 ns/op 16576 B/op 298 allocs/op +BenchmarkPossum_GPlusAll 100000 20716 ns/op 5408 B/op 39 allocs/op +BenchmarkR2router_GPlusAll 100000 17463 ns/op 5040 B/op 63 allocs/op +BenchmarkRivet_GPlusAll 300000 5142 ns/op 768 B/op 11 allocs/op +BenchmarkTango_GPlusAll 50000 27321 ns/op 3656 B/op 104 allocs/op +BenchmarkTigerTonic_GPlusAll 20000 77597 ns/op 14512 B/op 288 allocs/op +BenchmarkTraffic_GPlusAll 10000 151406 ns/op 37360 B/op 392 allocs/op +BenchmarkVulcan_GPlusAll 100000 18555 ns/op 1274 B/op 39 allocs/op +``` + +## Parse.com + +``` +BenchmarkGin_ParseStatic 10000000 133 ns/op 0 B/op 0 allocs/op + +BenchmarkAce_ParseStatic 5000000 241 ns/op 0 B/op 0 allocs/op +BenchmarkBear_ParseStatic 2000000 728 ns/op 120 B/op 3 allocs/op +BenchmarkBeego_ParseStatic 1000000 2623 ns/op 368 B/op 4 allocs/op +BenchmarkBone_ParseStatic 1000000 1285 ns/op 144 B/op 3 allocs/op +BenchmarkDenco_ParseStatic 30000000 57.8 ns/op 0 B/op 0 allocs/op +BenchmarkEcho_ParseStatic 5000000 342 ns/op 32 B/op 1 allocs/op +BenchmarkGocraftWeb_ParseStatic 1000000 1478 ns/op 296 B/op 5 allocs/op +BenchmarkGoji_ParseStatic 3000000 415 ns/op 0 B/op 0 allocs/op +BenchmarkGojiv2_ParseStatic 1000000 2087 ns/op 928 B/op 7 allocs/op +BenchmarkGoJsonRest_ParseStatic 1000000 1712 ns/op 329 B/op 11 allocs/op +BenchmarkGoRestful_ParseStatic 200000 11072 ns/op 3224 B/op 22 allocs/op +BenchmarkGorillaMux_ParseStatic 500000 4129 ns/op 752 B/op 11 allocs/op +BenchmarkHttpRouter_ParseStatic 30000000 52.4 ns/op 0 B/op 0 allocs/op +BenchmarkHttpTreeMux_ParseStatic 20000000 109 ns/op 0 B/op 0 allocs/op +BenchmarkKocha_ParseStatic 20000000 81.8 ns/op 0 B/op 0 allocs/op +BenchmarkLARS_ParseStatic 10000000 150 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_ParseStatic 1000000 3288 ns/op 768 B/op 9 allocs/op +BenchmarkMartini_ParseStatic 200000 9110 ns/op 768 B/op 9 allocs/op +BenchmarkPat_ParseStatic 1000000 1135 ns/op 240 B/op 5 allocs/op +BenchmarkPossum_ParseStatic 1000000 1557 ns/op 416 B/op 3 allocs/op +BenchmarkR2router_ParseStatic 2000000 730 ns/op 144 B/op 4 allocs/op +BenchmarkRivet_ParseStatic 10000000 121 ns/op 0 B/op 0 allocs/op +BenchmarkTango_ParseStatic 1000000 1688 ns/op 248 B/op 8 allocs/op +BenchmarkTigerTonic_ParseStatic 3000000 427 ns/op 48 B/op 1 allocs/op +BenchmarkTraffic_ParseStatic 500000 5962 ns/op 1816 B/op 20 allocs/op +BenchmarkVulcan_ParseStatic 2000000 969 ns/op 98 B/op 3 allocs/op +BenchmarkAce_ParseParam 3000000 497 ns/op 64 B/op 1 allocs/op +BenchmarkBear_ParseParam 1000000 1473 ns/op 467 B/op 5 allocs/op +BenchmarkBeego_ParseParam 1000000 2384 ns/op 368 B/op 4 allocs/op +BenchmarkBone_ParseParam 1000000 2513 ns/op 768 B/op 6 allocs/op +BenchmarkDenco_ParseParam 5000000 364 ns/op 64 B/op 1 allocs/op +BenchmarkEcho_ParseParam 5000000 418 ns/op 32 B/op 1 allocs/op +BenchmarkGin_ParseParam 10000000 163 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_ParseParam 1000000 2361 ns/op 664 B/op 8 allocs/op +BenchmarkGoji_ParseParam 1000000 1590 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_ParseParam 1000000 2851 ns/op 976 B/op 9 allocs/op +BenchmarkGoJsonRest_ParseParam 1000000 2965 ns/op 649 B/op 13 allocs/op +BenchmarkGoRestful_ParseParam 200000 12207 ns/op 3544 B/op 23 allocs/op +BenchmarkGorillaMux_ParseParam 500000 5187 ns/op 1088 B/op 12 allocs/op +BenchmarkHttpRouter_ParseParam 5000000 275 ns/op 64 B/op 1 allocs/op +BenchmarkHttpTreeMux_ParseParam 1000000 1108 ns/op 352 B/op 3 allocs/op +BenchmarkKocha_ParseParam 3000000 495 ns/op 56 B/op 3 allocs/op +BenchmarkLARS_ParseParam 10000000 192 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_ParseParam 500000 4103 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_ParseParam 200000 9878 ns/op 1072 B/op 10 allocs/op +BenchmarkPat_ParseParam 500000 3657 ns/op 1120 B/op 17 allocs/op +BenchmarkPossum_ParseParam 1000000 2084 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_ParseParam 1000000 1251 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_ParseParam 5000000 335 ns/op 48 B/op 1 allocs/op +BenchmarkTango_ParseParam 1000000 1854 ns/op 280 B/op 8 allocs/op +BenchmarkTigerTonic_ParseParam 500000 4582 ns/op 1008 B/op 17 allocs/op +BenchmarkTraffic_ParseParam 200000 8125 ns/op 2248 B/op 23 allocs/op +BenchmarkVulcan_ParseParam 1000000 1148 ns/op 98 B/op 3 allocs/op +BenchmarkAce_Parse2Params 3000000 539 ns/op 64 B/op 1 allocs/op +BenchmarkBear_Parse2Params 1000000 1778 ns/op 496 B/op 5 allocs/op +BenchmarkBeego_Parse2Params 1000000 2519 ns/op 368 B/op 4 allocs/op +BenchmarkBone_Parse2Params 1000000 2596 ns/op 720 B/op 5 allocs/op +BenchmarkDenco_Parse2Params 3000000 492 ns/op 64 B/op 1 allocs/op +BenchmarkEcho_Parse2Params 3000000 484 ns/op 32 B/op 1 allocs/op +BenchmarkGin_Parse2Params 10000000 193 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_Parse2Params 1000000 2575 ns/op 712 B/op 9 allocs/op +BenchmarkGoji_Parse2Params 1000000 1373 ns/op 336 B/op 2 allocs/op +BenchmarkGojiv2_Parse2Params 500000 2416 ns/op 960 B/op 8 allocs/op +BenchmarkGoJsonRest_Parse2Params 300000 3452 ns/op 713 B/op 14 allocs/op +BenchmarkGoRestful_Parse2Params 100000 17719 ns/op 6008 B/op 25 allocs/op +BenchmarkGorillaMux_Parse2Params 300000 5102 ns/op 1088 B/op 11 allocs/op +BenchmarkHttpRouter_Parse2Params 5000000 303 ns/op 64 B/op 1 allocs/op +BenchmarkHttpTreeMux_Parse2Params 1000000 1372 ns/op 384 B/op 4 allocs/op +BenchmarkKocha_Parse2Params 2000000 874 ns/op 128 B/op 5 allocs/op +BenchmarkLARS_Parse2Params 10000000 192 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_Parse2Params 500000 3871 ns/op 1056 B/op 10 allocs/op +BenchmarkMartini_Parse2Params 200000 9954 ns/op 1152 B/op 11 allocs/op +BenchmarkPat_Parse2Params 500000 4194 ns/op 832 B/op 17 allocs/op +BenchmarkPossum_Parse2Params 1000000 2121 ns/op 560 B/op 6 allocs/op +BenchmarkR2router_Parse2Params 1000000 1415 ns/op 432 B/op 5 allocs/op +BenchmarkRivet_Parse2Params 3000000 457 ns/op 96 B/op 1 allocs/op +BenchmarkTango_Parse2Params 1000000 1914 ns/op 312 B/op 8 allocs/op +BenchmarkTigerTonic_Parse2Params 300000 6895 ns/op 1408 B/op 24 allocs/op +BenchmarkTraffic_Parse2Params 200000 8317 ns/op 2040 B/op 22 allocs/op +BenchmarkVulcan_Parse2Params 1000000 1274 ns/op 98 B/op 3 allocs/op +BenchmarkAce_ParseAll 200000 10401 ns/op 640 B/op 16 allocs/op +BenchmarkBear_ParseAll 50000 37743 ns/op 8928 B/op 110 allocs/op +BenchmarkBeego_ParseAll 20000 63193 ns/op 9568 B/op 104 allocs/op +BenchmarkBone_ParseAll 20000 61767 ns/op 14160 B/op 131 allocs/op +BenchmarkDenco_ParseAll 300000 7036 ns/op 928 B/op 16 allocs/op +BenchmarkEcho_ParseAll 200000 11824 ns/op 832 B/op 26 allocs/op +BenchmarkGin_ParseAll 300000 4199 ns/op 0 B/op 0 allocs/op +BenchmarkGocraftWeb_ParseAll 30000 51758 ns/op 13728 B/op 181 allocs/op +BenchmarkGoji_ParseAll 50000 29614 ns/op 5376 B/op 32 allocs/op +BenchmarkGojiv2_ParseAll 20000 68676 ns/op 24464 B/op 199 allocs/op +BenchmarkGoJsonRest_ParseAll 20000 76135 ns/op 13866 B/op 321 allocs/op +BenchmarkGoRestful_ParseAll 5000 389487 ns/op 110928 B/op 600 allocs/op +BenchmarkGorillaMux_ParseAll 10000 221250 ns/op 24864 B/op 292 allocs/op +BenchmarkHttpRouter_ParseAll 200000 6444 ns/op 640 B/op 16 allocs/op +BenchmarkHttpTreeMux_ParseAll 50000 30702 ns/op 5728 B/op 51 allocs/op +BenchmarkKocha_ParseAll 200000 13712 ns/op 1112 B/op 54 allocs/op +BenchmarkLARS_ParseAll 300000 6925 ns/op 0 B/op 0 allocs/op +BenchmarkMacaron_ParseAll 20000 96278 ns/op 24576 B/op 250 allocs/op +BenchmarkMartini_ParseAll 5000 271352 ns/op 25072 B/op 253 allocs/op +BenchmarkPat_ParseAll 20000 74941 ns/op 17264 B/op 343 allocs/op +BenchmarkPossum_ParseAll 50000 39947 ns/op 10816 B/op 78 allocs/op +BenchmarkR2router_ParseAll 50000 42479 ns/op 8352 B/op 120 allocs/op +BenchmarkRivet_ParseAll 200000 7726 ns/op 912 B/op 16 allocs/op +BenchmarkTango_ParseAll 30000 50014 ns/op 7168 B/op 208 allocs/op +BenchmarkTigerTonic_ParseAll 10000 106550 ns/op 19728 B/op 379 allocs/op +BenchmarkTraffic_ParseAll 10000 216037 ns/op 57776 B/op 642 allocs/op +BenchmarkVulcan_ParseAll 50000 34379 ns/op 2548 B/op 78 allocs/op +``` diff --git a/vendor/github.com/gin-gonic/gin/CHANGELOG.md b/vendor/github.com/gin-gonic/gin/CHANGELOG.md new file mode 100644 index 000000000..e6a108ca3 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/CHANGELOG.md @@ -0,0 +1,213 @@ +# CHANGELOG + +### Gin 1.3.0 + +- [NEW] Add [`func (*Context) QueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.QueryMap), [`func (*Context) GetQueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetQueryMap), [`func (*Context) PostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.PostFormMap) and [`func (*Context) GetPostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetPostFormMap) to support `type map[string]string` as query string or form parameters, see [#1383](https://github.com/gin-gonic/gin/pull/1383) +- [NEW] Add [`func (*Context) AsciiJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.AsciiJSON), see [#1358](https://github.com/gin-gonic/gin/pull/1358) +- [NEW] Add `Pusher()` in [`type ResponseWriter`](https://godoc.org/github.com/gin-gonic/gin#ResponseWriter) for supporting http2 push, see [#1273](https://github.com/gin-gonic/gin/pull/1273) +- [NEW] Add [`func (*Context) DataFromReader`](https://godoc.org/github.com/gin-gonic/gin#Context.DataFromReader) for serving dynamic data, see [#1304](https://github.com/gin-gonic/gin/pull/1304) +- [NEW] Add [`func (*Context) ShouldBindBodyWith`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindBodyWith) allowing to call binding multiple times, see [#1341](https://github.com/gin-gonic/gin/pull/1341) +- [NEW] Support pointers in form binding, see [#1336](https://github.com/gin-gonic/gin/pull/1336) +- [NEW] Add [`func (*Context) JSONP`](https://godoc.org/github.com/gin-gonic/gin#Context.JSONP), see [#1333](https://github.com/gin-gonic/gin/pull/1333) +- [NEW] Support default value in form binding, see [#1138](https://github.com/gin-gonic/gin/pull/1138) +- [NEW] Expose validator engine in [`type StructValidator`](https://godoc.org/github.com/gin-gonic/gin/binding#StructValidator), see [#1277](https://github.com/gin-gonic/gin/pull/1277) +- [NEW] Add [`func (*Context) ShouldBind`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind), [`func (*Context) ShouldBindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindQuery) and [`func (*Context) ShouldBindJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindJSON), see [#1047](https://github.com/gin-gonic/gin/pull/1047) +- [NEW] Add support for `time.Time` location in form binding, see [#1117](https://github.com/gin-gonic/gin/pull/1117) +- [NEW] Add [`func (*Context) BindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.BindQuery), see [#1029](https://github.com/gin-gonic/gin/pull/1029) +- [NEW] Make [jsonite](https://github.com/json-iterator/go) optional with build tags, see [#1026](https://github.com/gin-gonic/gin/pull/1026) +- [NEW] Show query string in logger, see [#999](https://github.com/gin-gonic/gin/pull/999) +- [NEW] Add [`func (*Context) SecureJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.SecureJSON), see [#987](https://github.com/gin-gonic/gin/pull/987) and [#993](https://github.com/gin-gonic/gin/pull/993) +- [DEPRECATE] `func (*Context) GetCookie` for [`func (*Context) Cookie`](https://godoc.org/github.com/gin-gonic/gin#Context.Cookie) +- [FIX] Don't display color tags if [`func DisableConsoleColor`](https://godoc.org/github.com/gin-gonic/gin#DisableConsoleColor) called, see [#1072](https://github.com/gin-gonic/gin/pull/1072) +- [FIX] Gin Mode `""` when calling [`func Mode`](https://godoc.org/github.com/gin-gonic/gin#Mode) now returns `const DebugMode`, see [#1250](https://github.com/gin-gonic/gin/pull/1250) +- [FIX] `Flush()` now doesn't overwrite `responseWriter` status code, see [#1460](https://github.com/gin-gonic/gin/pull/1460) + +### Gin 1.2.0 + +- [NEW] Switch from godeps to govendor +- [NEW] Add support for Let's Encrypt via gin-gonic/autotls +- [NEW] Improve README examples and add extra at examples folder +- [NEW] Improved support with App Engine +- [NEW] Add custom template delimiters, see #860 +- [NEW] Add Template Func Maps, see #962 +- [NEW] Add \*context.Handler(), see #928 +- [NEW] Add \*context.GetRawData() +- [NEW] Add \*context.GetHeader() (request) +- [NEW] Add \*context.AbortWithStatusJSON() (JSON content type) +- [NEW] Add \*context.Keys type cast helpers +- [NEW] Add \*context.ShouldBindWith() +- [NEW] Add \*context.MustBindWith() +- [NEW] Add \*engine.SetFuncMap() +- [DEPRECATE] On next release: \*context.BindWith(), see #855 +- [FIX] Refactor render +- [FIX] Reworked tests +- [FIX] logger now supports cygwin +- [FIX] Use X-Forwarded-For before X-Real-Ip +- [FIX] time.Time binding (#904) + +### Gin 1.1.4 + +- [NEW] Support google appengine for IsTerminal func + +### Gin 1.1.3 + +- [FIX] Reverted Logger: skip ANSI color commands + +### Gin 1.1 + +- [NEW] Implement QueryArray and PostArray methods +- [NEW] Refactor GetQuery and GetPostForm +- [NEW] Add contribution guide +- [FIX] Corrected typos in README +- [FIX] Removed additional Iota +- [FIX] Changed imports to gopkg instead of github in README (#733) +- [FIX] Logger: skip ANSI color commands if output is not a tty + +### Gin 1.0rc2 (...) + +- [PERFORMANCE] Fast path for writing Content-Type. +- [PERFORMANCE] Much faster 404 routing +- [PERFORMANCE] Allocation optimizations +- [PERFORMANCE] Faster root tree lookup +- [PERFORMANCE] Zero overhead, String() and JSON() rendering. +- [PERFORMANCE] Faster ClientIP parsing +- [PERFORMANCE] Much faster SSE implementation +- [NEW] Benchmarks suite +- [NEW] Bind validation can be disabled and replaced with custom validators. +- [NEW] More flexible HTML render +- [NEW] Multipart and PostForm bindings +- [NEW] Adds method to return all the registered routes +- [NEW] Context.HandlerName() returns the main handler's name +- [NEW] Adds Error.IsType() helper +- [FIX] Binding multipart form +- [FIX] Integration tests +- [FIX] Crash when binding non struct object in Context. +- [FIX] RunTLS() implementation +- [FIX] Logger() unit tests +- [FIX] Adds SetHTMLTemplate() warning +- [FIX] Context.IsAborted() +- [FIX] More unit tests +- [FIX] JSON, XML, HTML renders accept custom content-types +- [FIX] gin.AbortIndex is unexported +- [FIX] Better approach to avoid directory listing in StaticFS() +- [FIX] Context.ClientIP() always returns the IP with trimmed spaces. +- [FIX] Better warning when running in debug mode. +- [FIX] Google App Engine integration. debugPrint does not use os.Stdout +- [FIX] Fixes integer overflow in error type +- [FIX] Error implements the json.Marshaller interface +- [FIX] MIT license in every file + + +### Gin 1.0rc1 (May 22, 2015) + +- [PERFORMANCE] Zero allocation router +- [PERFORMANCE] Faster JSON, XML and text rendering +- [PERFORMANCE] Custom hand optimized HttpRouter for Gin +- [PERFORMANCE] Misc code optimizations. Inlining, tail call optimizations +- [NEW] Built-in support for golang.org/x/net/context +- [NEW] Any(path, handler). Create a route that matches any path +- [NEW] Refactored rendering pipeline (faster and static typeded) +- [NEW] Refactored errors API +- [NEW] IndentedJSON() prints pretty JSON +- [NEW] Added gin.DefaultWriter +- [NEW] UNIX socket support +- [NEW] RouterGroup.BasePath is exposed +- [NEW] JSON validation using go-validate-yourself (very powerful options) +- [NEW] Completed suite of unit tests +- [NEW] HTTP streaming with c.Stream() +- [NEW] StaticFile() creates a router for serving just one file. +- [NEW] StaticFS() has an option to disable directory listing. +- [NEW] StaticFS() for serving static files through virtual filesystems +- [NEW] Server-Sent Events native support +- [NEW] WrapF() and WrapH() helpers for wrapping http.HandlerFunc and http.Handler +- [NEW] Added LoggerWithWriter() middleware +- [NEW] Added RecoveryWithWriter() middleware +- [NEW] Added DefaultPostFormValue() +- [NEW] Added DefaultFormValue() +- [NEW] Added DefaultParamValue() +- [FIX] BasicAuth() when using custom realm +- [FIX] Bug when serving static files in nested routing group +- [FIX] Redirect using built-in http.Redirect() +- [FIX] Logger when printing the requested path +- [FIX] Documentation typos +- [FIX] Context.Engine renamed to Context.engine +- [FIX] Better debugging messages +- [FIX] ErrorLogger +- [FIX] Debug HTTP render +- [FIX] Refactored binding and render modules +- [FIX] Refactored Context initialization +- [FIX] Refactored BasicAuth() +- [FIX] NoMethod/NoRoute handlers +- [FIX] Hijacking http +- [FIX] Better support for Google App Engine (using log instead of fmt) + + +### Gin 0.6 (Mar 9, 2015) + +- [NEW] Support multipart/form-data +- [NEW] NoMethod handler +- [NEW] Validate sub structures +- [NEW] Support for HTTP Realm Auth +- [FIX] Unsigned integers in binding +- [FIX] Improve color logger + + +### Gin 0.5 (Feb 7, 2015) + +- [NEW] Content Negotiation +- [FIX] Solved security bug that allow a client to spoof ip +- [FIX] Fix unexported/ignored fields in binding + + +### Gin 0.4 (Aug 21, 2014) + +- [NEW] Development mode +- [NEW] Unit tests +- [NEW] Add Content.Redirect() +- [FIX] Deferring WriteHeader() +- [FIX] Improved documentation for model binding + + +### Gin 0.3 (Jul 18, 2014) + +- [PERFORMANCE] Normal log and error log are printed in the same call. +- [PERFORMANCE] Improve performance of NoRouter() +- [PERFORMANCE] Improve context's memory locality, reduce CPU cache faults. +- [NEW] Flexible rendering API +- [NEW] Add Context.File() +- [NEW] Add shorcut RunTLS() for http.ListenAndServeTLS +- [FIX] Rename NotFound404() to NoRoute() +- [FIX] Errors in context are purged +- [FIX] Adds HEAD method in Static file serving +- [FIX] Refactors Static() file serving +- [FIX] Using keyed initialization to fix app-engine integration +- [FIX] Can't unmarshal JSON array, #63 +- [FIX] Renaming Context.Req to Context.Request +- [FIX] Check application/x-www-form-urlencoded when parsing form + + +### Gin 0.2b (Jul 08, 2014) +- [PERFORMANCE] Using sync.Pool to allocatio/gc overhead +- [NEW] Travis CI integration +- [NEW] Completely new logger +- [NEW] New API for serving static files. gin.Static() +- [NEW] gin.H() can be serialized into XML +- [NEW] Typed errors. Errors can be typed. Internet/external/custom. +- [NEW] Support for Godeps +- [NEW] Travis/Godocs badges in README +- [NEW] New Bind() and BindWith() methods for parsing request body. +- [NEW] Add Content.Copy() +- [NEW] Add context.LastError() +- [NEW] Add shorcut for OPTIONS HTTP method +- [FIX] Tons of README fixes +- [FIX] Header is written before body +- [FIX] BasicAuth() and changes API a little bit +- [FIX] Recovery() middleware only prints panics +- [FIX] Context.Get() does not panic anymore. Use MustGet() instead. +- [FIX] Multiple http.WriteHeader() in NotFound handlers +- [FIX] Engine.Run() panics if http server can't be setted up +- [FIX] Crash when route path doesn't start with '/' +- [FIX] Do not update header when status code is negative +- [FIX] Setting response headers before calling WriteHeader in context.String() +- [FIX] Add MIT license +- [FIX] Changes behaviour of ErrorLogger() and Logger() diff --git a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..4ea14f395 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers 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, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at teamgingonic@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md new file mode 100644 index 000000000..547b777a1 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md @@ -0,0 +1,13 @@ +## Contributing + +- With issues: + - Use the search tool before opening a new issue. + - Please provide source code and commit sha if you found a bug. + - Review existing issues and provide feedback or react to them. + +- With pull requests: + - Open your pull request against `master` + - Your pull request should have no more than two commits, if not you should squash them. + - It should pass all tests in the available continuous integrations systems such as TravisCI. + - You should add/modify tests to cover your proposed code changes. + - If your pull request contains a new feature, please document it on the README. diff --git a/vendor/github.com/gin-gonic/gin/Makefile b/vendor/github.com/gin-gonic/gin/Makefile new file mode 100644 index 000000000..51b9969fd --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/Makefile @@ -0,0 +1,62 @@ +GOFMT ?= gofmt "-s" +PACKAGES ?= $(shell go list ./... | grep -v /vendor/) +VETPACKAGES ?= $(shell go list ./... | grep -v /vendor/ | grep -v /examples/) +GOFILES := $(shell find . -name "*.go" -type f -not -path "./vendor/*") + +all: install + +install: deps + govendor sync + +.PHONY: test +test: + sh coverage.sh + +.PHONY: fmt +fmt: + $(GOFMT) -w $(GOFILES) + +.PHONY: fmt-check +fmt-check: + # get all go files and run go fmt on them + @diff=$$($(GOFMT) -d $(GOFILES)); \ + if [ -n "$$diff" ]; then \ + echo "Please run 'make fmt' and commit the result:"; \ + echo "$${diff}"; \ + exit 1; \ + fi; + +vet: + go vet $(VETPACKAGES) + +deps: + @hash govendor > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go get -u github.com/kardianos/govendor; \ + fi + @hash embedmd > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go get -u github.com/campoy/embedmd; \ + fi + +embedmd: + embedmd -d *.md + +.PHONY: lint +lint: + @hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go get -u github.com/golang/lint/golint; \ + fi + for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; + +.PHONY: misspell-check +misspell-check: + @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go get -u github.com/client9/misspell/cmd/misspell; \ + fi + misspell -error $(GOFILES) + +.PHONY: misspell +misspell: + @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + go get -u github.com/client9/misspell/cmd/misspell; \ + fi + misspell -w $(GOFILES) diff --git a/vendor/github.com/gin-gonic/gin/README.md b/vendor/github.com/gin-gonic/gin/README.md new file mode 100644 index 000000000..28598baf5 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/README.md @@ -0,0 +1,1820 @@ +# Gin Web Framework + + + +[![Build Status](https://travis-ci.org/gin-gonic/gin.svg)](https://travis-ci.org/gin-gonic/gin) +[![codecov](https://codecov.io/gh/gin-gonic/gin/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-gonic/gin) +[![Go Report Card](https://goreportcard.com/badge/github.com/gin-gonic/gin)](https://goreportcard.com/report/github.com/gin-gonic/gin) +[![GoDoc](https://godoc.org/github.com/gin-gonic/gin?status.svg)](https://godoc.org/github.com/gin-gonic/gin) +[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Sourcegraph](https://sourcegraph.com/github.com/gin-gonic/gin/-/badge.svg)](https://sourcegraph.com/github.com/gin-gonic/gin?badge) +[![Open Source Helpers](https://www.codetriage.com/gin-gonic/gin/badges/users.svg)](https://www.codetriage.com/gin-gonic/gin) + +Gin is a web framework written in Go (Golang). It features a martini-like API with much better performance, up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin. + +![Gin console logger](https://gin-gonic.github.io/gin/other/console.png) + +## Contents + +- [Installation](#installation) +- [Prerequisite](#prerequisite) +- [Quick start](#quick-start) +- [Benchmarks](#benchmarks) +- [Gin v1.stable](#gin-v1-stable) +- [Build with jsoniter](#build-with-jsoniter) +- [API Examples](#api-examples) + - [Using GET,POST,PUT,PATCH,DELETE and OPTIONS](#using-get-post-put-patch-delete-and-options) + - [Parameters in path](#parameters-in-path) + - [Querystring parameters](#querystring-parameters) + - [Multipart/Urlencoded Form](#multiparturlencoded-form) + - [Another example: query + post form](#another-example-query--post-form) + - [Map as querystring or postform parameters](#map-as-querystring-or-postform-parameters) + - [Upload files](#upload-files) + - [Grouping routes](#grouping-routes) + - [Blank Gin without middleware by default](#blank-gin-without-middleware-by-default) + - [Using middleware](#using-middleware) + - [How to write log file](#how-to-write-log-file) + - [Model binding and validation](#model-binding-and-validation) + - [Custom Validators](#custom-validators) + - [Only Bind Query String](#only-bind-query-string) + - [Bind Query String or Post Data](#bind-query-string-or-post-data) + - [Bind HTML checkboxes](#bind-html-checkboxes) + - [Multipart/Urlencoded binding](#multiparturlencoded-binding) + - [XML, JSON and YAML rendering](#xml-json-and-yaml-rendering) + - [JSONP rendering](#jsonp) + - [Serving static files](#serving-static-files) + - [Serving data from reader](#serving-data-from-reader) + - [HTML rendering](#html-rendering) + - [Multitemplate](#multitemplate) + - [Redirects](#redirects) + - [Custom Middleware](#custom-middleware) + - [Using BasicAuth() middleware](#using-basicauth-middleware) + - [Goroutines inside a middleware](#goroutines-inside-a-middleware) + - [Custom HTTP configuration](#custom-http-configuration) + - [Support Let's Encrypt](#support-lets-encrypt) + - [Run multiple service using Gin](#run-multiple-service-using-gin) + - [Graceful restart or stop](#graceful-restart-or-stop) + - [Build a single binary with templates](#build-a-single-binary-with-templates) + - [Bind form-data request with custom struct](#bind-form-data-request-with-custom-struct) + - [Try to bind body into different structs](#try-to-bind-body-into-different-structs) + - [http2 server push](#http2-server-push) +- [Testing](#testing) +- [Users](#users--) + +## Installation + +To install Gin package, you need to install Go and set your Go workspace first. + +1. Download and install it: + +```sh +$ go get -u github.com/gin-gonic/gin +``` + +2. Import it in your code: + +```go +import "github.com/gin-gonic/gin" +``` + +3. (Optional) Import `net/http`. This is required for example if using constants such as `http.StatusOK`. + +```go +import "net/http" +``` + +### Use a vendor tool like [Govendor](https://github.com/kardianos/govendor) + +1. `go get` govendor + +```sh +$ go get github.com/kardianos/govendor +``` +2. Create your project folder and `cd` inside + +```sh +$ mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_" +``` + +3. Vendor init your project and add gin + +```sh +$ govendor init +$ govendor fetch github.com/gin-gonic/gin@v1.2 +``` + +4. Copy a starting template inside your project + +```sh +$ curl https://raw.githubusercontent.com/gin-gonic/gin/master/examples/basic/main.go > main.go +``` + +5. Run your project + +```sh +$ go run main.go +``` + +## Prerequisite + +Now Gin requires Go 1.6 or later and Go 1.7 will be required soon. + +## Quick start + +```sh +# assume the following codes in example.go file +$ cat example.go +``` + +```go +package main + +import "github.com/gin-gonic/gin" + +func main() { + r := gin.Default() + r.GET("/ping", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "pong", + }) + }) + r.Run() // listen and serve on 0.0.0.0:8080 +} +``` + +``` +# run example.go and visit 0.0.0.0:8080/ping on browser +$ go run example.go +``` + +## Benchmarks + +Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter) + +[See all benchmarks](/BENCHMARKS.md) + +Benchmark name | (1) | (2) | (3) | (4) +--------------------------------------------|-----------:|------------:|-----------:|---------: +**BenchmarkGin_GithubAll** | **30000** | **48375** | **0** | **0** +BenchmarkAce_GithubAll | 10000 | 134059 | 13792 | 167 +BenchmarkBear_GithubAll | 5000 | 534445 | 86448 | 943 +BenchmarkBeego_GithubAll | 3000 | 592444 | 74705 | 812 +BenchmarkBone_GithubAll | 200 | 6957308 | 698784 | 8453 +BenchmarkDenco_GithubAll | 10000 | 158819 | 20224 | 167 +BenchmarkEcho_GithubAll | 10000 | 154700 | 6496 | 203 +BenchmarkGocraftWeb_GithubAll | 3000 | 570806 | 131656 | 1686 +BenchmarkGoji_GithubAll | 2000 | 818034 | 56112 | 334 +BenchmarkGojiv2_GithubAll | 2000 | 1213973 | 274768 | 3712 +BenchmarkGoJsonRest_GithubAll | 2000 | 785796 | 134371 | 2737 +BenchmarkGoRestful_GithubAll | 300 | 5238188 | 689672 | 4519 +BenchmarkGorillaMux_GithubAll | 100 | 10257726 | 211840 | 2272 +BenchmarkHttpRouter_GithubAll | 20000 | 105414 | 13792 | 167 +BenchmarkHttpTreeMux_GithubAll | 10000 | 319934 | 65856 | 671 +BenchmarkKocha_GithubAll | 10000 | 209442 | 23304 | 843 +BenchmarkLARS_GithubAll | 20000 | 62565 | 0 | 0 +BenchmarkMacaron_GithubAll | 2000 | 1161270 | 204194 | 2000 +BenchmarkMartini_GithubAll | 200 | 9991713 | 226549 | 2325 +BenchmarkPat_GithubAll | 200 | 5590793 | 1499568 | 27435 +BenchmarkPossum_GithubAll | 10000 | 319768 | 84448 | 609 +BenchmarkR2router_GithubAll | 10000 | 305134 | 77328 | 979 +BenchmarkRivet_GithubAll | 10000 | 132134 | 16272 | 167 +BenchmarkTango_GithubAll | 3000 | 552754 | 63826 | 1618 +BenchmarkTigerTonic_GithubAll | 1000 | 1439483 | 239104 | 5374 +BenchmarkTraffic_GithubAll | 100 | 11383067 | 2659329 | 21848 +BenchmarkVulcan_GithubAll | 5000 | 394253 | 19894 | 609 + +- (1): Total Repetitions achieved in constant time, higher means more confident result +- (2): Single Repetition Duration (ns/op), lower is better +- (3): Heap Memory (B/op), lower is better +- (4): Average Allocations per Repetition (allocs/op), lower is better + +## Gin v1. stable + +- [x] Zero allocation router. +- [x] Still the fastest http router and framework. From routing to writing. +- [x] Complete suite of unit tests +- [x] Battle tested +- [x] API frozen, new releases will not break your code. + +## Build with [jsoniter](https://github.com/json-iterator/go) + +Gin use `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags. + +```sh +$ go build -tags=jsoniter . +``` + +## API Examples + +### Using GET, POST, PUT, PATCH, DELETE and OPTIONS + +```go +func main() { + // Disable Console Color + // gin.DisableConsoleColor() + + // Creates a gin router with default middleware: + // logger and recovery (crash-free) middleware + router := gin.Default() + + router.GET("/someGet", getting) + router.POST("/somePost", posting) + router.PUT("/somePut", putting) + router.DELETE("/someDelete", deleting) + router.PATCH("/somePatch", patching) + router.HEAD("/someHead", head) + router.OPTIONS("/someOptions", options) + + // By default it serves on :8080 unless a + // PORT environment variable was defined. + router.Run() + // router.Run(":3000") for a hard coded port +} +``` + +### Parameters in path + +```go +func main() { + router := gin.Default() + + // This handler will match /user/john but will not match /user/ or /user + router.GET("/user/:name", func(c *gin.Context) { + name := c.Param("name") + c.String(http.StatusOK, "Hello %s", name) + }) + + // However, this one will match /user/john/ and also /user/john/send + // If no other routers match /user/john, it will redirect to /user/john/ + router.GET("/user/:name/*action", func(c *gin.Context) { + name := c.Param("name") + action := c.Param("action") + message := name + " is " + action + c.String(http.StatusOK, message) + }) + + router.Run(":8080") +} +``` + +### Querystring parameters + +```go +func main() { + router := gin.Default() + + // Query string parameters are parsed using the existing underlying request object. + // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe + router.GET("/welcome", func(c *gin.Context) { + firstname := c.DefaultQuery("firstname", "Guest") + lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname") + + c.String(http.StatusOK, "Hello %s %s", firstname, lastname) + }) + router.Run(":8080") +} +``` + +### Multipart/Urlencoded Form + +```go +func main() { + router := gin.Default() + + router.POST("/form_post", func(c *gin.Context) { + message := c.PostForm("message") + nick := c.DefaultPostForm("nick", "anonymous") + + c.JSON(200, gin.H{ + "status": "posted", + "message": message, + "nick": nick, + }) + }) + router.Run(":8080") +} +``` + +### Another example: query + post form + +``` +POST /post?id=1234&page=1 HTTP/1.1 +Content-Type: application/x-www-form-urlencoded + +name=manu&message=this_is_great +``` + +```go +func main() { + router := gin.Default() + + router.POST("/post", func(c *gin.Context) { + + id := c.Query("id") + page := c.DefaultQuery("page", "0") + name := c.PostForm("name") + message := c.PostForm("message") + + fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message) + }) + router.Run(":8080") +} +``` + +``` +id: 1234; page: 1; name: manu; message: this_is_great +``` + +### Map as querystring or postform parameters + +``` +POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1 +Content-Type: application/x-www-form-urlencoded + +names[first]=thinkerou&names[second]=tianou +``` + +```go +func main() { + router := gin.Default() + + router.POST("/post", func(c *gin.Context) { + + ids := c.QueryMap("ids") + names := c.PostFormMap("names") + + fmt.Printf("ids: %v; names: %v", ids, names) + }) + router.Run(":8080") +} +``` + +``` +ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou] +``` + +### Upload files + +#### Single file + +References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](examples/upload-file/single). + +```go +func main() { + router := gin.Default() + // Set a lower memory limit for multipart forms (default is 32 MiB) + // router.MaxMultipartMemory = 8 << 20 // 8 MiB + router.POST("/upload", func(c *gin.Context) { + // single file + file, _ := c.FormFile("file") + log.Println(file.Filename) + + // Upload the file to specific dst. + // c.SaveUploadedFile(file, dst) + + c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) + }) + router.Run(":8080") +} +``` + +How to `curl`: + +```bash +curl -X POST http://localhost:8080/upload \ + -F "file=@/Users/appleboy/test.zip" \ + -H "Content-Type: multipart/form-data" +``` + +#### Multiple files + +See the detail [example code](examples/upload-file/multiple). + +```go +func main() { + router := gin.Default() + // Set a lower memory limit for multipart forms (default is 32 MiB) + // router.MaxMultipartMemory = 8 << 20 // 8 MiB + router.POST("/upload", func(c *gin.Context) { + // Multipart form + form, _ := c.MultipartForm() + files := form.File["upload[]"] + + for _, file := range files { + log.Println(file.Filename) + + // Upload the file to specific dst. + // c.SaveUploadedFile(file, dst) + } + c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) + }) + router.Run(":8080") +} +``` + +How to `curl`: + +```bash +curl -X POST http://localhost:8080/upload \ + -F "upload[]=@/Users/appleboy/test1.zip" \ + -F "upload[]=@/Users/appleboy/test2.zip" \ + -H "Content-Type: multipart/form-data" +``` + +### Grouping routes + +```go +func main() { + router := gin.Default() + + // Simple group: v1 + v1 := router.Group("/v1") + { + v1.POST("/login", loginEndpoint) + v1.POST("/submit", submitEndpoint) + v1.POST("/read", readEndpoint) + } + + // Simple group: v2 + v2 := router.Group("/v2") + { + v2.POST("/login", loginEndpoint) + v2.POST("/submit", submitEndpoint) + v2.POST("/read", readEndpoint) + } + + router.Run(":8080") +} +``` + +### Blank Gin without middleware by default + +Use + +```go +r := gin.New() +``` + +instead of + +```go +// Default With the Logger and Recovery middleware already attached +r := gin.Default() +``` + + +### Using middleware +```go +func main() { + // Creates a router without any middleware by default + r := gin.New() + + // Global middleware + // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. + // By default gin.DefaultWriter = os.Stdout + r.Use(gin.Logger()) + + // Recovery middleware recovers from any panics and writes a 500 if there was one. + r.Use(gin.Recovery()) + + // Per route middleware, you can add as many as you desire. + r.GET("/benchmark", MyBenchLogger(), benchEndpoint) + + // Authorization group + // authorized := r.Group("/", AuthRequired()) + // exactly the same as: + authorized := r.Group("/") + // per group middleware! in this case we use the custom created + // AuthRequired() middleware just in the "authorized" group. + authorized.Use(AuthRequired()) + { + authorized.POST("/login", loginEndpoint) + authorized.POST("/submit", submitEndpoint) + authorized.POST("/read", readEndpoint) + + // nested group + testing := authorized.Group("testing") + testing.GET("/analytics", analyticsEndpoint) + } + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### How to write log file +```go +func main() { + // Disable Console Color, you don't need console color when writing the logs to file. + gin.DisableConsoleColor() + + // Logging to a file. + f, _ := os.Create("gin.log") + gin.DefaultWriter = io.MultiWriter(f) + + // Use the following code if you need to write the logs to file and console at the same time. + // gin.DefaultWriter = io.MultiWriter(f, os.Stdout) + + router := gin.Default() + router.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + +    router.Run(":8080") +} +``` + +### Model binding and validation + +To bind a request body into a type, use model binding. We currently support binding of JSON, XML and standard form values (foo=bar&boo=baz). + +Gin uses [**go-playground/validator.v8**](https://github.com/go-playground/validator) for validation. Check the full docs on tags usage [here](http://godoc.org/gopkg.in/go-playground/validator.v8#hdr-Baked_In_Validators_and_Tags). + +Note that you need to set the corresponding binding tag on all fields you want to bind. For example, when binding from JSON, set `json:"fieldname"`. + +Also, Gin provides two sets of methods for binding: +- **Type** - Must bind + - **Methods** - `Bind`, `BindJSON`, `BindQuery` + - **Behavior** - These methods use `MustBindWith` under the hood. If there is a binding error, the request is aborted with `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. This sets the response status code to 400 and the `Content-Type` header is set to `text/plain; charset=utf-8`. Note that if you try to set the response code after this, it will result in a warning `[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422`. If you wish to have greater control over the behavior, consider using the `ShouldBind` equivalent method. +- **Type** - Should bind + - **Methods** - `ShouldBind`, `ShouldBindJSON`, `ShouldBindQuery` + - **Behavior** - These methods use `ShouldBindWith` under the hood. If there is a binding error, the error is returned and it is the developer's responsibility to handle the request and error appropriately. + +When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use `MustBindWith` or `ShouldBindWith`. + +You can also specify that specific fields are required. If a field is decorated with `binding:"required"` and has a empty value when binding, an error will be returned. + +```go +// Binding from JSON +type Login struct { + User string `form:"user" json:"user" binding:"required"` + Password string `form:"password" json:"password" binding:"required"` +} + +func main() { + router := gin.Default() + + // Example for binding JSON ({"user": "manu", "password": "123"}) + router.POST("/loginJSON", func(c *gin.Context) { + var json Login + if err := c.ShouldBindJSON(&json); err == nil { + if json.User == "manu" && json.Password == "123" { + c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) + } else { + c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) + } + } else { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + } + }) + + // Example for binding a HTML form (user=manu&password=123) + router.POST("/loginForm", func(c *gin.Context) { + var form Login + // This will infer what binder to use depending on the content-type header. + if err := c.ShouldBind(&form); err == nil { + if form.User == "manu" && form.Password == "123" { + c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) + } else { + c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) + } + } else { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + } + }) + + // Listen and serve on 0.0.0.0:8080 + router.Run(":8080") +} +``` + +**Sample request** +```shell +$ curl -v -X POST \ + http://localhost:8080/loginJSON \ + -H 'content-type: application/json' \ + -d '{ "user": "manu" }' +> POST /loginJSON HTTP/1.1 +> Host: localhost:8080 +> User-Agent: curl/7.51.0 +> Accept: */* +> content-type: application/json +> Content-Length: 18 +> +* upload completely sent off: 18 out of 18 bytes +< HTTP/1.1 400 Bad Request +< Content-Type: application/json; charset=utf-8 +< Date: Fri, 04 Aug 2017 03:51:31 GMT +< Content-Length: 100 +< +{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"} +``` + +**Skip validate** + +When running the above example using the above the `curl` command, it returns error. Because the example use `binding:"required"` for `Password`. If use `binding:"-"` for `Password`, then it will not return error when running the above example again. + +### Custom Validators + +It is also possible to register custom validators. See the [example code](examples/custom-validation/server.go). + +[embedmd]:# (examples/custom-validation/server.go go) +```go +package main + +import ( + "net/http" + "reflect" + "time" + + "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" + "gopkg.in/go-playground/validator.v8" +) + +type Booking struct { + CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"` + CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"` +} + +func bookableDate( + v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, + field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string, +) bool { + if date, ok := field.Interface().(time.Time); ok { + today := time.Now() + if today.Year() > date.Year() || today.YearDay() > date.YearDay() { + return false + } + } + return true +} + +func main() { + route := gin.Default() + + if v, ok := binding.Validator.Engine().(*validator.Validate); ok { + v.RegisterValidation("bookabledate", bookableDate) + } + + route.GET("/bookable", getBookable) + route.Run(":8085") +} + +func getBookable(c *gin.Context) { + var b Booking + if err := c.ShouldBindWith(&b, binding.Query); err == nil { + c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"}) + } else { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + } +} +``` + +```console +$ curl "localhost:8085/bookable?check_in=2018-04-16&check_out=2018-04-17" +{"message":"Booking dates are valid!"} + +$ curl "localhost:8085/bookable?check_in=2018-03-08&check_out=2018-03-09" +{"error":"Key: 'Booking.CheckIn' Error:Field validation for 'CheckIn' failed on the 'bookabledate' tag"} +``` + +[Struct level validations](https://github.com/go-playground/validator/releases/tag/v8.7) can also be registed this way. +See the [struct-lvl-validation example](examples/struct-lvl-validations) to learn more. + +### Only Bind Query String + +`ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). + +```go +package main + +import ( + "log" + + "github.com/gin-gonic/gin" +) + +type Person struct { + Name string `form:"name"` + Address string `form:"address"` +} + +func main() { + route := gin.Default() + route.Any("/testing", startPage) + route.Run(":8085") +} + +func startPage(c *gin.Context) { + var person Person + if c.ShouldBindQuery(&person) == nil { + log.Println("====== Only Bind By Query String ======") + log.Println(person.Name) + log.Println(person.Address) + } + c.String(200, "Success") +} + +``` + +### Bind Query String or Post Data + +See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). + +```go +package main + +import "log" +import "github.com/gin-gonic/gin" +import "time" + +type Person struct { + Name string `form:"name"` + Address string `form:"address"` + Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"` +} + +func main() { + route := gin.Default() + route.GET("/testing", startPage) + route.Run(":8085") +} + +func startPage(c *gin.Context) { + var person Person + // If `GET`, only `Form` binding engine (`query`) used. + // If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`). + // See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48 + if c.ShouldBind(&person) == nil { + log.Println(person.Name) + log.Println(person.Address) + log.Println(person.Birthday) + } + + c.String(200, "Success") +} +``` + +Test it with: +```sh +$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15" +``` + +### Bind HTML checkboxes + +See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) + +main.go + +```go +... + +type myForm struct { + Colors []string `form:"colors[]"` +} + +... + +func formHandler(c *gin.Context) { + var fakeForm myForm + c.ShouldBind(&fakeForm) + c.JSON(200, gin.H{"color": fakeForm.Colors}) +} + +... + +``` + +form.html + +```html +
+

Check some colors

+ + + + + + + +
+``` + +result: + +``` +{"color":["red","green","blue"]} +``` + +### Multipart/Urlencoded binding + +```go +package main + +import ( + "github.com/gin-gonic/gin" +) + +type LoginForm struct { + User string `form:"user" binding:"required"` + Password string `form:"password" binding:"required"` +} + +func main() { + router := gin.Default() + router.POST("/login", func(c *gin.Context) { + // you can bind multipart form with explicit binding declaration: + // c.ShouldBindWith(&form, binding.Form) + // or you can simply use autobinding with ShouldBind method: + var form LoginForm + // in this case proper binding will be automatically selected + if c.ShouldBind(&form) == nil { + if form.User == "user" && form.Password == "password" { + c.JSON(200, gin.H{"status": "you are logged in"}) + } else { + c.JSON(401, gin.H{"status": "unauthorized"}) + } + } + }) + router.Run(":8080") +} +``` + +Test it with: +```sh +$ curl -v --form user=user --form password=password http://localhost:8080/login +``` + +### XML, JSON and YAML rendering + +```go +func main() { + r := gin.Default() + + // gin.H is a shortcut for map[string]interface{} + r.GET("/someJSON", func(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) + }) + + r.GET("/moreJSON", func(c *gin.Context) { + // You also can use a struct + var msg struct { + Name string `json:"user"` + Message string + Number int + } + msg.Name = "Lena" + msg.Message = "hey" + msg.Number = 123 + // Note that msg.Name becomes "user" in the JSON + // Will output : {"user": "Lena", "Message": "hey", "Number": 123} + c.JSON(http.StatusOK, msg) + }) + + r.GET("/someXML", func(c *gin.Context) { + c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) + }) + + r.GET("/someYAML", func(c *gin.Context) { + c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +#### SecureJSON + +Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. + +```go +func main() { + r := gin.Default() + + // You can also use your own secure json prefix + // r.SecureJsonPrefix(")]}',\n") + + r.GET("/someJSON", func(c *gin.Context) { + names := []string{"lena", "austin", "foo"} + + // Will output : while(1);["lena","austin","foo"] + c.SecureJSON(http.StatusOK, names) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` +#### JSONP + +Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. + +```go +func main() { + r := gin.Default() + + r.GET("/JSONP?callback=x", func(c *gin.Context) { + data := map[string]interface{}{ + "foo": "bar", + } + + //callback is x + // Will output : x({\"foo\":\"bar\"}) + c.JSONP(http.StatusOK, data) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +#### AsciiJSON + +Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII chracters. + +```go +func main() { + r := gin.Default() + + r.GET("/someJSON", func(c *gin.Context) { + data := map[string]interface{}{ + "lang": "GO语言", + "tag": "
", + } + + // will output : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"} + c.AsciiJSON(http.StatusOK, data) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Serving static files + +```go +func main() { + router := gin.Default() + router.Static("/assets", "./assets") + router.StaticFS("/more_static", http.Dir("my_file_system")) + router.StaticFile("/favicon.ico", "./resources/favicon.ico") + + // Listen and serve on 0.0.0.0:8080 + router.Run(":8080") +} +``` + +### Serving data from reader + +```go +func main() { + router := gin.Default() + router.GET("/someDataFromReader", func(c *gin.Context) { + response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png") + if err != nil || response.StatusCode != http.StatusOK { + c.Status(http.StatusServiceUnavailable) + return + } + + reader := response.Body + contentLength := response.ContentLength + contentType := response.Header.Get("Content-Type") + + extraHeaders := map[string]string{ + "Content-Disposition": `attachment; filename="gopher.png"`, + } + + c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) + }) + router.Run(":8080") +} +``` + +### HTML rendering + +Using LoadHTMLGlob() or LoadHTMLFiles() + +```go +func main() { + router := gin.Default() + router.LoadHTMLGlob("templates/*") + //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html") + router.GET("/index", func(c *gin.Context) { + c.HTML(http.StatusOK, "index.tmpl", gin.H{ + "title": "Main website", + }) + }) + router.Run(":8080") +} +``` + +templates/index.tmpl + +```html + +

+ {{ .title }} +

+ +``` + +Using templates with same name in different directories + +```go +func main() { + router := gin.Default() + router.LoadHTMLGlob("templates/**/*") + router.GET("/posts/index", func(c *gin.Context) { + c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ + "title": "Posts", + }) + }) + router.GET("/users/index", func(c *gin.Context) { + c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ + "title": "Users", + }) + }) + router.Run(":8080") +} +``` + +templates/posts/index.tmpl + +```html +{{ define "posts/index.tmpl" }} +

+ {{ .title }} +

+

Using posts/index.tmpl

+ +{{ end }} +``` + +templates/users/index.tmpl + +```html +{{ define "users/index.tmpl" }} +

+ {{ .title }} +

+

Using users/index.tmpl

+ +{{ end }} +``` + +#### Custom Template renderer + +You can also use your own html template render + +```go +import "html/template" + +func main() { + router := gin.Default() + html := template.Must(template.ParseFiles("file1", "file2")) + router.SetHTMLTemplate(html) + router.Run(":8080") +} +``` + +#### Custom Delimiters + +You may use custom delims + +```go + r := gin.Default() + r.Delims("{[{", "}]}") + r.LoadHTMLGlob("/path/to/templates")) +``` + +#### Custom Template Funcs + +See the detail [example code](examples/template). + +main.go + +```go +import ( + "fmt" + "html/template" + "net/http" + "time" + + "github.com/gin-gonic/gin" +) + +func formatAsDate(t time.Time) string { + year, month, day := t.Date() + return fmt.Sprintf("%d%02d/%02d", year, month, day) +} + +func main() { + router := gin.Default() + router.Delims("{[{", "}]}") + router.SetFuncMap(template.FuncMap{ + "formatAsDate": formatAsDate, + }) + router.LoadHTMLFiles("./testdata/template/raw.tmpl") + + router.GET("/raw", func(c *gin.Context) { + c.HTML(http.StatusOK, "raw.tmpl", map[string]interface{}{ + "now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), + }) + }) + + router.Run(":8080") +} + +``` + +raw.tmpl + +```html +Date: {[{.now | formatAsDate}]} +``` + +Result: +``` +Date: 2017/07/01 +``` + +### Multitemplate + +Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. + +### Redirects + +Issuing a HTTP redirect is easy. Both internal and external locations are supported. + +```go +r.GET("/test", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") +}) +``` + + +Issuing a Router redirect, use `HandleContext` like below. + +``` go +r.GET("/test", func(c *gin.Context) { + c.Request.URL.Path = "/test2" + r.HandleContext(c) +}) +r.GET("/test2", func(c *gin.Context) { + c.JSON(200, gin.H{"hello": "world"}) +}) +``` + + +### Custom Middleware + +```go +func Logger() gin.HandlerFunc { + return func(c *gin.Context) { + t := time.Now() + + // Set example variable + c.Set("example", "12345") + + // before request + + c.Next() + + // after request + latency := time.Since(t) + log.Print(latency) + + // access the status we are sending + status := c.Writer.Status() + log.Println(status) + } +} + +func main() { + r := gin.New() + r.Use(Logger()) + + r.GET("/test", func(c *gin.Context) { + example := c.MustGet("example").(string) + + // it would print: "12345" + log.Println(example) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Using BasicAuth() middleware + +```go +// simulate some private data +var secrets = gin.H{ + "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, + "austin": gin.H{"email": "austin@example.com", "phone": "666"}, + "lena": gin.H{"email": "lena@guapa.com", "phone": "523443"}, +} + +func main() { + r := gin.Default() + + // Group using gin.BasicAuth() middleware + // gin.Accounts is a shortcut for map[string]string + authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ + "foo": "bar", + "austin": "1234", + "lena": "hello2", + "manu": "4321", + })) + + // /admin/secrets endpoint + // hit "localhost:8080/admin/secrets + authorized.GET("/secrets", func(c *gin.Context) { + // get user, it was set by the BasicAuth middleware + user := c.MustGet(gin.AuthUserKey).(string) + if secret, ok := secrets[user]; ok { + c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret}) + } else { + c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("}) + } + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Goroutines inside a middleware + +When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. + +```go +func main() { + r := gin.Default() + + r.GET("/long_async", func(c *gin.Context) { + // create copy to be used inside the goroutine + cCp := c.Copy() + go func() { + // simulate a long task with time.Sleep(). 5 seconds + time.Sleep(5 * time.Second) + + // note that you are using the copied context "cCp", IMPORTANT + log.Println("Done! in path " + cCp.Request.URL.Path) + }() + }) + + r.GET("/long_sync", func(c *gin.Context) { + // simulate a long task with time.Sleep(). 5 seconds + time.Sleep(5 * time.Second) + + // since we are NOT using a goroutine, we do not have to copy the context + log.Println("Done! in path " + c.Request.URL.Path) + }) + + // Listen and serve on 0.0.0.0:8080 + r.Run(":8080") +} +``` + +### Custom HTTP configuration + +Use `http.ListenAndServe()` directly, like this: + +```go +func main() { + router := gin.Default() + http.ListenAndServe(":8080", router) +} +``` +or + +```go +func main() { + router := gin.Default() + + s := &http.Server{ + Addr: ":8080", + Handler: router, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + MaxHeaderBytes: 1 << 20, + } + s.ListenAndServe() +} +``` + +### Support Let's Encrypt + +example for 1-line LetsEncrypt HTTPS servers. + +[embedmd]:# (examples/auto-tls/example1/main.go go) +```go +package main + +import ( + "log" + + "github.com/gin-gonic/autotls" + "github.com/gin-gonic/gin" +) + +func main() { + r := gin.Default() + + // Ping handler + r.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + + log.Fatal(autotls.Run(r, "example1.com", "example2.com")) +} +``` + +example for custom autocert manager. + +[embedmd]:# (examples/auto-tls/example2/main.go go) +```go +package main + +import ( + "log" + + "github.com/gin-gonic/autotls" + "github.com/gin-gonic/gin" + "golang.org/x/crypto/acme/autocert" +) + +func main() { + r := gin.Default() + + // Ping handler + r.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + + m := autocert.Manager{ + Prompt: autocert.AcceptTOS, + HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"), + Cache: autocert.DirCache("/var/www/.cache"), + } + + log.Fatal(autotls.RunWithManager(r, &m)) +} +``` + +### Run multiple service using Gin + +See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: + +[embedmd]:# (examples/multiple-service/main.go go) +```go +package main + +import ( + "log" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "golang.org/x/sync/errgroup" +) + +var ( + g errgroup.Group +) + +func router01() http.Handler { + e := gin.New() + e.Use(gin.Recovery()) + e.GET("/", func(c *gin.Context) { + c.JSON( + http.StatusOK, + gin.H{ + "code": http.StatusOK, + "error": "Welcome server 01", + }, + ) + }) + + return e +} + +func router02() http.Handler { + e := gin.New() + e.Use(gin.Recovery()) + e.GET("/", func(c *gin.Context) { + c.JSON( + http.StatusOK, + gin.H{ + "code": http.StatusOK, + "error": "Welcome server 02", + }, + ) + }) + + return e +} + +func main() { + server01 := &http.Server{ + Addr: ":8080", + Handler: router01(), + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + + server02 := &http.Server{ + Addr: ":8081", + Handler: router02(), + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + + g.Go(func() error { + return server01.ListenAndServe() + }) + + g.Go(func() error { + return server02.ListenAndServe() + }) + + if err := g.Wait(); err != nil { + log.Fatal(err) + } +} +``` + +### Graceful restart or stop + +Do you want to graceful restart or stop your web server? +There are some ways this can be done. + +We can use [fvbock/endless](https://github.com/fvbock/endless) to replace the default `ListenAndServe`. Refer issue [#296](https://github.com/gin-gonic/gin/issues/296) for more details. + +```go +router := gin.Default() +router.GET("/", handler) +// [...] +endless.ListenAndServe(":4242", router) +``` + +An alternative to endless: + +* [manners](https://github.com/braintree/manners): A polite Go HTTP server that shuts down gracefully. +* [graceful](https://github.com/tylerb/graceful): Graceful is a Go package enabling graceful shutdown of an http.Handler server. +* [grace](https://github.com/facebookgo/grace): Graceful restart & zero downtime deploy for Go servers. + +If you are using Go 1.8, you may not need to use this library! Consider using http.Server's built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. See the full [graceful-shutdown](./examples/graceful-shutdown) example with gin. + +[embedmd]:# (examples/graceful-shutdown/graceful-shutdown/server.go go) +```go +// +build go1.8 + +package main + +import ( + "context" + "log" + "net/http" + "os" + "os/signal" + "time" + + "github.com/gin-gonic/gin" +) + +func main() { + router := gin.Default() + router.GET("/", func(c *gin.Context) { + time.Sleep(5 * time.Second) + c.String(http.StatusOK, "Welcome Gin Server") + }) + + srv := &http.Server{ + Addr: ":8080", + Handler: router, + } + + go func() { + // service connections + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("listen: %s\n", err) + } + }() + + // Wait for interrupt signal to gracefully shutdown the server with + // a timeout of 5 seconds. + quit := make(chan os.Signal) + signal.Notify(quit, os.Interrupt) + <-quit + log.Println("Shutdown Server ...") + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + log.Fatal("Server Shutdown:", err) + } + log.Println("Server exiting") +} +``` + +### Build a single binary with templates + +You can build a server into a single binary containing templates by using [go-assets][]. + +[go-assets]: https://github.com/jessevdk/go-assets + +```go +func main() { + r := gin.New() + + t, err := loadTemplate() + if err != nil { + panic(err) + } + r.SetHTMLTemplate(t) + + r.GET("/", func(c *gin.Context) { + c.HTML(http.StatusOK, "/html/index.tmpl",nil) + }) + r.Run(":8080") +} + +// loadTemplate loads templates embedded by go-assets-builder +func loadTemplate() (*template.Template, error) { + t := template.New("") + for name, file := range Assets.Files { + if file.IsDir() || !strings.HasSuffix(name, ".tmpl") { + continue + } + h, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + t, err = t.New(name).Parse(string(h)) + if err != nil { + return nil, err + } + } + return t, nil +} +``` + +See a complete example in the `examples/assets-in-binary` directory. + +### Bind form-data request with custom struct + +The follow example using custom struct: + +```go +type StructA struct { + FieldA string `form:"field_a"` +} + +type StructB struct { + NestedStruct StructA + FieldB string `form:"field_b"` +} + +type StructC struct { + NestedStructPointer *StructA + FieldC string `form:"field_c"` +} + +type StructD struct { + NestedAnonyStruct struct { + FieldX string `form:"field_x"` + } + FieldD string `form:"field_d"` +} + +func GetDataB(c *gin.Context) { + var b StructB + c.Bind(&b) + c.JSON(200, gin.H{ + "a": b.NestedStruct, + "b": b.FieldB, + }) +} + +func GetDataC(c *gin.Context) { + var b StructC + c.Bind(&b) + c.JSON(200, gin.H{ + "a": b.NestedStructPointer, + "c": b.FieldC, + }) +} + +func GetDataD(c *gin.Context) { + var b StructD + c.Bind(&b) + c.JSON(200, gin.H{ + "x": b.NestedAnonyStruct, + "d": b.FieldD, + }) +} + +func main() { + r := gin.Default() + r.GET("/getb", GetDataB) + r.GET("/getc", GetDataC) + r.GET("/getd", GetDataD) + + r.Run() +} +``` + +Using the command `curl` command result: + +``` +$ curl "http://localhost:8080/getb?field_a=hello&field_b=world" +{"a":{"FieldA":"hello"},"b":"world"} +$ curl "http://localhost:8080/getc?field_a=hello&field_c=world" +{"a":{"FieldA":"hello"},"c":"world"} +$ curl "http://localhost:8080/getd?field_x=hello&field_d=world" +{"d":"world","x":{"FieldX":"hello"}} +``` + +**NOTE**: NOT support the follow style struct: + +```go +type StructX struct { + X struct {} `form:"name_x"` // HERE have form +} + +type StructY struct { + Y StructX `form:"name_y"` // HERE hava form +} + +type StructZ struct { + Z *StructZ `form:"name_z"` // HERE hava form +} +``` + +In a word, only support nested custom struct which have no `form` now. + +### Try to bind body into different structs + +The normal methods for binding request body consumes `c.Request.Body` and they +cannot be called multiple times. + +```go +type formA struct { + Foo string `json:"foo" xml:"foo" binding:"required"` +} + +type formB struct { + Bar string `json:"bar" xml:"bar" binding:"required"` +} + +func SomeHandler(c *gin.Context) { + objA := formA{} + objB := formB{} + // This c.ShouldBind consumes c.Request.Body and it cannot be reused. + if errA := c.ShouldBind(&objA); errA == nil { + c.String(http.StatusOK, `the body should be formA`) + // Always an error is occurred by this because c.Request.Body is EOF now. + } else if errB := c.ShouldBind(&objB); errB == nil { + c.String(http.StatusOK, `the body should be formB`) + } else { + ... + } +} +``` + +For this, you can use `c.ShouldBindBodyWith`. + +```go +func SomeHandler(c *gin.Context) { + objA := formA{} + objB := formB{} + // This reads c.Request.Body and stores the result into the context. + if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil { + c.String(http.StatusOK, `the body should be formA`) + // At this time, it reuses body stored in the context. + } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil { + c.String(http.StatusOK, `the body should be formB JSON`) + // And it can accepts other formats + } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil { + c.String(http.StatusOK, `the body should be formB XML`) + } else { + ... + } +} +``` + +* `c.ShouldBindBodyWith` stores body into the context before binding. This has +a slight impact to performance, so you should not use this method if you are +enough to call binding at once. +* This feature is only needed for some formats -- `JSON`, `XML`, `MsgPack`, +`ProtoBuf`. For other formats, `Query`, `Form`, `FormPost`, `FormMultipart`, +can be called by `c.ShouldBind()` multiple times without any damage to +performance (See [#1341](https://github.com/gin-gonic/gin/pull/1341)). + +### http2 server push + +http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. + +[embedmd]:# (examples/http-pusher/main.go go) +```go +package main + +import ( + "html/template" + "log" + + "github.com/gin-gonic/gin" +) + +var html = template.Must(template.New("https").Parse(` + + + Https Test + + + +

Welcome, Ginner!

+ + +`)) + +func main() { + r := gin.Default() + r.Static("/assets", "./assets") + r.SetHTMLTemplate(html) + + r.GET("/", func(c *gin.Context) { + if pusher := c.Writer.Pusher(); pusher != nil { + // use pusher.Push() to do server push + if err := pusher.Push("/assets/app.js", nil); err != nil { + log.Printf("Failed to push: %v", err) + } + } + c.HTML(200, "https", gin.H{ + "status": "success", + }) + }) + + // Listen and Server in https://127.0.0.1:8080 + r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") +} +``` + +## Testing + +The `net/http/httptest` package is preferable way for HTTP testing. + +```go +package main + +func setupRouter() *gin.Engine { + r := gin.Default() + r.GET("/ping", func(c *gin.Context) { + c.String(200, "pong") + }) + return r +} + +func main() { + r := setupRouter() + r.Run(":8080") +} +``` + +Test for code example above: + +```go +package main + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPingRoute(t *testing.T) { + router := setupRouter() + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/ping", nil) + router.ServeHTTP(w, req) + + assert.Equal(t, 200, w.Code) + assert.Equal(t, "pong", w.Body.String()) +} +``` + +## Users + +Awesome project lists using [Gin](https://github.com/gin-gonic/gin) web framework. + +* [drone](https://github.com/drone/drone): Drone is a Continuous Delivery platform built on Docker, written in Go +* [gorush](https://github.com/appleboy/gorush): A push notification server written in Go. diff --git a/vendor/github.com/gin-gonic/gin/codecov.yml b/vendor/github.com/gin-gonic/gin/codecov.yml new file mode 100644 index 000000000..c9c9a522d --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/codecov.yml @@ -0,0 +1,5 @@ +coverage: + notify: + gitter: + default: + url: https://webhooks.gitter.im/e/d90dcdeeab2f1e357165 diff --git a/vendor/github.com/gin-gonic/gin/coverage.sh b/vendor/github.com/gin-gonic/gin/coverage.sh new file mode 100644 index 000000000..4d1ee0361 --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/coverage.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e + +echo "mode: count" > coverage.out + +for d in $(go list ./... | grep -E 'gin$|binding$|render$' | grep -v 'examples'); do + go test -v -covermode=count -coverprofile=profile.out $d + if [ -f profile.out ]; then + cat profile.out | grep -v "mode:" >> coverage.out + rm profile.out + fi +done diff --git a/vendor/github.com/gin-gonic/gin/wercker.yml b/vendor/github.com/gin-gonic/gin/wercker.yml new file mode 100644 index 000000000..3ab8084cc --- /dev/null +++ b/vendor/github.com/gin-gonic/gin/wercker.yml @@ -0,0 +1 @@ +box: wercker/default \ No newline at end of file diff --git a/vendor/github.com/go-ini/ini/.gitignore b/vendor/github.com/go-ini/ini/.gitignore new file mode 100644 index 000000000..12411127b --- /dev/null +++ b/vendor/github.com/go-ini/ini/.gitignore @@ -0,0 +1,6 @@ +testdata/conf_out.ini +ini.sublime-project +ini.sublime-workspace +testdata/conf_reflect.ini +.idea +/.vscode diff --git a/vendor/github.com/go-ini/ini/.travis.yml b/vendor/github.com/go-ini/ini/.travis.yml new file mode 100644 index 000000000..c8ea49ccc --- /dev/null +++ b/vendor/github.com/go-ini/ini/.travis.yml @@ -0,0 +1,17 @@ +sudo: false +language: go +go: + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x + - 1.11.x + +script: + - go get golang.org/x/tools/cmd/cover + - go get github.com/smartystreets/goconvey + - mkdir -p $HOME/gopath/src/gopkg.in + - ln -s $HOME/gopath/src/github.com/go-ini/ini $HOME/gopath/src/gopkg.in/ini.v1 + - cd $HOME/gopath/src/gopkg.in/ini.v1 + - go test -v -cover -race diff --git a/vendor/github.com/go-ini/ini/Makefile b/vendor/github.com/go-ini/ini/Makefile new file mode 100644 index 000000000..af27ff076 --- /dev/null +++ b/vendor/github.com/go-ini/ini/Makefile @@ -0,0 +1,15 @@ +.PHONY: build test bench vet coverage + +build: vet bench + +test: + go test -v -cover -race + +bench: + go test -v -cover -race -test.bench=. -test.benchmem + +vet: + go vet + +coverage: + go test -coverprofile=c.out && go tool cover -html=c.out && rm c.out diff --git a/vendor/github.com/go-ini/ini/README.md b/vendor/github.com/go-ini/ini/README.md new file mode 100644 index 000000000..ae4dfc3a5 --- /dev/null +++ b/vendor/github.com/go-ini/ini/README.md @@ -0,0 +1,46 @@ +INI [![Build Status](https://travis-ci.org/go-ini/ini.svg?branch=master)](https://travis-ci.org/go-ini/ini) [![Sourcegraph](https://img.shields.io/badge/view%20on-Sourcegraph-brightgreen.svg)](https://sourcegraph.com/github.com/go-ini/ini) +=== + +![](https://avatars0.githubusercontent.com/u/10216035?v=3&s=200) + +Package ini provides INI file read and write functionality in Go. + +## Features + +- Load from multiple data sources(`[]byte`, file and `io.ReadCloser`) with overwrites. +- Read with recursion values. +- Read with parent-child sections. +- Read with auto-increment key names. +- Read with multiple-line values. +- Read with tons of helper methods. +- Read and convert values to Go types. +- Read and **WRITE** comments of sections and keys. +- Manipulate sections, keys and comments with ease. +- Keep sections and keys in order as you parse and save. + +## Installation + +The minimum requirement of Go is **1.6**. + +To use a tagged revision: + +```sh +$ go get gopkg.in/ini.v1 +``` + +To use with latest changes: + +```sh +$ go get github.com/go-ini/ini +``` + +Please add `-u` flag to update in the future. + +## Getting Help + +- [Getting Started](https://ini.unknwon.io/docs/intro/getting_started) +- [API Documentation](https://gowalker.org/gopkg.in/ini.v1) + +## License + +This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/vendor/github.com/go-ole/go-ole/.travis.yml b/vendor/github.com/go-ole/go-ole/.travis.yml new file mode 100644 index 000000000..0c2c02bdf --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/.travis.yml @@ -0,0 +1,9 @@ +language: go +sudo: false + +go: + - 1.1 + - 1.2 + - 1.3 + - 1.4 + - tip diff --git a/vendor/github.com/go-ole/go-ole/ChangeLog.md b/vendor/github.com/go-ole/go-ole/ChangeLog.md new file mode 100644 index 000000000..4ba6a8c64 --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/ChangeLog.md @@ -0,0 +1,49 @@ +# Version 1.x.x + +* **Add more test cases and reference new test COM server project.** (Placeholder for future additions) + +# Version 1.2.0-alphaX + +**Minimum supported version is now Go 1.4. Go 1.1 support is deprecated, but should still build.** + + * Added CI configuration for Travis-CI and AppVeyor. + * Added test InterfaceID and ClassID for the COM Test Server project. + * Added more inline documentation (#83). + * Added IEnumVARIANT implementation (#88). + * Added IEnumVARIANT test cases (#99, #100, #101). + * Added support for retrieving `time.Time` from VARIANT (#92). + * Added test case for IUnknown (#64). + * Added test case for IDispatch (#64). + * Added test cases for scalar variants (#64, #76). + +# Version 1.1.1 + + * Fixes for Linux build. + * Fixes for Windows build. + +# Version 1.1.0 + +The change to provide building on all platforms is a new feature. The increase in minor version reflects that and allows those who wish to stay on 1.0.x to continue to do so. Support for 1.0.x will be limited to bug fixes. + + * Move GUID out of variables.go into its own file to make new documentation available. + * Move OleError out of ole.go into its own file to make new documentation available. + * Add documentation to utility functions. + * Add documentation to variant receiver functions. + * Add documentation to ole structures. + * Make variant available to other systems outside of Windows. + * Make OLE structures available to other systems outside of Windows. + +## New Features + + * Library should now be built on all platforms supported by Go. Library will NOOP on any platform that is not Windows. + * More functions are now documented and available on godoc.org. + +# Version 1.0.1 + + 1. Fix package references from repository location change. + +# Version 1.0.0 + +This version is stable enough for use. The COM API is still incomplete, but provides enough functionality for accessing COM servers using IDispatch interface. + +There is no changelog for this version. Check commits for history. diff --git a/vendor/github.com/go-ole/go-ole/README.md b/vendor/github.com/go-ole/go-ole/README.md new file mode 100644 index 000000000..0ea9db33c --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/README.md @@ -0,0 +1,46 @@ +#Go OLE + +[![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28) +[![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole) +[![GoDoc](https://godoc.org/github.com/go-ole/go-ole?status.svg)](https://godoc.org/github.com/go-ole/go-ole) + +Go bindings for Windows COM using shared libraries instead of cgo. + +By Yasuhiro Matsumoto. + +## Install + +To experiment with go-ole, you can just compile and run the example program: + +``` +go get github.com/go-ole/go-ole +cd /path/to/go-ole/ +go test + +cd /path/to/go-ole/example/excel +go run excel.go +``` + +## Continuous Integration + +Continuous integration configuration has been added for both Travis-CI and AppVeyor. You will have to add these to your own account for your fork in order for it to run. + +**Travis-CI** + +Travis-CI was added to check builds on Linux to ensure that `go get` works when cross building. Currently, Travis-CI is not used to test cross-building, but this may be changed in the future. It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server. + +**AppVeyor** + +AppVeyor is used to build on Windows using the (in-development) test COM server. It is currently only used to test the build and ensure that the code works on Windows. It will be used to register a COM server and then run the test cases based on the test COM server. + +The tests currently do run and do pass and this should be maintained with commits. + +##Versioning + +Go OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch. + +This contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed. + +##LICENSE + +Under the MIT License: http://mattn.mit-license.org/2013 diff --git a/vendor/github.com/go-ole/go-ole/appveyor.yml b/vendor/github.com/go-ole/go-ole/appveyor.yml new file mode 100644 index 000000000..0d557ac2f --- /dev/null +++ b/vendor/github.com/go-ole/go-ole/appveyor.yml @@ -0,0 +1,54 @@ +# Notes: +# - Minimal appveyor.yml file is an empty file. All sections are optional. +# - Indent each level of configuration with 2 spaces. Do not use tabs! +# - All section names are case-sensitive. +# - Section names should be unique on each level. + +version: "1.3.0.{build}-alpha-{branch}" + +os: Windows Server 2012 R2 + +branches: + only: + - master + - v1.2 + - v1.1 + - v1.0 + +skip_tags: true + +clone_folder: c:\gopath\src\github.com\go-ole\go-ole + +environment: + GOPATH: c:\gopath + matrix: + - GOARCH: amd64 + GOVERSION: 1.5 + GOROOT: c:\go + DOWNLOADPLATFORM: "x64" + +install: + - choco install mingw + - SET PATH=c:\tools\mingw64\bin;%PATH% + # - Download COM Server + - ps: Start-FileDownload "https://github.com/go-ole/test-com-server/releases/download/v1.0.2/test-com-server-${env:DOWNLOADPLATFORM}.zip" + - 7z e test-com-server-%DOWNLOADPLATFORM%.zip -oc:\gopath\src\github.com\go-ole\go-ole > NUL + - c:\gopath\src\github.com\go-ole\go-ole\build\register-assembly.bat + # - set + - go version + - go env + - go get -u golang.org/x/tools/cmd/cover + - go get -u golang.org/x/tools/cmd/godoc + - go get -u golang.org/x/tools/cmd/stringer + +build_script: + - cd c:\gopath\src\github.com\go-ole\go-ole + - go get -v -t ./... + - go build + - go test -v -cover ./... + +# disable automatic tests +test: off + +# disable deployment +deploy: off diff --git a/vendor/github.com/go-stack/stack/.travis.yml b/vendor/github.com/go-stack/stack/.travis.yml new file mode 100644 index 000000000..5c5a2b516 --- /dev/null +++ b/vendor/github.com/go-stack/stack/.travis.yml @@ -0,0 +1,15 @@ +language: go +sudo: false +go: + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x + - 1.11.x + - tip + +before_install: + - go get github.com/mattn/goveralls + +script: + - goveralls -service=travis-ci diff --git a/vendor/github.com/go-stack/stack/README.md b/vendor/github.com/go-stack/stack/README.md new file mode 100644 index 000000000..f11ccccaa --- /dev/null +++ b/vendor/github.com/go-stack/stack/README.md @@ -0,0 +1,38 @@ +[![GoDoc](https://godoc.org/github.com/go-stack/stack?status.svg)](https://godoc.org/github.com/go-stack/stack) +[![Go Report Card](https://goreportcard.com/badge/go-stack/stack)](https://goreportcard.com/report/go-stack/stack) +[![TravisCI](https://travis-ci.org/go-stack/stack.svg?branch=master)](https://travis-ci.org/go-stack/stack) +[![Coverage Status](https://coveralls.io/repos/github/go-stack/stack/badge.svg?branch=master)](https://coveralls.io/github/go-stack/stack?branch=master) + +# stack + +Package stack implements utilities to capture, manipulate, and format call +stacks. It provides a simpler API than package runtime. + +The implementation takes care of the minutia and special cases of interpreting +the program counter (pc) values returned by runtime.Callers. + +## Versioning + +Package stack publishes releases via [semver](http://semver.org/) compatible Git +tags prefixed with a single 'v'. The master branch always contains the latest +release. The develop branch contains unreleased commits. + +## Formatting + +Package stack's types implement fmt.Formatter, which provides a simple and +flexible way to declaratively configure formatting when used with logging or +error tracking packages. + +```go +func DoTheThing() { + c := stack.Caller(0) + log.Print(c) // "source.go:10" + log.Printf("%+v", c) // "pkg/path/source.go:10" + log.Printf("%n", c) // "DoTheThing" + + s := stack.Trace().TrimRuntime() + log.Print(s) // "[source.go:15 caller.go:42 main.go:14]" +} +``` + +See the docs for all of the supported formatting options. diff --git a/vendor/github.com/go-stack/stack/go.mod b/vendor/github.com/go-stack/stack/go.mod new file mode 100644 index 000000000..96a53a109 --- /dev/null +++ b/vendor/github.com/go-stack/stack/go.mod @@ -0,0 +1 @@ +module github.com/go-stack/stack diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE index 0f646931a..1b1b1921e 100644 --- a/vendor/github.com/golang/protobuf/LICENSE +++ b/vendor/github.com/golang/protobuf/LICENSE @@ -1,4 +1,7 @@ +Go support for Protocol Buffers - Google's data interchange format + Copyright 2010 The Go Authors. All rights reserved. +https://github.com/golang/protobuf Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/golang/protobuf/proto/Makefile b/vendor/github.com/golang/protobuf/proto/Makefile new file mode 100644 index 000000000..e2e0651a9 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/Makefile @@ -0,0 +1,43 @@ +# Go support for Protocol Buffers - Google's data interchange format +# +# Copyright 2010 The Go Authors. All rights reserved. +# https://github.com/golang/protobuf +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +install: + go install + +test: install generate-test-pbs + go test + + +generate-test-pbs: + make install + make -C testdata + protoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto + make diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go index 3cd3249f7..e392575b3 100644 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ b/vendor/github.com/golang/protobuf/proto/clone.go @@ -35,39 +35,22 @@ package proto import ( - "fmt" "log" "reflect" "strings" ) // Clone returns a deep copy of a protocol buffer. -func Clone(src Message) Message { - in := reflect.ValueOf(src) +func Clone(pb Message) Message { + in := reflect.ValueOf(pb) if in.IsNil() { - return src + return pb } - out := reflect.New(in.Type().Elem()) - dst := out.Interface().(Message) - Merge(dst, src) - return dst -} -// Merger is the interface representing objects that can merge messages of the same type. -type Merger interface { - // Merge merges src into this message. - // Required and optional fields that are set in src will be set to that value in dst. - // Elements of repeated fields will be appended. - // - // Merge may panic if called with a different argument type than the receiver. - Merge(src Message) -} - -// generatedMerger is the custom merge method that generated protos will have. -// We must add this method since a generate Merge method will conflict with -// many existing protos that have a Merge data field already defined. -type generatedMerger interface { - XXX_Merge(src Message) + out := reflect.New(in.Type().Elem()) + // out is empty so a merge is a deep copy. + mergeStruct(out.Elem(), in.Elem()) + return out.Interface().(Message) } // Merge merges src into dst. @@ -75,24 +58,17 @@ type generatedMerger interface { // Elements of repeated fields will be appended. // Merge panics if src and dst are not the same type, or if dst is nil. func Merge(dst, src Message) { - if m, ok := dst.(Merger); ok { - m.Merge(src) - return - } - in := reflect.ValueOf(src) out := reflect.ValueOf(dst) if out.IsNil() { panic("proto: nil destination") } if in.Type() != out.Type() { - panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) + // Explicit test prior to mergeStruct so that mistyped nils will fail + panic("proto: type mismatch") } if in.IsNil() { - return // Merge from nil src is a noop - } - if m, ok := dst.(generatedMerger); ok { - m.XXX_Merge(src) + // Merging nil into non-nil is a quiet no-op return } mergeStruct(out.Elem(), in.Elem()) @@ -108,7 +84,7 @@ func mergeStruct(out, in reflect.Value) { mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) } - if emIn, err := extendable(in.Addr().Interface()); err == nil { + if emIn, ok := extendable(in.Addr().Interface()); ok { emOut, _ := extendable(out.Addr().Interface()) mIn, muIn := emIn.extensionsRead() if mIn != nil { diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go index d9aa3c42d..aa207298f 100644 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ b/vendor/github.com/golang/protobuf/proto/decode.go @@ -39,6 +39,8 @@ import ( "errors" "fmt" "io" + "os" + "reflect" ) // errOverflow is returned when an integer is too large to be represented. @@ -48,6 +50,10 @@ var errOverflow = errors.New("proto: integer overflow") // wire type is encountered. It does not get returned to user code. var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") +// The fundamental decoders that interpret bytes on the wire. +// Those that take integer types all return uint64 and are +// therefore of type valueDecoder. + // DecodeVarint reads a varint-encoded integer from the slice. // It returns the integer and the number of bytes consumed, or // zero if there is not enough. @@ -261,6 +267,9 @@ func (p *Buffer) DecodeZigzag32() (x uint64, err error) { return } +// These are not ValueDecoders: they produce an array of bytes or a string. +// bytes, embedded messages + // DecodeRawBytes reads a count-delimited byte buffer from the Buffer. // This is the format used for the bytes protocol buffer // type and for embedded messages. @@ -302,29 +311,81 @@ func (p *Buffer) DecodeStringBytes() (s string, err error) { return string(buf), nil } +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +// If the protocol buffer has extensions, and the field matches, add it as an extension. +// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. +func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { + oi := o.index + + err := o.skip(t, tag, wire) + if err != nil { + return err + } + + if !unrecField.IsValid() { + return nil + } + + ptr := structPointer_Bytes(base, unrecField) + + // Add the skipped field to struct field + obuf := o.buf + + o.buf = *ptr + o.EncodeVarint(uint64(tag<<3 | wire)) + *ptr = append(o.buf, obuf[oi:o.index]...) + + o.buf = obuf + + return nil +} + +// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. +func (o *Buffer) skip(t reflect.Type, tag, wire int) error { + + var u uint64 + var err error + + switch wire { + case WireVarint: + _, err = o.DecodeVarint() + case WireFixed64: + _, err = o.DecodeFixed64() + case WireBytes: + _, err = o.DecodeRawBytes(false) + case WireFixed32: + _, err = o.DecodeFixed32() + case WireStartGroup: + for { + u, err = o.DecodeVarint() + if err != nil { + break + } + fwire := int(u & 0x7) + if fwire == WireEndGroup { + break + } + ftag := int(u >> 3) + err = o.skip(t, ftag, fwire) + if err != nil { + break + } + } + default: + err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) + } + return err +} + // Unmarshaler is the interface representing objects that can -// unmarshal themselves. The argument points to data that may be +// unmarshal themselves. The method should reset the receiver before +// decoding starts. The argument points to data that may be // overwritten, so implementations should not keep references to the // buffer. -// Unmarshal implementations should not clear the receiver. -// Any unmarshaled data should be merged into the receiver. -// Callers of Unmarshal that do not want to retain existing data -// should Reset the receiver before calling Unmarshal. type Unmarshaler interface { Unmarshal([]byte) error } -// newUnmarshaler is the interface representing objects that can -// unmarshal themselves. The semantics are identical to Unmarshaler. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newUnmarshaler interface { - XXX_Unmarshal([]byte) error -} - // Unmarshal parses the protocol buffer representation in buf and places the // decoded result in pb. If the struct underlying pb does not match // the data in buf, the results can be unpredictable. @@ -334,13 +395,7 @@ type newUnmarshaler interface { // to preserve and append to existing data. func Unmarshal(buf []byte, pb Message) error { pb.Reset() - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) + return UnmarshalMerge(buf, pb) } // UnmarshalMerge parses the protocol buffer representation in buf and @@ -350,16 +405,8 @@ func Unmarshal(buf []byte, pb Message) error { // UnmarshalMerge merges into existing data in pb. // Most code should use Unmarshal instead. func UnmarshalMerge(buf []byte, pb Message) error { - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } + // If the object can unmarshal itself, let it. if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 return u.Unmarshal(buf) } return NewBuffer(buf).Unmarshal(pb) @@ -375,17 +422,12 @@ func (p *Buffer) DecodeMessage(pb Message) error { } // DecodeGroup reads a tag-delimited group from the Buffer. -// StartGroup tag is already consumed. This function consumes -// EndGroup tag. func (p *Buffer) DecodeGroup(pb Message) error { - b := p.buf[p.index:] - x, y := findEndGroup(b) - if x < 0 { - return io.ErrUnexpectedEOF + typ, base, err := getbase(pb) + if err != nil { + return err } - err := Unmarshal(b[:x], pb) - p.index += y - return err + return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) } // Unmarshal parses the protocol buffer representation in the @@ -396,33 +438,533 @@ func (p *Buffer) DecodeGroup(pb Message) error { // Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. func (p *Buffer) Unmarshal(pb Message) error { // If the object can unmarshal itself, let it. - if u, ok := pb.(newUnmarshaler); ok { - err := u.XXX_Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 err := u.Unmarshal(p.buf[p.index:]) p.index = len(p.buf) return err } - // Slow workaround for messages that aren't Unmarshalers. - // This includes some hand-coded .pb.go files and - // bootstrap protos. - // TODO: fix all of those and then add Unmarshal to - // the Message interface. Then: - // The cast above and code below can be deleted. - // The old unmarshaler can be deleted. - // Clients can call Unmarshal directly (can already do that, actually). - var info InternalMessageInfo - err := info.Unmarshal(pb, p.buf[p.index:]) - p.index = len(p.buf) + typ, base, err := getbase(pb) + if err != nil { + return err + } + + err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) + + if collectStats { + stats.Decode++ + } + + return err +} + +// unmarshalType does the work of unmarshaling a structure. +func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { + var state errorState + required, reqFields := prop.reqCount, uint64(0) + + var err error + for err == nil && o.index < len(o.buf) { + oi := o.index + var u uint64 + u, err = o.DecodeVarint() + if err != nil { + break + } + wire := int(u & 0x7) + if wire == WireEndGroup { + if is_group { + if required > 0 { + // Not enough information to determine the exact field. + // (See below.) + return &RequiredNotSetError{"{Unknown}"} + } + return nil // input is satisfied + } + return fmt.Errorf("proto: %s: wiretype end group for non-group", st) + } + tag := int(u >> 3) + if tag <= 0 { + return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) + } + fieldnum, ok := prop.decoderTags.get(tag) + if !ok { + // Maybe it's an extension? + if prop.extendable { + if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { + if err = o.skip(st, tag, wire); err == nil { + extmap := e.extensionsWrite() + ext := extmap[int32(tag)] // may be missing + ext.enc = append(ext.enc, o.buf[oi:o.index]...) + extmap[int32(tag)] = ext + } + continue + } + } + // Maybe it's a oneof? + if prop.oneofUnmarshaler != nil { + m := structPointer_Interface(base, st).(Message) + // First return value indicates whether tag is a oneof field. + ok, err = prop.oneofUnmarshaler(m, tag, wire, o) + if err == ErrInternalBadWireType { + // Map the error to something more descriptive. + // Do the formatting here to save generated code space. + err = fmt.Errorf("bad wiretype for oneof field in %T", m) + } + if ok { + continue + } + } + err = o.skipAndSave(st, tag, wire, base, prop.unrecField) + continue + } + p := prop.Prop[fieldnum] + + if p.dec == nil { + fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) + continue + } + dec := p.dec + if wire != WireStartGroup && wire != p.WireType { + if wire == WireBytes && p.packedDec != nil { + // a packable field + dec = p.packedDec + } else { + err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) + continue + } + } + decErr := dec(o, p, base) + if decErr != nil && !state.shouldContinue(decErr, p) { + err = decErr + } + if err == nil && p.Required { + // Successfully decoded a required field. + if tag <= 64 { + // use bitmap for fields 1-64 to catch field reuse. + var mask uint64 = 1 << uint64(tag-1) + if reqFields&mask == 0 { + // new required field + reqFields |= mask + required-- + } + } else { + // This is imprecise. It can be fooled by a required field + // with a tag > 64 that is encoded twice; that's very rare. + // A fully correct implementation would require allocating + // a data structure, which we would like to avoid. + required-- + } + } + } + if err == nil { + if is_group { + return io.ErrUnexpectedEOF + } + if state.err != nil { + return state.err + } + if required > 0 { + // Not enough information to determine the exact field. If we use extra + // CPU, we could determine the field only if the missing required field + // has a tag <= 64 and we check reqFields. + return &RequiredNotSetError{"{Unknown}"} + } + } + return err +} + +// Individual type decoders +// For each, +// u is the decoded value, +// v is a pointer to the field (pointer) in the struct + +// Sizes of the pools to allocate inside the Buffer. +// The goal is modest amortization and allocation +// on at least 16-byte boundaries. +const ( + boolPoolSize = 16 + uint32PoolSize = 8 + uint64PoolSize = 4 +) + +// Decode a bool. +func (o *Buffer) dec_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + if len(o.bools) == 0 { + o.bools = make([]bool, boolPoolSize) + } + o.bools[0] = u != 0 + *structPointer_Bool(base, p.field) = &o.bools[0] + o.bools = o.bools[1:] + return nil +} + +func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + *structPointer_BoolVal(base, p.field) = u != 0 + return nil +} + +// Decode an int32. +func (o *Buffer) dec_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) + return nil +} + +func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) + return nil +} + +// Decode an int64. +func (o *Buffer) dec_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64_Set(structPointer_Word64(base, p.field), o, u) + return nil +} + +func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + word64Val_Set(structPointer_Word64Val(base, p.field), o, u) + return nil +} + +// Decode a string. +func (o *Buffer) dec_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_String(base, p.field) = &s + return nil +} + +func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + *structPointer_StringVal(base, p.field) = s + return nil +} + +// Decode a slice of bytes ([]byte). +func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + *structPointer_Bytes(base, p.field) = b + return nil +} + +// Decode a slice of bools ([]bool). +func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + v := structPointer_BoolSlice(base, p.field) + *v = append(*v, u != 0) + return nil +} + +// Decode a slice of bools ([]bool) in packed format. +func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { + v := structPointer_BoolSlice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded bools + fin := o.index + nb + if fin < o.index { + return errOverflow + } + + y := *v + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + y = append(y, u != 0) + } + + *v = y + return nil +} + +// Decode a slice of int32s ([]int32). +func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + structPointer_Word32Slice(base, p.field).Append(uint32(u)) + return nil +} + +// Decode a slice of int32s ([]int32) in packed format. +func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int32s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(uint32(u)) + } + return nil +} + +// Decode a slice of int64s ([]int64). +func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { + u, err := p.valDec(o) + if err != nil { + return err + } + + structPointer_Word64Slice(base, p.field).Append(u) + return nil +} + +// Decode a slice of int64s ([]int64) in packed format. +func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Slice(base, p.field) + + nn, err := o.DecodeVarint() + if err != nil { + return err + } + nb := int(nn) // number of bytes of encoded int64s + + fin := o.index + nb + if fin < o.index { + return errOverflow + } + for o.index < fin { + u, err := p.valDec(o) + if err != nil { + return err + } + v.Append(u) + } + return nil +} + +// Decode a slice of strings ([]string). +func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { + s, err := o.DecodeStringBytes() + if err != nil { + return err + } + v := structPointer_StringSlice(base, p.field) + *v = append(*v, s) + return nil +} + +// Decode a slice of slice of bytes ([][]byte). +func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { + b, err := o.DecodeRawBytes(true) + if err != nil { + return err + } + v := structPointer_BytesSlice(base, p.field) + *v = append(*v, b) + return nil +} + +// Decode a map field. +func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + oi := o.index // index at the end of this map entry + o.index -= len(raw) // move buffer back to start of map entry + + mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V + if mptr.Elem().IsNil() { + mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) + } + v := mptr.Elem() // map[K]V + + // Prepare addressable doubly-indirect placeholders for the key and value types. + // See enc_new_map for why. + keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K + keybase := toStructPointer(keyptr.Addr()) // **K + + var valbase structPointer + var valptr reflect.Value + switch p.mtype.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valptr = reflect.ValueOf(&dummy) // *[]byte + valbase = toStructPointer(valptr) // *[]byte + case reflect.Ptr: + // message; valptr is **Msg; need to allocate the intermediate pointer + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valptr.Set(reflect.New(valptr.Type().Elem())) + valbase = toStructPointer(valptr) + default: + // everything else + valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V + valbase = toStructPointer(valptr.Addr()) // **V + } + + // Decode. + // This parses a restricted wire format, namely the encoding of a message + // with two fields. See enc_new_map for the format. + for o.index < oi { + // tagcode for key and value properties are always a single byte + // because they have tags 1 and 2. + tagcode := o.buf[o.index] + o.index++ + switch tagcode { + case p.mkeyprop.tagcode[0]: + if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { + return err + } + case p.mvalprop.tagcode[0]: + if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { + return err + } + default: + // TODO: Should we silently skip this instead? + return fmt.Errorf("proto: bad map data tag %d", raw[0]) + } + } + keyelem, valelem := keyptr.Elem(), valptr.Elem() + if !keyelem.IsValid() { + keyelem = reflect.Zero(p.mtype.Key()) + } + if !valelem.IsValid() { + valelem = reflect.Zero(p.mtype.Elem()) + } + + v.SetMapIndex(keyelem, valelem) + return nil +} + +// Decode a group. +func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + return o.unmarshalType(p.stype, p.sprop, true, bas) +} + +// Decode an embedded message. +func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { + raw, e := o.DecodeRawBytes(false) + if e != nil { + return e + } + + bas := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(bas) { + // allocate new nested message + bas = toStructPointer(reflect.New(p.stype)) + structPointer_SetStructPointer(base, p.field, bas) + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := structPointer_Interface(bas, p.stype) + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, false, bas) + o.buf = obuf + o.index = oi + + return err +} + +// Decode a slice of embedded messages. +func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, false, base) +} + +// Decode a slice of embedded groups. +func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { + return o.dec_slice_struct(p, true, base) +} + +// Decode a slice of structs ([]*struct). +func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { + v := reflect.New(p.stype) + bas := toStructPointer(v) + structPointer_StructPointerSlice(base, p.field).Append(bas) + + if is_group { + err := o.unmarshalType(p.stype, p.sprop, is_group, bas) + return err + } + + raw, err := o.DecodeRawBytes(false) + if err != nil { + return err + } + + // If the object can unmarshal itself, let it. + if p.isUnmarshaler { + iv := v.Interface() + return iv.(Unmarshaler).Unmarshal(raw) + } + + obuf := o.buf + oi := o.index + o.buf = raw + o.index = 0 + + err = o.unmarshalType(p.stype, p.sprop, is_group, bas) + + o.buf = obuf + o.index = oi + return err } diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go deleted file mode 100644 index dea2617ce..000000000 --- a/vendor/github.com/golang/protobuf/proto/discard.go +++ /dev/null @@ -1,350 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2017 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -type generatedDiscarder interface { - XXX_DiscardUnknown() -} - -// DiscardUnknown recursively discards all unknown fields from this message -// and all embedded messages. -// -// When unmarshaling a message with unrecognized fields, the tags and values -// of such fields are preserved in the Message. This allows a later call to -// marshal to be able to produce a message that continues to have those -// unrecognized fields. To avoid this, DiscardUnknown is used to -// explicitly clear the unknown fields after unmarshaling. -// -// For proto2 messages, the unknown fields of message extensions are only -// discarded from messages that have been accessed via GetExtension. -func DiscardUnknown(m Message) { - if m, ok := m.(generatedDiscarder); ok { - m.XXX_DiscardUnknown() - return - } - // TODO: Dynamically populate a InternalMessageInfo for legacy messages, - // but the master branch has no implementation for InternalMessageInfo, - // so it would be more work to replicate that approach. - discardLegacy(m) -} - -// DiscardUnknown recursively discards all unknown fields. -func (a *InternalMessageInfo) DiscardUnknown(m Message) { - di := atomicLoadDiscardInfo(&a.discard) - if di == nil { - di = getDiscardInfo(reflect.TypeOf(m).Elem()) - atomicStoreDiscardInfo(&a.discard, di) - } - di.discard(toPointer(&m)) -} - -type discardInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []discardFieldInfo - unrecognized field -} - -type discardFieldInfo struct { - field field // Offset of field, guaranteed to be valid - discard func(src pointer) -} - -var ( - discardInfoMap = map[reflect.Type]*discardInfo{} - discardInfoLock sync.Mutex -) - -func getDiscardInfo(t reflect.Type) *discardInfo { - discardInfoLock.Lock() - defer discardInfoLock.Unlock() - di := discardInfoMap[t] - if di == nil { - di = &discardInfo{typ: t} - discardInfoMap[t] = di - } - return di -} - -func (di *discardInfo) discard(src pointer) { - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&di.initialized) == 0 { - di.computeDiscardInfo() - } - - for _, fi := range di.fields { - sfp := src.offset(fi.field) - fi.discard(sfp) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { - // Ignore lock since DiscardUnknown is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - DiscardUnknown(m) - } - } - } - - if di.unrecognized.IsValid() { - *src.offset(di.unrecognized).toBytes() = nil - } -} - -func (di *discardInfo) computeDiscardInfo() { - di.lock.Lock() - defer di.lock.Unlock() - if di.initialized != 0 { - return - } - t := di.typ - n := t.NumField() - - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - dfi := discardFieldInfo{field: toField(&f)} - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) - case isSlice: // E.g., []*pb.T - di := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sps := src.getPointerSlice() - for _, sp := range sps { - if !sp.isNil() { - di.discard(sp) - } - } - } - default: // E.g., *pb.T - di := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sp := src.getPointer() - if !sp.isNil() { - di.discard(sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) - default: // E.g., map[K]V - if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) - dfi.discard = func(src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - DiscardUnknown(val.Interface().(Message)) - } - } - } else { - dfi.discard = func(pointer) {} // Noop - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) - default: // E.g., interface{} - // TODO: Make this faster? - dfi.discard = func(src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - DiscardUnknown(sv.Interface().(Message)) - } - } - } - } - default: - continue - } - di.fields = append(di.fields, dfi) - } - - di.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - di.unrecognized = toField(&f) - } - - atomic.StoreInt32(&di.initialized, 1) -} - -func discardLegacy(m Message) { - v := reflect.ValueOf(m) - if v.Kind() != reflect.Ptr || v.IsNil() { - return - } - v = v.Elem() - if v.Kind() != reflect.Struct { - return - } - t := v.Type() - - for i := 0; i < v.NumField(); i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - vf := v.Field(i) - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) - case isSlice: // E.g., []*pb.T - for j := 0; j < vf.Len(); j++ { - discardLegacy(vf.Index(j).Interface().(Message)) - } - default: // E.g., *pb.T - discardLegacy(vf.Interface().(Message)) - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) - default: // E.g., map[K]V - tv := vf.Type().Elem() - if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) - for _, key := range vf.MapKeys() { - val := vf.MapIndex(key) - discardLegacy(val.Interface().(Message)) - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) - default: // E.g., test_proto.isCommunique_Union interface - if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { - vf = vf.Elem() // E.g., *test_proto.Communique_Msg - if !vf.IsNil() { - vf = vf.Elem() // E.g., test_proto.Communique_Msg - vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value - if vf.Kind() == reflect.Ptr { - discardLegacy(vf.Interface().(Message)) - } - } - } - } - } - } - - if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { - if vf.Type() != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - vf.Set(reflect.ValueOf([]byte(nil))) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(m); err == nil { - // Ignore lock since discardLegacy is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - discardLegacy(m) - } - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go index 3abfed2cf..2b30f8462 100644 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ b/vendor/github.com/golang/protobuf/proto/encode.go @@ -37,9 +37,28 @@ package proto import ( "errors" + "fmt" "reflect" + "sort" ) +// RequiredNotSetError is the error returned if Marshal is called with +// a protocol buffer struct whose required fields have not +// all been initialized. It is also the error returned if Unmarshal is +// called with an encoded protocol buffer that does not include all the +// required fields. +// +// When printed, RequiredNotSetError reports the first unset required field in a +// message. If the field cannot be precisely determined, it is reported as +// "{Unknown}". +type RequiredNotSetError struct { + field string +} + +func (e *RequiredNotSetError) Error() string { + return fmt.Sprintf("proto: required field %q not set", e.field) +} + var ( // errRepeatedHasNil is the error returned if Marshal is called with // a struct with a repeated field containing a nil element. @@ -63,6 +82,10 @@ var ( const maxVarintBytes = 10 // maximum length of a varint +// maxMarshalSize is the largest allowed size of an encoded protobuf, +// since C++ and Java use signed int32s for the size. +const maxMarshalSize = 1<<31 - 1 + // EncodeVarint returns the varint encoding of x. // This is the format for the // int32, int64, uint32, uint64, bool, and enum @@ -96,27 +119,18 @@ func (p *Buffer) EncodeVarint(x uint64) error { // SizeVarint returns the varint encoding size of an integer. func SizeVarint(x uint64) int { - switch { - case x < 1<<7: - return 1 - case x < 1<<14: - return 2 - case x < 1<<21: - return 3 - case x < 1<<28: - return 4 - case x < 1<<35: - return 5 - case x < 1<<42: - return 6 - case x < 1<<49: - return 7 - case x < 1<<56: - return 8 - case x < 1<<63: - return 9 - } - return 10 + return sizeVarint(x) +} + +func sizeVarint(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } // EncodeFixed64 writes a 64-bit integer to the Buffer. @@ -135,6 +149,10 @@ func (p *Buffer) EncodeFixed64(x uint64) error { return nil } +func sizeFixed64(x uint64) int { + return 8 +} + // EncodeFixed32 writes a 32-bit integer to the Buffer. // This is the format for the // fixed32, sfixed32, and float protocol buffer types. @@ -147,6 +165,10 @@ func (p *Buffer) EncodeFixed32(x uint64) error { return nil } +func sizeFixed32(x uint64) int { + return 4 +} + // EncodeZigzag64 writes a zigzag-encoded 64-bit integer // to the Buffer. // This is the format used for the sint64 protocol buffer type. @@ -155,6 +177,10 @@ func (p *Buffer) EncodeZigzag64(x uint64) error { return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func sizeZigzag64(x uint64) int { + return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} + // EncodeZigzag32 writes a zigzag-encoded 32-bit integer // to the Buffer. // This is the format used for the sint32 protocol buffer type. @@ -163,6 +189,10 @@ func (p *Buffer) EncodeZigzag32(x uint64) error { return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) } +func sizeZigzag32(x uint64) int { + return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) +} + // EncodeRawBytes writes a count-delimited byte buffer to the Buffer. // This is the format used for the bytes protocol buffer // type and for embedded messages. @@ -172,6 +202,11 @@ func (p *Buffer) EncodeRawBytes(b []byte) error { return nil } +func sizeRawBytes(b []byte) int { + return sizeVarint(uint64(len(b))) + + len(b) +} + // EncodeStringBytes writes an encoded string to the Buffer. // This is the format used for the proto2 string type. func (p *Buffer) EncodeStringBytes(s string) error { @@ -180,17 +215,319 @@ func (p *Buffer) EncodeStringBytes(s string) error { return nil } +func sizeStringBytes(s string) int { + return sizeVarint(uint64(len(s))) + + len(s) +} + // Marshaler is the interface representing objects that can marshal themselves. type Marshaler interface { Marshal() ([]byte, error) } +// Marshal takes the protocol buffer +// and encodes it into the wire format, returning the data. +func Marshal(pb Message) ([]byte, error) { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + return m.Marshal() + } + p := NewBuffer(nil) + err := p.Marshal(pb) + if p.buf == nil && err == nil { + // Return a non-nil slice on success. + return []byte{}, nil + } + return p.buf, err +} + // EncodeMessage writes the protocol buffer to the Buffer, // prefixed by a varint-encoded length. func (p *Buffer) EncodeMessage(pb Message) error { - siz := Size(pb) - p.EncodeVarint(uint64(siz)) - return p.Marshal(pb) + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + var state errorState + err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) + } + return err +} + +// Marshal takes the protocol buffer +// and encodes it into the wire format, writing the result to the +// Buffer. +func (p *Buffer) Marshal(pb Message) error { + // Can the object marshal itself? + if m, ok := pb.(Marshaler); ok { + data, err := m.Marshal() + p.buf = append(p.buf, data...) + return err + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return ErrNil + } + if err == nil { + err = p.enc_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + (stats).Encode++ // Parens are to work around a goimports bug. + } + + if len(p.buf) > maxMarshalSize { + return ErrTooLarge + } + return err +} + +// Size returns the encoded size of a protocol buffer. +func Size(pb Message) (n int) { + // Can the object marshal itself? If so, Size is slow. + // TODO: add Size to Marshaler, or add a Sizer interface. + if m, ok := pb.(Marshaler); ok { + b, _ := m.Marshal() + return len(b) + } + + t, base, err := getbase(pb) + if structPointer_IsNil(base) { + return 0 + } + if err == nil { + n = size_struct(GetProperties(t.Elem()), base) + } + + if collectStats { + (stats).Size++ // Parens are to work around a goimports bug. + } + + return +} + +// Individual type encoders. + +// Encode a bool. +func (o *Buffer) enc_bool(p *Properties, base structPointer) error { + v := *structPointer_Bool(base, p.field) + if v == nil { + return ErrNil + } + x := 0 + if *v { + x = 1 + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { + v := *structPointer_BoolVal(base, p.field) + if !v { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, 1) + return nil +} + +func size_bool(p *Properties, base structPointer) int { + v := *structPointer_Bool(base, p.field) + if v == nil { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +func size_proto3_bool(p *Properties, base structPointer) int { + v := *structPointer_BoolVal(base, p.field) + if !v && !p.oneof { + return 0 + } + return len(p.tagcode) + 1 // each bool takes exactly one byte +} + +// Encode an int32. +func (o *Buffer) enc_int32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_int32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode a uint32. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return ErrNil + } + x := word32_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, uint64(x)) + return nil +} + +func size_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32(base, p.field) + if word32_IsNil(v) { + return 0 + } + x := word32_Get(v) + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +func size_proto3_uint32(p *Properties, base structPointer) (n int) { + v := structPointer_Word32Val(base, p.field) + x := word32Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(uint64(x)) + return +} + +// Encode an int64. +func (o *Buffer) enc_int64(p *Properties, base structPointer) error { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return ErrNil + } + x := word64_Get(v) + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, x) + return nil +} + +func size_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64(base, p.field) + if word64_IsNil(v) { + return 0 + } + x := word64_Get(v) + n += len(p.tagcode) + n += p.valSize(x) + return +} + +func size_proto3_int64(p *Properties, base structPointer) (n int) { + v := structPointer_Word64Val(base, p.field) + x := word64Val_Get(v) + if x == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += p.valSize(x) + return +} + +// Encode a string. +func (o *Buffer) enc_string(p *Properties, base structPointer) error { + v := *structPointer_String(base, p.field) + if v == nil { + return ErrNil + } + x := *v + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(x) + return nil +} + +func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { + v := *structPointer_StringVal(base, p.field) + if v == "" { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(v) + return nil +} + +func size_string(p *Properties, base structPointer) (n int) { + v := *structPointer_String(base, p.field) + if v == nil { + return 0 + } + x := *v + n += len(p.tagcode) + n += sizeStringBytes(x) + return +} + +func size_proto3_string(p *Properties, base structPointer) (n int) { + v := *structPointer_StringVal(base, p.field) + if v == "" && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeStringBytes(v) + return } // All protocol buffer fields are nillable, but be careful. @@ -201,3 +538,825 @@ func isNil(v reflect.Value) bool { } return false } + +// Encode a message struct. +func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { + var state errorState + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return ErrNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + return state.err + } + + o.buf = append(o.buf, p.tagcode...) + return o.enc_len_struct(p.sprop, structp, &state) +} + +func size_struct_message(p *Properties, base structPointer) int { + structp := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(structp) { + return 0 + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n0 := len(p.tagcode) + n1 := sizeRawBytes(data) + return n0 + n1 + } + + n0 := len(p.tagcode) + n1 := size_struct(p.sprop, structp) + n2 := sizeVarint(uint64(n1)) // size of encoded length + return n0 + n1 + n2 +} + +// Encode a group struct. +func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { + var state errorState + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return ErrNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + err := o.enc_struct(p.sprop, b) + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return state.err +} + +func size_struct_group(p *Properties, base structPointer) (n int) { + b := structPointer_GetStructPointer(base, p.field) + if structPointer_IsNil(b) { + return 0 + } + + n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) + n += size_struct(p.sprop, b) + n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) + return +} + +// Encode a slice of bools ([]bool). +func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + for _, x := range s { + o.buf = append(o.buf, p.tagcode...) + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_bool(p *Properties, base structPointer) int { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + return l * (len(p.tagcode) + 1) // each bool takes exactly one byte +} + +// Encode a slice of bools ([]bool) in packed format. +func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(l)) // each bool takes exactly one byte + for _, x := range s { + v := uint64(0) + if x { + v = 1 + } + p.valEnc(o, v) + } + return nil +} + +func size_slice_packed_bool(p *Properties, base structPointer) (n int) { + s := *structPointer_BoolSlice(base, p.field) + l := len(s) + if l == 0 { + return 0 + } + n += len(p.tagcode) + n += sizeVarint(uint64(l)) + n += l // each bool takes exactly one byte + return +} + +// Encode a slice of bytes ([]byte). +func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if s == nil { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 { + return ErrNil + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(s) + return nil +} + +func size_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if s == nil && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { + s := *structPointer_Bytes(base, p.field) + if len(s) == 0 && !p.oneof { + return 0 + } + n += len(p.tagcode) + n += sizeRawBytes(s) + return +} + +// Encode a slice of int32s ([]int32). +func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of int32s ([]int32) in packed format. +func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + p.valEnc(buf, uint64(x)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + x := int32(s.Index(i)) // permit sign extension to use full 64-bit range + bufSize += p.valSize(uint64(x)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of uint32s ([]uint32). +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + x := s.Index(i) + p.valEnc(o, uint64(x)) + } + return nil +} + +func size_slice_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + x := s.Index(i) + n += p.valSize(uint64(x)) + } + return +} + +// Encode a slice of uint32s ([]uint32) in packed format. +// Exactly the same as int32, except for no sign extension. +func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, uint64(s.Index(i))) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { + s := structPointer_Word32Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(uint64(s.Index(i))) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of int64s ([]int64). +func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + p.valEnc(o, s.Index(i)) + } + return nil +} + +func size_slice_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + for i := 0; i < l; i++ { + n += len(p.tagcode) + n += p.valSize(s.Index(i)) + } + return +} + +// Encode a slice of int64s ([]int64) in packed format. +func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return ErrNil + } + // TODO: Reuse a Buffer. + buf := NewBuffer(nil) + for i := 0; i < l; i++ { + p.valEnc(buf, s.Index(i)) + } + + o.buf = append(o.buf, p.tagcode...) + o.EncodeVarint(uint64(len(buf.buf))) + o.buf = append(o.buf, buf.buf...) + return nil +} + +func size_slice_packed_int64(p *Properties, base structPointer) (n int) { + s := structPointer_Word64Slice(base, p.field) + l := s.Len() + if l == 0 { + return 0 + } + var bufSize int + for i := 0; i < l; i++ { + bufSize += p.valSize(s.Index(i)) + } + + n += len(p.tagcode) + n += sizeVarint(uint64(bufSize)) + n += bufSize + return +} + +// Encode a slice of slice of bytes ([][]byte). +func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return ErrNil + } + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(ss[i]) + } + return nil +} + +func size_slice_slice_byte(p *Properties, base structPointer) (n int) { + ss := *structPointer_BytesSlice(base, p.field) + l := len(ss) + if l == 0 { + return 0 + } + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeRawBytes(ss[i]) + } + return +} + +// Encode a slice of strings ([]string). +func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + for i := 0; i < l; i++ { + o.buf = append(o.buf, p.tagcode...) + o.EncodeStringBytes(ss[i]) + } + return nil +} + +func size_slice_string(p *Properties, base structPointer) (n int) { + ss := *structPointer_StringSlice(base, p.field) + l := len(ss) + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + n += sizeStringBytes(ss[i]) + } + return +} + +// Encode a slice of message structs ([]*struct). +func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return errRepeatedHasNil + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, err := m.Marshal() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + o.buf = append(o.buf, p.tagcode...) + o.EncodeRawBytes(data) + continue + } + + o.buf = append(o.buf, p.tagcode...) + err := o.enc_len_struct(p.sprop, structp, &state) + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + } + return state.err +} + +func size_slice_struct_message(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + n += l * len(p.tagcode) + for i := 0; i < l; i++ { + structp := s.Index(i) + if structPointer_IsNil(structp) { + return // return the size up to this point + } + + // Can the object marshal itself? + if p.isMarshaler { + m := structPointer_Interface(structp, p.stype).(Marshaler) + data, _ := m.Marshal() + n += sizeRawBytes(data) + continue + } + + n0 := size_struct(p.sprop, structp) + n1 := sizeVarint(uint64(n0)) // size of encoded length + n += n0 + n1 + } + return +} + +// Encode a slice of group structs ([]*struct). +func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { + var state errorState + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return errRepeatedHasNil + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) + + err := o.enc_struct(p.sprop, b) + + if err != nil && !state.shouldContinue(err, nil) { + if err == ErrNil { + return errRepeatedHasNil + } + return err + } + + o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) + } + return state.err +} + +func size_slice_struct_group(p *Properties, base structPointer) (n int) { + s := structPointer_StructPointerSlice(base, p.field) + l := s.Len() + + n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) + n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) + for i := 0; i < l; i++ { + b := s.Index(i) + if structPointer_IsNil(b) { + return // return size up to this point + } + + n += size_struct(p.sprop, b) + } + return +} + +// Encode an extension map. +func (o *Buffer) enc_map(p *Properties, base structPointer) error { + exts := structPointer_ExtMap(base, p.field) + if err := encodeExtensionsMap(*exts); err != nil { + return err + } + + return o.enc_map_body(*exts) +} + +func (o *Buffer) enc_exts(p *Properties, base structPointer) error { + exts := structPointer_Extensions(base, p.field) + + v, mu := exts.extensionsRead() + if v == nil { + return nil + } + + mu.Lock() + defer mu.Unlock() + if err := encodeExtensionsMap(v); err != nil { + return err + } + + return o.enc_map_body(v) +} + +func (o *Buffer) enc_map_body(v map[int32]Extension) error { + // Fast-path for common cases: zero or one extensions. + if len(v) <= 1 { + for _, e := range v { + o.buf = append(o.buf, e.enc...) + } + return nil + } + + // Sort keys to provide a deterministic encoding. + keys := make([]int, 0, len(v)) + for k := range v { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + o.buf = append(o.buf, v[int32(k)].enc...) + } + return nil +} + +func size_map(p *Properties, base structPointer) int { + v := structPointer_ExtMap(base, p.field) + return extensionsMapSize(*v) +} + +func size_exts(p *Properties, base structPointer) int { + v := structPointer_Extensions(base, p.field) + return extensionsSize(v) +} + +// Encode a map field. +func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { + var state errorState // XXX: or do we need to plumb this through? + + /* + A map defined as + map map_field = N; + is encoded in the same way as + message MapFieldEntry { + key_type key = 1; + value_type value = 2; + } + repeated MapFieldEntry map_field = N; + */ + + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + if v.Len() == 0 { + return nil + } + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + enc := func() error { + if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { + return err + } + if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { + return err + } + return nil + } + + // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + + keycopy.Set(key) + valcopy.Set(val) + + o.buf = append(o.buf, p.tagcode...) + if err := o.enc_len_thing(enc, &state); err != nil { + return err + } + } + return nil +} + +func size_new_map(p *Properties, base structPointer) int { + v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V + + keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) + + n := 0 + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + keycopy.Set(key) + valcopy.Set(val) + + // Tag codes for key and val are the responsibility of the sub-sizer. + keysize := p.mkeyprop.size(p.mkeyprop, keybase) + valsize := p.mvalprop.size(p.mvalprop, valbase) + entry := keysize + valsize + // Add on tag code and length of map entry itself. + n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry + } + return n +} + +// mapEncodeScratch returns a new reflect.Value matching the map's value type, +// and a structPointer suitable for passing to an encoder or sizer. +func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { + // Prepare addressable doubly-indirect placeholders for the key and value types. + // This is needed because the element-type encoders expect **T, but the map iteration produces T. + + keycopy = reflect.New(mapType.Key()).Elem() // addressable K + keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K + keyptr.Set(keycopy.Addr()) // + keybase = toStructPointer(keyptr.Addr()) // **K + + // Value types are more varied and require special handling. + switch mapType.Elem().Kind() { + case reflect.Slice: + // []byte + var dummy []byte + valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte + valbase = toStructPointer(valcopy.Addr()) + case reflect.Ptr: + // message; the generated field type is map[K]*Msg (so V is *Msg), + // so we only need one level of indirection. + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valbase = toStructPointer(valcopy.Addr()) + default: + // everything else + valcopy = reflect.New(mapType.Elem()).Elem() // addressable V + valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V + valptr.Set(valcopy.Addr()) // + valbase = toStructPointer(valptr.Addr()) // **V + } + return +} + +// Encode a struct. +func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { + var state errorState + // Encode fields in tag order so that decoders may use optimizations + // that depend on the ordering. + // https://developers.google.com/protocol-buffers/docs/encoding#order + for _, i := range prop.order { + p := prop.Prop[i] + if p.enc != nil { + err := p.enc(o, p, base) + if err != nil { + if err == ErrNil { + if p.Required && state.err == nil { + state.err = &RequiredNotSetError{p.Name} + } + } else if err == errRepeatedHasNil { + // Give more context to nil values in repeated fields. + return errors.New("repeated field " + p.OrigName + " has nil element") + } else if !state.shouldContinue(err, p) { + return err + } + } + if len(o.buf) > maxMarshalSize { + return ErrTooLarge + } + } + } + + // Do oneof fields. + if prop.oneofMarshaler != nil { + m := structPointer_Interface(base, prop.stype).(Message) + if err := prop.oneofMarshaler(m, o); err == ErrNil { + return errOneofHasNil + } else if err != nil { + return err + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + if len(o.buf)+len(v) > maxMarshalSize { + return ErrTooLarge + } + if len(v) > 0 { + o.buf = append(o.buf, v...) + } + } + + return state.err +} + +func size_struct(prop *StructProperties, base structPointer) (n int) { + for _, i := range prop.order { + p := prop.Prop[i] + if p.size != nil { + n += p.size(p, base) + } + } + + // Add unrecognized fields at the end. + if prop.unrecField.IsValid() { + v := *structPointer_Bytes(base, prop.unrecField) + n += len(v) + } + + // Factor in any oneof fields. + if prop.oneofSizer != nil { + m := structPointer_Interface(base, prop.stype).(Message) + n += prop.oneofSizer(m) + } + + return +} + +var zeroes [20]byte // longer than any conceivable sizeVarint + +// Encode a struct, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { + return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) +} + +// Encode something, preceded by its encoded length (as a varint). +func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { + iLen := len(o.buf) + o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length + iMsg := len(o.buf) + err := enc() + if err != nil && !state.shouldContinue(err, nil) { + return err + } + lMsg := len(o.buf) - iMsg + lLen := sizeVarint(uint64(lMsg)) + switch x := lLen - (iMsg - iLen); { + case x > 0: // actual length is x bytes larger than the space we reserved + // Move msg x bytes right. + o.buf = append(o.buf, zeroes[:x]...) + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + case x < 0: // actual length is x bytes smaller than the space we reserved + // Move msg x bytes left. + copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) + o.buf = o.buf[:len(o.buf)+x] // x is negative + } + // Encode the length in the reserved space. + o.buf = o.buf[:iLen] + o.EncodeVarint(uint64(lMsg)) + o.buf = o.buf[:len(o.buf)+lMsg] + return state.err +} + +// errorState maintains the first error that occurs and updates that error +// with additional context. +type errorState struct { + err error +} + +// shouldContinue reports whether encoding should continue upon encountering the +// given error. If the error is RequiredNotSetError, shouldContinue returns true +// and, if this is the first appearance of that error, remembers it for future +// reporting. +// +// If prop is not nil, it may update any error with additional context about the +// field with the error. +func (s *errorState) shouldContinue(err error, prop *Properties) bool { + // Ignore unset required fields. + reqNotSet, ok := err.(*RequiredNotSetError) + if !ok { + return false + } + if s.err == nil { + if prop != nil { + err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} + } + s.err = err + } + return true +} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go index d4db5a1c1..2ed1cf596 100644 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ b/vendor/github.com/golang/protobuf/proto/equal.go @@ -109,6 +109,15 @@ func equalStruct(v1, v2 reflect.Value) bool { // set/unset mismatch return false } + b1, ok := f1.Interface().(raw) + if ok { + b2 := f2.Interface().(raw) + // RawMessage + if !bytes.Equal(b1.Bytes(), b2.Bytes()) { + return false + } + continue + } f1, f2 = f1.Elem(), f2.Elem() } if !equalAny(f1, f2, sprop.Prop[i]) { @@ -137,7 +146,11 @@ func equalStruct(v1, v2 reflect.Value) bool { u1 := uf.Bytes() u2 := v2.FieldByName("XXX_unrecognized").Bytes() - return bytes.Equal(u1, u2) + if !bytes.Equal(u1, u2) { + return false + } + + return true } // v1 and v2 are known to have the same type. @@ -248,15 +261,6 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { m1, m2 := e1.value, e2.value - if m1 == nil && m2 == nil { - // Both have only encoded form. - if bytes.Equal(e1.enc, e2.enc) { - continue - } - // The bytes are different, but the extensions might still be - // equal. We need to decode them to compare. - } - if m1 != nil && m2 != nil { // Both are unencoded. if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { @@ -272,12 +276,8 @@ func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { desc = m[extNum] } if desc == nil { - // If both have only encoded form and the bytes are the same, - // it is handled above. We get here when the bytes are different. - // We don't know how to decode it, so just compare them as byte - // slices. log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - return false + continue } var err error if m1 == nil { diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go index 816a3b9d6..eaad21831 100644 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ b/vendor/github.com/golang/protobuf/proto/extensions.go @@ -38,7 +38,6 @@ package proto import ( "errors" "fmt" - "io" "reflect" "strconv" "sync" @@ -92,29 +91,14 @@ func (n notLocker) Unlock() {} // extendable returns the extendableProto interface for the given generated proto message. // If the proto message has the old extension format, it returns a wrapper that implements // the extendableProto interface. -func extendable(p interface{}) (extendableProto, error) { - switch p := p.(type) { - case extendableProto: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return p, nil - case extendableProtoV1: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return extensionAdapter{p}, nil +func extendable(p interface{}) (extendableProto, bool) { + if ep, ok := p.(extendableProto); ok { + return ep, ok } - // Don't allocate a specific error containing %T: - // this is the hot path for Clone and MarshalText. - return nil, errNotExtendable -} - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -func isNilPtr(x interface{}) bool { - v := reflect.ValueOf(x) - return v.Kind() == reflect.Ptr && v.IsNil() + if ep, ok := p.(extendableProtoV1); ok { + return extensionAdapter{ep}, ok + } + return nil, false } // XXX_InternalExtensions is an internal representation of proto extensions. @@ -159,6 +143,9 @@ func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Loc return e.p.extensionMap, &e.p.mu } +var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() +var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() + // ExtensionDesc represents an extension specification. // Used in generated code from the protocol compiler. type ExtensionDesc struct { @@ -192,8 +179,8 @@ type Extension struct { // SetRawExtension is for testing only. func SetRawExtension(base Message, id int32, b []byte) { - epb, err := extendable(base) - if err != nil { + epb, ok := extendable(base) + if !ok { return } extmap := epb.extensionsWrite() @@ -218,7 +205,7 @@ func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { pbi = ea.extendableProtoV1 } if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) + return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) } // Check the range. if !isExtensionField(pb, extension.Field) { @@ -263,11 +250,85 @@ func extensionProperties(ed *ExtensionDesc) *Properties { return prop } +// encode encodes any unmarshaled (unencoded) extensions in e. +func encodeExtensions(e *XXX_InternalExtensions) error { + m, mu := e.extensionsRead() + if m == nil { + return nil // fast path + } + mu.Lock() + defer mu.Unlock() + return encodeExtensionsMap(m) +} + +// encode encodes any unmarshaled (unencoded) extensions in e. +func encodeExtensionsMap(m map[int32]Extension) error { + for k, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + et := reflect.TypeOf(e.desc.ExtensionType) + props := extensionProperties(e.desc) + + p := NewBuffer(nil) + // If e.value has type T, the encoder expects a *struct{ X T }. + // Pass a *T with a zero field and hope it all works out. + x := reflect.New(et) + x.Elem().Set(reflect.ValueOf(e.value)) + if err := props.enc(p, props, toStructPointer(x)); err != nil { + return err + } + e.enc = p.buf + m[k] = e + } + return nil +} + +func extensionsSize(e *XXX_InternalExtensions) (n int) { + m, mu := e.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + defer mu.Unlock() + return extensionsMapSize(m) +} + +func extensionsMapSize(m map[int32]Extension) (n int) { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + et := reflect.TypeOf(e.desc.ExtensionType) + props := extensionProperties(e.desc) + + // If e.value has type T, the encoder expects a *struct{ X T }. + // Pass a *T with a zero field and hope it all works out. + x := reflect.New(et) + x.Elem().Set(reflect.ValueOf(e.value)) + n += props.size(props, toStructPointer(x)) + } + return +} + // HasExtension returns whether the given extension is present in pb. func HasExtension(pb Message, extension *ExtensionDesc) bool { // TODO: Check types, field numbers, etc.? - epb, err := extendable(pb) - if err != nil { + epb, ok := extendable(pb) + if !ok { return false } extmap, mu := epb.extensionsRead() @@ -275,15 +336,15 @@ func HasExtension(pb Message, extension *ExtensionDesc) bool { return false } mu.Lock() - _, ok := extmap[extension.Field] + _, ok = extmap[extension.Field] mu.Unlock() return ok } // ClearExtension removes the given extension from pb. func ClearExtension(pb Message, extension *ExtensionDesc) { - epb, err := extendable(pb) - if err != nil { + epb, ok := extendable(pb) + if !ok { return } // TODO: Check types, field numbers, etc.? @@ -291,26 +352,16 @@ func ClearExtension(pb Message, extension *ExtensionDesc) { delete(extmap, extension.Field) } -// GetExtension retrieves a proto2 extended field from pb. -// -// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), -// then GetExtension parses the encoded field and returns a Go value of the specified type. -// If the field is not present, then the default value is returned (if one is specified), -// otherwise ErrMissingExtension is reported. -// -// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes of the field extension. +// GetExtension parses and returns the given extension of pb. +// If the extension is not present and has no default value it returns ErrMissingExtension. func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") } - if extension.ExtendedType != nil { - // can only check type if this is a complete descriptor - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err - } + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err } emap, mu := epb.extensionsRead() @@ -337,11 +388,6 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { return e.value, nil } - if extension.ExtensionType == nil { - // incomplete descriptor - return e.enc, nil - } - v, err := decodeExtension(e.enc, extension) if err != nil { return nil, err @@ -359,11 +405,6 @@ func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { // defaultExtensionValue returns the default value for extension. // If no default for an extension is defined ErrMissingExtension is returned. func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - if extension.ExtensionType == nil { - // incomplete descriptor, so no default - return nil, ErrMissingExtension - } - t := reflect.TypeOf(extension.ExtensionType) props := extensionProperties(extension) @@ -398,28 +439,31 @@ func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { // decodeExtension decodes an extension encoded in b. func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { + o := NewBuffer(b) + t := reflect.TypeOf(extension.ExtensionType) - unmarshal := typeUnmarshaler(t, extension.Tag) + + props := extensionProperties(extension) // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate space to store the pointer/slice. + // Allocate a "field" to store the pointer/slice itself; the + // pointer/slice will be stored here. We pass + // the address of this field to props.dec. + // This passes a zero field and a *t and lets props.dec + // interpret it as a *struct{ x t }. value := reflect.New(t).Elem() - var err error for { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF + // Discard wire type and field number varint. It isn't needed. + if _, err := o.DecodeVarint(); err != nil { + return nil, err } - b = b[n:] - wire := int(x) & 7 - b, err = unmarshal(b, valToPointer(value.Addr()), wire) - if err != nil { + if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { return nil, err } - if len(b) == 0 { + if o.index >= len(o.buf) { break } } @@ -429,9 +473,9 @@ func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { // GetExtensions returns a slice of the extensions present in pb that are also listed in es. // The returned slice has the same length as es; missing extensions will appear as nil elements. func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, err := extendable(pb) - if err != nil { - return nil, err + epb, ok := extendable(pb) + if !ok { + return nil, errors.New("proto: not an extendable proto") } extensions = make([]interface{}, len(es)) for i, e := range es { @@ -450,9 +494,9 @@ func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, e // For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing // just the Field field, which defines the extension's field number. func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err + epb, ok := extendable(pb) + if !ok { + return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) } registeredExtensions := RegisteredExtensions(pb) @@ -479,9 +523,9 @@ func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { // SetExtension sets the specified extension of pb to the specified value. func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - epb, err := extendable(pb) - if err != nil { - return err + epb, ok := extendable(pb) + if !ok { + return errors.New("proto: not an extendable proto") } if err := checkExtensionTypes(epb, extension); err != nil { return err @@ -506,8 +550,8 @@ func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error // ClearAllExtensions clears all extensions from pb. func ClearAllExtensions(pb Message) { - epb, err := extendable(pb) - if err != nil { + epb, ok := extendable(pb) + if !ok { return } m := epb.extensionsWrite() diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go index 75565cc6d..1c225504a 100644 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -273,67 +273,6 @@ import ( "sync" ) -// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. -// Marshal reports this when a required field is not initialized. -// Unmarshal reports this when a required field is missing from the wire data. -type RequiredNotSetError struct{ field string } - -func (e *RequiredNotSetError) Error() string { - if e.field == "" { - return fmt.Sprintf("proto: required field not set") - } - return fmt.Sprintf("proto: required field %q not set", e.field) -} -func (e *RequiredNotSetError) RequiredNotSet() bool { - return true -} - -type invalidUTF8Error struct{ field string } - -func (e *invalidUTF8Error) Error() string { - if e.field == "" { - return "proto: invalid UTF-8 detected" - } - return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) -} -func (e *invalidUTF8Error) InvalidUTF8() bool { - return true -} - -// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. -// This error should not be exposed to the external API as such errors should -// be recreated with the field information. -var errInvalidUTF8 = &invalidUTF8Error{} - -// isNonFatal reports whether the error is either a RequiredNotSet error -// or a InvalidUTF8 error. -func isNonFatal(err error) bool { - if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { - return true - } - if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { - return true - } - return false -} - -type nonFatal struct{ E error } - -// Merge merges err into nf and reports whether it was successful. -// Otherwise it returns false for any fatal non-nil errors. -func (nf *nonFatal) Merge(err error) (ok bool) { - if err == nil { - return true // not an error - } - if !isNonFatal(err) { - return false // fatal error - } - if nf.E == nil { - nf.E = err // store first instance of non-fatal error - } - return true -} - // Message is implemented by generated protocol buffer messages. type Message interface { Reset() @@ -370,7 +309,16 @@ type Buffer struct { buf []byte // encode/decode byte stream index int // read point - deterministic bool + // pools of basic types to amortize allocation. + bools []bool + uint32s []uint32 + uint64s []uint64 + + // extra pools, only used with pointer_reflect.go + int32s []int32 + int64s []int64 + float32s []float32 + float64s []float64 } // NewBuffer allocates a new Buffer and initializes its internal data to @@ -395,30 +343,6 @@ func (p *Buffer) SetBuf(s []byte) { // Bytes returns the contents of the Buffer. func (p *Buffer) Bytes() []byte { return p.buf } -// SetDeterministic sets whether to use deterministic serialization. -// -// Deterministic serialization guarantees that for a given binary, equal -// messages will always be serialized to the same bytes. This implies: -// -// - Repeated serialization of a message will return the same bytes. -// - Different processes of the same binary (which may be executing on -// different machines) will serialize equal messages to the same bytes. -// -// Note that the deterministic serialization is NOT canonical across -// languages. It is not guaranteed to remain stable over time. It is unstable -// across different builds with schema changes due to unknown fields. -// Users who need canonical serialization (e.g., persistent storage in a -// canonical form, fingerprinting, etc.) should define their own -// canonicalization specification and implement their own serializer rather -// than relying on this API. -// -// If deterministic serialization is requested, map entries will be sorted -// by keys in lexographical order. This is an implementation detail and -// subject to change. -func (p *Buffer) SetDeterministic(deterministic bool) { - p.deterministic = deterministic -} - /* * Helper routines for simplifying the creation of optional fields of basic type. */ @@ -907,12 +831,22 @@ func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMes return sf, false, nil } -// mapKeys returns a sort.Interface to be used for sorting the map keys. // Map fields may have key types of non-float scalars, strings and enums. +// The easiest way to sort them in some deterministic order is to use fmt. +// If this turns out to be inefficient we can always consider other options, +// such as doing a Schwartzian transform. + func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{vs: vs} + s := mapKeySorter{ + vs: vs, + // default Less function: textual comparison + less: func(a, b reflect.Value) bool { + return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) + }, + } - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; + // numeric keys are sorted numerically. if len(vs) == 0 { return s } @@ -921,12 +855,6 @@ func mapKeys(vs []reflect.Value) sort.Interface { s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } case reflect.Uint32, reflect.Uint64: s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - case reflect.Bool: - s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true - case reflect.String: - s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } - default: - panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) } return s @@ -967,13 +895,3 @@ const ProtoPackageIsVersion2 = true // ProtoPackageIsVersion1 is referenced from generated protocol buffer files // to assert that that code is compatible with this version of the proto package. const ProtoPackageIsVersion1 = true - -// InternalMessageInfo is a type used internally by generated .pb.go files. -// This type is not intended to be used by non-generated code. -// This type is not subject to any compatibility guarantee. -type InternalMessageInfo struct { - marshal *marshalInfo - unmarshal *unmarshalInfo - merge *mergeInfo - discard *discardInfo -} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go index 3b6ca41d5..fd982decd 100644 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ b/vendor/github.com/golang/protobuf/proto/message_set.go @@ -42,7 +42,6 @@ import ( "fmt" "reflect" "sort" - "sync" ) // errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. @@ -95,7 +94,10 @@ func (ms *messageSet) find(pb Message) *_MessageSet_Item { } func (ms *messageSet) Has(pb Message) bool { - return ms.find(pb) != nil + if ms.find(pb) != nil { + return true + } + return false } func (ms *messageSet) Unmarshal(pb Message) error { @@ -148,42 +150,46 @@ func skipVarint(buf []byte) []byte { // MarshalMessageSet encodes the extension map represented by m in the message set wire format. // It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. func MarshalMessageSet(exts interface{}) ([]byte, error) { - return marshalMessageSet(exts, false) -} - -// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal. -func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) { + var m map[int32]Extension switch exts := exts.(type) { case *XXX_InternalExtensions: - var u marshalInfo - siz := u.sizeMessageSet(exts) - b := make([]byte, 0, siz) - return u.appendMessageSet(b, exts, deterministic) - + if err := encodeExtensions(exts); err != nil { + return nil, err + } + m, _ = exts.extensionsRead() case map[int32]Extension: - // This is an old-style extension map. - // Wrap it in a new-style XXX_InternalExtensions. - ie := XXX_InternalExtensions{ - p: &struct { - mu sync.Mutex - extensionMap map[int32]Extension - }{ - extensionMap: exts, - }, + if err := encodeExtensionsMap(exts); err != nil { + return nil, err } - - var u marshalInfo - siz := u.sizeMessageSet(&ie) - b := make([]byte, 0, siz) - return u.appendMessageSet(b, &ie, deterministic) - + m = exts default: return nil, errors.New("proto: not an extension map") } + + // Sort extension IDs to provide a deterministic encoding. + // See also enc_map in encode.go. + ids := make([]int, 0, len(m)) + for id := range m { + ids = append(ids, int(id)) + } + sort.Ints(ids) + + ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} + for _, id := range ids { + e := m[int32(id)] + // Remove the wire type and field number varint, as well as the length varint. + msg := skipVarint(skipVarint(e.enc)) + + ms.Item = append(ms.Item, &_MessageSet_Item{ + TypeId: Int32(int32(id)), + Message: msg, + }) + } + return Marshal(ms) } // UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. func UnmarshalMessageSet(buf []byte, exts interface{}) error { var m map[int32]Extension switch exts := exts.(type) { @@ -229,15 +235,7 @@ func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { var m map[int32]Extension switch exts := exts.(type) { case *XXX_InternalExtensions: - var mu sync.Locker - m, mu = exts.extensionsRead() - if m != nil { - // Keep the extensions map locked until we're done marshaling to prevent - // races between marshaling and unmarshaling the lazily-{en,de}coded - // values. - mu.Lock() - defer mu.Unlock() - } + m, _ = exts.extensionsRead() case map[int32]Extension: m = exts default: @@ -255,16 +253,15 @@ func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { for i, id := range ids { ext := m[id] + if i > 0 { + b.WriteByte(',') + } + msd, ok := messageSetMap[id] if !ok { // Unknown type; we can't render it, so skip it. continue } - - if i > 0 && b.Len() > 1 { - b.WriteByte(',') - } - fmt.Fprintf(&b, `"[%s]":`, msd.name) x := ext.value diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go index b6cad9083..fb512e2e1 100644 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build purego appengine js +// +build appengine js // This file contains an implementation of proto field accesses using package reflect. // It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can @@ -38,13 +38,32 @@ package proto import ( + "math" "reflect" - "sync" ) -const unsafeAllowed = false +// A structPointer is a pointer to a struct. +type structPointer struct { + v reflect.Value +} + +// toStructPointer returns a structPointer equivalent to the given reflect value. +// The reflect value must itself be a pointer to a struct. +func toStructPointer(v reflect.Value) structPointer { + return structPointer{v} +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p.v.IsNil() +} -// A field identifies a field in a struct, accessible from a pointer. +// Interface returns the struct pointer as an interface value. +func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { + return p.v.Interface() +} + +// A field identifies a field in a struct, accessible from a structPointer. // In this implementation, a field is identified by the sequence of field indices // passed to reflect's FieldByIndex. type field []int @@ -57,301 +76,409 @@ func toField(f *reflect.StructField) field { // invalidField is an invalid field identifier. var invalidField = field(nil) -// zeroField is a noop when calling pointer.offset. -var zeroField = field([]int{}) - // IsValid reports whether the field identifier is valid. func (f field) IsValid() bool { return f != nil } -// The pointer type is for the table-driven decoder. -// The implementation here uses a reflect.Value of pointer type to -// create a generic pointer. In pointer_unsafe.go we use unsafe -// instead of reflect to implement the same (but faster) interface. -type pointer struct { - v reflect.Value -} +// field returns the given field in the struct as a reflect value. +func structPointer_field(p structPointer, f field) reflect.Value { + // Special case: an extension map entry with a value of type T + // passes a *T to the struct-handling code with a zero field, + // expecting that it will be treated as equivalent to *struct{ X T }, + // which has the same memory layout. We have to handle that case + // specially, because reflect will panic if we call FieldByIndex on a + // non-struct. + if f == nil { + return p.v.Elem() + } -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - return pointer{v: reflect.ValueOf(*i)} + return p.v.Elem().FieldByIndex(f) } -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr bool) pointer { - v := reflect.ValueOf(*i) - u := reflect.New(v.Type()) - u.Elem().Set(v) - return pointer{v: u} +// ifield returns the given field in the struct as an interface value. +func structPointer_ifield(p structPointer, f field) interface{} { + return structPointer_field(p, f).Addr().Interface() } -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{v: v} +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return structPointer_ifield(p, f).(*[]byte) } -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return structPointer_ifield(p, f).(*[][]byte) } -func (p pointer) isNil() bool { - return p.v.IsNil() +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return structPointer_ifield(p, f).(**bool) } -// grow updates the slice s in place to make it one element longer. -// s must be addressable. -// Returns the (addressable) new element. -func grow(s reflect.Value) reflect.Value { - n, m := s.Len(), s.Cap() - if n < m { - s.SetLen(n + 1) - } else { - s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) - } - return s.Index(n) +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return structPointer_ifield(p, f).(*bool) } -func (p pointer) toInt64() *int64 { - return p.v.Interface().(*int64) +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return structPointer_ifield(p, f).(*[]bool) } -func (p pointer) toInt64Ptr() **int64 { - return p.v.Interface().(**int64) -} -func (p pointer) toInt64Slice() *[]int64 { - return p.v.Interface().(*[]int64) -} - -var int32ptr = reflect.TypeOf((*int32)(nil)) -func (p pointer) toInt32() *int32 { - return p.v.Convert(int32ptr).Interface().(*int32) +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return structPointer_ifield(p, f).(**string) } -// The toInt32Ptr/Slice methods don't work because of enums. -// Instead, we must use set/get methods for the int32ptr/slice case. -/* - func (p pointer) toInt32Ptr() **int32 { - return p.v.Interface().(**int32) +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return structPointer_ifield(p, f).(*string) } - func (p pointer) toInt32Slice() *[]int32 { - return p.v.Interface().(*[]int32) -} -*/ -func (p pointer) getInt32Ptr() *int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().(*int32) - } - // an enum - return p.v.Elem().Convert(int32PtrType).Interface().(*int32) -} -func (p pointer) setInt32Ptr(v int32) { - // Allocate value in a *int32. Possibly convert that to a *enum. - // Then assign it to a **int32 or **enum. - // Note: we can convert *int32 to *enum, but we can't convert - // **int32 to **enum! - p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) -} - -// getInt32Slice copies []int32 from p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getInt32Slice() []int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().([]int32) - } - // an enum - // Allocate a []int32, then assign []enum's values into it. - // Note: we can't convert []enum to []int32. - slice := p.v.Elem() - s := make([]int32, slice.Len()) - for i := 0; i < slice.Len(); i++ { - s[i] = int32(slice.Index(i).Int()) - } - return s + +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return structPointer_ifield(p, f).(*[]string) } -// setInt32Slice copies []int32 into p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setInt32Slice(v []int32) { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - p.v.Elem().Set(reflect.ValueOf(v)) - return - } - // an enum - // Allocate a []enum, then assign []int32's values into it. - // Note: we can't convert []enum to []int32. - slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) - for i, x := range v { - slice.Index(i).SetInt(int64(x)) - } - p.v.Elem().Set(slice) +// Extensions returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return structPointer_ifield(p, f).(*XXX_InternalExtensions) } -func (p pointer) appendInt32Slice(v int32) { - grow(p.v.Elem()).SetInt(int64(v)) + +// ExtMap returns the address of an extension map field in the struct. +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return structPointer_ifield(p, f).(*map[int32]Extension) } -func (p pointer) toUint64() *uint64 { - return p.v.Interface().(*uint64) +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return structPointer_field(p, f).Addr() } -func (p pointer) toUint64Ptr() **uint64 { - return p.v.Interface().(**uint64) + +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + structPointer_field(p, f).Set(q.v) } -func (p pointer) toUint64Slice() *[]uint64 { - return p.v.Interface().(*[]uint64) + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return structPointer{structPointer_field(p, f)} } -func (p pointer) toUint32() *uint32 { - return p.v.Interface().(*uint32) + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { + return structPointerSlice{structPointer_field(p, f)} } -func (p pointer) toUint32Ptr() **uint32 { - return p.v.Interface().(**uint32) + +// A structPointerSlice represents the address of a slice of pointers to structs +// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. +type structPointerSlice struct { + v reflect.Value } -func (p pointer) toUint32Slice() *[]uint32 { - return p.v.Interface().(*[]uint32) + +func (p structPointerSlice) Len() int { return p.v.Len() } +func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } +func (p structPointerSlice) Append(q structPointer) { + p.v.Set(reflect.Append(p.v, q.v)) } -func (p pointer) toBool() *bool { - return p.v.Interface().(*bool) + +var ( + int32Type = reflect.TypeOf(int32(0)) + uint32Type = reflect.TypeOf(uint32(0)) + float32Type = reflect.TypeOf(float32(0)) + int64Type = reflect.TypeOf(int64(0)) + uint64Type = reflect.TypeOf(uint64(0)) + float64Type = reflect.TypeOf(float64(0)) +) + +// A word32 represents a field of type *int32, *uint32, *float32, or *enum. +// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. +type word32 struct { + v reflect.Value } -func (p pointer) toBoolPtr() **bool { - return p.v.Interface().(**bool) + +// IsNil reports whether p is nil. +func word32_IsNil(p word32) bool { + return p.v.IsNil() } -func (p pointer) toBoolSlice() *[]bool { - return p.v.Interface().(*[]bool) + +// Set sets p to point at a newly allocated word with bits set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + t := p.v.Type().Elem() + switch t { + case int32Type: + if len(o.int32s) == 0 { + o.int32s = make([]int32, uint32PoolSize) + } + o.int32s[0] = int32(x) + p.v.Set(reflect.ValueOf(&o.int32s[0])) + o.int32s = o.int32s[1:] + return + case uint32Type: + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + p.v.Set(reflect.ValueOf(&o.uint32s[0])) + o.uint32s = o.uint32s[1:] + return + case float32Type: + if len(o.float32s) == 0 { + o.float32s = make([]float32, uint32PoolSize) + } + o.float32s[0] = math.Float32frombits(x) + p.v.Set(reflect.ValueOf(&o.float32s[0])) + o.float32s = o.float32s[1:] + return + } + + // must be enum + p.v.Set(reflect.New(t)) + p.v.Elem().SetInt(int64(int32(x))) } -func (p pointer) toFloat64() *float64 { - return p.v.Interface().(*float64) + +// Get gets the bits pointed at by p, as a uint32. +func word32_Get(p word32) uint32 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") } -func (p pointer) toFloat64Ptr() **float64 { - return p.v.Interface().(**float64) + +// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32{structPointer_field(p, f)} } -func (p pointer) toFloat64Slice() *[]float64 { - return p.v.Interface().(*[]float64) + +// A word32Val represents a field of type int32, uint32, float32, or enum. +// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. +type word32Val struct { + v reflect.Value } -func (p pointer) toFloat32() *float32 { - return p.v.Interface().(*float32) + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + switch p.v.Type() { + case int32Type: + p.v.SetInt(int64(x)) + return + case uint32Type: + p.v.SetUint(uint64(x)) + return + case float32Type: + p.v.SetFloat(float64(math.Float32frombits(x))) + return + } + + // must be enum + p.v.SetInt(int64(int32(x))) } -func (p pointer) toFloat32Ptr() **float32 { - return p.v.Interface().(**float32) + +// Get gets the bits pointed at by p, as a uint32. +func word32Val_Get(p word32Val) uint32 { + elem := p.v + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") } -func (p pointer) toFloat32Slice() *[]float32 { - return p.v.Interface().(*[]float32) + +// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val{structPointer_field(p, f)} } -func (p pointer) toString() *string { - return p.v.Interface().(*string) + +// A word32Slice is a slice of 32-bit values. +// That is, v.Type() is []int32, []uint32, []float32, or []enum. +type word32Slice struct { + v reflect.Value } -func (p pointer) toStringPtr() **string { - return p.v.Interface().(**string) + +func (p word32Slice) Append(x uint32) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int32: + elem.SetInt(int64(int32(x))) + case reflect.Uint32: + elem.SetUint(uint64(x)) + case reflect.Float32: + elem.SetFloat(float64(math.Float32frombits(x))) + } } -func (p pointer) toStringSlice() *[]string { - return p.v.Interface().(*[]string) + +func (p word32Slice) Len() int { + return p.v.Len() } -func (p pointer) toBytes() *[]byte { - return p.v.Interface().(*[]byte) + +func (p word32Slice) Index(i int) uint32 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int32: + return uint32(elem.Int()) + case reflect.Uint32: + return uint32(elem.Uint()) + case reflect.Float32: + return math.Float32bits(float32(elem.Float())) + } + panic("unreachable") } -func (p pointer) toBytesSlice() *[][]byte { - return p.v.Interface().(*[][]byte) + +// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) word32Slice { + return word32Slice{structPointer_field(p, f)} } -func (p pointer) toExtensions() *XXX_InternalExtensions { - return p.v.Interface().(*XXX_InternalExtensions) + +// word64 is like word32 but for 64-bit values. +type word64 struct { + v reflect.Value } -func (p pointer) toOldExtensions() *map[int32]Extension { - return p.v.Interface().(*map[int32]Extension) + +func word64_Set(p word64, o *Buffer, x uint64) { + t := p.v.Type().Elem() + switch t { + case int64Type: + if len(o.int64s) == 0 { + o.int64s = make([]int64, uint64PoolSize) + } + o.int64s[0] = int64(x) + p.v.Set(reflect.ValueOf(&o.int64s[0])) + o.int64s = o.int64s[1:] + return + case uint64Type: + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + p.v.Set(reflect.ValueOf(&o.uint64s[0])) + o.uint64s = o.uint64s[1:] + return + case float64Type: + if len(o.float64s) == 0 { + o.float64s = make([]float64, uint64PoolSize) + } + o.float64s[0] = math.Float64frombits(x) + p.v.Set(reflect.ValueOf(&o.float64s[0])) + o.float64s = o.float64s[1:] + return + } + panic("unreachable") } -func (p pointer) getPointer() pointer { - return pointer{v: p.v.Elem()} + +func word64_IsNil(p word64) bool { + return p.v.IsNil() } -func (p pointer) setPointer(q pointer) { - p.v.Elem().Set(q.v) + +func word64_Get(p word64) uint64 { + elem := p.v.Elem() + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) + } + panic("unreachable") } -func (p pointer) appendPointer(q pointer) { - grow(p.v.Elem()).Set(q.v) + +func structPointer_Word64(p structPointer, f field) word64 { + return word64{structPointer_field(p, f)} } -// getPointerSlice copies []*T from p as a new []pointer. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getPointerSlice() []pointer { - if p.v.IsNil() { - return nil - } - n := p.v.Elem().Len() - s := make([]pointer, n) - for i := 0; i < n; i++ { - s[i] = pointer{v: p.v.Elem().Index(i)} - } - return s +// word64Val is like word32Val but for 64-bit values. +type word64Val struct { + v reflect.Value } -// setPointerSlice copies []pointer into p as a new []*T. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setPointerSlice(v []pointer) { - if v == nil { - p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + switch p.v.Type() { + case int64Type: + p.v.SetInt(int64(x)) + return + case uint64Type: + p.v.SetUint(x) + return + case float64Type: + p.v.SetFloat(math.Float64frombits(x)) return } - s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) - for _, p := range v { - s = reflect.Append(s, p.v) - } - p.v.Elem().Set(s) + panic("unreachable") } -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - if p.v.Elem().IsNil() { - return pointer{v: p.v.Elem()} +func word64Val_Get(p word64Val) uint64 { + elem := p.v + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return elem.Uint() + case reflect.Float64: + return math.Float64bits(elem.Float()) } - return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct + panic("unreachable") } -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - // TODO: check that p.v.Type().Elem() == t? - return p.v +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val{structPointer_field(p, f)} } -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p +type word64Slice struct { + v reflect.Value } -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v + +func (p word64Slice) Append(x uint64) { + n, m := p.v.Len(), p.v.Cap() + if n < m { + p.v.SetLen(n + 1) + } else { + t := p.v.Type().Elem() + p.v.Set(reflect.Append(p.v, reflect.Zero(t))) + } + elem := p.v.Index(n) + switch elem.Kind() { + case reflect.Int64: + elem.SetInt(int64(int64(x))) + case reflect.Uint64: + elem.SetUint(uint64(x)) + case reflect.Float64: + elem.SetFloat(float64(math.Float64frombits(x))) + } } -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p + +func (p word64Slice) Len() int { + return p.v.Len() } -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v + +func (p word64Slice) Index(i int) uint64 { + elem := p.v.Index(i) + switch elem.Kind() { + case reflect.Int64: + return uint64(elem.Int()) + case reflect.Uint64: + return uint64(elem.Uint()) + case reflect.Float64: + return math.Float64bits(float64(elem.Float())) + } + panic("unreachable") } -var atomicLock sync.Mutex +func structPointer_Word64Slice(p structPointer, f field) word64Slice { + return word64Slice{structPointer_field(p, f)} +} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go index d55a335d9..6b5567d47 100644 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build !purego,!appengine,!js +// +build !appengine,!js // This file contains the implementation of the proto field accesses using package unsafe. @@ -37,13 +37,38 @@ package proto import ( "reflect" - "sync/atomic" "unsafe" ) -const unsafeAllowed = true +// NOTE: These type_Foo functions would more idiomatically be methods, +// but Go does not allow methods on pointer types, and we must preserve +// some pointer type for the garbage collector. We use these +// funcs with clunky names as our poor approximation to methods. +// +// An alternative would be +// type structPointer struct { p unsafe.Pointer } +// but that does not registerize as well. + +// A structPointer is a pointer to a struct. +type structPointer unsafe.Pointer + +// toStructPointer returns a structPointer equivalent to the given reflect value. +func toStructPointer(v reflect.Value) structPointer { + return structPointer(unsafe.Pointer(v.Pointer())) +} + +// IsNil reports whether p is nil. +func structPointer_IsNil(p structPointer) bool { + return p == nil +} + +// Interface returns the struct pointer, assumed to have element type t, +// as an interface value. +func structPointer_Interface(p structPointer, t reflect.Type) interface{} { + return reflect.NewAt(t, unsafe.Pointer(p)).Interface() +} -// A field identifies a field in a struct, accessible from a pointer. +// A field identifies a field in a struct, accessible from a structPointer. // In this implementation, a field is identified by its byte offset from the start of the struct. type field uintptr @@ -55,254 +80,191 @@ func toField(f *reflect.StructField) field { // invalidField is an invalid field identifier. const invalidField = ^field(0) -// zeroField is a noop when calling pointer.offset. -const zeroField = field(0) - // IsValid reports whether the field identifier is valid. func (f field) IsValid() bool { - return f != invalidField + return f != ^field(0) } -// The pointer type below is for the new table-driven encoder/decoder. -// The implementation here uses unsafe.Pointer to create a generic pointer. -// In pointer_reflect.go we use reflect instead of unsafe to implement -// the same (but slower) interface. -type pointer struct { - p unsafe.Pointer +// Bytes returns the address of a []byte field in the struct. +func structPointer_Bytes(p structPointer, f field) *[]byte { + return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// size of pointer -var ptrSize = unsafe.Sizeof(uintptr(0)) - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - // Super-tricky - read pointer out of data word of interface value. - // Saves ~25ns over the equivalent: - // return valToPointer(reflect.ValueOf(*i)) - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +// BytesSlice returns the address of a [][]byte field in the struct. +func structPointer_BytesSlice(p structPointer, f field) *[][]byte { + return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr bool) pointer { - // Super-tricky - read or get the address of data word of interface value. - if isptr { - // The interface is of pointer type, thus it is a direct interface. - // The data word is the pointer data itself. We take its address. - return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} - } - // The interface is not of pointer type. The data word is the pointer - // to the data. - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +// Bool returns the address of a *bool field in the struct. +func structPointer_Bool(p structPointer, f field) **bool { + return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{p: unsafe.Pointer(v.Pointer())} +// BoolVal returns the address of a bool field in the struct. +func structPointer_BoolVal(p structPointer, f field) *bool { + return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - // For safety, we should panic if !f.IsValid, however calling panic causes - // this to no longer be inlineable, which is a serious performance cost. - /* - if !f.IsValid() { - panic("invalid field") - } - */ - return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} +// BoolSlice returns the address of a []bool field in the struct. +func structPointer_BoolSlice(p structPointer, f field) *[]bool { + return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -func (p pointer) isNil() bool { - return p.p == nil +// String returns the address of a *string field in the struct. +func structPointer_String(p structPointer, f field) **string { + return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -func (p pointer) toInt64() *int64 { - return (*int64)(p.p) -} -func (p pointer) toInt64Ptr() **int64 { - return (**int64)(p.p) -} -func (p pointer) toInt64Slice() *[]int64 { - return (*[]int64)(p.p) -} -func (p pointer) toInt32() *int32 { - return (*int32)(p.p) +// StringVal returns the address of a string field in the struct. +func structPointer_StringVal(p structPointer, f field) *string { + return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. -/* - func (p pointer) toInt32Ptr() **int32 { - return (**int32)(p.p) - } - func (p pointer) toInt32Slice() *[]int32 { - return (*[]int32)(p.p) - } -*/ -func (p pointer) getInt32Ptr() *int32 { - return *(**int32)(p.p) -} -func (p pointer) setInt32Ptr(v int32) { - *(**int32)(p.p) = &v +// StringSlice returns the address of a []string field in the struct. +func structPointer_StringSlice(p structPointer, f field) *[]string { + return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// getInt32Slice loads a []int32 from p. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getInt32Slice() []int32 { - return *(*[]int32)(p.p) +// ExtMap returns the address of an extension map field in the struct. +func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// setInt32Slice stores a []int32 to p. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setInt32Slice(v []int32) { - *(*[]int32)(p.p) = v +func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { + return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? -func (p pointer) appendInt32Slice(v int32) { - s := (*[]int32)(p.p) - *s = append(*s, v) +// NewAt returns the reflect.Value for a pointer to a field in the struct. +func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { + return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) } -func (p pointer) toUint64() *uint64 { - return (*uint64)(p.p) -} -func (p pointer) toUint64Ptr() **uint64 { - return (**uint64)(p.p) -} -func (p pointer) toUint64Slice() *[]uint64 { - return (*[]uint64)(p.p) -} -func (p pointer) toUint32() *uint32 { - return (*uint32)(p.p) -} -func (p pointer) toUint32Ptr() **uint32 { - return (**uint32)(p.p) -} -func (p pointer) toUint32Slice() *[]uint32 { - return (*[]uint32)(p.p) -} -func (p pointer) toBool() *bool { - return (*bool)(p.p) -} -func (p pointer) toBoolPtr() **bool { - return (**bool)(p.p) -} -func (p pointer) toBoolSlice() *[]bool { - return (*[]bool)(p.p) -} -func (p pointer) toFloat64() *float64 { - return (*float64)(p.p) -} -func (p pointer) toFloat64Ptr() **float64 { - return (**float64)(p.p) -} -func (p pointer) toFloat64Slice() *[]float64 { - return (*[]float64)(p.p) -} -func (p pointer) toFloat32() *float32 { - return (*float32)(p.p) +// SetStructPointer writes a *struct field in the struct. +func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { + *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q } -func (p pointer) toFloat32Ptr() **float32 { - return (**float32)(p.p) -} -func (p pointer) toFloat32Slice() *[]float32 { - return (*[]float32)(p.p) -} -func (p pointer) toString() *string { - return (*string)(p.p) -} -func (p pointer) toStringPtr() **string { - return (**string)(p.p) -} -func (p pointer) toStringSlice() *[]string { - return (*[]string)(p.p) -} -func (p pointer) toBytes() *[]byte { - return (*[]byte)(p.p) -} -func (p pointer) toBytesSlice() *[][]byte { - return (*[][]byte)(p.p) + +// GetStructPointer reads a *struct field in the struct. +func structPointer_GetStructPointer(p structPointer, f field) structPointer { + return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -func (p pointer) toExtensions() *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(p.p) + +// StructPointerSlice the address of a []*struct field in the struct. +func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { + return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -func (p pointer) toOldExtensions() *map[int32]Extension { - return (*map[int32]Extension)(p.p) + +// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). +type structPointerSlice []structPointer + +func (v *structPointerSlice) Len() int { return len(*v) } +func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } +func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } + +// A word32 is the address of a "pointer to 32-bit value" field. +type word32 **uint32 + +// IsNil reports whether *v is nil. +func word32_IsNil(p word32) bool { + return *p == nil } -// getPointerSlice loads []*T from p as a []pointer. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getPointerSlice() []pointer { - // Super-tricky - p should point to a []*T where T is a - // message type. We load it as []pointer. - return *(*[]pointer)(p.p) +// Set sets *v to point at a newly allocated word set to x. +func word32_Set(p word32, o *Buffer, x uint32) { + if len(o.uint32s) == 0 { + o.uint32s = make([]uint32, uint32PoolSize) + } + o.uint32s[0] = x + *p = &o.uint32s[0] + o.uint32s = o.uint32s[1:] } -// setPointerSlice stores []pointer into p as a []*T. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setPointerSlice(v []pointer) { - // Super-tricky - p should point to a []*T where T is a - // message type. We store it as []pointer. - *(*[]pointer)(p.p) = v +// Get gets the value pointed at by *v. +func word32_Get(p word32) uint32 { + return **p } -// getPointer loads the pointer at p and returns it. -func (p pointer) getPointer() pointer { - return pointer{p: *(*unsafe.Pointer)(p.p)} +// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32(p structPointer, f field) word32 { + return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) } -// setPointer stores the pointer q at p. -func (p pointer) setPointer(q pointer) { - *(*unsafe.Pointer)(p.p) = q.p +// A word32Val is the address of a 32-bit value field. +type word32Val *uint32 + +// Set sets *p to x. +func word32Val_Set(p word32Val, x uint32) { + *p = x } -// append q to the slice pointed to by p. -func (p pointer) appendPointer(q pointer) { - s := (*[]unsafe.Pointer)(p.p) - *s = append(*s, q.p) +// Get gets the value pointed at by p. +func word32Val_Get(p word32Val) uint32 { + return *p } -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - // Super-tricky - read pointer out of data word of interface value. - return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. +func structPointer_Word32Val(p structPointer, f field) word32Val { + return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) } -// asPointerTo returns a reflect.Value that is a pointer to an -// object of type t stored at p. -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - return reflect.NewAt(t, p.p) +// A word32Slice is a slice of 32-bit values. +type word32Slice []uint32 + +func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } +func (v *word32Slice) Len() int { return len(*v) } +func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } + +// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. +func structPointer_Word32Slice(p structPointer, f field) *word32Slice { + return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) } -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +// word64 is like word32 but for 64-bit values. +type word64 **uint64 + +func word64_Set(p word64, o *Buffer, x uint64) { + if len(o.uint64s) == 0 { + o.uint64s = make([]uint64, uint64PoolSize) + } + o.uint64s[0] = x + *p = &o.uint64s[0] + o.uint64s = o.uint64s[1:] } -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) + +func word64_IsNil(p word64) bool { + return *p == nil } -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) + +func word64_Get(p word64) uint64 { + return **p } -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) + +func structPointer_Word64(p structPointer, f field) word64 { + return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) } -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) + +// word64Val is like word32Val but for 64-bit values. +type word64Val *uint64 + +func word64Val_Set(p word64Val, o *Buffer, x uint64) { + *p = x } -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) + +func word64Val_Get(p word64Val) uint64 { + return *p } -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) + +func structPointer_Word64Val(p structPointer, f field) word64Val { + return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) } -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) + +// word64Slice is like word32Slice but for 64-bit values. +type word64Slice []uint64 + +func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } +func (v *word64Slice) Len() int { return len(*v) } +func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } + +func structPointer_Word64Slice(p structPointer, f field) *word64Slice { + return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) } diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go index 50b99b83a..ec2289c00 100644 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -58,6 +58,42 @@ const ( WireFixed32 = 5 ) +const startSize = 10 // initial slice/string sizes + +// Encoders are defined in encode.go +// An encoder outputs the full representation of a field, including its +// tag and encoder type. +type encoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueEncoder encodes a single integer in a particular encoding. +type valueEncoder func(o *Buffer, x uint64) error + +// Sizers are defined in encode.go +// A sizer returns the encoded size of a field, including its tag and encoder +// type. +type sizer func(prop *Properties, base structPointer) int + +// A valueSizer returns the encoded size of a single integer in a particular +// encoding. +type valueSizer func(x uint64) int + +// Decoders are defined in decode.go +// A decoder creates a value from its wire representation. +// Unrecognized subelements are saved in unrec. +type decoder func(p *Buffer, prop *Properties, base structPointer) error + +// A valueDecoder decodes a single integer in a particular encoding. +type valueDecoder func(o *Buffer) (x uint64, err error) + +// A oneofMarshaler does the marshaling for all oneof fields in a message. +type oneofMarshaler func(Message, *Buffer) error + +// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. +type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) + +// A oneofSizer does the sizing for all oneof fields in a message. +type oneofSizer func(Message) int + // tagMap is an optimization over map[int]int for typical protocol buffer // use-cases. Encoded protocol buffers are often in tag order with small tag // numbers. @@ -104,6 +140,13 @@ type StructProperties struct { decoderTags tagMap // map from proto tag to struct field number decoderOrigNames map[string]int // map from original name to struct field number order []int // list of struct field numbers in tag order + unrecField field // field id of the XXX_unrecognized []byte field + extendable bool // is this an extendable proto + + oneofMarshaler oneofMarshaler + oneofUnmarshaler oneofUnmarshaler + oneofSizer oneofSizer + stype reflect.Type // OneofTypes contains information about the oneof fields in this message. // It is keyed by the original name of a field. @@ -139,24 +182,41 @@ type Properties struct { Repeated bool Packed bool // relevant for repeated primitives only Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field + proto3 bool // whether this is known to be a proto3 field; set for []byte only oneof bool // whether this is a oneof field Default string // default value HasDefault bool // whether an explicit default was provided - - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - - mtype reflect.Type // set for map types only - MapKeyProp *Properties // set for map types only - MapValProp *Properties // set for map types only + def_uint64 uint64 + + enc encoder + valEnc valueEncoder // set for bool and numeric types only + field field + tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) + tagbuf [8]byte + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + isMarshaler bool + isUnmarshaler bool + + mtype reflect.Type // set for map types only + mkeyprop *Properties // set for map types only + mvalprop *Properties // set for map types only + + size sizer + valSize valueSizer // set for bool and numeric types only + + dec decoder + valDec valueDecoder // set for bool and numeric types only + + // If this is a packable field, this will be the decoder for the packed version of the field. + packedDec decoder } // String formats the properties in the protobuf struct field tag style. func (p *Properties) String() string { s := p.Wire - s += "," + s = "," s += strconv.Itoa(p.Tag) if p.Required { s += ",req" @@ -202,14 +262,29 @@ func (p *Properties) Parse(s string) { switch p.Wire { case "varint": p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeVarint + p.valDec = (*Buffer).DecodeVarint + p.valSize = sizeVarint case "fixed32": p.WireType = WireFixed32 + p.valEnc = (*Buffer).EncodeFixed32 + p.valDec = (*Buffer).DecodeFixed32 + p.valSize = sizeFixed32 case "fixed64": p.WireType = WireFixed64 + p.valEnc = (*Buffer).EncodeFixed64 + p.valDec = (*Buffer).DecodeFixed64 + p.valSize = sizeFixed64 case "zigzag32": p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag32 + p.valDec = (*Buffer).DecodeZigzag32 + p.valSize = sizeZigzag32 case "zigzag64": p.WireType = WireVarint + p.valEnc = (*Buffer).EncodeZigzag64 + p.valDec = (*Buffer).DecodeZigzag64 + p.valSize = sizeZigzag64 case "bytes", "group": p.WireType = WireBytes // no numeric converter for non-numeric types @@ -224,7 +299,6 @@ func (p *Properties) Parse(s string) { return } -outer: for i := 2; i < len(fields); i++ { f := fields[i] switch { @@ -252,41 +326,256 @@ outer: if i+1 < len(fields) { // Commas aren't escaped, and def is always last. p.Default += "," + strings.Join(fields[i+1:], ",") - break outer + break } } } } +func logNoSliceEnc(t1, t2 reflect.Type) { + fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) +} + var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() -// setFieldProps initializes the field properties for submessages and maps. -func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { +// Initialize the fields for encoding and decoding. +func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { + p.enc = nil + p.dec = nil + p.size = nil + switch t1 := typ; t1.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) + + // proto3 scalar types + + case reflect.Bool: + p.enc = (*Buffer).enc_proto3_bool + p.dec = (*Buffer).dec_proto3_bool + p.size = size_proto3_bool + case reflect.Int32: + p.enc = (*Buffer).enc_proto3_int32 + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_proto3_uint32 + p.dec = (*Buffer).dec_proto3_int32 // can reuse + p.size = size_proto3_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_proto3_int64 + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int32 + p.size = size_proto3_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits + p.dec = (*Buffer).dec_proto3_int64 + p.size = size_proto3_int64 + case reflect.String: + p.enc = (*Buffer).enc_proto3_string + p.dec = (*Buffer).dec_proto3_string + p.size = size_proto3_string + case reflect.Ptr: - if t1.Elem().Kind() == reflect.Struct { + switch t2 := t1.Elem(); t2.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) + break + case reflect.Bool: + p.enc = (*Buffer).enc_bool + p.dec = (*Buffer).dec_bool + p.size = size_bool + case reflect.Int32: + p.enc = (*Buffer).enc_int32 + p.dec = (*Buffer).dec_int32 + p.size = size_int32 + case reflect.Uint32: + p.enc = (*Buffer).enc_uint32 + p.dec = (*Buffer).dec_int32 // can reuse + p.size = size_uint32 + case reflect.Int64, reflect.Uint64: + p.enc = (*Buffer).enc_int64 + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.Float32: + p.enc = (*Buffer).enc_uint32 // can just treat them as bits + p.dec = (*Buffer).dec_int32 + p.size = size_uint32 + case reflect.Float64: + p.enc = (*Buffer).enc_int64 // can just treat them as bits + p.dec = (*Buffer).dec_int64 + p.size = size_int64 + case reflect.String: + p.enc = (*Buffer).enc_string + p.dec = (*Buffer).dec_string + p.size = size_string + case reflect.Struct: p.stype = t1.Elem() + p.isMarshaler = isMarshaler(t1) + p.isUnmarshaler = isUnmarshaler(t1) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_struct_message + p.dec = (*Buffer).dec_struct_message + p.size = size_struct_message + } else { + p.enc = (*Buffer).enc_struct_group + p.dec = (*Buffer).dec_struct_group + p.size = size_struct_group + } } case reflect.Slice: - if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { - p.stype = t2.Elem() + switch t2 := t1.Elem(); t2.Kind() { + default: + logNoSliceEnc(t1, t2) + break + case reflect.Bool: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_bool + p.size = size_slice_packed_bool + } else { + p.enc = (*Buffer).enc_slice_bool + p.size = size_slice_bool + } + p.dec = (*Buffer).dec_slice_bool + p.packedDec = (*Buffer).dec_slice_packed_bool + case reflect.Int32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int32 + p.size = size_slice_packed_int32 + } else { + p.enc = (*Buffer).enc_slice_int32 + p.size = size_slice_int32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Uint32: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case reflect.Int64, reflect.Uint64: + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + case reflect.Uint8: + p.dec = (*Buffer).dec_slice_byte + if p.proto3 { + p.enc = (*Buffer).enc_proto3_slice_byte + p.size = size_proto3_slice_byte + } else { + p.enc = (*Buffer).enc_slice_byte + p.size = size_slice_byte + } + case reflect.Float32, reflect.Float64: + switch t2.Bits() { + case 32: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_uint32 + p.size = size_slice_packed_uint32 + } else { + p.enc = (*Buffer).enc_slice_uint32 + p.size = size_slice_uint32 + } + p.dec = (*Buffer).dec_slice_int32 + p.packedDec = (*Buffer).dec_slice_packed_int32 + case 64: + // can just treat them as bits + if p.Packed { + p.enc = (*Buffer).enc_slice_packed_int64 + p.size = size_slice_packed_int64 + } else { + p.enc = (*Buffer).enc_slice_int64 + p.size = size_slice_int64 + } + p.dec = (*Buffer).dec_slice_int64 + p.packedDec = (*Buffer).dec_slice_packed_int64 + default: + logNoSliceEnc(t1, t2) + break + } + case reflect.String: + p.enc = (*Buffer).enc_slice_string + p.dec = (*Buffer).dec_slice_string + p.size = size_slice_string + case reflect.Ptr: + switch t3 := t2.Elem(); t3.Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) + break + case reflect.Struct: + p.stype = t2.Elem() + p.isMarshaler = isMarshaler(t2) + p.isUnmarshaler = isUnmarshaler(t2) + if p.Wire == "bytes" { + p.enc = (*Buffer).enc_slice_struct_message + p.dec = (*Buffer).dec_slice_struct_message + p.size = size_slice_struct_message + } else { + p.enc = (*Buffer).enc_slice_struct_group + p.dec = (*Buffer).dec_slice_struct_group + p.size = size_slice_struct_group + } + } + case reflect.Slice: + switch t2.Elem().Kind() { + default: + fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) + break + case reflect.Uint8: + p.enc = (*Buffer).enc_slice_slice_byte + p.dec = (*Buffer).dec_slice_slice_byte + p.size = size_slice_slice_byte + } } case reflect.Map: + p.enc = (*Buffer).enc_new_map + p.dec = (*Buffer).dec_new_map + p.size = size_new_map + p.mtype = t1 - p.MapKeyProp = &Properties{} - p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.MapValProp = &Properties{} + p.mkeyprop = &Properties{} + p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.mvalprop = &Properties{} vtype := p.mtype.Elem() if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { // The value type is not a message (*T) or bytes ([]byte), // so we need encoders for the pointer to this type. vtype = reflect.PtrTo(vtype) } - p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) } + // precalculate tag code + wire := p.WireType + if p.Packed { + wire = WireBytes + } + x := uint32(p.Tag)<<3 | uint32(wire) + i := 0 + for i = 0; x > 127; i++ { + p.tagbuf[i] = 0x80 | uint8(x&0x7F) + x >>= 7 + } + p.tagbuf[i] = uint8(x) + p.tagcode = p.tagbuf[0 : i+1] + if p.stype != nil { if lockGetProp { p.sprop = GetProperties(p.stype) @@ -297,9 +586,32 @@ func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, loc } var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() ) +// isMarshaler reports whether type t implements Marshaler. +func isMarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isMarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isMarshaler") + } + return t.Implements(marshalerType) +} + +// isUnmarshaler reports whether type t implements Unmarshaler. +func isUnmarshaler(t reflect.Type) bool { + // We're checking for (likely) pointer-receiver methods + // so if t is not a pointer, something is very wrong. + // The calls above only invoke isUnmarshaler on pointer types. + if t.Kind() != reflect.Ptr { + panic("proto: misuse of isUnmarshaler") + } + return t.Implements(unmarshalerType) +} + // Init populates the properties from a protocol buffer struct tag. func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { p.init(typ, name, tag, f, true) @@ -309,11 +621,14 @@ func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructF // "bytes,49,opt,def=hello!" p.Name = name p.OrigName = name + if f != nil { + p.field = toField(f) + } if tag == "" { return } p.Parse(tag) - p.setFieldProps(typ, f, lockGetProp) + p.setEncAndDec(typ, f, lockGetProp) } var ( @@ -363,6 +678,9 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { propertiesMap[t] = prop // build properties + prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || + reflect.PtrTo(t).Implements(extendableProtoV1Type) + prop.unrecField = invalidField prop.Prop = make([]*Properties, t.NumField()) prop.order = make([]int, t.NumField()) @@ -372,6 +690,17 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { name := f.Name p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) + if f.Name == "XXX_InternalExtensions" { // special case + p.enc = (*Buffer).enc_exts + p.dec = nil // not needed + p.size = size_exts + } else if f.Name == "XXX_extensions" { // special case + p.enc = (*Buffer).enc_map + p.dec = nil // not needed + p.size = size_map + } else if f.Name == "XXX_unrecognized" { // special case + prop.unrecField = toField(&f) + } oneof := f.Tag.Get("protobuf_oneof") // special case if oneof != "" { // Oneof fields don't use the traditional protobuf tag. @@ -386,6 +715,9 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { } print("\n") } + if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { + fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") + } } // Re-order prop.order. @@ -396,7 +728,8 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { } if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { var oots []interface{} - _, _, _, oots = om.XXX_OneofFuncs() + prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() + prop.stype = t // Interpret oneof metadata. prop.OneofTypes = make(map[string]*OneofProperties) @@ -446,6 +779,30 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { return prop } +// Return the Properties object for the x[0]'th field of the structure. +func propByIndex(t reflect.Type, x []int) *Properties { + if len(x) != 1 { + fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) + return nil + } + prop := GetProperties(t) + return prop.Prop[x[0]] +} + +// Get the address and type of a pointer to a struct from an interface. +func getbase(pb Message) (t reflect.Type, b structPointer, err error) { + if pb == nil { + err = ErrNil + return + } + // get the reflect type of the pointer to the struct. + t = reflect.TypeOf(pb) + // get the address of the struct. + value := reflect.ValueOf(pb) + b = toStructPointer(value) + return +} + // A global registry of enum types. // The generated code will register the generated maps by calling RegisterEnum. @@ -469,42 +826,20 @@ func EnumValueMap(enumType string) map[string]int32 { // A registry of all linked message types. // The string is a fully-qualified proto name ("pkg.Message"). var ( - protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers - protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types - revProtoTypes = make(map[reflect.Type]string) + protoTypes = make(map[string]reflect.Type) + revProtoTypes = make(map[reflect.Type]string) ) // RegisterType is called from generated code and maps from the fully qualified // proto name to the type (pointer to struct) of the protocol buffer. func RegisterType(x Message, name string) { - if _, ok := protoTypedNils[name]; ok { + if _, ok := protoTypes[name]; ok { // TODO: Some day, make this a panic. log.Printf("proto: duplicate proto type registered: %s", name) return } t := reflect.TypeOf(x) - if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { - // Generated code always calls RegisterType with nil x. - // This check is just for extra safety. - protoTypedNils[name] = x - } else { - protoTypedNils[name] = reflect.Zero(t).Interface().(Message) - } - revProtoTypes[t] = name -} - -// RegisterMapType is called from generated code and maps from the fully qualified -// proto name to the native map type of the proto map definition. -func RegisterMapType(x interface{}, name string) { - if reflect.TypeOf(x).Kind() != reflect.Map { - panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) - } - if _, ok := protoMapTypes[name]; ok { - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoMapTypes[name] = t + protoTypes[name] = t revProtoTypes[t] = name } @@ -520,14 +855,7 @@ func MessageName(x Message) string { } // MessageType returns the message type (pointer to struct) for a named message. -// The type is not guaranteed to implement proto.Message if the name refers to a -// map entry. -func MessageType(name string) reflect.Type { - if t, ok := protoTypedNils[name]; ok { - return reflect.TypeOf(t) - } - return protoMapTypes[name] -} +func MessageType(name string) reflect.Type { return protoTypes[name] } // A registry of all linked proto files. var ( diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go deleted file mode 100644 index b16794496..000000000 --- a/vendor/github.com/golang/protobuf/proto/table_marshal.go +++ /dev/null @@ -1,2767 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "math" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// a sizer takes a pointer to a field and the size of its tag, computes the size of -// the encoded data. -type sizer func(pointer, int) int - -// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), -// marshals the field to the end of the slice, returns the slice and error (if any). -type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) - -// marshalInfo is the information used for marshaling a message. -type marshalInfo struct { - typ reflect.Type - fields []*marshalFieldInfo - unrecognized field // offset of XXX_unrecognized - extensions field // offset of XXX_InternalExtensions - v1extensions field // offset of XXX_extensions - sizecache field // offset of XXX_sizecache - initialized int32 // 0 -- only typ is set, 1 -- fully initialized - messageset bool // uses message set wire format - hasmarshaler bool // has custom marshaler - sync.RWMutex // protect extElems map, also for initialization - extElems map[int32]*marshalElemInfo // info of extension elements -} - -// marshalFieldInfo is the information used for marshaling a field of a message. -type marshalFieldInfo struct { - field field - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isPointer bool - required bool // field is required - name string // name of the field, for error reporting - oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements -} - -// marshalElemInfo is the information used for marshaling an extension or oneof element. -type marshalElemInfo struct { - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) -} - -var ( - marshalInfoMap = map[reflect.Type]*marshalInfo{} - marshalInfoLock sync.Mutex -) - -// getMarshalInfo returns the information to marshal a given type of message. -// The info it returns may not necessarily initialized. -// t is the type of the message (NOT the pointer to it). -func getMarshalInfo(t reflect.Type) *marshalInfo { - marshalInfoLock.Lock() - u, ok := marshalInfoMap[t] - if !ok { - u = &marshalInfo{typ: t} - marshalInfoMap[t] = u - } - marshalInfoLock.Unlock() - return u -} - -// Size is the entry point from generated code, -// and should be ONLY called by generated code. -// It computes the size of encoded data of msg. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Size(msg Message) int { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return 0 - } - return u.size(ptr) -} - -// Marshal is the entry point from generated code, -// and should be ONLY called by generated code. -// It marshals msg to the end of b. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return b, ErrNil - } - return u.marshal(b, ptr, deterministic) -} - -func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { - // u := a.marshal, but atomically. - // We use an atomic here to ensure memory consistency. - u := atomicLoadMarshalInfo(&a.marshal) - if u == nil { - // Get marshal information from type of message. - t := reflect.ValueOf(msg).Type() - if t.Kind() != reflect.Ptr { - panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) - } - u = getMarshalInfo(t.Elem()) - // Store it in the cache for later users. - // a.marshal = u, but atomically. - atomicStoreMarshalInfo(&a.marshal, u) - } - return u -} - -// size is the main function to compute the size of the encoded data of a message. -// ptr is the pointer to the message. -func (u *marshalInfo) size(ptr pointer) int { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b, _ := m.Marshal() - return len(b) - } - - n := 0 - for _, f := range u.fields { - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - n += f.sizer(ptr.offset(f.field), f.tagsize) - } - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - n += u.sizeMessageSet(e) - } else { - n += u.sizeExtensions(e) - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - n += u.sizeV1Extensions(m) - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - n += len(s) - } - // cache the result for use in marshal - if u.sizecache.IsValid() { - atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) - } - return n -} - -// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), -// fall back to compute the size. -func (u *marshalInfo) cachedsize(ptr pointer) int { - if u.sizecache.IsValid() { - return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) - } - return u.size(ptr) -} - -// marshal is the main function to marshal a message. It takes a byte slice and appends -// the encoded data to the end of the slice, returns the slice and error (if any). -// ptr is the pointer to the message. -// If deterministic is true, map is marshaled in deterministic order. -func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b1, err := m.Marshal() - b = append(b, b1...) - return b, err - } - - var err, errLater error - // The old marshaler encodes extensions at beginning. - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - b, err = u.appendMessageSet(b, e, deterministic) - } else { - b, err = u.appendExtensions(b, e, deterministic) - } - if err != nil { - return b, err - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - b, err = u.appendV1Extensions(b, m, deterministic) - if err != nil { - return b, err - } - } - for _, f := range u.fields { - if f.required { - if ptr.offset(f.field).getPointer().isNil() { - // Required field is not set. - // We record the error but keep going, to give a complete marshaling. - if errLater == nil { - errLater = &RequiredNotSetError{f.name} - } - continue - } - } - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) - if err != nil { - if err1, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errLater == nil { - errLater = &RequiredNotSetError{f.name + "." + err1.field} - } - continue - } - if err == errRepeatedHasNil { - err = errors.New("proto: repeated field " + f.name + " has nil element") - } - if err == errInvalidUTF8 { - if errLater == nil { - fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name - errLater = &invalidUTF8Error{fullName} - } - continue - } - return b, err - } - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - b = append(b, s...) - } - return b, errLater -} - -// computeMarshalInfo initializes the marshal info. -func (u *marshalInfo) computeMarshalInfo() { - u.Lock() - defer u.Unlock() - if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock - return - } - - t := u.typ - u.unrecognized = invalidField - u.extensions = invalidField - u.v1extensions = invalidField - u.sizecache = invalidField - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if reflect.PtrTo(t).Implements(marshalerType) { - u.hasmarshaler = true - atomic.StoreInt32(&u.initialized, 1) - return - } - - // get oneof implementers - var oneofImplementers []interface{} - if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { - _, _, _, oneofImplementers = m.XXX_OneofFuncs() - } - - n := t.NumField() - - // deal with XXX fields first - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if !strings.HasPrefix(f.Name, "XXX_") { - continue - } - switch f.Name { - case "XXX_sizecache": - u.sizecache = toField(&f) - case "XXX_unrecognized": - u.unrecognized = toField(&f) - case "XXX_InternalExtensions": - u.extensions = toField(&f) - u.messageset = f.Tag.Get("protobuf_messageset") == "1" - case "XXX_extensions": - u.v1extensions = toField(&f) - case "XXX_NoUnkeyedLiteral": - // nothing to do - default: - panic("unknown XXX field: " + f.Name) - } - n-- - } - - // normal fields - fields := make([]marshalFieldInfo, n) // batch allocation - u.fields = make([]*marshalFieldInfo, 0, n) - for i, j := 0, 0; i < t.NumField(); i++ { - f := t.Field(i) - - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - field := &fields[j] - j++ - field.name = f.Name - u.fields = append(u.fields, field) - if f.Tag.Get("protobuf_oneof") != "" { - field.computeOneofFieldInfo(&f, oneofImplementers) - continue - } - if f.Tag.Get("protobuf") == "" { - // field has no tag (not in generated message), ignore it - u.fields = u.fields[:len(u.fields)-1] - j-- - continue - } - field.computeMarshalFieldInfo(&f) - } - - // fields are marshaled in tag order on the wire. - sort.Sort(byTag(u.fields)) - - atomic.StoreInt32(&u.initialized, 1) -} - -// helper for sorting fields by tag -type byTag []*marshalFieldInfo - -func (a byTag) Len() int { return len(a) } -func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } - -// getExtElemInfo returns the information to marshal an extension element. -// The info it returns is initialized. -func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { - // get from cache first - u.RLock() - e, ok := u.extElems[desc.Field] - u.RUnlock() - if ok { - return e - } - - t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct - tags := strings.Split(desc.Tag, ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizer, marshaler := typeMarshaler(t, tags, false, false) - e = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizer, - marshaler: marshaler, - isptr: t.Kind() == reflect.Ptr, - } - - // update cache - u.Lock() - if u.extElems == nil { - u.extElems = make(map[int32]*marshalElemInfo) - } - u.extElems[desc.Field] = e - u.Unlock() - return e -} - -// computeMarshalFieldInfo fills up the information to marshal a field. -func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { - // parse protobuf tag of the field. - // tag has format of "bytes,49,opt,name=foo,def=hello!" - tags := strings.Split(f.Tag.Get("protobuf"), ",") - if tags[0] == "" { - return - } - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - if tags[2] == "req" { - fi.required = true - } - fi.setTag(f, tag, wt) - fi.setMarshaler(f, tags) -} - -func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { - fi.field = toField(f) - fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. - fi.isPointer = true - fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) - fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) - - ityp := f.Type // interface type - for _, o := range oneofImplementers { - t := reflect.TypeOf(o) - if !t.Implements(ityp) { - continue - } - sf := t.Elem().Field(0) // oneof implementer is a struct with a single field - tags := strings.Split(sf.Tag.Get("protobuf"), ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value - fi.oneofElems[t.Elem()] = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizer, - marshaler: marshaler, - } - } -} - -type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) -} - -// wiretype returns the wire encoding of the type. -func wiretype(encoding string) uint64 { - switch encoding { - case "fixed32": - return WireFixed32 - case "fixed64": - return WireFixed64 - case "varint", "zigzag32", "zigzag64": - return WireVarint - case "bytes": - return WireBytes - case "group": - return WireStartGroup - } - panic("unknown wire type " + encoding) -} - -// setTag fills up the tag (in wire format) and its size in the info of a field. -func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { - fi.field = toField(f) - fi.wiretag = uint64(tag)<<3 | wt - fi.tagsize = SizeVarint(uint64(tag) << 3) -} - -// setMarshaler fills up the sizer and marshaler in the info of a field. -func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { - switch f.Type.Kind() { - case reflect.Map: - // map field - fi.isPointer = true - fi.sizer, fi.marshaler = makeMapMarshaler(f) - return - case reflect.Ptr, reflect.Slice: - fi.isPointer = true - } - fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) -} - -// typeMarshaler returns the sizer and marshaler of a given field. -// t is the type of the field. -// tags is the generated "protobuf" tag of the field. -// If nozero is true, zero value is not marshaled to the wire. -// If oneof is true, it is a oneof field. -func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { - encoding := tags[0] - - pointer := false - slice := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - packed := false - proto3 := false - validateUTF8 := true - for i := 2; i < len(tags); i++ { - if tags[i] == "packed" { - packed = true - } - if tags[i] == "proto3" { - proto3 = true - } - } - validateUTF8 = validateUTF8 && proto3 - - switch t.Kind() { - case reflect.Bool: - if pointer { - return sizeBoolPtr, appendBoolPtr - } - if slice { - if packed { - return sizeBoolPackedSlice, appendBoolPackedSlice - } - return sizeBoolSlice, appendBoolSlice - } - if nozero { - return sizeBoolValueNoZero, appendBoolValueNoZero - } - return sizeBoolValue, appendBoolValue - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixed32Ptr, appendFixed32Ptr - } - if slice { - if packed { - return sizeFixed32PackedSlice, appendFixed32PackedSlice - } - return sizeFixed32Slice, appendFixed32Slice - } - if nozero { - return sizeFixed32ValueNoZero, appendFixed32ValueNoZero - } - return sizeFixed32Value, appendFixed32Value - case "varint": - if pointer { - return sizeVarint32Ptr, appendVarint32Ptr - } - if slice { - if packed { - return sizeVarint32PackedSlice, appendVarint32PackedSlice - } - return sizeVarint32Slice, appendVarint32Slice - } - if nozero { - return sizeVarint32ValueNoZero, appendVarint32ValueNoZero - } - return sizeVarint32Value, appendVarint32Value - } - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixedS32Ptr, appendFixedS32Ptr - } - if slice { - if packed { - return sizeFixedS32PackedSlice, appendFixedS32PackedSlice - } - return sizeFixedS32Slice, appendFixedS32Slice - } - if nozero { - return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero - } - return sizeFixedS32Value, appendFixedS32Value - case "varint": - if pointer { - return sizeVarintS32Ptr, appendVarintS32Ptr - } - if slice { - if packed { - return sizeVarintS32PackedSlice, appendVarintS32PackedSlice - } - return sizeVarintS32Slice, appendVarintS32Slice - } - if nozero { - return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero - } - return sizeVarintS32Value, appendVarintS32Value - case "zigzag32": - if pointer { - return sizeZigzag32Ptr, appendZigzag32Ptr - } - if slice { - if packed { - return sizeZigzag32PackedSlice, appendZigzag32PackedSlice - } - return sizeZigzag32Slice, appendZigzag32Slice - } - if nozero { - return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero - } - return sizeZigzag32Value, appendZigzag32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixed64Ptr, appendFixed64Ptr - } - if slice { - if packed { - return sizeFixed64PackedSlice, appendFixed64PackedSlice - } - return sizeFixed64Slice, appendFixed64Slice - } - if nozero { - return sizeFixed64ValueNoZero, appendFixed64ValueNoZero - } - return sizeFixed64Value, appendFixed64Value - case "varint": - if pointer { - return sizeVarint64Ptr, appendVarint64Ptr - } - if slice { - if packed { - return sizeVarint64PackedSlice, appendVarint64PackedSlice - } - return sizeVarint64Slice, appendVarint64Slice - } - if nozero { - return sizeVarint64ValueNoZero, appendVarint64ValueNoZero - } - return sizeVarint64Value, appendVarint64Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixedS64Ptr, appendFixedS64Ptr - } - if slice { - if packed { - return sizeFixedS64PackedSlice, appendFixedS64PackedSlice - } - return sizeFixedS64Slice, appendFixedS64Slice - } - if nozero { - return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero - } - return sizeFixedS64Value, appendFixedS64Value - case "varint": - if pointer { - return sizeVarintS64Ptr, appendVarintS64Ptr - } - if slice { - if packed { - return sizeVarintS64PackedSlice, appendVarintS64PackedSlice - } - return sizeVarintS64Slice, appendVarintS64Slice - } - if nozero { - return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero - } - return sizeVarintS64Value, appendVarintS64Value - case "zigzag64": - if pointer { - return sizeZigzag64Ptr, appendZigzag64Ptr - } - if slice { - if packed { - return sizeZigzag64PackedSlice, appendZigzag64PackedSlice - } - return sizeZigzag64Slice, appendZigzag64Slice - } - if nozero { - return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero - } - return sizeZigzag64Value, appendZigzag64Value - } - case reflect.Float32: - if pointer { - return sizeFloat32Ptr, appendFloat32Ptr - } - if slice { - if packed { - return sizeFloat32PackedSlice, appendFloat32PackedSlice - } - return sizeFloat32Slice, appendFloat32Slice - } - if nozero { - return sizeFloat32ValueNoZero, appendFloat32ValueNoZero - } - return sizeFloat32Value, appendFloat32Value - case reflect.Float64: - if pointer { - return sizeFloat64Ptr, appendFloat64Ptr - } - if slice { - if packed { - return sizeFloat64PackedSlice, appendFloat64PackedSlice - } - return sizeFloat64Slice, appendFloat64Slice - } - if nozero { - return sizeFloat64ValueNoZero, appendFloat64ValueNoZero - } - return sizeFloat64Value, appendFloat64Value - case reflect.String: - if validateUTF8 { - if pointer { - return sizeStringPtr, appendUTF8StringPtr - } - if slice { - return sizeStringSlice, appendUTF8StringSlice - } - if nozero { - return sizeStringValueNoZero, appendUTF8StringValueNoZero - } - return sizeStringValue, appendUTF8StringValue - } - if pointer { - return sizeStringPtr, appendStringPtr - } - if slice { - return sizeStringSlice, appendStringSlice - } - if nozero { - return sizeStringValueNoZero, appendStringValueNoZero - } - return sizeStringValue, appendStringValue - case reflect.Slice: - if slice { - return sizeBytesSlice, appendBytesSlice - } - if oneof { - // Oneof bytes field may also have "proto3" tag. - // We want to marshal it as a oneof field. Do this - // check before the proto3 check. - return sizeBytesOneof, appendBytesOneof - } - if proto3 { - return sizeBytes3, appendBytes3 - } - return sizeBytes, appendBytes - case reflect.Struct: - switch encoding { - case "group": - if slice { - return makeGroupSliceMarshaler(getMarshalInfo(t)) - } - return makeGroupMarshaler(getMarshalInfo(t)) - case "bytes": - if slice { - return makeMessageSliceMarshaler(getMarshalInfo(t)) - } - return makeMessageMarshaler(getMarshalInfo(t)) - } - } - panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) -} - -// Below are functions to size/marshal a specific type of a field. -// They are stored in the field's info, and called by function pointers. -// They have type sizer or marshaler. - -func sizeFixed32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixedS32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFloat32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - return (4 + tagsize) * len(s) -} -func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixed64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFixedS64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFloat64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - return (8 + tagsize) * len(s) -} -func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeVarint32Value(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarint32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarint64Value(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - return SizeVarint(v) + tagsize -} -func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return SizeVarint(v) + tagsize -} -func sizeVarint64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return SizeVarint(*p) + tagsize -} -func sizeVarint64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(v) + tagsize - } - return n -} -func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize - } - return n -} -func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize - } - return n -} -func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeBoolValue(_ pointer, tagsize int) int { - return 1 + tagsize -} -func sizeBoolValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toBool() - if !v { - return 0 - } - return 1 + tagsize -} -func sizeBoolPtr(ptr pointer, tagsize int) int { - p := *ptr.toBoolPtr() - if p == nil { - return 0 - } - return 1 + tagsize -} -func sizeBoolSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - return (1 + tagsize) * len(s) -} -func sizeBoolPackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return 0 - } - return len(s) + SizeVarint(uint64(len(s))) + tagsize -} -func sizeStringValue(ptr pointer, tagsize int) int { - v := *ptr.toString() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toString() - if v == "" { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringPtr(ptr pointer, tagsize int) int { - p := *ptr.toStringPtr() - if p == nil { - return 0 - } - v := *p - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringSlice(ptr pointer, tagsize int) int { - s := *ptr.toStringSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} -func sizeBytes(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if v == nil { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytes3(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if len(v) == 0 { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesOneof(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesSlice(ptr pointer, tagsize int) int { - s := *ptr.toBytesSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} - -// appendFixed32 appends an encoded fixed32 to b. -func appendFixed32(b []byte, v uint32) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24)) - return b -} - -// appendFixed64 appends an encoded fixed64 to b. -func appendFixed64(b []byte, v uint64) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24), - byte(v>>32), - byte(v>>40), - byte(v>>48), - byte(v>>56)) - return b -} - -// appendVarint appends an encoded varint to b. -func appendVarint(b []byte, v uint64) []byte { - // TODO: make 1-byte (maybe 2-byte) case inline-able, once we - // have non-leaf inliner. - switch { - case v < 1<<7: - b = append(b, byte(v)) - case v < 1<<14: - b = append(b, - byte(v&0x7f|0x80), - byte(v>>7)) - case v < 1<<21: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte(v>>14)) - case v < 1<<28: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte(v>>21)) - case v < 1<<35: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte(v>>28)) - case v < 1<<42: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte(v>>35)) - case v < 1<<49: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte(v>>42)) - case v < 1<<56: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte(v>>49)) - case v < 1<<63: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte(v>>56)) - default: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte((v>>56)&0x7f|0x80), - 1) - } - return b -} - -func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, *p) - return b, nil -} -func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(*p)) - return b, nil -} -func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(*p)) - return b, nil -} -func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, *p) - return b, nil -} -func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(*p)) - return b, nil -} -func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(*p)) - return b, nil -} -func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, *p) - return b, nil -} -func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - } - return b, nil -} -func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, v) - } - return b, nil -} -func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - if !v { - return b, nil - } - b = appendVarint(b, wiretag) - b = append(b, 1) - return b, nil -} - -func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toBoolPtr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - if *p { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(len(s))) - for _, v := range s { - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - if v == "" { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toStringSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} -func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - v := *ptr.toString() - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - v := *ptr.toString() - if v == "" { - return b, nil - } - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - var invalidUTF8 bool - s := *ptr.toStringSlice() - for _, v := range s { - if !utf8.ValidString(v) { - invalidUTF8 = true - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - if invalidUTF8 { - return b, errInvalidUTF8 - } - return b, nil -} -func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if v == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if len(v) == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBytesSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} - -// makeGroupMarshaler returns the sizer and marshaler for a group. -// u is the marshal info of the underlying message. -func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - return u.size(p) + 2*tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - var err error - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, p, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - return b, err - } -} - -// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. -// u is the marshal info of the underlying message. -func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - n += u.size(v) + 2*tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err error - var nerr nonFatal - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, v, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - if !nerr.Merge(err) { - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, nerr.E - } -} - -// makeMessageMarshaler returns the sizer and marshaler for a message field. -// u is the marshal info of the message. -func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.size(p) - return siz + SizeVarint(uint64(siz)) + tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(p) - b = appendVarint(b, uint64(siz)) - return u.marshal(b, p, deterministic) - } -} - -// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. -// u is the marshal info of the message. -func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - siz := u.size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err error - var nerr nonFatal - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(v) - b = appendVarint(b, uint64(siz)) - b, err = u.marshal(b, v, deterministic) - - if !nerr.Merge(err) { - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, nerr.E - } -} - -// makeMapMarshaler returns the sizer and marshaler for a map field. -// f is the pointer to the reflect data structure of the field. -func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { - // figure out key and value type - t := f.Type - keyType := t.Key() - valType := t.Elem() - keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") - valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") - keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map - valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map - keyWireTag := 1<<3 | wiretype(keyTags[0]) - valWireTag := 2<<3 | wiretype(valTags[0]) - - // We create an interface to get the addresses of the map key and value. - // If value is pointer-typed, the interface is a direct interface, the - // idata itself is the value. Otherwise, the idata is the pointer to the - // value. - // Key cannot be pointer-typed. - valIsPtr := valType.Kind() == reflect.Ptr - - // If value is a message with nested maps, calling - // valSizer in marshal may be quadratic. We should use - // cached version in marshal (but not in size). - // If value is not message type, we don't have size cache, - // but it cannot be nested either. Just use valSizer. - valCachedSizer := valSizer - if valIsPtr && valType.Elem().Kind() == reflect.Struct { - u := getMarshalInfo(valType.Elem()) - valCachedSizer = func(ptr pointer, tagsize int) int { - // Same as message sizer, but use cache. - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.cachedsize(p) - return siz + SizeVarint(uint64(siz)) + tagsize - } - } - return func(ptr pointer, tagsize int) int { - m := ptr.asPointerTo(t).Elem() // the map - n := 0 - for _, k := range m.MapKeys() { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value - siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { - m := ptr.asPointerTo(t).Elem() // the map - var err error - keys := m.MapKeys() - if len(keys) > 1 && deterministic { - sort.Sort(mapKeys(keys)) - } - - var nerr nonFatal - for _, k := range keys { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value - b = appendVarint(b, tag) - siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - b = appendVarint(b, uint64(siz)) - b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) - if !nerr.Merge(err) { - return b, err - } - b, err = valMarshaler(b, vaddr, valWireTag, deterministic) - if err != ErrNil && !nerr.Merge(err) { // allow nil value in map - return b, err - } - } - return b, nerr.E - } -} - -// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. -// fi is the marshal info of the field. -// f is the pointer to the reflect data structure of the field. -func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { - // Oneof field is an interface. We need to get the actual data type on the fly. - t := f.Type - return func(ptr pointer, _ int) int { - p := ptr.getInterfacePointer() - if p.isNil() { - return 0 - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - e := fi.oneofElems[telem] - return e.sizer(p, e.tagsize) - }, - func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { - p := ptr.getInterfacePointer() - if p.isNil() { - return b, nil - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { - return b, errOneofHasNil - } - e := fi.oneofElems[telem] - return e.marshaler(b, p, e.wiretag, deterministic) - } -} - -// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. -func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, ei.tagsize) - } - mu.Unlock() - return n -} - -// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. -func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - var nerr nonFatal - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E - } - - // Sort the keys to provide a deterministic encoding. - // Not sure this is required, but the old code does it. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// message set format is: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } - -// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field -// in message set format (above). -func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for id, e := range m { - n += 2 // start group, end group. tag = 1 (size=1) - n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - siz := len(msgWithLen) - n += siz + 1 // message, tag = 3 (size=1) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, 1) // message, tag = 3 (size=1) - } - mu.Unlock() - return n -} - -// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) -// to the end of byte slice b. -func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - var nerr nonFatal - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for id, e := range m { - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - if !nerr.Merge(err) { - return b, err - } - b = append(b, 1<<3|WireEndGroup) - } - return b, nerr.E - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, id := range keys { - e := m[int32(id)] - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - b = append(b, 1<<3|WireEndGroup) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// sizeV1Extensions computes the size of encoded data for a V1-API extension field. -func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { - if m == nil { - return 0 - } - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, ei.tagsize) - } - return n -} - -// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. -func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { - if m == nil { - return b, nil - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - var err error - var nerr nonFatal - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if !nerr.Merge(err) { - return b, err - } - } - return b, nerr.E -} - -// newMarshaler is the interface representing objects that can marshal themselves. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newMarshaler interface { - XXX_Size() int - XXX_Marshal(b []byte, deterministic bool) ([]byte, error) -} - -// Size returns the encoded size of a protocol buffer message. -// This is the main entry point. -func Size(pb Message) int { - if m, ok := pb.(newMarshaler); ok { - return m.XXX_Size() - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, _ := m.Marshal() - return len(b) - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return 0 - } - var info InternalMessageInfo - return info.Size(pb) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, returning the data. -// This is the main entry point. -func Marshal(pb Message) ([]byte, error) { - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - b := make([]byte, 0, siz) - return m.XXX_Marshal(b, false) - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - return m.Marshal() - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return nil, ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - b := make([]byte, 0, siz) - return info.Marshal(b, pb, false) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, writing the result to the -// Buffer. -// This is an alternative entry point. It is not necessary to use -// a Buffer for most applications. -func (p *Buffer) Marshal(pb Message) error { - var err error - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - p.grow(siz) // make sure buf has enough capacity - p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) - return err - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, err := m.Marshal() - p.buf = append(p.buf, b...) - return err - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - p.grow(siz) // make sure buf has enough capacity - p.buf, err = info.Marshal(p.buf, pb, p.deterministic) - return err -} - -// grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After grow(n), at least n bytes can be written to the -// buffer without another allocation. -func (p *Buffer) grow(n int) { - need := len(p.buf) + n - if need <= cap(p.buf) { - return - } - newCap := len(p.buf) * 2 - if newCap < need { - newCap = need - } - p.buf = append(make([]byte, 0, newCap), p.buf...) -} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go deleted file mode 100644 index 5525def6a..000000000 --- a/vendor/github.com/golang/protobuf/proto/table_merge.go +++ /dev/null @@ -1,654 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -// Merge merges the src message into dst. -// This assumes that dst and src of the same type and are non-nil. -func (a *InternalMessageInfo) Merge(dst, src Message) { - mi := atomicLoadMergeInfo(&a.merge) - if mi == nil { - mi = getMergeInfo(reflect.TypeOf(dst).Elem()) - atomicStoreMergeInfo(&a.merge, mi) - } - mi.merge(toPointer(&dst), toPointer(&src)) -} - -type mergeInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []mergeFieldInfo - unrecognized field // Offset of XXX_unrecognized -} - -type mergeFieldInfo struct { - field field // Offset of field, guaranteed to be valid - - // isPointer reports whether the value in the field is a pointer. - // This is true for the following situations: - // * Pointer to struct - // * Pointer to basic type (proto2 only) - // * Slice (first value in slice header is a pointer) - // * String (first value in string header is a pointer) - isPointer bool - - // basicWidth reports the width of the field assuming that it is directly - // embedded in the struct (as is the case for basic types in proto3). - // The possible values are: - // 0: invalid - // 1: bool - // 4: int32, uint32, float32 - // 8: int64, uint64, float64 - basicWidth int - - // Where dst and src are pointers to the types being merged. - merge func(dst, src pointer) -} - -var ( - mergeInfoMap = map[reflect.Type]*mergeInfo{} - mergeInfoLock sync.Mutex -) - -func getMergeInfo(t reflect.Type) *mergeInfo { - mergeInfoLock.Lock() - defer mergeInfoLock.Unlock() - mi := mergeInfoMap[t] - if mi == nil { - mi = &mergeInfo{typ: t} - mergeInfoMap[t] = mi - } - return mi -} - -// merge merges src into dst assuming they are both of type *mi.typ. -func (mi *mergeInfo) merge(dst, src pointer) { - if dst.isNil() { - panic("proto: nil destination") - } - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&mi.initialized) == 0 { - mi.computeMergeInfo() - } - - for _, fi := range mi.fields { - sfp := src.offset(fi.field) - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string - continue - } - if fi.basicWidth > 0 { - switch { - case fi.basicWidth == 1 && !*sfp.toBool(): - continue - case fi.basicWidth == 4 && *sfp.toUint32() == 0: - continue - case fi.basicWidth == 8 && *sfp.toUint64() == 0: - continue - } - } - } - - dfp := dst.offset(fi.field) - fi.merge(dfp, sfp) - } - - // TODO: Make this faster? - out := dst.asPointerTo(mi.typ).Elem() - in := src.asPointerTo(mi.typ).Elem() - if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - if mi.unrecognized.IsValid() { - if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { - *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) - } - } -} - -func (mi *mergeInfo) computeMergeInfo() { - mi.lock.Lock() - defer mi.lock.Unlock() - if mi.initialized != 0 { - return - } - t := mi.typ - n := t.NumField() - - props := GetProperties(t) - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - mfi := mergeFieldInfo{field: toField(&f)} - tf := f.Type - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - switch tf.Kind() { - case reflect.Ptr, reflect.Slice, reflect.String: - // As a special case, we assume slices and strings are pointers - // since we know that the first field in the SliceSlice or - // StringHeader is a data pointer. - mfi.isPointer = true - case reflect.Bool: - mfi.basicWidth = 1 - case reflect.Int32, reflect.Uint32, reflect.Float32: - mfi.basicWidth = 4 - case reflect.Int64, reflect.Uint64, reflect.Float64: - mfi.basicWidth = 8 - } - } - - // Unwrap tf to get at its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + tf.Name()) - } - - switch tf.Kind() { - case reflect.Int32: - switch { - case isSlice: // E.g., []int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Slice is not defined (see pointer_reflect.go). - /* - sfsp := src.toInt32Slice() - if *sfsp != nil { - dfsp := dst.toInt32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - */ - sfs := src.getInt32Slice() - if sfs != nil { - dfs := dst.getInt32Slice() - dfs = append(dfs, sfs...) - if dfs == nil { - dfs = []int32{} - } - dst.setInt32Slice(dfs) - } - } - case isPointer: // E.g., *int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). - /* - sfpp := src.toInt32Ptr() - if *sfpp != nil { - dfpp := dst.toInt32Ptr() - if *dfpp == nil { - *dfpp = Int32(**sfpp) - } else { - **dfpp = **sfpp - } - } - */ - sfp := src.getInt32Ptr() - if sfp != nil { - dfp := dst.getInt32Ptr() - if dfp == nil { - dst.setInt32Ptr(*sfp) - } else { - *dfp = *sfp - } - } - } - default: // E.g., int32 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt32(); v != 0 { - *dst.toInt32() = v - } - } - } - case reflect.Int64: - switch { - case isSlice: // E.g., []int64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toInt64Slice() - if *sfsp != nil { - dfsp := dst.toInt64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - } - case isPointer: // E.g., *int64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toInt64Ptr() - if *sfpp != nil { - dfpp := dst.toInt64Ptr() - if *dfpp == nil { - *dfpp = Int64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., int64 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt64(); v != 0 { - *dst.toInt64() = v - } - } - } - case reflect.Uint32: - switch { - case isSlice: // E.g., []uint32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint32Slice() - if *sfsp != nil { - dfsp := dst.toUint32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint32{} - } - } - } - case isPointer: // E.g., *uint32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint32Ptr() - if *sfpp != nil { - dfpp := dst.toUint32Ptr() - if *dfpp == nil { - *dfpp = Uint32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint32 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint32(); v != 0 { - *dst.toUint32() = v - } - } - } - case reflect.Uint64: - switch { - case isSlice: // E.g., []uint64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint64Slice() - if *sfsp != nil { - dfsp := dst.toUint64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint64{} - } - } - } - case isPointer: // E.g., *uint64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint64Ptr() - if *sfpp != nil { - dfpp := dst.toUint64Ptr() - if *dfpp == nil { - *dfpp = Uint64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint64 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint64(); v != 0 { - *dst.toUint64() = v - } - } - } - case reflect.Float32: - switch { - case isSlice: // E.g., []float32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat32Slice() - if *sfsp != nil { - dfsp := dst.toFloat32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float32{} - } - } - } - case isPointer: // E.g., *float32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat32Ptr() - if *sfpp != nil { - dfpp := dst.toFloat32Ptr() - if *dfpp == nil { - *dfpp = Float32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float32 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat32(); v != 0 { - *dst.toFloat32() = v - } - } - } - case reflect.Float64: - switch { - case isSlice: // E.g., []float64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat64Slice() - if *sfsp != nil { - dfsp := dst.toFloat64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float64{} - } - } - } - case isPointer: // E.g., *float64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat64Ptr() - if *sfpp != nil { - dfpp := dst.toFloat64Ptr() - if *dfpp == nil { - *dfpp = Float64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float64 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat64(); v != 0 { - *dst.toFloat64() = v - } - } - } - case reflect.Bool: - switch { - case isSlice: // E.g., []bool - mfi.merge = func(dst, src pointer) { - sfsp := src.toBoolSlice() - if *sfsp != nil { - dfsp := dst.toBoolSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []bool{} - } - } - } - case isPointer: // E.g., *bool - mfi.merge = func(dst, src pointer) { - sfpp := src.toBoolPtr() - if *sfpp != nil { - dfpp := dst.toBoolPtr() - if *dfpp == nil { - *dfpp = Bool(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., bool - mfi.merge = func(dst, src pointer) { - if v := *src.toBool(); v { - *dst.toBool() = v - } - } - } - case reflect.String: - switch { - case isSlice: // E.g., []string - mfi.merge = func(dst, src pointer) { - sfsp := src.toStringSlice() - if *sfsp != nil { - dfsp := dst.toStringSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []string{} - } - } - } - case isPointer: // E.g., *string - mfi.merge = func(dst, src pointer) { - sfpp := src.toStringPtr() - if *sfpp != nil { - dfpp := dst.toStringPtr() - if *dfpp == nil { - *dfpp = String(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., string - mfi.merge = func(dst, src pointer) { - if v := *src.toString(); v != "" { - *dst.toString() = v - } - } - } - case reflect.Slice: - isProto3 := props.Prop[i].proto3 - switch { - case isPointer: - panic("bad pointer in byte slice case in " + tf.Name()) - case tf.Elem().Kind() != reflect.Uint8: - panic("bad element kind in byte slice case in " + tf.Name()) - case isSlice: // E.g., [][]byte - mfi.merge = func(dst, src pointer) { - sbsp := src.toBytesSlice() - if *sbsp != nil { - dbsp := dst.toBytesSlice() - for _, sb := range *sbsp { - if sb == nil { - *dbsp = append(*dbsp, nil) - } else { - *dbsp = append(*dbsp, append([]byte{}, sb...)) - } - } - if *dbsp == nil { - *dbsp = [][]byte{} - } - } - } - default: // E.g., []byte - mfi.merge = func(dst, src pointer) { - sbp := src.toBytes() - if *sbp != nil { - dbp := dst.toBytes() - if !isProto3 || len(*sbp) > 0 { - *dbp = append([]byte{}, *sbp...) - } - } - } - } - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("message field %s without pointer", tf)) - case isSlice: // E.g., []*pb.T - mi := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sps := src.getPointerSlice() - if sps != nil { - dps := dst.getPointerSlice() - for _, sp := range sps { - var dp pointer - if !sp.isNil() { - dp = valToPointer(reflect.New(tf)) - mi.merge(dp, sp) - } - dps = append(dps, dp) - } - if dps == nil { - dps = []pointer{} - } - dst.setPointerSlice(dps) - } - } - default: // E.g., *pb.T - mi := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sp := src.getPointer() - if !sp.isNil() { - dp := dst.getPointer() - if dp.isNil() { - dp = valToPointer(reflect.New(tf)) - dst.setPointer(dp) - } - mi.merge(dp, sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic("bad pointer or slice in map case in " + tf.Name()) - default: // E.g., map[K]V - mfi.merge = func(dst, src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - dm := dst.asPointerTo(tf).Elem() - if dm.IsNil() { - dm.Set(reflect.MakeMap(tf)) - } - - switch tf.Elem().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(Clone(val.Interface().(Message))) - dm.SetMapIndex(key, val) - } - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - dm.SetMapIndex(key, val) - } - default: // Basic type (e.g., string) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - dm.SetMapIndex(key, val) - } - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic("bad pointer or slice in interface case in " + tf.Name()) - default: // E.g., interface{} - // TODO: Make this faster? - mfi.merge = func(dst, src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - du := dst.asPointerTo(tf).Elem() - typ := su.Elem().Type() - if du.IsNil() || du.Elem().Type() != typ { - du.Set(reflect.New(typ.Elem())) // Initialize interface if empty - } - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - dv := du.Elem().Elem().Field(0) - if dv.Kind() == reflect.Ptr && dv.IsNil() { - dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - Merge(dv.Interface().(Message), sv.Interface().(Message)) - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) - default: // Basic type (e.g., string) - dv.Set(sv) - } - } - } - } - default: - panic(fmt.Sprintf("merger not found for type:%s", tf)) - } - mi.fields = append(mi.fields, mfi) - } - - mi.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - mi.unrecognized = toField(&f) - } - - atomic.StoreInt32(&mi.initialized, 1) -} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go deleted file mode 100644 index ebf1caa56..000000000 --- a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go +++ /dev/null @@ -1,2051 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "io" - "math" - "reflect" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// Unmarshal is the entry point from the generated .pb.go files. -// This function is not intended to be used by non-generated code. -// This function is not subject to any compatibility guarantee. -// msg contains a pointer to a protocol buffer struct. -// b is the data to be unmarshaled into the protocol buffer. -// a is a pointer to a place to store cached unmarshal information. -func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { - // Load the unmarshal information for this message type. - // The atomic load ensures memory consistency. - u := atomicLoadUnmarshalInfo(&a.unmarshal) - if u == nil { - // Slow path: find unmarshal info for msg, update a with it. - u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) - atomicStoreUnmarshalInfo(&a.unmarshal, u) - } - // Then do the unmarshaling. - err := u.unmarshal(toPointer(&msg), b) - return err -} - -type unmarshalInfo struct { - typ reflect.Type // type of the protobuf struct - - // 0 = only typ field is initialized - // 1 = completely initialized - initialized int32 - lock sync.Mutex // prevents double initialization - dense []unmarshalFieldInfo // fields indexed by tag # - sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # - reqFields []string // names of required fields - reqMask uint64 // 1< 0 { - // Read tag and wire type. - // Special case 1 and 2 byte varints. - var x uint64 - if b[0] < 128 { - x = uint64(b[0]) - b = b[1:] - } else if len(b) >= 2 && b[1] < 128 { - x = uint64(b[0]&0x7f) + uint64(b[1])<<7 - b = b[2:] - } else { - var n int - x, n = decodeVarint(b) - if n == 0 { - return io.ErrUnexpectedEOF - } - b = b[n:] - } - tag := x >> 3 - wire := int(x) & 7 - - // Dispatch on the tag to one of the unmarshal* functions below. - var f unmarshalFieldInfo - if tag < uint64(len(u.dense)) { - f = u.dense[tag] - } else { - f = u.sparse[tag] - } - if fn := f.unmarshal; fn != nil { - var err error - b, err = fn(b, m.offset(f.field), wire) - if err == nil { - reqMask |= f.reqMask - continue - } - if r, ok := err.(*RequiredNotSetError); ok { - // Remember this error, but keep parsing. We need to produce - // a full parse even if a required field is missing. - if errLater == nil { - errLater = r - } - reqMask |= f.reqMask - continue - } - if err != errInternalBadWireType { - if err == errInvalidUTF8 { - if errLater == nil { - fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name - errLater = &invalidUTF8Error{fullName} - } - continue - } - return err - } - // Fragments with bad wire type are treated as unknown fields. - } - - // Unknown tag. - if !u.unrecognized.IsValid() { - // Don't keep unrecognized data; just skip it. - var err error - b, err = skipField(b, wire) - if err != nil { - return err - } - continue - } - // Keep unrecognized data around. - // maybe in extensions, maybe in the unrecognized field. - z := m.offset(u.unrecognized).toBytes() - var emap map[int32]Extension - var e Extension - for _, r := range u.extensionRanges { - if uint64(r.Start) <= tag && tag <= uint64(r.End) { - if u.extensions.IsValid() { - mp := m.offset(u.extensions).toExtensions() - emap = mp.extensionsWrite() - e = emap[int32(tag)] - z = &e.enc - break - } - if u.oldExtensions.IsValid() { - p := m.offset(u.oldExtensions).toOldExtensions() - emap = *p - if emap == nil { - emap = map[int32]Extension{} - *p = emap - } - e = emap[int32(tag)] - z = &e.enc - break - } - panic("no extensions field available") - } - } - - // Use wire type to skip data. - var err error - b0 := b - b, err = skipField(b, wire) - if err != nil { - return err - } - *z = encodeVarint(*z, tag<<3|uint64(wire)) - *z = append(*z, b0[:len(b0)-len(b)]...) - - if emap != nil { - emap[int32(tag)] = e - } - } - if reqMask != u.reqMask && errLater == nil { - // A required field of this message is missing. - for _, n := range u.reqFields { - if reqMask&1 == 0 { - errLater = &RequiredNotSetError{n} - } - reqMask >>= 1 - } - } - return errLater -} - -// computeUnmarshalInfo fills in u with information for use -// in unmarshaling protocol buffers of type u.typ. -func (u *unmarshalInfo) computeUnmarshalInfo() { - u.lock.Lock() - defer u.lock.Unlock() - if u.initialized != 0 { - return - } - t := u.typ - n := t.NumField() - - // Set up the "not found" value for the unrecognized byte buffer. - // This is the default for proto3. - u.unrecognized = invalidField - u.extensions = invalidField - u.oldExtensions = invalidField - - // List of the generated type and offset for each oneof field. - type oneofField struct { - ityp reflect.Type // interface type of oneof field - field field // offset in containing message - } - var oneofFields []oneofField - - for i := 0; i < n; i++ { - f := t.Field(i) - if f.Name == "XXX_unrecognized" { - // The byte slice used to hold unrecognized input is special. - if f.Type != reflect.TypeOf(([]byte)(nil)) { - panic("bad type for XXX_unrecognized field: " + f.Type.Name()) - } - u.unrecognized = toField(&f) - continue - } - if f.Name == "XXX_InternalExtensions" { - // Ditto here. - if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { - panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) - } - u.extensions = toField(&f) - if f.Tag.Get("protobuf_messageset") == "1" { - u.isMessageSet = true - } - continue - } - if f.Name == "XXX_extensions" { - // An older form of the extensions field. - if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { - panic("bad type for XXX_extensions field: " + f.Type.Name()) - } - u.oldExtensions = toField(&f) - continue - } - if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { - continue - } - - oneof := f.Tag.Get("protobuf_oneof") - if oneof != "" { - oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) - // The rest of oneof processing happens below. - continue - } - - tags := f.Tag.Get("protobuf") - tagArray := strings.Split(tags, ",") - if len(tagArray) < 2 { - panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) - } - tag, err := strconv.Atoi(tagArray[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tagArray[1]) - } - - name := "" - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - } - - // Extract unmarshaling function from the field (its type and tags). - unmarshal := fieldUnmarshaler(&f) - - // Required field? - var reqMask uint64 - if tagArray[2] == "req" { - bit := len(u.reqFields) - u.reqFields = append(u.reqFields, name) - reqMask = uint64(1) << uint(bit) - // TODO: if we have more than 64 required fields, we end up - // not verifying that all required fields are present. - // Fix this, perhaps using a count of required fields? - } - - // Store the info in the correct slot in the message. - u.setTag(tag, toField(&f), unmarshal, reqMask, name) - } - - // Find any types associated with oneof fields. - // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? - fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") - if fn.IsValid() { - res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} - for i := res.Len() - 1; i >= 0; i-- { - v := res.Index(i) // interface{} - tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X - typ := tptr.Elem() // Msg_X - - f := typ.Field(0) // oneof implementers have one field - baseUnmarshal := fieldUnmarshaler(&f) - tags := strings.Split(f.Tag.Get("protobuf"), ",") - fieldNum, err := strconv.Atoi(tags[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tags[1]) - } - var name string - for _, tag := range tags { - if strings.HasPrefix(tag, "name=") { - name = strings.TrimPrefix(tag, "name=") - break - } - } - - // Find the oneof field that this struct implements. - // Might take O(n^2) to process all of the oneofs, but who cares. - for _, of := range oneofFields { - if tptr.Implements(of.ityp) { - // We have found the corresponding interface for this struct. - // That lets us know where this struct should be stored - // when we encounter it during unmarshaling. - unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) - u.setTag(fieldNum, of.field, unmarshal, 0, name) - } - } - } - } - - // Get extension ranges, if any. - fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") - if fn.IsValid() { - if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { - panic("a message with extensions, but no extensions field in " + t.Name()) - } - u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) - } - - // Explicitly disallow tag 0. This will ensure we flag an error - // when decoding a buffer of all zeros. Without this code, we - // would decode and skip an all-zero buffer of even length. - // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. - u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { - return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) - }, 0, "") - - // Set mask for required field check. - u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? - for len(u.dense) <= tag { - u.dense = append(u.dense, unmarshalFieldInfo{}) - } - u.dense[tag] = i - return - } - if u.sparse == nil { - u.sparse = map[uint64]unmarshalFieldInfo{} - } - u.sparse[uint64(tag)] = i -} - -// fieldUnmarshaler returns an unmarshaler for the given field. -func fieldUnmarshaler(f *reflect.StructField) unmarshaler { - if f.Type.Kind() == reflect.Map { - return makeUnmarshalMap(f) - } - return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) -} - -// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. -func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { - tagArray := strings.Split(tags, ",") - encoding := tagArray[0] - name := "unknown" - proto3 := false - validateUTF8 := true - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - if tag == "proto3" { - proto3 = true - } - } - validateUTF8 = validateUTF8 && proto3 - - // Figure out packaging (pointer, slice, or both) - slice := false - pointer := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - // We'll never have both pointer and slice for basic types. - if pointer && slice && t.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + t.Name()) - } - - switch t.Kind() { - case reflect.Bool: - if pointer { - return unmarshalBoolPtr - } - if slice { - return unmarshalBoolSlice - } - return unmarshalBoolValue - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixedS32Ptr - } - if slice { - return unmarshalFixedS32Slice - } - return unmarshalFixedS32Value - case "varint": - // this could be int32 or enum - if pointer { - return unmarshalInt32Ptr - } - if slice { - return unmarshalInt32Slice - } - return unmarshalInt32Value - case "zigzag32": - if pointer { - return unmarshalSint32Ptr - } - if slice { - return unmarshalSint32Slice - } - return unmarshalSint32Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixedS64Ptr - } - if slice { - return unmarshalFixedS64Slice - } - return unmarshalFixedS64Value - case "varint": - if pointer { - return unmarshalInt64Ptr - } - if slice { - return unmarshalInt64Slice - } - return unmarshalInt64Value - case "zigzag64": - if pointer { - return unmarshalSint64Ptr - } - if slice { - return unmarshalSint64Slice - } - return unmarshalSint64Value - } - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixed32Ptr - } - if slice { - return unmarshalFixed32Slice - } - return unmarshalFixed32Value - case "varint": - if pointer { - return unmarshalUint32Ptr - } - if slice { - return unmarshalUint32Slice - } - return unmarshalUint32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixed64Ptr - } - if slice { - return unmarshalFixed64Slice - } - return unmarshalFixed64Value - case "varint": - if pointer { - return unmarshalUint64Ptr - } - if slice { - return unmarshalUint64Slice - } - return unmarshalUint64Value - } - case reflect.Float32: - if pointer { - return unmarshalFloat32Ptr - } - if slice { - return unmarshalFloat32Slice - } - return unmarshalFloat32Value - case reflect.Float64: - if pointer { - return unmarshalFloat64Ptr - } - if slice { - return unmarshalFloat64Slice - } - return unmarshalFloat64Value - case reflect.Map: - panic("map type in typeUnmarshaler in " + t.Name()) - case reflect.Slice: - if pointer { - panic("bad pointer in slice case in " + t.Name()) - } - if slice { - return unmarshalBytesSlice - } - return unmarshalBytesValue - case reflect.String: - if validateUTF8 { - if pointer { - return unmarshalUTF8StringPtr - } - if slice { - return unmarshalUTF8StringSlice - } - return unmarshalUTF8StringValue - } - if pointer { - return unmarshalStringPtr - } - if slice { - return unmarshalStringSlice - } - return unmarshalStringValue - case reflect.Struct: - // message or group field - if !pointer { - panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) - } - switch encoding { - case "bytes": - if slice { - return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) - case "group": - if slice { - return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) - } - } - panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) -} - -// Below are all the unmarshalers for individual fields of various types. - -func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64() = v - return b, nil -} - -func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64() = v - return b, nil -} - -func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64() = v - return b, nil -} - -func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64Ptr() = &v - return b, nil -} - -func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - *f.toInt32() = v - return b, nil -} - -func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - *f.toInt32() = v - return b, nil -} - -func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32() = v - return b, nil -} - -func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32Ptr() = &v - return b, nil -} - -func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64() = v - return b[8:], nil -} - -func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64() = v - return b[8:], nil -} - -func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32() = v - return b[4:], nil -} - -func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32Ptr() = &v - return b[4:], nil -} - -func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - *f.toInt32() = v - return b[4:], nil -} - -func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.setInt32Ptr(v) - return b[4:], nil -} - -func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - return b[4:], nil -} - -func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - // Note: any length varint is allowed, even though any sane - // encoder will use one byte. - // See https://github.com/golang/protobuf/issues/76 - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - // TODO: check if x>1? Tests seem to indicate no. - v := x != 0 - *f.toBool() = v - return b[n:], nil -} - -func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - *f.toBoolPtr() = &v - return b[n:], nil -} - -func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - b = b[n:] - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - return b[n:], nil -} - -func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64() = v - return b[8:], nil -} - -func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64Ptr() = &v - return b[8:], nil -} - -func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32() = v - return b[4:], nil -} - -func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32Ptr() = &v - return b[4:], nil -} - -func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toString() = v - return b[x:], nil -} - -func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toStringPtr() = &v - return b[x:], nil -} - -func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - s := f.toStringSlice() - *s = append(*s, v) - return b[x:], nil -} - -func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toString() = v - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - *f.toStringPtr() = &v - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - s := f.toStringSlice() - *s = append(*s, v) - if !utf8.ValidString(v) { - return b[x:], errInvalidUTF8 - } - return b[x:], nil -} - -var emptyBuf [0]byte - -func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // The use of append here is a trick which avoids the zeroing - // that would be required if we used a make/copy pair. - // We append to emptyBuf instead of nil because we want - // a non-nil result even when the length is 0. - v := append(emptyBuf[:], b[:x]...) - *f.toBytes() = v - return b[x:], nil -} - -func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := append(emptyBuf[:], b[:x]...) - s := f.toBytesSlice() - *s = append(*s, v) - return b[x:], nil -} - -func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // First read the message field to see if something is there. - // The semantics of multiple submessages are weird. Instead of - // the last one winning (as it is for all other fields), multiple - // submessages are merged. - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[x:], err - } -} - -func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[x:], err - } -} - -func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[y:], err - } -} - -func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[y:], err - } -} - -func makeUnmarshalMap(f *reflect.StructField) unmarshaler { - t := f.Type - kt := t.Key() - vt := t.Elem() - unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) - unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) - return func(b []byte, f pointer, w int) ([]byte, error) { - // The map entry is a submessage. Figure out how big it is. - if w != WireBytes { - return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - r := b[x:] // unused data to return - b = b[:x] // data for map entry - - // Note: we could use #keys * #values ~= 200 functions - // to do map decoding without reflection. Probably not worth it. - // Maps will be somewhat slow. Oh well. - - // Read key and value from data. - var nerr nonFatal - k := reflect.New(kt) - v := reflect.New(vt) - for len(b) > 0 { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - wire := int(x) & 7 - b = b[n:] - - var err error - switch x >> 3 { - case 1: - b, err = unmarshalKey(b, valToPointer(k), wire) - case 2: - b, err = unmarshalVal(b, valToPointer(v), wire) - default: - err = errInternalBadWireType // skip unknown tag - } - - if nerr.Merge(err) { - continue - } - if err != errInternalBadWireType { - return nil, err - } - - // Skip past unknown fields. - b, err = skipField(b, wire) - if err != nil { - return nil, err - } - } - - // Get map, allocate if needed. - m := f.asPointerTo(t).Elem() // an addressable map[K]T - if m.IsNil() { - m.Set(reflect.MakeMap(t)) - } - - // Insert into map. - m.SetMapIndex(k.Elem(), v.Elem()) - - return r, nerr.E - } -} - -// makeUnmarshalOneof makes an unmarshaler for oneof fields. -// for: -// message Msg { -// oneof F { -// int64 X = 1; -// float64 Y = 2; -// } -// } -// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). -// ityp is the interface type of the oneof field (e.g. isMsg_F). -// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). -// Note that this function will be called once for each case in the oneof. -func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { - sf := typ.Field(0) - field0 := toField(&sf) - return func(b []byte, f pointer, w int) ([]byte, error) { - // Allocate holder for value. - v := reflect.New(typ) - - // Unmarshal data into holder. - // We unmarshal into the first field of the holder object. - var err error - var nerr nonFatal - b, err = unmarshal(b, valToPointer(v).offset(field0), w) - if !nerr.Merge(err) { - return nil, err - } - - // Write pointer to holder into target field. - f.asPointerTo(ityp).Elem().Set(v) - - return b, nerr.E - } -} - -// Error used by decode internally. -var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") - -// skipField skips past a field of type wire and returns the remaining bytes. -func skipField(b []byte, wire int) ([]byte, error) { - switch wire { - case WireVarint: - _, k := decodeVarint(b) - if k == 0 { - return b, io.ErrUnexpectedEOF - } - b = b[k:] - case WireFixed32: - if len(b) < 4 { - return b, io.ErrUnexpectedEOF - } - b = b[4:] - case WireFixed64: - if len(b) < 8 { - return b, io.ErrUnexpectedEOF - } - b = b[8:] - case WireBytes: - m, k := decodeVarint(b) - if k == 0 || uint64(len(b)-k) < m { - return b, io.ErrUnexpectedEOF - } - b = b[uint64(k)+m:] - case WireStartGroup: - _, i := findEndGroup(b) - if i == -1 { - return b, io.ErrUnexpectedEOF - } - b = b[i:] - default: - return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) - } - return b, nil -} - -// findEndGroup finds the index of the next EndGroup tag. -// Groups may be nested, so the "next" EndGroup tag is the first -// unpaired EndGroup. -// findEndGroup returns the indexes of the start and end of the EndGroup tag. -// Returns (-1,-1) if it can't find one. -func findEndGroup(b []byte) (int, int) { - depth := 1 - i := 0 - for { - x, n := decodeVarint(b[i:]) - if n == 0 { - return -1, -1 - } - j := i - i += n - switch x & 7 { - case WireVarint: - _, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - case WireFixed32: - if len(b)-4 < i { - return -1, -1 - } - i += 4 - case WireFixed64: - if len(b)-8 < i { - return -1, -1 - } - i += 8 - case WireBytes: - m, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - if uint64(len(b)-i) < m { - return -1, -1 - } - i += int(m) - case WireStartGroup: - depth++ - case WireEndGroup: - depth-- - if depth == 0 { - return j, i - } - default: - return -1, -1 - } - } -} - -// encodeVarint appends a varint-encoded integer to b and returns the result. -func encodeVarint(b []byte, x uint64) []byte { - for x >= 1<<7 { - b = append(b, byte(x&0x7f|0x80)) - x >>= 7 - } - return append(b, byte(x)) -} - -// decodeVarint reads a varint-encoded integer from b. -// Returns the decoded integer and the number of bytes read. -// If there is an error, it returns 0,0. -func decodeVarint(b []byte) (uint64, int) { - var x, y uint64 - if len(b) <= 0 { - goto bad - } - x = uint64(b[0]) - if x < 0x80 { - return x, 1 - } - x -= 0x80 - - if len(b) <= 1 { - goto bad - } - y = uint64(b[1]) - x += y << 7 - if y < 0x80 { - return x, 2 - } - x -= 0x80 << 7 - - if len(b) <= 2 { - goto bad - } - y = uint64(b[2]) - x += y << 14 - if y < 0x80 { - return x, 3 - } - x -= 0x80 << 14 - - if len(b) <= 3 { - goto bad - } - y = uint64(b[3]) - x += y << 21 - if y < 0x80 { - return x, 4 - } - x -= 0x80 << 21 - - if len(b) <= 4 { - goto bad - } - y = uint64(b[4]) - x += y << 28 - if y < 0x80 { - return x, 5 - } - x -= 0x80 << 28 - - if len(b) <= 5 { - goto bad - } - y = uint64(b[5]) - x += y << 35 - if y < 0x80 { - return x, 6 - } - x -= 0x80 << 35 - - if len(b) <= 6 { - goto bad - } - y = uint64(b[6]) - x += y << 42 - if y < 0x80 { - return x, 7 - } - x -= 0x80 << 42 - - if len(b) <= 7 { - goto bad - } - y = uint64(b[7]) - x += y << 49 - if y < 0x80 { - return x, 8 - } - x -= 0x80 << 49 - - if len(b) <= 8 { - goto bad - } - y = uint64(b[8]) - x += y << 56 - if y < 0x80 { - return x, 9 - } - x -= 0x80 << 56 - - if len(b) <= 9 { - goto bad - } - y = uint64(b[9]) - x += y << 63 - if y < 2 { - return x, 10 - } - -bad: - return 0, 0 -} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go index 1aaee725b..965876bf0 100644 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -50,6 +50,7 @@ import ( var ( newline = []byte("\n") spaces = []byte(" ") + gtNewline = []byte(">\n") endBraceNewline = []byte("}\n") backslashN = []byte{'\\', 'n'} backslashR = []byte{'\\', 'r'} @@ -169,6 +170,11 @@ func writeName(w *textWriter, props *Properties) error { return nil } +// raw is the interface satisfied by RawMessage. +type raw interface { + Bytes() []byte +} + func requiresQuotes(u string) bool { // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. for _, ch := range u { @@ -263,10 +269,6 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { props := sprops.Prop[i] name := st.Field(i).Name - if name == "XXX_NoUnkeyedLiteral" { - continue - } - if strings.HasPrefix(name, "XXX_") { // There are two XXX_ fields: // XXX_unrecognized []byte @@ -353,7 +355,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { + if err := tm.writeAny(w, key, props.mkeyprop); err != nil { return err } if err := w.WriteByte('\n'); err != nil { @@ -370,7 +372,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if err := tm.writeAny(w, val, props.MapValProp); err != nil { + if err := tm.writeAny(w, val, props.mvalprop); err != nil { return err } if err := w.WriteByte('\n'); err != nil { @@ -434,6 +436,12 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } + if b, ok := fv.Interface().(raw); ok { + if err := writeRaw(w, b.Bytes()); err != nil { + return err + } + continue + } // Enums have a String method, so writeAny will work fine. if err := tm.writeAny(w, fv, props); err != nil { @@ -447,7 +455,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { // Extensions (the XXX_extensions field). pv := sv.Addr() - if _, err := extendable(pv.Interface()); err == nil { + if _, ok := extendable(pv.Interface()); ok { if err := tm.writeExtensions(w, pv); err != nil { return err } @@ -456,6 +464,27 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return nil } +// writeRaw writes an uninterpreted raw message. +func writeRaw(w *textWriter, b []byte) error { + if err := w.WriteByte('<'); err != nil { + return err + } + if !w.compact { + if err := w.WriteByte('\n'); err != nil { + return err + } + } + w.indent() + if err := writeUnknownStruct(w, b); err != nil { + return err + } + w.unindent() + if err := w.WriteByte('>'); err != nil { + return err + } + return nil +} + // writeAny writes an arbitrary field. func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { v = reflect.Indirect(v) @@ -506,19 +535,6 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert } } w.indent() - if v.CanAddr() { - // Calling v.Interface on a struct causes the reflect package to - // copy the entire struct. This is racy with the new Marshaler - // since we atomically update the XXX_sizecache. - // - // Thus, we retrieve a pointer to the struct if possible to avoid - // a race since v.Interface on the pointer doesn't copy the struct. - // - // If v is not addressable, then we are not worried about a race - // since it implies that the binary Marshaler cannot possibly be - // mutating this value. - v = v.Addr() - } if etm, ok := v.Interface().(encoding.TextMarshaler); ok { text, err := etm.MarshalText() if err != nil { @@ -527,13 +543,8 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert if _, err = w.Write(text); err != nil { return err } - } else { - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - if err := tm.writeStruct(w, v); err != nil { - return err - } + } else if err := tm.writeStruct(w, v); err != nil { + return err } w.unindent() if err := w.WriteByte(ket); err != nil { diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go index bb55a3af2..61f83c1e1 100644 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ b/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -206,6 +206,7 @@ func (p *textParser) advance() { var ( errBadUTF8 = errors.New("proto: bad UTF-8") + errBadHex = errors.New("proto: bad hexadecimal") ) func unquoteC(s string, quote rune) (string, error) { @@ -276,47 +277,60 @@ func unescape(s string) (ch string, tail string, err error) { return "?", s, nil // trigraph workaround case '\'', '"', '\\': return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7': + case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': if len(s) < 2 { return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) } - ss := string(r) + s[:2] + base := 8 + ss := s[:2] s = s[2:] - i, err := strconv.ParseUint(ss, 8, 8) + if r == 'x' || r == 'X' { + base = 16 + } else { + ss = string(r) + ss + } + i, err := strconv.ParseUint(ss, base, 8) if err != nil { - return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) + return "", "", err } return string([]byte{byte(i)}), s, nil - case 'x', 'X', 'u', 'U': - var n int - switch r { - case 'x', 'X': - n = 2 - case 'u': - n = 4 - case 'U': + case 'u', 'U': + n := 4 + if r == 'U' { n = 8 } if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) - } - ss := s[:n] - s = s[n:] - i, err := strconv.ParseUint(ss, 16, 64) - if err != nil { - return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) - } - if r == 'x' || r == 'X' { - return string([]byte{byte(i)}), s, nil + return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) } - if i > utf8.MaxRune { - return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + + bs := make([]byte, n/2) + for i := 0; i < n; i += 2 { + a, ok1 := unhex(s[i]) + b, ok2 := unhex(s[i+1]) + if !ok1 || !ok2 { + return "", "", errBadHex + } + bs[i/2] = a<<4 | b } - return string(i), s, nil + s = s[n:] + return string(bs), s, nil } return "", "", fmt.Errorf(`unknown escape \%c`, r) } +// Adapted from src/pkg/strconv/quote.go. +func unhex(b byte) (v byte, ok bool) { + switch { + case '0' <= b && b <= '9': + return b - '0', true + case 'a' <= b && b <= 'f': + return b - 'a' + 10, true + case 'A' <= b && b <= 'F': + return b - 'A' + 10, true + } + return 0, false +} + // Back off the parser by one token. Can only be done between calls to next(). // It makes the next advance() a no-op. func (p *textParser) back() { p.backed = true } @@ -630,17 +644,17 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { if err := p.consumeToken(":"); err != nil { return err } - if err := p.readAny(key, props.MapKeyProp); err != nil { + if err := p.readAny(key, props.mkeyprop); err != nil { return err } if err := p.consumeOptionalSeparator(); err != nil { return err } case "value": - if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { return err } - if err := p.readAny(val, props.MapValProp); err != nil { + if err := p.readAny(val, props.mvalprop); err != nil { return err } if err := p.consumeOptionalSeparator(); err != nil { @@ -714,9 +728,6 @@ func (p *textParser) consumeExtName() (string, error) { if tok.err != nil { return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) } - if p.done && tok.value != "]" { - return "", p.errorf("unclosed type_url or extension name") - } } return strings.Join(parts, ""), nil } @@ -872,9 +883,13 @@ func (p *textParser) readAny(v reflect.Value, props *Properties) error { // UnmarshalText returns *RequiredNotSetError. func UnmarshalText(s string, pb Message) error { if um, ok := pb.(encoding.TextUnmarshaler); ok { - return um.UnmarshalText([]byte(s)) + err := um.UnmarshalText([]byte(s)) + return err } pb.Reset() v := reflect.ValueOf(pb) - return newTextParser(s).readStruct(v.Elem(), "") + if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { + return pe + } + return nil } diff --git a/vendor/github.com/googollee/go-engine.io/.travis.yml b/vendor/github.com/googollee/go-engine.io/.travis.yml new file mode 100644 index 000000000..0a5134f0d --- /dev/null +++ b/vendor/github.com/googollee/go-engine.io/.travis.yml @@ -0,0 +1,7 @@ +language: go +go: 1.5 +install: + - go get "github.com/smartystreets/goconvey/convey" + - go get -v . +script: + - go test -race -v ./... diff --git a/vendor/github.com/googollee/go-engine.io/README.md b/vendor/github.com/googollee/go-engine.io/README.md new file mode 100644 index 000000000..c5d603f57 --- /dev/null +++ b/vendor/github.com/googollee/go-engine.io/README.md @@ -0,0 +1,78 @@ +# go-engine.io + +[![GoDoc](http://godoc.org/github.com/googollee/go-engine.io?status.svg)](http://godoc.org/github.com/googollee/go-engine.io) [![Build Status](https://travis-ci.org/googollee/go-engine.io.svg)](https://travis-ci.org/googollee/go-engine.io) + +go-engine.io is the implement of engine.io in golang, which is transport-based cross-browser/cross-device bi-directional communication layer for [go-socket.io](https://github.com/googollee/go-socket.io). + +It is compatible with node.js implement, and supported long-polling and websocket transport. + +## Install + +Install the package with: + +```bash +go get github.com/googollee/go-engine.io +``` + +Import it with: + +```go +import "github.com/googollee/go-engine.io" +``` + +and use `engineio` as the package name inside the code. + +## Example + +Please check example folder for details. + +```go +package main + +import ( + "encoding/hex" + "io/ioutil" + "log" + "net/http" + + "github.com/googollee/go-engine.io" +) + +func main() { + server, err := engineio.NewServer(nil) + if err != nil { + log.Fatal(err) + } + + go func() { + for { + conn, _ := server.Accept() + go func() { + defer conn.Close() + for i := 0; i < 10; i++ { + t, r, _ := conn.NextReader() + b, _ := ioutil.ReadAll(r) + r.Close() + if t == engineio.MessageText { + log.Println(t, string(b)) + } else { + log.Println(t, hex.EncodeToString(b)) + } + w, _ := conn.NextWriter(t) + w.Write([]byte("pong")) + w.Close() + } + }() + } + }() + + http.Handle("/engine.io/", server) + http.Handle("/", http.FileServer(http.Dir("./asset"))) + log.Println("Serving at localhost:5000...") + log.Fatal(http.ListenAndServe(":5000", nil)) +} +``` + +## License + +The 3-clause BSD License - see LICENSE for more details \ No newline at end of file diff --git a/vendor/github.com/googollee/go-socket.io/.gitignore b/vendor/github.com/googollee/go-socket.io/.gitignore new file mode 100644 index 000000000..615566c1e --- /dev/null +++ b/vendor/github.com/googollee/go-socket.io/.gitignore @@ -0,0 +1,4 @@ + +.DS_Store +.idea/ +go.sum \ No newline at end of file diff --git a/vendor/github.com/googollee/go-socket.io/.travis.yml b/vendor/github.com/googollee/go-socket.io/.travis.yml new file mode 100644 index 000000000..ca7753f3d --- /dev/null +++ b/vendor/github.com/googollee/go-socket.io/.travis.yml @@ -0,0 +1,7 @@ +language: go +go: +- 1.7.x +- 1.11.x +install: + - go get "github.com/smartystreets/goconvey/convey" + - go get -v . diff --git a/vendor/github.com/googollee/go-socket.io/README.md b/vendor/github.com/googollee/go-socket.io/README.md new file mode 100644 index 000000000..e5a160ddd --- /dev/null +++ b/vendor/github.com/googollee/go-socket.io/README.md @@ -0,0 +1,127 @@ +# socket.io + +[![GoDoc](http://godoc.org/github.com/googollee/go-socket.io?status.svg)](http://godoc.org/github.com/googollee/go-socket.io) [![Build Status](https://travis-ci.org/googollee/go-socket.io.svg)](https://travis-ci.org/googollee/go-socket.io) + +**Please use v1.4 branch, or import "gopkg.in/googollee/go-socket.io.v1". I have no time to maintain master branch now** + +go-socket.io is an implementation of [socket.io](http://socket.io) in golang, which is a realtime application framework. + +It is compatible with latest implementation of socket.io in node.js, and supports room and namespace. + +* for compatability with socket.io 0.9.x, please use branch 0.9.x * + +## Install + +Install the package with: + +```bash +go get github.com/googollee/go-socket.io +``` + +Import it with: + +```go +import "github.com/googollee/go-socket.io" +``` + +and use `socketio` as the package name inside the code. + +## Example + +Please check the example folder for details. + +```go +package main + +import ( + "log" + "net/http" + + "github.com/googollee/go-socket.io" +) + +func main() { + server, err := socketio.NewServer(nil) + if err != nil { + log.Fatal(err) + } + server.On("connection", func(so socketio.Socket) { + log.Println("on connection") + so.Join("chat") + so.On("chat message", func(msg string) { + log.Println("emit:", so.Emit("chat message", msg)) + so.BroadcastTo("chat", "chat message", msg) + }) + so.On("disconnection", func() { + log.Println("on disconnect") + }) + }) + server.On("error", func(so socketio.Socket, err error) { + log.Println("error:", err) + }) + + http.Handle("/socket.io/", server) + http.Handle("/", http.FileServer(http.Dir("./asset"))) + log.Println("Serving at localhost:5000...") + log.Fatal(http.ListenAndServe(":5000", nil)) +} +``` + +## Acknowledgements in go-socket.io 1.X.X + +[See documentation about acknowledgements](http://socket.io/docs/#sending-and-getting-data-(acknowledgements)) + +##### Sending ACK with data from SERVER to CLIENT + +* Client-side + +```javascript + //using client-side socket.io-1.X.X.js + socket.emit('some:event', JSON.stringify(someData), function(data){ + console.log('ACK from server wtih data: ', data)); + }); +``` + +* Server-side + +```go +// The return type may vary depending on whether you will return +// In golang implementation of socket.io don't used callbacks for acknowledgement, +// but used return value, which wrapped into ack package and returned to the client's callback in JavaScript +so.On("some:event", func(msg string) string { + return msg //Sending ack with data in msg back to client, using "return statement" +}) +``` + +##### Sending ACK with data from CLIENT to SERVER + +* Client-side + +```javascript +//using client-side socket.io-1.X.X.js +//last parameter of "on" handler is callback for sending ack to server with data or without data +socket.on('some:event', function (msg, sendAckCb) { + //Sending ACK with data to server after receiving some:event from server + sendAckCb(JSON.stringify(data)); // for example used serializing to JSON +} +``` + +* Server-side + +```go +//You can use Emit or BroadcastTo with last parameter as callback for handling ack from client +//Sending packet to room "room_name" and event "some:event" +so.BroadcastTo("room_name", "some:event", dataForClient, func (so socketio.Socket, data string) { + log.Println("Client ACK with data: ", data) +}) + +// Or + +so.Emit("some:event", dataForClient, func (so socketio.Socket, data string) { + log.Println("Client ACK with data: ", data) +}) +``` + +## License + +The 3-clause BSD License - see LICENSE for more details diff --git a/vendor/github.com/gorilla/websocket/.gitignore b/vendor/github.com/gorilla/websocket/.gitignore new file mode 100644 index 000000000..cd3fcd1ef --- /dev/null +++ b/vendor/github.com/gorilla/websocket/.gitignore @@ -0,0 +1,25 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe + +.idea/ +*.iml diff --git a/vendor/github.com/gorilla/websocket/.travis.yml b/vendor/github.com/gorilla/websocket/.travis.yml new file mode 100644 index 000000000..a49db51c4 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/.travis.yml @@ -0,0 +1,19 @@ +language: go +sudo: false + +matrix: + include: + - go: 1.7.x + - go: 1.8.x + - go: 1.9.x + - go: 1.10.x + - go: 1.11.x + - go: tip + allow_failures: + - go: tip + +script: + - go get -t -v ./... + - diff -u <(echo -n) <(gofmt -d .) + - go vet $(go list ./... | grep -v /vendor/) + - go test -v -race ./... diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md new file mode 100644 index 000000000..20e391f86 --- /dev/null +++ b/vendor/github.com/gorilla/websocket/README.md @@ -0,0 +1,64 @@ +# Gorilla WebSocket + +Gorilla WebSocket is a [Go](http://golang.org/) implementation of the +[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. + +[![Build Status](https://travis-ci.org/gorilla/websocket.svg?branch=master)](https://travis-ci.org/gorilla/websocket) +[![GoDoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) + +### Documentation + +* [API Reference](http://godoc.org/github.com/gorilla/websocket) +* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat) +* [Command example](https://github.com/gorilla/websocket/tree/master/examples/command) +* [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo) +* [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch) + +### Status + +The Gorilla WebSocket package provides a complete and tested implementation of +the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. The +package API is stable. + +### Installation + + go get github.com/gorilla/websocket + +### Protocol Compliance + +The Gorilla WebSocket package passes the server tests in the [Autobahn Test +Suite](http://autobahn.ws/testsuite) using the application in the [examples/autobahn +subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). + +### Gorilla WebSocket compared with other packages + + + + + + + + + + + + + + + + + + +
github.com/gorillagolang.org/x/net
RFC 6455 Features
Passes Autobahn Test SuiteYesNo
Receive fragmented messageYesNo, see note 1
Send close messageYesNo
Send pings and receive pongsYesNo
Get the type of a received data messageYesYes, see note 2
Other Features
Compression ExtensionsExperimentalNo
Read message using io.ReaderYesNo, see note 3
Write message using io.WriteCloserYesNo, see note 3
+ +Notes: + +1. Large messages are fragmented in [Chrome's new WebSocket implementation](http://www.ietf.org/mail-archive/web/hybi/current/msg10503.html). +2. The application can get the type of a received data message by implementing + a [Codec marshal](http://godoc.org/golang.org/x/net/websocket#Codec.Marshal) + function. +3. The go.net io.Reader and io.Writer operate across WebSocket frame boundaries. + Read returns when the input buffer is full or a frame boundary is + encountered. Each call to Write sends a single frame message. The Gorilla + io.Reader and io.WriteCloser operate on a single WebSocket message. + diff --git a/vendor/github.com/itsjamie/gin-cors/.gitignore b/vendor/github.com/itsjamie/gin-cors/.gitignore new file mode 100644 index 000000000..daf913b1b --- /dev/null +++ b/vendor/github.com/itsjamie/gin-cors/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/itsjamie/gin-cors/.travis.yml b/vendor/github.com/itsjamie/gin-cors/.travis.yml new file mode 100644 index 000000000..2124b2f29 --- /dev/null +++ b/vendor/github.com/itsjamie/gin-cors/.travis.yml @@ -0,0 +1,10 @@ +language: go + +go: + - tip +before_install: + - go get github.com/axw/gocov/gocov + - go get github.com/mattn/goveralls + - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi +script: + - $HOME/gopath/bin/goveralls -service=travis-ci \ No newline at end of file diff --git a/vendor/github.com/itsjamie/gin-cors/README.md b/vendor/github.com/itsjamie/gin-cors/README.md new file mode 100644 index 000000000..f5693fc93 --- /dev/null +++ b/vendor/github.com/itsjamie/gin-cors/README.md @@ -0,0 +1,50 @@ +# CORS for Gin [![GoDoc](https://godoc.org/github.com/itsjamie/gin-cors?status.svg)](https://godoc.org/github.com/itsjamie/gin-cors) [![Build Status](https://travis-ci.org/itsjamie/gin-cors.svg?branch=master)](https://travis-ci.org/itsjamie/gin-cors) [![Coverage Status](https://coveralls.io/repos/itsjamie/gin-cors/badge.svg?branch=master)](https://coveralls.io/r/itsjamie/gin-cors?branch=master) + +gin-cors is a middleware written in [Go (Golang)](http://golang.org) specifically for the [Gin Framework](https://gin-gonic.github.io/gin/) that implements the [Cross Origin Resource Sharing specification](http://www.w3.org/TR/cors/) from the W3C. Implementing CORS headers enable pages within a modern web browser to consume resources (such as REST APIs) from servers that are on a different domain. + +## Getting Started +To use this library, add the following code into your Gin router setup: + +```go +import "github.com/itsjamie/gin-cors" + +// Initialize a new Gin router +router := gin.New() + +// Apply the middleware to the router (works with groups too) +router.Use(cors.Middleware(cors.Config{ + Origins: "*", + Methods: "GET, PUT, POST, DELETE", + RequestHeaders: "Origin, Authorization, Content-Type", + ExposedHeaders: "", + MaxAge: 50 * time.Second, + Credentials: true, + ValidateHeaders: false, +})) +``` + +## Setup Options +The middleware can be configured with four options, which match the HTTP headers that it generates: + +Parameter | Type | Details +-------------------|-----------------|---------------------------------- +Origins | *string* | A comma delimited list of origins which have access. For example: ```"http://localhost, http://api.server.com, http://files.server.com"``` +RequestHeaders | *string* | A comma delimited list of allowed HTTP that is passed to the browser in the **Access-Control-Allow-Headers** header. +ExposeHeaders | *string* | A comma delimited list of HTTP headers that should be exposed to the CORS client via the **Access-Control-Expose-Headers** header. +Methods | *string* | A comma delimited list of allowed HTTP methods that is passed to the browser in the **Access-Control-Allow-Methods**. +MaxAge | *time.Duration* | The amount of time a preflight request should be cached, if not specified, the header **Access-Control-Max-Age** will not be set. +Credentials | *bool* | This is passed in the **Access-Control-Allow-Credentials** header. If ```true``` Cookies, HTTP authentication and the client-side SSL certificates will be sent on previous interactions with the origin. +ValidateHeaders | *bool* | If ```false``` we skip validating the requested headers/methods with the list of allowed ones, and instead just respond with all what we support, it is up to the client implementating CORS to deny the request. This is an optimization allowed by the specification. + + +## CORS Resources + +* [HTML Rocks Tutorial: Using CORS](http://www.html5rocks.com/en/tutorials/cors/) +* [Mozilla Developer Network: CORS Reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS) +* [CORS Specification from W3C](http://www.w3.org/TR/cors/) + +## Special Thanks +Special thanks to [benpate](https://github.com/benpate) for providing a foundation to work from. + +## License +The code is licensed under the MIT License. See LICENSE file for more details. diff --git a/vendor/github.com/json-iterator/go/.codecov.yml b/vendor/github.com/json-iterator/go/.codecov.yml new file mode 100644 index 000000000..955dc0be5 --- /dev/null +++ b/vendor/github.com/json-iterator/go/.codecov.yml @@ -0,0 +1,3 @@ +ignore: + - "output_tests/.*" + diff --git a/vendor/github.com/json-iterator/go/.gitignore b/vendor/github.com/json-iterator/go/.gitignore new file mode 100644 index 000000000..501fcdc9a --- /dev/null +++ b/vendor/github.com/json-iterator/go/.gitignore @@ -0,0 +1,3 @@ +.idea +/coverage.txt +/profile.out diff --git a/vendor/github.com/json-iterator/go/.travis.yml b/vendor/github.com/json-iterator/go/.travis.yml new file mode 100644 index 000000000..945b9c594 --- /dev/null +++ b/vendor/github.com/json-iterator/go/.travis.yml @@ -0,0 +1,13 @@ +language: go + +go: + - 1.8.x + +before_install: + - go get -t -v ./... + +script: + - ./test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/json-iterator/go/README.md b/vendor/github.com/json-iterator/go/README.md new file mode 100644 index 000000000..23a4b57c8 --- /dev/null +++ b/vendor/github.com/json-iterator/go/README.md @@ -0,0 +1,80 @@ +[![Sourcegraph](https://sourcegraph.com/github.com/json-iterator/go/-/badge.svg)](https://sourcegraph.com/github.com/json-iterator/go?badge) +[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/json-iterator/go) +[![Build Status](https://travis-ci.org/json-iterator/go.svg?branch=master)](https://travis-ci.org/json-iterator/go) +[![codecov](https://codecov.io/gh/json-iterator/go/branch/master/graph/badge.svg)](https://codecov.io/gh/json-iterator/go) +[![rcard](https://goreportcard.com/badge/github.com/json-iterator/go)](https://goreportcard.com/report/github.com/json-iterator/go) +[![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/json-iterator/go/master/LICENSE) +[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby) + +A high-performance 100% compatible drop-in replacement of "encoding/json" + +``` +Go开发者们请加入我们,滴滴出行平台技术部 taowen@didichuxing.com +``` + +# Benchmark + +![benchmark](http://jsoniter.com/benchmarks/go-benchmark.png) + +Source code: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go + +Raw Result (easyjson requires static code generation) + +| | ns/op | allocation bytes | allocation times | +| --- | --- | --- | --- | +| std decode | 35510 ns/op | 1960 B/op | 99 allocs/op | +| easyjson decode | 8499 ns/op | 160 B/op | 4 allocs/op | +| jsoniter decode | 5623 ns/op | 160 B/op | 3 allocs/op | +| std encode | 2213 ns/op | 712 B/op | 5 allocs/op | +| easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op | +| jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op | + +# Usage + +100% compatibility with standard lib + +Replace + +```go +import "encoding/json" +json.Marshal(&data) +``` + +with + +```go +import "github.com/json-iterator/go" +jsoniter.Marshal(&data) +``` + +Replace + +```go +import "encoding/json" +json.Unmarshal(input, &data) +``` + +with + +```go +import "github.com/json-iterator/go" +jsoniter.Unmarshal(input, &data) +``` + +[More documentation](http://jsoniter.com/migrate-from-go-std.html) + +# How to get + +``` +go get github.com/json-iterator/go +``` + +# Contribution Welcomed ! + +Contributors + +* [thockin](https://github.com/thockin) +* [mattn](https://github.com/mattn) +* [cch123](https://github.com/cch123) + +Report issue or pull request, or email taowen@gmail.com, or [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby) diff --git a/vendor/github.com/json-iterator/go/config.go b/vendor/github.com/json-iterator/go/config.go deleted file mode 100644 index 8c58fcba5..000000000 --- a/vendor/github.com/json-iterator/go/config.go +++ /dev/null @@ -1,375 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "io" - "reflect" - "sync" - "unsafe" - - "github.com/modern-go/concurrent" - "github.com/modern-go/reflect2" -) - -// Config customize how the API should behave. -// The API is created from Config by Froze. -type Config struct { - IndentionStep int - MarshalFloatWith6Digits bool - EscapeHTML bool - SortMapKeys bool - UseNumber bool - DisallowUnknownFields bool - TagKey string - OnlyTaggedField bool - ValidateJsonRawMessage bool - ObjectFieldMustBeSimpleString bool - CaseSensitive bool -} - -// API the public interface of this package. -// Primary Marshal and Unmarshal. -type API interface { - IteratorPool - StreamPool - MarshalToString(v interface{}) (string, error) - Marshal(v interface{}) ([]byte, error) - MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) - UnmarshalFromString(str string, v interface{}) error - Unmarshal(data []byte, v interface{}) error - Get(data []byte, path ...interface{}) Any - NewEncoder(writer io.Writer) *Encoder - NewDecoder(reader io.Reader) *Decoder - Valid(data []byte) bool - RegisterExtension(extension Extension) - DecoderOf(typ reflect2.Type) ValDecoder - EncoderOf(typ reflect2.Type) ValEncoder -} - -// ConfigDefault the default API -var ConfigDefault = Config{ - EscapeHTML: true, -}.Froze() - -// ConfigCompatibleWithStandardLibrary tries to be 100% compatible with standard library behavior -var ConfigCompatibleWithStandardLibrary = Config{ - EscapeHTML: true, - SortMapKeys: true, - ValidateJsonRawMessage: true, -}.Froze() - -// ConfigFastest marshals float with only 6 digits precision -var ConfigFastest = Config{ - EscapeHTML: false, - MarshalFloatWith6Digits: true, // will lose precession - ObjectFieldMustBeSimpleString: true, // do not unescape object field -}.Froze() - -type frozenConfig struct { - configBeforeFrozen Config - sortMapKeys bool - indentionStep int - objectFieldMustBeSimpleString bool - onlyTaggedField bool - disallowUnknownFields bool - decoderCache *concurrent.Map - encoderCache *concurrent.Map - encoderExtension Extension - decoderExtension Extension - extraExtensions []Extension - streamPool *sync.Pool - iteratorPool *sync.Pool - caseSensitive bool -} - -func (cfg *frozenConfig) initCache() { - cfg.decoderCache = concurrent.NewMap() - cfg.encoderCache = concurrent.NewMap() -} - -func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) { - cfg.decoderCache.Store(cacheKey, decoder) -} - -func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) { - cfg.encoderCache.Store(cacheKey, encoder) -} - -func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder { - decoder, found := cfg.decoderCache.Load(cacheKey) - if found { - return decoder.(ValDecoder) - } - return nil -} - -func (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder { - encoder, found := cfg.encoderCache.Load(cacheKey) - if found { - return encoder.(ValEncoder) - } - return nil -} - -var cfgCache = concurrent.NewMap() - -func getFrozenConfigFromCache(cfg Config) *frozenConfig { - obj, found := cfgCache.Load(cfg) - if found { - return obj.(*frozenConfig) - } - return nil -} - -func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) { - cfgCache.Store(cfg, frozenConfig) -} - -// Froze forge API from config -func (cfg Config) Froze() API { - api := &frozenConfig{ - sortMapKeys: cfg.SortMapKeys, - indentionStep: cfg.IndentionStep, - objectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString, - onlyTaggedField: cfg.OnlyTaggedField, - disallowUnknownFields: cfg.DisallowUnknownFields, - caseSensitive: cfg.CaseSensitive, - } - api.streamPool = &sync.Pool{ - New: func() interface{} { - return NewStream(api, nil, 512) - }, - } - api.iteratorPool = &sync.Pool{ - New: func() interface{} { - return NewIterator(api) - }, - } - api.initCache() - encoderExtension := EncoderExtension{} - decoderExtension := DecoderExtension{} - if cfg.MarshalFloatWith6Digits { - api.marshalFloatWith6Digits(encoderExtension) - } - if cfg.EscapeHTML { - api.escapeHTML(encoderExtension) - } - if cfg.UseNumber { - api.useNumber(decoderExtension) - } - if cfg.ValidateJsonRawMessage { - api.validateJsonRawMessage(encoderExtension) - } - api.encoderExtension = encoderExtension - api.decoderExtension = decoderExtension - api.configBeforeFrozen = cfg - return api -} - -func (cfg Config) frozeWithCacheReuse(extraExtensions []Extension) *frozenConfig { - api := getFrozenConfigFromCache(cfg) - if api != nil { - return api - } - api = cfg.Froze().(*frozenConfig) - for _, extension := range extraExtensions { - api.RegisterExtension(extension) - } - addFrozenConfigToCache(cfg, api) - return api -} - -func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) { - encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) { - rawMessage := *(*json.RawMessage)(ptr) - iter := cfg.BorrowIterator([]byte(rawMessage)) - iter.Read() - if iter.Error != nil { - stream.WriteRaw("null") - } else { - cfg.ReturnIterator(iter) - stream.WriteRaw(string(rawMessage)) - } - }, func(ptr unsafe.Pointer) bool { - return len(*((*json.RawMessage)(ptr))) == 0 - }} - extension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder - extension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder -} - -func (cfg *frozenConfig) useNumber(extension DecoderExtension) { - extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { - exitingValue := *((*interface{})(ptr)) - if exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr { - iter.ReadVal(exitingValue) - return - } - if iter.WhatIsNext() == NumberValue { - *((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) - } else { - *((*interface{})(ptr)) = iter.Read() - } - }} -} -func (cfg *frozenConfig) getTagKey() string { - tagKey := cfg.configBeforeFrozen.TagKey - if tagKey == "" { - return "json" - } - return tagKey -} - -func (cfg *frozenConfig) RegisterExtension(extension Extension) { - cfg.extraExtensions = append(cfg.extraExtensions, extension) - copied := cfg.configBeforeFrozen - cfg.configBeforeFrozen = copied -} - -type lossyFloat32Encoder struct { -} - -func (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32Lossy(*((*float32)(ptr))) -} - -func (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type lossyFloat64Encoder struct { -} - -func (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64Lossy(*((*float64)(ptr))) -} - -func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -// EnableLossyFloatMarshalling keeps 10**(-6) precision -// for float variables for better performance. -func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) { - // for better performance - extension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{} - extension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{} -} - -type htmlEscapedStringEncoder struct { -} - -func (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteStringWithHTMLEscaped(str) -} - -func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) { - encoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{} -} - -func (cfg *frozenConfig) cleanDecoders() { - typeDecoders = map[string]ValDecoder{} - fieldDecoders = map[string]ValDecoder{} - *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) -} - -func (cfg *frozenConfig) cleanEncoders() { - typeEncoders = map[string]ValEncoder{} - fieldEncoders = map[string]ValEncoder{} - *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) -} - -func (cfg *frozenConfig) MarshalToString(v interface{}) (string, error) { - stream := cfg.BorrowStream(nil) - defer cfg.ReturnStream(stream) - stream.WriteVal(v) - if stream.Error != nil { - return "", stream.Error - } - return string(stream.Buffer()), nil -} - -func (cfg *frozenConfig) Marshal(v interface{}) ([]byte, error) { - stream := cfg.BorrowStream(nil) - defer cfg.ReturnStream(stream) - stream.WriteVal(v) - if stream.Error != nil { - return nil, stream.Error - } - result := stream.Buffer() - copied := make([]byte, len(result)) - copy(copied, result) - return copied, nil -} - -func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - if prefix != "" { - panic("prefix is not supported") - } - for _, r := range indent { - if r != ' ' { - panic("indent can only be space") - } - } - newCfg := cfg.configBeforeFrozen - newCfg.IndentionStep = len(indent) - return newCfg.frozeWithCacheReuse(cfg.extraExtensions).Marshal(v) -} - -func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error { - data := []byte(str) - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.ReadVal(v) - c := iter.nextToken() - if c == 0 { - if iter.Error == io.EOF { - return nil - } - return iter.Error - } - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") - return iter.Error -} - -func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - return locatePath(iter, path) -} - -func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.ReadVal(v) - c := iter.nextToken() - if c == 0 { - if iter.Error == io.EOF { - return nil - } - return iter.Error - } - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") - return iter.Error -} - -func (cfg *frozenConfig) NewEncoder(writer io.Writer) *Encoder { - stream := NewStream(cfg, writer, 512) - return &Encoder{stream} -} - -func (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder { - iter := Parse(cfg, reader, 512) - return &Decoder{iter} -} - -func (cfg *frozenConfig) Valid(data []byte) bool { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.Skip() - return iter.Error == nil -} diff --git a/vendor/github.com/json-iterator/go/adapter.go b/vendor/github.com/json-iterator/go/feature_adapter.go similarity index 70% rename from vendor/github.com/json-iterator/go/adapter.go rename to vendor/github.com/json-iterator/go/feature_adapter.go index e674d0f39..edb477c4f 100644 --- a/vendor/github.com/json-iterator/go/adapter.go +++ b/vendor/github.com/json-iterator/go/feature_adapter.go @@ -16,6 +16,15 @@ func Unmarshal(data []byte, v interface{}) error { return ConfigDefault.Unmarshal(data, v) } +func lastNotSpacePos(data []byte) int { + for i := len(data) - 1; i >= 0; i-- { + if data[i] != ' ' && data[i] != '\t' && data[i] != '\r' && data[i] != '\n' { + return i + 1 + } + } + return 0 +} + // UnmarshalFromString convenient method to read from string instead of []byte func UnmarshalFromString(str string, v interface{}) error { return ConfigDefault.UnmarshalFromString(str, v) @@ -62,11 +71,6 @@ type Decoder struct { // Decode decode JSON into interface{} func (adapter *Decoder) Decode(obj interface{}) error { - if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil { - if !adapter.iter.loadMore() { - return io.EOF - } - } adapter.iter.ReadVal(obj) err := adapter.iter.Error if err == io.EOF { @@ -77,16 +81,7 @@ func (adapter *Decoder) Decode(obj interface{}) error { // More is there more? func (adapter *Decoder) More() bool { - iter := adapter.iter - if iter.Error != nil { - return false - } - c := iter.nextToken() - if c == 0 { - return false - } - iter.unreadByte() - return c != ']' && c != '}' + return adapter.iter.head != adapter.iter.tail } // Buffered remaining buffer @@ -95,21 +90,11 @@ func (adapter *Decoder) Buffered() io.Reader { return bytes.NewReader(remaining) } -// UseNumber causes the Decoder to unmarshal a number into an interface{} as a -// Number instead of as a float64. +// UseNumber for number JSON element, use float64 or json.NumberValue (alias of string) func (adapter *Decoder) UseNumber() { - cfg := adapter.iter.cfg.configBeforeFrozen - cfg.UseNumber = true - adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions) -} - -// 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. -func (adapter *Decoder) DisallowUnknownFields() { - cfg := adapter.iter.cfg.configBeforeFrozen - cfg.DisallowUnknownFields = true - adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions) + origCfg := adapter.iter.cfg.configBeforeFrozen + origCfg.UseNumber = true + adapter.iter.cfg = origCfg.Froze().(*frozenConfig) } // NewEncoder same as json.NewEncoder @@ -125,26 +110,18 @@ type Encoder struct { // Encode encode interface{} as JSON to io.Writer func (adapter *Encoder) Encode(val interface{}) error { adapter.stream.WriteVal(val) - adapter.stream.WriteRaw("\n") adapter.stream.Flush() return adapter.stream.Error } // SetIndent set the indention. Prefix is not supported func (adapter *Encoder) SetIndent(prefix, indent string) { - config := adapter.stream.cfg.configBeforeFrozen - config.IndentionStep = len(indent) - adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions) + adapter.stream.cfg.indentionStep = len(indent) } // SetEscapeHTML escape html by default, set to false to disable func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) { config := adapter.stream.cfg.configBeforeFrozen config.EscapeHTML = escapeHTML - adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions) -} - -// Valid reports whether data is a valid JSON encoding. -func Valid(data []byte) bool { - return ConfigDefault.Valid(data) + adapter.stream.cfg = config.Froze().(*frozenConfig) } diff --git a/vendor/github.com/json-iterator/go/any.go b/vendor/github.com/json-iterator/go/feature_any.go similarity index 74% rename from vendor/github.com/json-iterator/go/any.go rename to vendor/github.com/json-iterator/go/feature_any.go index daecfed61..6733dce4c 100644 --- a/vendor/github.com/json-iterator/go/any.go +++ b/vendor/github.com/json-iterator/go/feature_any.go @@ -1,13 +1,9 @@ package jsoniter import ( - "errors" "fmt" - "github.com/modern-go/reflect2" "io" "reflect" - "strconv" - "unsafe" ) // Any generic object representation. @@ -28,6 +24,7 @@ type Any interface { ToString() string ToVal(val interface{}) Get(path ...interface{}) Any + // TODO: add Set Size() int Keys() []string GetInterface() interface{} @@ -37,7 +34,7 @@ type Any interface { type baseAny struct{} func (any *baseAny) Get(path ...interface{}) Any { - return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} + return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)} } func (any *baseAny) Size() int { @@ -91,7 +88,7 @@ func Wrap(val interface{}) Any { if isAny { return asAny } - typ := reflect2.TypeOf(val) + typ := reflect.TypeOf(val) switch typ.Kind() { case reflect.Slice: return wrapArray(val) @@ -102,9 +99,6 @@ func Wrap(val interface{}) Any { case reflect.String: return WrapString(val.(string)) case reflect.Int: - if strconv.IntSize == 32 { - return WrapInt32(int32(val.(int))) - } return WrapInt64(int64(val.(int))) case reflect.Int8: return WrapInt32(int32(val.(int8))) @@ -115,15 +109,7 @@ func Wrap(val interface{}) Any { case reflect.Int64: return WrapInt64(val.(int64)) case reflect.Uint: - if strconv.IntSize == 32 { - return WrapUint32(uint32(val.(uint))) - } return WrapUint64(uint64(val.(uint))) - case reflect.Uintptr: - if ptrSize == 32 { - return WrapUint32(uint32(val.(uintptr))) - } - return WrapUint64(uint64(val.(uintptr))) case reflect.Uint8: return WrapUint32(uint32(val.(uint8))) case reflect.Uint16: @@ -171,8 +157,6 @@ func (iter *Iterator) readAny() Any { return iter.readArrayAny() case '-': return iter.readNumberAny(false) - case 0: - return &invalidAny{baseAny{}, errors.New("input is empty")} default: return iter.readNumberAny(true) } @@ -256,66 +240,3 @@ func locatePath(iter *Iterator, path []interface{}) Any { } return iter.readAny() } - -var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem() - -func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{ - valType: typ, - } - } - return nil -} - -func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{ - valType: typ, - } - } - return nil -} - -type anyCodec struct { - valType reflect2.Type -} - -func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - panic("not implemented") -} - -func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := codec.valType.UnsafeIndirect(ptr) - any := obj.(Any) - any.WriteTo(stream) -} - -func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { - obj := codec.valType.UnsafeIndirect(ptr) - any := obj.(Any) - return any.Size() == 0 -} - -type directAnyCodec struct { -} - -func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *(*Any)(ptr) = iter.readAny() -} - -func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - any := *(*Any)(ptr) - any.WriteTo(stream) -} - -func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool { - any := *(*Any)(ptr) - return any.Size() == 0 -} diff --git a/vendor/github.com/json-iterator/go/any_array.go b/vendor/github.com/json-iterator/go/feature_any_array.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_array.go rename to vendor/github.com/json-iterator/go/feature_any_array.go diff --git a/vendor/github.com/json-iterator/go/any_bool.go b/vendor/github.com/json-iterator/go/feature_any_bool.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_bool.go rename to vendor/github.com/json-iterator/go/feature_any_bool.go diff --git a/vendor/github.com/json-iterator/go/any_float.go b/vendor/github.com/json-iterator/go/feature_any_float.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_float.go rename to vendor/github.com/json-iterator/go/feature_any_float.go diff --git a/vendor/github.com/json-iterator/go/any_int32.go b/vendor/github.com/json-iterator/go/feature_any_int32.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_int32.go rename to vendor/github.com/json-iterator/go/feature_any_int32.go diff --git a/vendor/github.com/json-iterator/go/any_int64.go b/vendor/github.com/json-iterator/go/feature_any_int64.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_int64.go rename to vendor/github.com/json-iterator/go/feature_any_int64.go diff --git a/vendor/github.com/json-iterator/go/any_invalid.go b/vendor/github.com/json-iterator/go/feature_any_invalid.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_invalid.go rename to vendor/github.com/json-iterator/go/feature_any_invalid.go diff --git a/vendor/github.com/json-iterator/go/any_nil.go b/vendor/github.com/json-iterator/go/feature_any_nil.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_nil.go rename to vendor/github.com/json-iterator/go/feature_any_nil.go diff --git a/vendor/github.com/json-iterator/go/any_number.go b/vendor/github.com/json-iterator/go/feature_any_number.go similarity index 76% rename from vendor/github.com/json-iterator/go/any_number.go rename to vendor/github.com/json-iterator/go/feature_any_number.go index 9d1e901a6..4e1c27641 100644 --- a/vendor/github.com/json-iterator/go/any_number.go +++ b/vendor/github.com/json-iterator/go/feature_any_number.go @@ -1,9 +1,6 @@ package jsoniter -import ( - "io" - "unsafe" -) +import "unsafe" type numberLazyAny struct { baseAny @@ -32,9 +29,7 @@ func (any *numberLazyAny) ToInt() int { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadInt() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -42,9 +37,7 @@ func (any *numberLazyAny) ToInt32() int32 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadInt32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -52,9 +45,7 @@ func (any *numberLazyAny) ToInt64() int64 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadInt64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -62,9 +53,7 @@ func (any *numberLazyAny) ToUint() uint { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadUint() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -72,9 +61,7 @@ func (any *numberLazyAny) ToUint32() uint32 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadUint32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -82,9 +69,7 @@ func (any *numberLazyAny) ToUint64() uint64 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadUint64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -92,9 +77,7 @@ func (any *numberLazyAny) ToFloat32() float32 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadFloat32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } @@ -102,9 +85,7 @@ func (any *numberLazyAny) ToFloat64() float64 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadFloat64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } + any.err = iter.Error return val } diff --git a/vendor/github.com/json-iterator/go/any_object.go b/vendor/github.com/json-iterator/go/feature_any_object.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_object.go rename to vendor/github.com/json-iterator/go/feature_any_object.go diff --git a/vendor/github.com/json-iterator/go/any_str.go b/vendor/github.com/json-iterator/go/feature_any_string.go similarity index 97% rename from vendor/github.com/json-iterator/go/any_str.go rename to vendor/github.com/json-iterator/go/feature_any_string.go index a4b93c78c..abf060bd5 100644 --- a/vendor/github.com/json-iterator/go/any_str.go +++ b/vendor/github.com/json-iterator/go/feature_any_string.go @@ -14,7 +14,7 @@ func (any *stringAny) Get(path ...interface{}) Any { if len(path) == 0 { return any } - return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} + return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)} } func (any *stringAny) Parse() *Iterator { diff --git a/vendor/github.com/json-iterator/go/any_uint32.go b/vendor/github.com/json-iterator/go/feature_any_uint32.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_uint32.go rename to vendor/github.com/json-iterator/go/feature_any_uint32.go diff --git a/vendor/github.com/json-iterator/go/any_uint64.go b/vendor/github.com/json-iterator/go/feature_any_uint64.go similarity index 100% rename from vendor/github.com/json-iterator/go/any_uint64.go rename to vendor/github.com/json-iterator/go/feature_any_uint64.go diff --git a/vendor/github.com/json-iterator/go/feature_config.go b/vendor/github.com/json-iterator/go/feature_config.go new file mode 100644 index 000000000..fc055d504 --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_config.go @@ -0,0 +1,312 @@ +package jsoniter + +import ( + "encoding/json" + "errors" + "io" + "reflect" + "sync/atomic" + "unsafe" +) + +// Config customize how the API should behave. +// The API is created from Config by Froze. +type Config struct { + IndentionStep int + MarshalFloatWith6Digits bool + EscapeHTML bool + SortMapKeys bool + UseNumber bool + TagKey string +} + +type frozenConfig struct { + configBeforeFrozen Config + sortMapKeys bool + indentionStep int + decoderCache unsafe.Pointer + encoderCache unsafe.Pointer + extensions []Extension + streamPool chan *Stream + iteratorPool chan *Iterator +} + +// API the public interface of this package. +// Primary Marshal and Unmarshal. +type API interface { + IteratorPool + StreamPool + MarshalToString(v interface{}) (string, error) + Marshal(v interface{}) ([]byte, error) + MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) + UnmarshalFromString(str string, v interface{}) error + Unmarshal(data []byte, v interface{}) error + Get(data []byte, path ...interface{}) Any + NewEncoder(writer io.Writer) *Encoder + NewDecoder(reader io.Reader) *Decoder +} + +// ConfigDefault the default API +var ConfigDefault = Config{ + EscapeHTML: true, +}.Froze() + +// ConfigCompatibleWithStandardLibrary tries to be 100% compatible with standard library behavior +var ConfigCompatibleWithStandardLibrary = Config{ + EscapeHTML: true, + SortMapKeys: true, +}.Froze() + +// ConfigFastest marshals float with only 6 digits precision +var ConfigFastest = Config{ + EscapeHTML: false, + MarshalFloatWith6Digits: true, +}.Froze() + +// Froze forge API from config +func (cfg Config) Froze() API { + // TODO: cache frozen config + frozenConfig := &frozenConfig{ + sortMapKeys: cfg.SortMapKeys, + indentionStep: cfg.IndentionStep, + streamPool: make(chan *Stream, 16), + iteratorPool: make(chan *Iterator, 16), + } + atomic.StorePointer(&frozenConfig.decoderCache, unsafe.Pointer(&map[string]ValDecoder{})) + atomic.StorePointer(&frozenConfig.encoderCache, unsafe.Pointer(&map[string]ValEncoder{})) + if cfg.MarshalFloatWith6Digits { + frozenConfig.marshalFloatWith6Digits() + } + if cfg.EscapeHTML { + frozenConfig.escapeHTML() + } + if cfg.UseNumber { + frozenConfig.useNumber() + } + frozenConfig.configBeforeFrozen = cfg + return frozenConfig +} + +func (cfg *frozenConfig) useNumber() { + cfg.addDecoderToCache(reflect.TypeOf((*interface{})(nil)).Elem(), &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { + if iter.WhatIsNext() == NumberValue { + *((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) + } else { + *((*interface{})(ptr)) = iter.Read() + } + }}) +} +func (cfg *frozenConfig) getTagKey() string { + tagKey := cfg.configBeforeFrozen.TagKey + if tagKey == "" { + return "json" + } + return tagKey +} + +func (cfg *frozenConfig) registerExtension(extension Extension) { + cfg.extensions = append(cfg.extensions, extension) +} + +type lossyFloat32Encoder struct { +} + +func (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat32Lossy(*((*float32)(ptr))) +} + +func (encoder *lossyFloat32Encoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float32)(ptr)) == 0 +} + +type lossyFloat64Encoder struct { +} + +func (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat64Lossy(*((*float64)(ptr))) +} + +func (encoder *lossyFloat64Encoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float64)(ptr)) == 0 +} + +// EnableLossyFloatMarshalling keeps 10**(-6) precision +// for float variables for better performance. +func (cfg *frozenConfig) marshalFloatWith6Digits() { + // for better performance + cfg.addEncoderToCache(reflect.TypeOf((*float32)(nil)).Elem(), &lossyFloat32Encoder{}) + cfg.addEncoderToCache(reflect.TypeOf((*float64)(nil)).Elem(), &lossyFloat64Encoder{}) +} + +type htmlEscapedStringEncoder struct { +} + +func (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + str := *((*string)(ptr)) + stream.WriteStringWithHTMLEscaped(str) +} + +func (encoder *htmlEscapedStringEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*string)(ptr)) == "" +} + +func (cfg *frozenConfig) escapeHTML() { + cfg.addEncoderToCache(reflect.TypeOf((*string)(nil)).Elem(), &htmlEscapedStringEncoder{}) +} + +func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) { + done := false + for !done { + ptr := atomic.LoadPointer(&cfg.decoderCache) + cache := *(*map[reflect.Type]ValDecoder)(ptr) + copied := map[reflect.Type]ValDecoder{} + for k, v := range cache { + copied[k] = v + } + copied[cacheKey] = decoder + done = atomic.CompareAndSwapPointer(&cfg.decoderCache, ptr, unsafe.Pointer(&copied)) + } +} + +func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) { + done := false + for !done { + ptr := atomic.LoadPointer(&cfg.encoderCache) + cache := *(*map[reflect.Type]ValEncoder)(ptr) + copied := map[reflect.Type]ValEncoder{} + for k, v := range cache { + copied[k] = v + } + copied[cacheKey] = encoder + done = atomic.CompareAndSwapPointer(&cfg.encoderCache, ptr, unsafe.Pointer(&copied)) + } +} + +func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder { + ptr := atomic.LoadPointer(&cfg.decoderCache) + cache := *(*map[reflect.Type]ValDecoder)(ptr) + return cache[cacheKey] +} + +func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder { + ptr := atomic.LoadPointer(&cfg.encoderCache) + cache := *(*map[reflect.Type]ValEncoder)(ptr) + return cache[cacheKey] +} + +func (cfg *frozenConfig) cleanDecoders() { + typeDecoders = map[string]ValDecoder{} + fieldDecoders = map[string]ValDecoder{} + *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) +} + +func (cfg *frozenConfig) cleanEncoders() { + typeEncoders = map[string]ValEncoder{} + fieldEncoders = map[string]ValEncoder{} + *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) +} + +func (cfg *frozenConfig) MarshalToString(v interface{}) (string, error) { + stream := cfg.BorrowStream(nil) + defer cfg.ReturnStream(stream) + stream.WriteVal(v) + if stream.Error != nil { + return "", stream.Error + } + return string(stream.Buffer()), nil +} + +func (cfg *frozenConfig) Marshal(v interface{}) ([]byte, error) { + stream := cfg.BorrowStream(nil) + defer cfg.ReturnStream(stream) + stream.WriteVal(v) + if stream.Error != nil { + return nil, stream.Error + } + result := stream.Buffer() + copied := make([]byte, len(result)) + copy(copied, result) + return copied, nil +} + +func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { + if prefix != "" { + panic("prefix is not supported") + } + for _, r := range indent { + if r != ' ' { + panic("indent can only be space") + } + } + newCfg := cfg.configBeforeFrozen + newCfg.IndentionStep = len(indent) + return newCfg.Froze().Marshal(v) +} + +func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error { + data := []byte(str) + data = data[:lastNotSpacePos(data)] + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + iter.ReadVal(v) + if iter.head == iter.tail { + iter.loadMore() + } + if iter.Error == io.EOF { + return nil + } + if iter.Error == nil { + iter.ReportError("UnmarshalFromString", "there are bytes left after unmarshal") + } + return iter.Error +} + +func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any { + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + return locatePath(iter, path) +} + +func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error { + data = data[:lastNotSpacePos(data)] + iter := cfg.BorrowIterator(data) + defer cfg.ReturnIterator(iter) + typ := reflect.TypeOf(v) + if typ.Kind() != reflect.Ptr { + // return non-pointer error + return errors.New("the second param must be ptr type") + } + iter.ReadVal(v) + if iter.head == iter.tail { + iter.loadMore() + } + if iter.Error == io.EOF { + return nil + } + if iter.Error == nil { + iter.ReportError("Unmarshal", "there are bytes left after unmarshal") + } + return iter.Error +} + +func (cfg *frozenConfig) NewEncoder(writer io.Writer) *Encoder { + stream := NewStream(cfg, writer, 512) + return &Encoder{stream} +} + +func (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder { + iter := Parse(cfg, reader, 512) + return &Decoder{iter} +} diff --git a/vendor/github.com/json-iterator/go/iter.go b/vendor/github.com/json-iterator/go/feature_iter.go similarity index 89% rename from vendor/github.com/json-iterator/go/iter.go rename to vendor/github.com/json-iterator/go/feature_iter.go index 95ae54fbf..4357d69ba 100644 --- a/vendor/github.com/json-iterator/go/iter.go +++ b/vendor/github.com/json-iterator/go/feature_iter.go @@ -77,7 +77,6 @@ type Iterator struct { captureStartedAt int captured []byte Error error - Attachment interface{} // open for customized decoder } // NewIterator creates an empty Iterator instance @@ -168,7 +167,7 @@ func (iter *Iterator) isObjectEnd() bool { if c == '}' { return true } - iter.ReportError("isObjectEnd", "object ended prematurely, unexpected char "+string([]byte{c})) + iter.ReportError("isObjectEnd", "object ended prematurely") return true } @@ -201,22 +200,8 @@ func (iter *Iterator) ReportError(operation string, msg string) { if peekStart < 0 { peekStart = 0 } - peekEnd := iter.head + 10 - if peekEnd > iter.tail { - peekEnd = iter.tail - } - parsing := string(iter.buf[peekStart:peekEnd]) - contextStart := iter.head - 50 - if contextStart < 0 { - contextStart = 0 - } - contextEnd := iter.head + 50 - if contextEnd > iter.tail { - contextEnd = iter.tail - } - context := string(iter.buf[contextStart:contextEnd]) - iter.Error = fmt.Errorf("%s: %s, error found in #%v byte of ...|%s|..., bigger context ...|%s|...", - operation, msg, iter.head-peekStart, parsing, context) + iter.Error = fmt.Errorf("%s: %s, parsing %v ...%s... at %s", operation, msg, iter.head, + string(iter.buf[peekStart:iter.head]), string(iter.buf[0:iter.tail])) } // CurrentBuffer gets current buffer as string for debugging purpose @@ -225,7 +210,7 @@ func (iter *Iterator) CurrentBuffer() string { if peekStart < 0 { peekStart = 0 } - return fmt.Sprintf("parsing #%v byte, around ...|%s|..., whole buffer ...|%s|...", iter.head, + return fmt.Sprintf("parsing %v ...|%s|... at %s", iter.head, string(iter.buf[peekStart:iter.head]), string(iter.buf[0:iter.tail])) } diff --git a/vendor/github.com/json-iterator/go/iter_array.go b/vendor/github.com/json-iterator/go/feature_iter_array.go similarity index 84% rename from vendor/github.com/json-iterator/go/iter_array.go rename to vendor/github.com/json-iterator/go/feature_iter_array.go index 6188cb457..cbc3ec8d1 100644 --- a/vendor/github.com/json-iterator/go/iter_array.go +++ b/vendor/github.com/json-iterator/go/feature_iter_array.go @@ -19,7 +19,7 @@ func (iter *Iterator) ReadArray() (ret bool) { case ',': return true default: - iter.ReportError("ReadArray", "expect [ or , or ] or n, but found "+string([]byte{c})) + iter.ReportError("ReadArray", "expect [ or , or ] or n, but found: "+string([]byte{c})) return } } @@ -42,7 +42,7 @@ func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) { c = iter.nextToken() } if c != ']' { - iter.ReportError("ReadArrayCB", "expect ] in the end, but found "+string([]byte{c})) + iter.ReportError("ReadArrayCB", "expect ] in the end") return false } return true @@ -53,6 +53,6 @@ func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) { iter.skipThreeBytes('u', 'l', 'l') return true // null } - iter.ReportError("ReadArrayCB", "expect [ or n, but found "+string([]byte{c})) + iter.ReportError("ReadArrayCB", "expect [ or n, but found: "+string([]byte{c})) return false } diff --git a/vendor/github.com/json-iterator/go/iter_float.go b/vendor/github.com/json-iterator/go/feature_iter_float.go similarity index 98% rename from vendor/github.com/json-iterator/go/iter_float.go rename to vendor/github.com/json-iterator/go/feature_iter_float.go index 4f883c095..86f459912 100644 --- a/vendor/github.com/json-iterator/go/iter_float.go +++ b/vendor/github.com/json-iterator/go/feature_iter_float.go @@ -1,7 +1,6 @@ package jsoniter import ( - "encoding/json" "io" "math/big" "strconv" @@ -340,8 +339,3 @@ func validateFloat(str string) string { } return "" } - -// ReadNumber read json.Number -func (iter *Iterator) ReadNumber() (ret json.Number) { - return json.Number(iter.readNumberAsString()) -} diff --git a/vendor/github.com/json-iterator/go/iter_int.go b/vendor/github.com/json-iterator/go/feature_iter_int.go similarity index 72% rename from vendor/github.com/json-iterator/go/iter_int.go rename to vendor/github.com/json-iterator/go/feature_iter_int.go index 214232035..886879efd 100644 --- a/vendor/github.com/json-iterator/go/iter_int.go +++ b/vendor/github.com/json-iterator/go/feature_iter_int.go @@ -22,17 +22,11 @@ func init() { // ReadUint read uint func (iter *Iterator) ReadUint() uint { - if strconv.IntSize == 32 { - return uint(iter.ReadUint32()) - } return uint(iter.ReadUint64()) } // ReadInt read int func (iter *Iterator) ReadInt() int { - if strconv.IntSize == 32 { - return int(iter.ReadInt32()) - } return int(iter.ReadInt64()) } @@ -121,7 +115,6 @@ func (iter *Iterator) ReadUint32() (ret uint32) { func (iter *Iterator) readUint32(c byte) (ret uint32) { ind := intDigits[c] if ind == 0 { - iter.assertInteger() return 0 // single zero } if ind == invalidCharForNumber { @@ -134,14 +127,12 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) { ind2 := intDigits[iter.buf[i]] if ind2 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value } i++ ind3 := intDigits[iter.buf[i]] if ind3 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value*10 + uint32(ind2) } //iter.head = i + 1 @@ -150,35 +141,30 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) { ind4 := intDigits[iter.buf[i]] if ind4 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value*100 + uint32(ind2)*10 + uint32(ind3) } i++ ind5 := intDigits[iter.buf[i]] if ind5 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4) } i++ ind6 := intDigits[iter.buf[i]] if ind6 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5) } i++ ind7 := intDigits[iter.buf[i]] if ind7 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6) } i++ ind8 := intDigits[iter.buf[i]] if ind8 == invalidCharForNumber { iter.head = i - iter.assertInteger() return value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7) } i++ @@ -186,7 +172,6 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) { value = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8) iter.head = i if ind9 == invalidCharForNumber { - iter.assertInteger() return value } } @@ -195,7 +180,6 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) { ind = intDigits[iter.buf[i]] if ind == invalidCharForNumber { iter.head = i - iter.assertInteger() return value } if value > uint32SafeToMultiply10 { @@ -210,7 +194,6 @@ func (iter *Iterator) readUint32(c byte) (ret uint32) { value = (value << 3) + (value << 1) + uint32(ind) } if !iter.loadMore() { - iter.assertInteger() return value } } @@ -243,7 +226,6 @@ func (iter *Iterator) ReadUint64() uint64 { func (iter *Iterator) readUint64(c byte) (ret uint64) { ind := intDigits[c] if ind == 0 { - iter.assertInteger() return 0 // single zero } if ind == invalidCharForNumber { @@ -251,73 +233,11 @@ func (iter *Iterator) readUint64(c byte) (ret uint64) { return } value := uint64(ind) - if iter.tail-iter.head > 10 { - i := iter.head - ind2 := intDigits[iter.buf[i]] - if ind2 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - i++ - ind3 := intDigits[iter.buf[i]] - if ind3 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10 + uint64(ind2) - } - //iter.head = i + 1 - //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) - i++ - ind4 := intDigits[iter.buf[i]] - if ind4 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100 + uint64(ind2)*10 + uint64(ind3) - } - i++ - ind5 := intDigits[iter.buf[i]] - if ind5 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000 + uint64(ind2)*100 + uint64(ind3)*10 + uint64(ind4) - } - i++ - ind6 := intDigits[iter.buf[i]] - if ind6 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10000 + uint64(ind2)*1000 + uint64(ind3)*100 + uint64(ind4)*10 + uint64(ind5) - } - i++ - ind7 := intDigits[iter.buf[i]] - if ind7 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100000 + uint64(ind2)*10000 + uint64(ind3)*1000 + uint64(ind4)*100 + uint64(ind5)*10 + uint64(ind6) - } - i++ - ind8 := intDigits[iter.buf[i]] - if ind8 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000000 + uint64(ind2)*100000 + uint64(ind3)*10000 + uint64(ind4)*1000 + uint64(ind5)*100 + uint64(ind6)*10 + uint64(ind7) - } - i++ - ind9 := intDigits[iter.buf[i]] - value = value*10000000 + uint64(ind2)*1000000 + uint64(ind3)*100000 + uint64(ind4)*10000 + uint64(ind5)*1000 + uint64(ind6)*100 + uint64(ind7)*10 + uint64(ind8) - iter.head = i - if ind9 == invalidCharForNumber { - iter.assertInteger() - return value - } - } for { for i := iter.head; i < iter.tail; i++ { ind = intDigits[iter.buf[i]] if ind == invalidCharForNumber { iter.head = i - iter.assertInteger() return value } if value > uint64SafeToMultiple10 { @@ -332,14 +252,7 @@ func (iter *Iterator) readUint64(c byte) (ret uint64) { value = (value << 3) + (value << 1) + uint64(ind) } if !iter.loadMore() { - iter.assertInteger() return value } } } - -func (iter *Iterator) assertInteger() { - if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' { - iter.ReportError("assertInteger", "can not decode float as int") - } -} diff --git a/vendor/github.com/json-iterator/go/iter_object.go b/vendor/github.com/json-iterator/go/feature_iter_object.go similarity index 53% rename from vendor/github.com/json-iterator/go/iter_object.go rename to vendor/github.com/json-iterator/go/feature_iter_object.go index 1c5757671..3bdb5576e 100644 --- a/vendor/github.com/json-iterator/go/iter_object.go +++ b/vendor/github.com/json-iterator/go/feature_iter_object.go @@ -2,7 +2,8 @@ package jsoniter import ( "fmt" - "strings" + "unicode" + "unsafe" ) // ReadObject read one field from object. @@ -18,25 +19,15 @@ func (iter *Iterator) ReadObject() (ret string) { c = iter.nextToken() if c == '"' { iter.unreadByte() - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field + return string(iter.readObjectFieldAsBytes()) } if c == '}' { return "" // end of object } - iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c})) + iter.ReportError("ReadObject", `expect " after {`) return case ',': - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field + return string(iter.readObjectFieldAsBytes()) case '}': return "" // end of object default: @@ -45,92 +36,62 @@ func (iter *Iterator) ReadObject() (ret string) { } } -// CaseInsensitive -func (iter *Iterator) readFieldHash() int64 { +func (iter *Iterator) readFieldHash() int32 { hash := int64(0x811c9dc5) c := iter.nextToken() - if c != '"' { - iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) - return 0 - } - for { - for i := iter.head; i < iter.tail; i++ { - // require ascii string and no escape - b := iter.buf[i] - if b == '\\' { - iter.head = i - for _, b := range iter.readStringSlowPath() { - if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 - } - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 + if c == '"' { + for { + for i := iter.head; i < iter.tail; i++ { + // require ascii string and no escape + b := iter.buf[i] + if 'A' <= b && b <= 'Z' { + b += 'a' - 'A' } - return hash - } - if b == '"' { - iter.head = i + 1 - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 + if b == '"' { + iter.head = i + 1 + c = iter.nextToken() + if c != ':' { + iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) + } + return int32(hash) } - return hash + hash ^= int64(b) + hash *= 0x1000193 } - if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { - b += 'a' - 'A' + if !iter.loadMore() { + iter.ReportError("readFieldHash", `incomplete field name`) + return 0 } - hash ^= int64(b) - hash *= 0x1000193 - } - if !iter.loadMore() { - iter.ReportError("readFieldHash", `incomplete field name`) - return 0 } } + iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) + return 0 } -func calcHash(str string, caseSensitive bool) int64 { - if !caseSensitive { - str = strings.ToLower(str) - } +func calcHash(str string) int32 { hash := int64(0x811c9dc5) - for _, b := range []byte(str) { - hash ^= int64(b) + for _, b := range str { + hash ^= int64(unicode.ToLower(b)) hash *= 0x1000193 } - return int64(hash) + return int32(hash) } // ReadObjectCB read object with callback, the key is ascii only and field name not copied func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { c := iter.nextToken() - var field string if c == '{' { c = iter.nextToken() if c == '"' { iter.unreadByte() - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - if !callback(iter, field) { + field := iter.readObjectFieldAsBytes() + if !callback(iter, *(*string)(unsafe.Pointer(&field))) { return false } c = iter.nextToken() for c == ',' { - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - if !callback(iter, field) { + field = iter.readObjectFieldAsBytes() + if !callback(iter, *(*string)(unsafe.Pointer(&field))) { return false } c = iter.nextToken() @@ -144,14 +105,14 @@ func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { if c == '}' { return true } - iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c})) + iter.ReportError("ReadObjectCB", `expect " after }`) return false } if c == 'n' { iter.skipThreeBytes('u', 'l', 'l') return true // null } - iter.ReportError("ReadObjectCB", `expect { or n, but found `+string([]byte{c})) + iter.ReportError("ReadObjectCB", `expect { or n`) return false } @@ -164,7 +125,7 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool { iter.unreadByte() field := iter.ReadString() if iter.nextToken() != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + iter.ReportError("ReadMapCB", "expect : after object field") return false } if !callback(iter, field) { @@ -174,7 +135,7 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool { for c == ',' { field = iter.ReadString() if iter.nextToken() != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + iter.ReportError("ReadMapCB", "expect : after object field") return false } if !callback(iter, field) { @@ -191,14 +152,14 @@ func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool { if c == '}' { return true } - iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) + iter.ReportError("ReadMapCB", `expect " after }`) return false } if c == 'n' { iter.skipThreeBytes('u', 'l', 'l') return true // null } - iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) + iter.ReportError("ReadMapCB", `expect { or n`) return false } @@ -215,7 +176,7 @@ func (iter *Iterator) readObjectStart() bool { iter.skipThreeBytes('u', 'l', 'l') return false } - iter.ReportError("readObjectStart", "expect { or n, but found "+string([]byte{c})) + iter.ReportError("readObjectStart", "expect { or n") return false } @@ -231,7 +192,7 @@ func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) { } } if iter.buf[iter.head] != ':' { - iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found "+string([]byte{iter.buf[iter.head]})) + iter.ReportError("readObjectFieldAsBytes", "expect : after object field") return } iter.head++ diff --git a/vendor/github.com/json-iterator/go/iter_skip.go b/vendor/github.com/json-iterator/go/feature_iter_skip.go similarity index 95% rename from vendor/github.com/json-iterator/go/iter_skip.go rename to vendor/github.com/json-iterator/go/feature_iter_skip.go index f58beb913..b008d98c9 100644 --- a/vendor/github.com/json-iterator/go/iter_skip.go +++ b/vendor/github.com/json-iterator/go/feature_iter_skip.go @@ -25,7 +25,7 @@ func (iter *Iterator) ReadBool() (ret bool) { iter.skipFourBytes('a', 'l', 's', 'e') return false } - iter.ReportError("ReadBool", "expect t or f, but found "+string([]byte{c})) + iter.ReportError("ReadBool", "expect t or f") return } @@ -59,9 +59,7 @@ func (iter *Iterator) stopCapture() []byte { iter.captureStartedAt = -1 iter.captured = nil if len(captured) == 0 { - copied := make([]byte, len(remaining)) - copy(copied, remaining) - return copied + return remaining } captured = append(captured, remaining...) return captured diff --git a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go b/vendor/github.com/json-iterator/go/feature_iter_skip_sloppy.go similarity index 99% rename from vendor/github.com/json-iterator/go/iter_skip_sloppy.go rename to vendor/github.com/json-iterator/go/feature_iter_skip_sloppy.go index 8fcdc3b69..047d58a4b 100644 --- a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go +++ b/vendor/github.com/json-iterator/go/feature_iter_skip_sloppy.go @@ -1,4 +1,4 @@ -//+build jsoniter_sloppy +//+build jsoniter-sloppy package jsoniter diff --git a/vendor/github.com/json-iterator/go/iter_skip_strict.go b/vendor/github.com/json-iterator/go/feature_iter_skip_strict.go similarity index 96% rename from vendor/github.com/json-iterator/go/iter_skip_strict.go rename to vendor/github.com/json-iterator/go/feature_iter_skip_strict.go index f67bc2e83..d26763825 100644 --- a/vendor/github.com/json-iterator/go/iter_skip_strict.go +++ b/vendor/github.com/json-iterator/go/feature_iter_skip_strict.go @@ -1,4 +1,4 @@ -//+build !jsoniter_sloppy +//+build !jsoniter-sloppy package jsoniter @@ -64,7 +64,7 @@ func (iter *Iterator) trySkipString() bool { } else if c == '\\' { return false } else if c < ' ' { - iter.ReportError("trySkipString", + iter.ReportError("ReadString", fmt.Sprintf(`invalid control character found: %d`, c)) return true // already failed } diff --git a/vendor/github.com/json-iterator/go/iter_str.go b/vendor/github.com/json-iterator/go/feature_iter_string.go similarity index 92% rename from vendor/github.com/json-iterator/go/iter_str.go rename to vendor/github.com/json-iterator/go/feature_iter_string.go index adc487ea8..b76460046 100644 --- a/vendor/github.com/json-iterator/go/iter_str.go +++ b/vendor/github.com/json-iterator/go/feature_iter_string.go @@ -28,7 +28,7 @@ func (iter *Iterator) ReadString() (ret string) { iter.skipThreeBytes('u', 'l', 'l') return "" } - iter.ReportError("ReadString", `expects " or n, but found `+string([]byte{c})) + iter.ReportError("ReadString", `expects " or n`) return } @@ -47,7 +47,7 @@ func (iter *Iterator) readStringSlowPath() (ret string) { str = append(str, c) } } - iter.ReportError("readStringSlowPath", "unexpected end of input") + iter.ReportError("ReadString", "unexpected end of input") return } @@ -104,7 +104,7 @@ func (iter *Iterator) readEscapedChar(c byte, str []byte) []byte { case 't': str = append(str, '\t') default: - iter.ReportError("readEscapedChar", + iter.ReportError("ReadString", `invalid escape char after \`) return nil } @@ -139,7 +139,7 @@ func (iter *Iterator) ReadStringAsSlice() (ret []byte) { } return copied } - iter.ReportError("ReadStringAsSlice", `expects " or n, but found `+string([]byte{c})) + iter.ReportError("ReadString", `expects " or n`) return } @@ -156,7 +156,7 @@ func (iter *Iterator) readU4() (ret rune) { } else if c >= 'A' && c <= 'F' { ret = ret*16 + rune(c-'A'+10) } else { - iter.ReportError("readU4", "expects 0~9 or a~f, but found "+string([]byte{c})) + iter.ReportError("readU4", "expects 0~9 or a~f") return } } diff --git a/vendor/github.com/json-iterator/go/feature_json_number.go b/vendor/github.com/json-iterator/go/feature_json_number.go new file mode 100644 index 000000000..0439f6725 --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_json_number.go @@ -0,0 +1,15 @@ +package jsoniter + +import "encoding/json" + +type Number string + +func CastJsonNumber(val interface{}) (string, bool) { + switch typedVal := val.(type) { + case json.Number: + return string(typedVal), true + case Number: + return string(typedVal), true + } + return "", false +} diff --git a/vendor/github.com/json-iterator/go/pool.go b/vendor/github.com/json-iterator/go/feature_pool.go similarity index 62% rename from vendor/github.com/json-iterator/go/pool.go rename to vendor/github.com/json-iterator/go/feature_pool.go index e2389b56c..73962bc6f 100644 --- a/vendor/github.com/json-iterator/go/pool.go +++ b/vendor/github.com/json-iterator/go/feature_pool.go @@ -17,26 +17,41 @@ type StreamPool interface { } func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream { - stream := cfg.streamPool.Get().(*Stream) - stream.Reset(writer) - return stream + select { + case stream := <-cfg.streamPool: + stream.Reset(writer) + return stream + default: + return NewStream(cfg, writer, 512) + } } func (cfg *frozenConfig) ReturnStream(stream *Stream) { - stream.out = nil stream.Error = nil - stream.Attachment = nil - cfg.streamPool.Put(stream) + select { + case cfg.streamPool <- stream: + return + default: + return + } } func (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator { - iter := cfg.iteratorPool.Get().(*Iterator) - iter.ResetBytes(data) - return iter + select { + case iter := <-cfg.iteratorPool: + iter.ResetBytes(data) + return iter + default: + return ParseBytes(cfg, data) + } } func (cfg *frozenConfig) ReturnIterator(iter *Iterator) { iter.Error = nil - iter.Attachment = nil - cfg.iteratorPool.Put(iter) + select { + case cfg.iteratorPool <- iter: + return + default: + return + } } diff --git a/vendor/github.com/json-iterator/go/feature_reflect.go b/vendor/github.com/json-iterator/go/feature_reflect.go new file mode 100644 index 000000000..05d91b49c --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_reflect.go @@ -0,0 +1,691 @@ +package jsoniter + +import ( + "encoding" + "encoding/json" + "fmt" + "reflect" + "time" + "unsafe" +) + +// ValDecoder is an internal type registered to cache as needed. +// Don't confuse jsoniter.ValDecoder with json.Decoder. +// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). +// +// Reflection on type to create decoders, which is then cached +// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions +// 1. create instance of new value, for example *int will need a int to be allocated +// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New +// 3. assignment to map, both key and value will be reflect.Value +// For a simple struct binding, it will be reflect.Value free and allocation free +type ValDecoder interface { + Decode(ptr unsafe.Pointer, iter *Iterator) +} + +// ValEncoder is an internal type registered to cache as needed. +// Don't confuse jsoniter.ValEncoder with json.Encoder. +// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). +type ValEncoder interface { + IsEmpty(ptr unsafe.Pointer) bool + Encode(ptr unsafe.Pointer, stream *Stream) + EncodeInterface(val interface{}, stream *Stream) +} + +type checkIsEmpty interface { + IsEmpty(ptr unsafe.Pointer) bool +} + +// WriteToStream the default implementation for TypeEncoder method EncodeInterface +func WriteToStream(val interface{}, stream *Stream, encoder ValEncoder) { + e := (*emptyInterface)(unsafe.Pointer(&val)) + if e.word == nil { + stream.WriteNil() + return + } + if reflect.TypeOf(val).Kind() == reflect.Ptr { + encoder.Encode(unsafe.Pointer(&e.word), stream) + } else { + encoder.Encode(e.word, stream) + } +} + +var jsonNumberType reflect.Type +var jsoniterNumberType reflect.Type +var jsonRawMessageType reflect.Type +var jsoniterRawMessageType reflect.Type +var anyType reflect.Type +var marshalerType reflect.Type +var unmarshalerType reflect.Type +var textMarshalerType reflect.Type +var textUnmarshalerType reflect.Type + +func init() { + jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem() + jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem() + jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem() + jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem() + anyType = reflect.TypeOf((*Any)(nil)).Elem() + marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem() + unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() + textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() + textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() +} + +type optionalDecoder struct { + valueType reflect.Type + valueDecoder ValDecoder +} + +func (decoder *optionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + *((*unsafe.Pointer)(ptr)) = nil + } else { + if *((*unsafe.Pointer)(ptr)) == nil { + //pointer to null, we have to allocate memory to hold the value + value := reflect.New(decoder.valueType) + newPtr := extractInterface(value.Interface()).word + decoder.valueDecoder.Decode(newPtr, iter) + *((*uintptr)(ptr)) = uintptr(newPtr) + } else { + //reuse existing instance + decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) + } + } +} + +type deferenceDecoder struct { + // only to deference a pointer + valueType reflect.Type + valueDecoder ValDecoder +} + +func (decoder *deferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if *((*unsafe.Pointer)(ptr)) == nil { + //pointer to null, we have to allocate memory to hold the value + value := reflect.New(decoder.valueType) + newPtr := extractInterface(value.Interface()).word + decoder.valueDecoder.Decode(newPtr, iter) + *((*uintptr)(ptr)) = uintptr(newPtr) + } else { + //reuse existing instance + decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) + } +} + +type optionalEncoder struct { + valueEncoder ValEncoder +} + +func (encoder *optionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *((*unsafe.Pointer)(ptr)) == nil { + stream.WriteNil() + } else { + encoder.valueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) + } +} + +func (encoder *optionalEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *optionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { + if *((*unsafe.Pointer)(ptr)) == nil { + return true + } + return false +} + +type placeholderEncoder struct { + cfg *frozenConfig + cacheKey reflect.Type +} + +func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.getRealEncoder().Encode(ptr, stream) +} + +func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.getRealEncoder().IsEmpty(ptr) +} + +func (encoder *placeholderEncoder) getRealEncoder() ValEncoder { + for i := 0; i < 30; i++ { + realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey) + _, isPlaceholder := realDecoder.(*placeholderEncoder) + if isPlaceholder { + time.Sleep(time.Second) + } else { + return realDecoder + } + } + panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey)) +} + +type placeholderDecoder struct { + cfg *frozenConfig + cacheKey reflect.Type +} + +func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + for i := 0; i < 30; i++ { + realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey) + _, isPlaceholder := realDecoder.(*placeholderDecoder) + if isPlaceholder { + time.Sleep(time.Second) + } else { + realDecoder.Decode(ptr, iter) + return + } + } + panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey)) +} + +// emptyInterface is the header for an interface{} value. +type emptyInterface struct { + typ unsafe.Pointer + word unsafe.Pointer +} + +// emptyInterface is the header for an interface with method (not interface{}) +type nonEmptyInterface struct { + // see ../runtime/iface.go:/Itab + itab *struct { + ityp unsafe.Pointer // static interface type + typ unsafe.Pointer // dynamic concrete type + link unsafe.Pointer + bad int32 + unused int32 + fun [100000]unsafe.Pointer // method table + } + word unsafe.Pointer +} + +// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal +func (iter *Iterator) ReadVal(obj interface{}) { + typ := reflect.TypeOf(obj) + cacheKey := typ.Elem() + decoder, err := decoderOfType(iter.cfg, cacheKey) + if err != nil { + iter.Error = err + return + } + e := (*emptyInterface)(unsafe.Pointer(&obj)) + decoder.Decode(e.word, iter) +} + +// WriteVal copy the go interface into underlying JSON, same as json.Marshal +func (stream *Stream) WriteVal(val interface{}) { + if nil == val { + stream.WriteNil() + return + } + typ := reflect.TypeOf(val) + cacheKey := typ + encoder, err := encoderOfType(stream.cfg, cacheKey) + if err != nil { + stream.Error = err + return + } + encoder.EncodeInterface(val, stream) +} + +type prefix string + +func (p prefix) addToDecoder(decoder ValDecoder, err error) (ValDecoder, error) { + if err != nil { + return nil, fmt.Errorf("%s: %s", p, err.Error()) + } + return decoder, err +} + +func (p prefix) addToEncoder(encoder ValEncoder, err error) (ValEncoder, error) { + if err != nil { + return nil, fmt.Errorf("%s: %s", p, err.Error()) + } + return encoder, err +} + +func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + cacheKey := typ + decoder := cfg.getDecoderFromCache(cacheKey) + if decoder != nil { + return decoder, nil + } + decoder = getTypeDecoderFromExtension(typ) + if decoder != nil { + cfg.addDecoderToCache(cacheKey, decoder) + return decoder, nil + } + decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey} + cfg.addDecoderToCache(cacheKey, decoder) + decoder, err := createDecoderOfType(cfg, typ) + for _, extension := range extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + cfg.addDecoderToCache(cacheKey, decoder) + return decoder, err +} + +func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + typeName := typ.String() + if typ == jsonRawMessageType { + return &jsonRawMessageCodec{}, nil + } + if typ == jsoniterRawMessageType { + return &jsoniterRawMessageCodec{}, nil + } + if typ.AssignableTo(jsonNumberType) { + return &jsonNumberCodec{}, nil + } + if typ.AssignableTo(jsoniterNumberType) { + return &jsoniterNumberCodec{}, nil + } + if typ.Implements(unmarshalerType) { + templateInterface := reflect.New(typ).Elem().Interface() + var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)} + if typ.Kind() == reflect.Ptr { + decoder = &optionalDecoder{typ.Elem(), decoder} + } + return decoder, nil + } + if reflect.PtrTo(typ).Implements(unmarshalerType) { + templateInterface := reflect.New(typ).Interface() + var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)} + return decoder, nil + } + if typ.Implements(textUnmarshalerType) { + templateInterface := reflect.New(typ).Elem().Interface() + var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)} + if typ.Kind() == reflect.Ptr { + decoder = &optionalDecoder{typ.Elem(), decoder} + } + return decoder, nil + } + if reflect.PtrTo(typ).Implements(textUnmarshalerType) { + templateInterface := reflect.New(typ).Interface() + var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)} + return decoder, nil + } + if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 { + sliceDecoder, err := prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ)) + if err != nil { + return nil, err + } + return &base64Codec{sliceDecoder: sliceDecoder}, nil + } + if typ.Implements(anyType) { + return &anyCodec{}, nil + } + switch typ.Kind() { + case reflect.String: + if typeName != "string" { + return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem()) + } + return &stringCodec{}, nil + case reflect.Int: + if typeName != "int" { + return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem()) + } + return &intCodec{}, nil + case reflect.Int8: + if typeName != "int8" { + return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem()) + } + return &int8Codec{}, nil + case reflect.Int16: + if typeName != "int16" { + return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem()) + } + return &int16Codec{}, nil + case reflect.Int32: + if typeName != "int32" { + return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem()) + } + return &int32Codec{}, nil + case reflect.Int64: + if typeName != "int64" { + return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem()) + } + return &int64Codec{}, nil + case reflect.Uint: + if typeName != "uint" { + return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem()) + } + return &uintCodec{}, nil + case reflect.Uint8: + if typeName != "uint8" { + return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem()) + } + return &uint8Codec{}, nil + case reflect.Uint16: + if typeName != "uint16" { + return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem()) + } + return &uint16Codec{}, nil + case reflect.Uint32: + if typeName != "uint32" { + return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem()) + } + return &uint32Codec{}, nil + case reflect.Uintptr: + if typeName != "uintptr" { + return decoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem()) + } + return &uintptrCodec{}, nil + case reflect.Uint64: + if typeName != "uint64" { + return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem()) + } + return &uint64Codec{}, nil + case reflect.Float32: + if typeName != "float32" { + return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem()) + } + return &float32Codec{}, nil + case reflect.Float64: + if typeName != "float64" { + return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem()) + } + return &float64Codec{}, nil + case reflect.Bool: + if typeName != "bool" { + return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem()) + } + return &boolCodec{}, nil + case reflect.Interface: + if typ.NumMethod() == 0 { + return &emptyInterfaceCodec{}, nil + } + return &nonEmptyInterfaceCodec{}, nil + case reflect.Struct: + return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ)) + case reflect.Array: + return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ)) + case reflect.Slice: + return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ)) + case reflect.Map: + return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ)) + case reflect.Ptr: + return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ)) + default: + return nil, fmt.Errorf("unsupported type: %v", typ) + } +} + +func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + cacheKey := typ + encoder := cfg.getEncoderFromCache(cacheKey) + if encoder != nil { + return encoder, nil + } + encoder = getTypeEncoderFromExtension(typ) + if encoder != nil { + cfg.addEncoderToCache(cacheKey, encoder) + return encoder, nil + } + encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey} + cfg.addEncoderToCache(cacheKey, encoder) + encoder, err := createEncoderOfType(cfg, typ) + for _, extension := range extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + cfg.addEncoderToCache(cacheKey, encoder) + return encoder, err +} + +func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + if typ == jsonRawMessageType { + return &jsonRawMessageCodec{}, nil + } + if typ == jsoniterRawMessageType { + return &jsoniterRawMessageCodec{}, nil + } + if typ.AssignableTo(jsonNumberType) { + return &jsonNumberCodec{}, nil + } + if typ.AssignableTo(jsoniterNumberType) { + return &jsoniterNumberCodec{}, nil + } + if typ.Implements(marshalerType) { + checkIsEmpty, err := createCheckIsEmpty(typ) + if err != nil { + return nil, err + } + templateInterface := reflect.New(typ).Elem().Interface() + var encoder ValEncoder = &marshalerEncoder{ + templateInterface: extractInterface(templateInterface), + checkIsEmpty: checkIsEmpty, + } + if typ.Kind() == reflect.Ptr { + encoder = &optionalEncoder{encoder} + } + return encoder, nil + } + if typ.Implements(textMarshalerType) { + checkIsEmpty, err := createCheckIsEmpty(typ) + if err != nil { + return nil, err + } + templateInterface := reflect.New(typ).Elem().Interface() + var encoder ValEncoder = &textMarshalerEncoder{ + templateInterface: extractInterface(templateInterface), + checkIsEmpty: checkIsEmpty, + } + if typ.Kind() == reflect.Ptr { + encoder = &optionalEncoder{encoder} + } + return encoder, nil + } + if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 { + return &base64Codec{}, nil + } + if typ.Implements(anyType) { + return &anyCodec{}, nil + } + return createEncoderOfSimpleType(cfg, typ) +} + +func createCheckIsEmpty(typ reflect.Type) (checkIsEmpty, error) { + kind := typ.Kind() + switch kind { + case reflect.String: + return &stringCodec{}, nil + case reflect.Int: + return &intCodec{}, nil + case reflect.Int8: + return &int8Codec{}, nil + case reflect.Int16: + return &int16Codec{}, nil + case reflect.Int32: + return &int32Codec{}, nil + case reflect.Int64: + return &int64Codec{}, nil + case reflect.Uint: + return &uintCodec{}, nil + case reflect.Uint8: + return &uint8Codec{}, nil + case reflect.Uint16: + return &uint16Codec{}, nil + case reflect.Uint32: + return &uint32Codec{}, nil + case reflect.Uintptr: + return &uintptrCodec{}, nil + case reflect.Uint64: + return &uint64Codec{}, nil + case reflect.Float32: + return &float32Codec{}, nil + case reflect.Float64: + return &float64Codec{}, nil + case reflect.Bool: + return &boolCodec{}, nil + case reflect.Interface: + if typ.NumMethod() == 0 { + return &emptyInterfaceCodec{}, nil + } + return &nonEmptyInterfaceCodec{}, nil + case reflect.Struct: + return &structEncoder{}, nil + case reflect.Array: + return &arrayEncoder{}, nil + case reflect.Slice: + return &sliceEncoder{}, nil + case reflect.Map: + return &mapEncoder{}, nil + case reflect.Ptr: + return &optionalEncoder{}, nil + default: + return nil, fmt.Errorf("unsupported type: %v", typ) + } +} + +func createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + typeName := typ.String() + kind := typ.Kind() + switch kind { + case reflect.String: + if typeName != "string" { + return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem()) + } + return &stringCodec{}, nil + case reflect.Int: + if typeName != "int" { + return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem()) + } + return &intCodec{}, nil + case reflect.Int8: + if typeName != "int8" { + return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem()) + } + return &int8Codec{}, nil + case reflect.Int16: + if typeName != "int16" { + return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem()) + } + return &int16Codec{}, nil + case reflect.Int32: + if typeName != "int32" { + return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem()) + } + return &int32Codec{}, nil + case reflect.Int64: + if typeName != "int64" { + return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem()) + } + return &int64Codec{}, nil + case reflect.Uint: + if typeName != "uint" { + return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem()) + } + return &uintCodec{}, nil + case reflect.Uint8: + if typeName != "uint8" { + return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem()) + } + return &uint8Codec{}, nil + case reflect.Uint16: + if typeName != "uint16" { + return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem()) + } + return &uint16Codec{}, nil + case reflect.Uint32: + if typeName != "uint32" { + return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem()) + } + return &uint32Codec{}, nil + case reflect.Uintptr: + if typeName != "uintptr" { + return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem()) + } + return &uintptrCodec{}, nil + case reflect.Uint64: + if typeName != "uint64" { + return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem()) + } + return &uint64Codec{}, nil + case reflect.Float32: + if typeName != "float32" { + return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem()) + } + return &float32Codec{}, nil + case reflect.Float64: + if typeName != "float64" { + return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem()) + } + return &float64Codec{}, nil + case reflect.Bool: + if typeName != "bool" { + return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem()) + } + return &boolCodec{}, nil + case reflect.Interface: + if typ.NumMethod() == 0 { + return &emptyInterfaceCodec{}, nil + } + return &nonEmptyInterfaceCodec{}, nil + case reflect.Struct: + return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ)) + case reflect.Array: + return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ)) + case reflect.Slice: + return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ)) + case reflect.Map: + return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ)) + case reflect.Ptr: + return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ)) + default: + return nil, fmt.Errorf("unsupported type: %v", typ) + } +} + +func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + elemType := typ.Elem() + decoder, err := decoderOfType(cfg, elemType) + if err != nil { + return nil, err + } + return &optionalDecoder{elemType, decoder}, nil +} + +func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + elemType := typ.Elem() + elemEncoder, err := encoderOfType(cfg, elemType) + if err != nil { + return nil, err + } + encoder := &optionalEncoder{elemEncoder} + if elemType.Kind() == reflect.Map { + encoder = &optionalEncoder{encoder} + } + return encoder, nil +} + +func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + decoder, err := decoderOfType(cfg, typ.Elem()) + if err != nil { + return nil, err + } + mapInterface := reflect.New(typ).Interface() + return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil +} + +func extractInterface(val interface{}) emptyInterface { + return *((*emptyInterface)(unsafe.Pointer(&val))) +} + +func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + elemType := typ.Elem() + encoder, err := encoderOfType(cfg, elemType) + if err != nil { + return nil, err + } + mapInterface := reflect.New(typ).Elem().Interface() + if cfg.sortMapKeys { + return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil + } + return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil +} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_array.go b/vendor/github.com/json-iterator/go/feature_reflect_array.go new file mode 100644 index 000000000..e23f187b7 --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_reflect_array.go @@ -0,0 +1,99 @@ +package jsoniter + +import ( + "fmt" + "io" + "reflect" + "unsafe" +) + +func decoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + decoder, err := decoderOfType(cfg, typ.Elem()) + if err != nil { + return nil, err + } + return &arrayDecoder{typ, typ.Elem(), decoder}, nil +} + +func encoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + encoder, err := encoderOfType(cfg, typ.Elem()) + if err != nil { + return nil, err + } + if typ.Elem().Kind() == reflect.Map { + encoder = &optionalEncoder{encoder} + } + return &arrayEncoder{typ, typ.Elem(), encoder}, nil +} + +type arrayEncoder struct { + arrayType reflect.Type + elemType reflect.Type + elemEncoder ValEncoder +} + +func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteArrayStart() + elemPtr := unsafe.Pointer(ptr) + encoder.elemEncoder.Encode(elemPtr, stream) + for i := 1; i < encoder.arrayType.Len(); i++ { + stream.WriteMore() + elemPtr = unsafe.Pointer(uintptr(elemPtr) + encoder.elemType.Size()) + encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream) + } + stream.WriteArrayEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) + } +} + +func (encoder *arrayEncoder) EncodeInterface(val interface{}, stream *Stream) { + // special optimization for interface{} + e := (*emptyInterface)(unsafe.Pointer(&val)) + if e.word == nil { + stream.WriteArrayStart() + stream.WriteNil() + stream.WriteArrayEnd() + return + } + elemType := encoder.arrayType.Elem() + if encoder.arrayType.Len() == 1 && (elemType.Kind() == reflect.Ptr || elemType.Kind() == reflect.Map) { + ptr := uintptr(e.word) + e.word = unsafe.Pointer(&ptr) + } + if reflect.TypeOf(val).Kind() == reflect.Ptr { + encoder.Encode(unsafe.Pointer(&e.word), stream) + } else { + encoder.Encode(e.word, stream) + } +} + +func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type arrayDecoder struct { + arrayType reflect.Type + elemType reflect.Type + elemDecoder ValDecoder +} + +func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.doDecode(ptr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) + } +} + +func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { + offset := uintptr(0) + iter.ReadArrayCB(func(iter *Iterator) bool { + if offset < decoder.arrayType.Size() { + decoder.elemDecoder.Decode(unsafe.Pointer(uintptr(ptr)+offset), iter) + offset += decoder.elemType.Size() + } else { + iter.Skip() + } + return true + }) +} diff --git a/vendor/github.com/json-iterator/go/reflect_extension.go b/vendor/github.com/json-iterator/go/feature_reflect_extension.go similarity index 53% rename from vendor/github.com/json-iterator/go/reflect_extension.go rename to vendor/github.com/json-iterator/go/feature_reflect_extension.go index 04f68756b..3dd38299d 100644 --- a/vendor/github.com/json-iterator/go/reflect_extension.go +++ b/vendor/github.com/json-iterator/go/feature_reflect_extension.go @@ -2,7 +2,6 @@ package jsoniter import ( "fmt" - "github.com/modern-go/reflect2" "reflect" "sort" "strings" @@ -18,15 +17,17 @@ var extensions = []Extension{} // StructDescriptor describe how should we encode/decode the struct type StructDescriptor struct { - Type reflect2.Type - Fields []*Binding + onePtrEmbedded bool + onePtrOptimization bool + Type reflect.Type + Fields []*Binding } // GetField get one field from the descriptor by its name. // Can not use map here to keep field orders. func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { for _, binding := range structDescriptor.Fields { - if binding.Field.Name() == fieldName { + if binding.Field.Name == fieldName { return binding } } @@ -36,7 +37,7 @@ func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { // Binding describe how should we encode/decode the struct field type Binding struct { levels []int - Field reflect2.StructField + Field *reflect.StructField FromNames []string ToNames []string Encoder ValEncoder @@ -47,12 +48,10 @@ type Binding struct { // Can also rename fields by UpdateStructDescriptor. type Extension interface { UpdateStructDescriptor(structDescriptor *StructDescriptor) - CreateMapKeyDecoder(typ reflect2.Type) ValDecoder - CreateMapKeyEncoder(typ reflect2.Type) ValEncoder - CreateDecoder(typ reflect2.Type) ValDecoder - CreateEncoder(typ reflect2.Type) ValEncoder - DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder - DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder + CreateDecoder(typ reflect.Type) ValDecoder + CreateEncoder(typ reflect.Type) ValEncoder + DecorateDecoder(typ reflect.Type, decoder ValDecoder) ValDecoder + DecorateEncoder(typ reflect.Type, encoder ValEncoder) ValEncoder } // DummyExtension embed this type get dummy implementation for all methods of Extension @@ -63,105 +62,23 @@ type DummyExtension struct { func (extension *DummyExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { } -// CreateMapKeyDecoder No-op -func (extension *DummyExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension *DummyExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// CreateDecoder No-op -func (extension *DummyExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateEncoder No-op -func (extension *DummyExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension *DummyExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension *DummyExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type EncoderExtension map[reflect2.Type]ValEncoder - -// UpdateStructDescriptor No-op -func (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - // CreateDecoder No-op -func (extension EncoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateEncoder get encoder from map -func (extension EncoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return extension[typ] -} - -// CreateMapKeyDecoder No-op -func (extension EncoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension EncoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension EncoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension EncoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type DecoderExtension map[reflect2.Type]ValDecoder - -// UpdateStructDescriptor No-op -func (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateMapKeyDecoder No-op -func (extension DecoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension DecoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { +func (extension *DummyExtension) CreateDecoder(typ reflect.Type) ValDecoder { return nil } -// CreateDecoder get decoder from map -func (extension DecoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return extension[typ] -} - // CreateEncoder No-op -func (extension DecoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { +func (extension *DummyExtension) CreateEncoder(typ reflect.Type) ValEncoder { return nil } // DecorateDecoder No-op -func (extension DecoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { +func (extension *DummyExtension) DecorateDecoder(typ reflect.Type, decoder ValDecoder) ValDecoder { return decoder } // DecorateEncoder No-op -func (extension DecoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { +func (extension *DummyExtension) DecorateEncoder(typ reflect.Type, encoder ValEncoder) ValEncoder { return encoder } @@ -182,6 +99,10 @@ func (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { encoder.fun(ptr, stream) } +func (encoder *funcEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + func (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool { if encoder.isEmptyFunc == nil { return false @@ -240,151 +161,132 @@ func RegisterExtension(extension Extension) { extensions = append(extensions, extension) } -func getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := _getTypeDecoderFromExtension(ctx, typ) +func getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { + decoder := _getTypeDecoderFromExtension(typ) if decoder != nil { for _, extension := range extensions { decoder = extension.DecorateDecoder(typ, decoder) } - decoder = ctx.decoderExtension.DecorateDecoder(typ, decoder) - for _, extension := range ctx.extraExtensions { - decoder = extension.DecorateDecoder(typ, decoder) - } } return decoder } -func _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { +func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder { for _, extension := range extensions { decoder := extension.CreateDecoder(typ) if decoder != nil { return decoder } } - decoder := ctx.decoderExtension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - for _, extension := range ctx.extraExtensions { - decoder := extension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - } typeName := typ.String() - decoder = typeDecoders[typeName] + decoder := typeDecoders[typeName] if decoder != nil { return decoder } if typ.Kind() == reflect.Ptr { - ptrType := typ.(*reflect2.UnsafePtrType) - decoder := typeDecoders[ptrType.Elem().String()] + decoder := typeDecoders[typ.Elem().String()] if decoder != nil { - return &OptionalDecoder{ptrType.Elem(), decoder} + return &optionalDecoder{typ.Elem(), decoder} } } return nil } -func getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := _getTypeEncoderFromExtension(ctx, typ) +func getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { + encoder := _getTypeEncoderFromExtension(typ) if encoder != nil { for _, extension := range extensions { encoder = extension.DecorateEncoder(typ, encoder) } - encoder = ctx.encoderExtension.DecorateEncoder(typ, encoder) - for _, extension := range ctx.extraExtensions { - encoder = extension.DecorateEncoder(typ, encoder) - } } return encoder } -func _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { +func _getTypeEncoderFromExtension(typ reflect.Type) ValEncoder { for _, extension := range extensions { encoder := extension.CreateEncoder(typ) if encoder != nil { return encoder } } - encoder := ctx.encoderExtension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - for _, extension := range ctx.extraExtensions { - encoder := extension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - } typeName := typ.String() - encoder = typeEncoders[typeName] + encoder := typeEncoders[typeName] if encoder != nil { return encoder } if typ.Kind() == reflect.Ptr { - typePtr := typ.(*reflect2.UnsafePtrType) - encoder := typeEncoders[typePtr.Elem().String()] + encoder := typeEncoders[typ.Elem().String()] if encoder != nil { - return &OptionalEncoder{encoder} + return &optionalEncoder{encoder} } } return nil } -func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { - structType := typ.(*reflect2.UnsafeStructType) +func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, error) { embeddedBindings := []*Binding{} bindings := []*Binding{} - for i := 0; i < structType.NumField(); i++ { - field := structType.Field(i) - tag, hastag := field.Tag().Lookup(ctx.getTagKey()) - if ctx.onlyTaggedField && !hastag { - continue - } + for i := 0; i < typ.NumField(); i++ { + field := typ.Field(i) + tag := field.Tag.Get(cfg.getTagKey()) tagParts := strings.Split(tag, ",") if tag == "-" { continue } - if field.Anonymous() && (tag == "" || tagParts[0] == "") { - if field.Type().Kind() == reflect.Struct { - structDescriptor := describeStruct(ctx, field.Type()) + if field.Anonymous && (tag == "" || tagParts[0] == "") { + if field.Type.Kind() == reflect.Struct { + structDescriptor, err := describeStruct(cfg, field.Type) + if err != nil { + return nil, err + } for _, binding := range structDescriptor.Fields { binding.levels = append([]int{i}, binding.levels...) omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} - binding.Decoder = &structFieldDecoder{field, binding.Decoder} + binding.Encoder = &structFieldEncoder{&field, binding.Encoder, omitempty} + binding.Decoder = &structFieldDecoder{&field, binding.Decoder} embeddedBindings = append(embeddedBindings, binding) } continue - } else if field.Type().Kind() == reflect.Ptr { - ptrType := field.Type().(*reflect2.UnsafePtrType) - if ptrType.Elem().Kind() == reflect.Struct { - structDescriptor := describeStruct(ctx, ptrType.Elem()) - for _, binding := range structDescriptor.Fields { - binding.levels = append([]int{i}, binding.levels...) - omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &dereferenceEncoder{binding.Encoder} - binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} - binding.Decoder = &dereferenceDecoder{ptrType.Elem(), binding.Decoder} - binding.Decoder = &structFieldDecoder{field, binding.Decoder} - embeddedBindings = append(embeddedBindings, binding) - } - continue + } else if field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { + structDescriptor, err := describeStruct(cfg, field.Type.Elem()) + if err != nil { + return nil, err } + for _, binding := range structDescriptor.Fields { + binding.levels = append([]int{i}, binding.levels...) + omitempty := binding.Encoder.(*structFieldEncoder).omitempty + binding.Encoder = &optionalEncoder{binding.Encoder} + binding.Encoder = &structFieldEncoder{&field, binding.Encoder, omitempty} + binding.Decoder = &deferenceDecoder{field.Type.Elem(), binding.Decoder} + binding.Decoder = &structFieldDecoder{&field, binding.Decoder} + embeddedBindings = append(embeddedBindings, binding) + } + continue } } - fieldNames := calcFieldNames(field.Name(), tagParts[0], tag) - fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name()) + fieldNames := calcFieldNames(field.Name, tagParts[0], tag) + fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name) decoder := fieldDecoders[fieldCacheKey] if decoder == nil { - decoder = decoderOfType(ctx.append(field.Name()), field.Type()) + var err error + decoder, err = decoderOfType(cfg, field.Type) + if err != nil { + return nil, err + } } encoder := fieldEncoders[fieldCacheKey] if encoder == nil { - encoder = encoderOfType(ctx.append(field.Name()), field.Type()) + var err error + encoder, err = encoderOfType(cfg, field.Type) + if err != nil { + return nil, err + } + // map is stored as pointer in the struct + if field.Type.Kind() == reflect.Map { + encoder = &optionalEncoder{encoder} + } } binding := &Binding{ - Field: field, + Field: &field, FromNames: fieldNames, ToNames: fieldNames, Decoder: decoder, @@ -393,22 +295,35 @@ func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { binding.levels = []int{i} bindings = append(bindings, binding) } - return createStructDescriptor(ctx, typ, bindings, embeddedBindings) -} -func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { + return createStructDescriptor(cfg, typ, bindings, embeddedBindings), nil +} +func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { + onePtrEmbedded := false + onePtrOptimization := false + if typ.NumField() == 1 { + firstField := typ.Field(0) + switch firstField.Type.Kind() { + case reflect.Ptr: + if firstField.Anonymous && firstField.Type.Elem().Kind() == reflect.Struct { + onePtrEmbedded = true + } + fallthrough + case reflect.Map: + onePtrOptimization = true + case reflect.Struct: + onePtrOptimization = isStructOnePtr(firstField.Type) + } + } structDescriptor := &StructDescriptor{ - Type: typ, - Fields: bindings, + onePtrEmbedded: onePtrEmbedded, + onePtrOptimization: onePtrOptimization, + Type: typ, + Fields: bindings, } for _, extension := range extensions { extension.UpdateStructDescriptor(structDescriptor) } - ctx.encoderExtension.UpdateStructDescriptor(structDescriptor) - ctx.decoderExtension.UpdateStructDescriptor(structDescriptor) - for _, extension := range ctx.extraExtensions { - extension.UpdateStructDescriptor(structDescriptor) - } - processTags(structDescriptor, ctx.frozenConfig) + processTags(structDescriptor, cfg) // merge normal & embedded bindings & sort with original order allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) sort.Sort(allBindings) @@ -416,6 +331,21 @@ func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, em return structDescriptor } +func isStructOnePtr(typ reflect.Type) bool { + if typ.NumField() == 1 { + firstField := typ.Field(0) + switch firstField.Type.Kind() { + case reflect.Ptr: + return true + case reflect.Map: + return true + case reflect.Struct: + return isStructOnePtr(firstField.Type) + } + } + return false +} + type sortableBindings []*Binding func (bindings sortableBindings) Len() int { @@ -443,12 +373,12 @@ func (bindings sortableBindings) Swap(i, j int) { func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { for _, binding := range structDescriptor.Fields { shouldOmitEmpty := false - tagParts := strings.Split(binding.Field.Tag().Get(cfg.getTagKey()), ",") + tagParts := strings.Split(binding.Field.Tag.Get(cfg.getTagKey()), ",") for _, tagPart := range tagParts[1:] { if tagPart == "omitempty" { shouldOmitEmpty = true } else if tagPart == "string" { - if binding.Field.Type().Kind() == reflect.String { + if binding.Field.Type.Kind() == reflect.String { binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg} binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg} } else { diff --git a/vendor/github.com/json-iterator/go/feature_reflect_map.go b/vendor/github.com/json-iterator/go/feature_reflect_map.go new file mode 100644 index 000000000..005671e01 --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_reflect_map.go @@ -0,0 +1,244 @@ +package jsoniter + +import ( + "encoding" + "encoding/json" + "reflect" + "sort" + "strconv" + "unsafe" +) + +type mapDecoder struct { + mapType reflect.Type + keyType reflect.Type + elemType reflect.Type + elemDecoder ValDecoder + mapInterface emptyInterface +} + +func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type + mapInterface := decoder.mapInterface + mapInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) + realVal := reflect.ValueOf(*realInterface).Elem() + if iter.ReadNil() { + realVal.Set(reflect.Zero(decoder.mapType)) + return + } + if realVal.IsNil() { + realVal.Set(reflect.MakeMap(realVal.Type())) + } + iter.ReadMapCB(func(iter *Iterator, keyStr string) bool { + elem := reflect.New(decoder.elemType) + decoder.elemDecoder.Decode(unsafe.Pointer(elem.Pointer()), iter) + // to put into map, we have to use reflection + keyType := decoder.keyType + // TODO: remove this from loop + switch { + case keyType.Kind() == reflect.String: + realVal.SetMapIndex(reflect.ValueOf(keyStr).Convert(keyType), elem.Elem()) + return true + case keyType.Implements(textUnmarshalerType): + textUnmarshaler := reflect.New(keyType.Elem()).Interface().(encoding.TextUnmarshaler) + err := textUnmarshaler.UnmarshalText([]byte(keyStr)) + if err != nil { + iter.ReportError("read map key as TextUnmarshaler", err.Error()) + return false + } + realVal.SetMapIndex(reflect.ValueOf(textUnmarshaler), elem.Elem()) + return true + case reflect.PtrTo(keyType).Implements(textUnmarshalerType): + textUnmarshaler := reflect.New(keyType).Interface().(encoding.TextUnmarshaler) + err := textUnmarshaler.UnmarshalText([]byte(keyStr)) + if err != nil { + iter.ReportError("read map key as TextUnmarshaler", err.Error()) + return false + } + realVal.SetMapIndex(reflect.ValueOf(textUnmarshaler).Elem(), elem.Elem()) + return true + default: + switch keyType.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + n, err := strconv.ParseInt(keyStr, 10, 64) + if err != nil || reflect.Zero(keyType).OverflowInt(n) { + iter.ReportError("read map key as int64", "read int64 failed") + return false + } + realVal.SetMapIndex(reflect.ValueOf(n).Convert(keyType), elem.Elem()) + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + n, err := strconv.ParseUint(keyStr, 10, 64) + if err != nil || reflect.Zero(keyType).OverflowUint(n) { + iter.ReportError("read map key as uint64", "read uint64 failed") + return false + } + realVal.SetMapIndex(reflect.ValueOf(n).Convert(keyType), elem.Elem()) + return true + } + } + iter.ReportError("read map key", "unexpected map key type "+keyType.String()) + return true + }) +} + +type mapEncoder struct { + mapType reflect.Type + elemType reflect.Type + elemEncoder ValEncoder + mapInterface emptyInterface +} + +func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + mapInterface := encoder.mapInterface + mapInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) + realVal := reflect.ValueOf(*realInterface) + stream.WriteObjectStart() + for i, key := range realVal.MapKeys() { + if i != 0 { + stream.WriteMore() + } + encodeMapKey(key, stream) + if stream.indention > 0 { + stream.writeTwoBytes(byte(':'), byte(' ')) + } else { + stream.writeByte(':') + } + val := realVal.MapIndex(key).Interface() + encoder.elemEncoder.EncodeInterface(val, stream) + } + stream.WriteObjectEnd() +} + +func encodeMapKey(key reflect.Value, stream *Stream) { + if key.Kind() == reflect.String { + stream.WriteString(key.String()) + return + } + if tm, ok := key.Interface().(encoding.TextMarshaler); ok { + buf, err := tm.MarshalText() + if err != nil { + stream.Error = err + return + } + stream.writeByte('"') + stream.Write(buf) + stream.writeByte('"') + return + } + switch key.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + stream.writeByte('"') + stream.WriteInt64(key.Int()) + stream.writeByte('"') + return + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + stream.writeByte('"') + stream.WriteUint64(key.Uint()) + stream.writeByte('"') + return + } + stream.Error = &json.UnsupportedTypeError{Type: key.Type()} +} + +func (encoder *mapEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { + mapInterface := encoder.mapInterface + mapInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) + realVal := reflect.ValueOf(*realInterface) + return realVal.Len() == 0 +} + +type sortKeysMapEncoder struct { + mapType reflect.Type + elemType reflect.Type + elemEncoder ValEncoder + mapInterface emptyInterface +} + +func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + mapInterface := encoder.mapInterface + mapInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) + realVal := reflect.ValueOf(*realInterface) + + // Extract and sort the keys. + keys := realVal.MapKeys() + sv := stringValues(make([]reflectWithString, len(keys))) + for i, v := range keys { + sv[i].v = v + if err := sv[i].resolve(); err != nil { + stream.Error = err + return + } + } + sort.Sort(sv) + + stream.WriteObjectStart() + for i, key := range sv { + if i != 0 { + stream.WriteMore() + } + stream.WriteVal(key.s) // might need html escape, so can not WriteString directly + if stream.indention > 0 { + stream.writeTwoBytes(byte(':'), byte(' ')) + } else { + stream.writeByte(':') + } + val := realVal.MapIndex(key.v).Interface() + encoder.elemEncoder.EncodeInterface(val, stream) + } + stream.WriteObjectEnd() +} + +// stringValues is a slice of reflect.Value holding *reflect.StringValue. +// It implements the methods to sort by string. +type stringValues []reflectWithString + +type reflectWithString struct { + v reflect.Value + s string +} + +func (w *reflectWithString) resolve() error { + if w.v.Kind() == reflect.String { + w.s = w.v.String() + return nil + } + if tm, ok := w.v.Interface().(encoding.TextMarshaler); ok { + buf, err := tm.MarshalText() + w.s = string(buf) + return err + } + switch w.v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + w.s = strconv.FormatInt(w.v.Int(), 10) + return nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + w.s = strconv.FormatUint(w.v.Uint(), 10) + return nil + } + return &json.UnsupportedTypeError{Type: w.v.Type()} +} + +func (sv stringValues) Len() int { return len(sv) } +func (sv stringValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } +func (sv stringValues) Less(i, j int) bool { return sv[i].s < sv[j].s } + +func (encoder *sortKeysMapEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { + mapInterface := encoder.mapInterface + mapInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) + realVal := reflect.ValueOf(*realInterface) + return realVal.Len() == 0 +} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_native.go b/vendor/github.com/json-iterator/go/feature_reflect_native.go new file mode 100644 index 000000000..b37dab3d8 --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_reflect_native.go @@ -0,0 +1,672 @@ +package jsoniter + +import ( + "encoding" + "encoding/base64" + "encoding/json" + "unsafe" +) + +type stringCodec struct { +} + +func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*string)(ptr)) = iter.ReadString() +} + +func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + str := *((*string)(ptr)) + stream.WriteString(str) +} + +func (codec *stringCodec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*string)(ptr)) == "" +} + +type intCodec struct { +} + +func (codec *intCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*int)(ptr)) = iter.ReadInt() +} + +func (codec *intCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt(*((*int)(ptr))) +} + +func (codec *intCodec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *intCodec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int)(ptr)) == 0 +} + +type uintptrCodec struct { +} + +func (codec *uintptrCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*uintptr)(ptr)) = uintptr(iter.ReadUint64()) +} + +func (codec *uintptrCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint64(uint64(*((*uintptr)(ptr)))) +} + +func (codec *uintptrCodec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *uintptrCodec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uintptr)(ptr)) == 0 +} + +type int8Codec struct { +} + +func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*int8)(ptr)) = iter.ReadInt8() +} + +func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt8(*((*int8)(ptr))) +} + +func (codec *int8Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int8)(ptr)) == 0 +} + +type int16Codec struct { +} + +func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*int16)(ptr)) = iter.ReadInt16() +} + +func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt16(*((*int16)(ptr))) +} + +func (codec *int16Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int16)(ptr)) == 0 +} + +type int32Codec struct { +} + +func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*int32)(ptr)) = iter.ReadInt32() +} + +func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt32(*((*int32)(ptr))) +} + +func (codec *int32Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int32)(ptr)) == 0 +} + +type int64Codec struct { +} + +func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*int64)(ptr)) = iter.ReadInt64() +} + +func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt64(*((*int64)(ptr))) +} + +func (codec *int64Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int64)(ptr)) == 0 +} + +type uintCodec struct { +} + +func (codec *uintCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*uint)(ptr)) = iter.ReadUint() +} + +func (codec *uintCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint(*((*uint)(ptr))) +} + +func (codec *uintCodec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *uintCodec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint)(ptr)) == 0 +} + +type uint8Codec struct { +} + +func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*uint8)(ptr)) = iter.ReadUint8() +} + +func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint8(*((*uint8)(ptr))) +} + +func (codec *uint8Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint8)(ptr)) == 0 +} + +type uint16Codec struct { +} + +func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*uint16)(ptr)) = iter.ReadUint16() +} + +func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint16(*((*uint16)(ptr))) +} + +func (codec *uint16Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint16)(ptr)) == 0 +} + +type uint32Codec struct { +} + +func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*uint32)(ptr)) = iter.ReadUint32() +} + +func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint32(*((*uint32)(ptr))) +} + +func (codec *uint32Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint32)(ptr)) == 0 +} + +type uint64Codec struct { +} + +func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*uint64)(ptr)) = iter.ReadUint64() +} + +func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint64(*((*uint64)(ptr))) +} + +func (codec *uint64Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint64)(ptr)) == 0 +} + +type float32Codec struct { +} + +func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*float32)(ptr)) = iter.ReadFloat32() +} + +func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat32(*((*float32)(ptr))) +} + +func (codec *float32Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float32)(ptr)) == 0 +} + +type float64Codec struct { +} + +func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*float64)(ptr)) = iter.ReadFloat64() +} + +func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat64(*((*float64)(ptr))) +} + +func (codec *float64Codec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float64)(ptr)) == 0 +} + +type boolCodec struct { +} + +func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*bool)(ptr)) = iter.ReadBool() +} + +func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteBool(*((*bool)(ptr))) +} + +func (codec *boolCodec) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, codec) +} + +func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { + return !(*((*bool)(ptr))) +} + +type emptyInterfaceCodec struct { +} + +func (codec *emptyInterfaceCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*interface{})(ptr)) = iter.Read() +} + +func (codec *emptyInterfaceCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteVal(*((*interface{})(ptr))) +} + +func (codec *emptyInterfaceCodec) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteVal(val) +} + +func (codec *emptyInterfaceCodec) IsEmpty(ptr unsafe.Pointer) bool { + return ptr == nil +} + +type nonEmptyInterfaceCodec struct { +} + +func (codec *nonEmptyInterfaceCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + nonEmptyInterface := (*nonEmptyInterface)(ptr) + if nonEmptyInterface.itab == nil { + iter.ReportError("read non-empty interface", "do not know which concrete type to decode to") + return + } + var i interface{} + e := (*emptyInterface)(unsafe.Pointer(&i)) + e.typ = nonEmptyInterface.itab.typ + e.word = nonEmptyInterface.word + iter.ReadVal(&i) + nonEmptyInterface.word = e.word +} + +func (codec *nonEmptyInterfaceCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + nonEmptyInterface := (*nonEmptyInterface)(ptr) + var i interface{} + e := (*emptyInterface)(unsafe.Pointer(&i)) + e.typ = nonEmptyInterface.itab.typ + e.word = nonEmptyInterface.word + stream.WriteVal(i) +} + +func (codec *nonEmptyInterfaceCodec) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteVal(val) +} + +func (codec *nonEmptyInterfaceCodec) IsEmpty(ptr unsafe.Pointer) bool { + nonEmptyInterface := (*nonEmptyInterface)(ptr) + return nonEmptyInterface.word == nil +} + +type anyCodec struct { +} + +func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*Any)(ptr)) = iter.ReadAny() +} + +func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + (*((*Any)(ptr))).WriteTo(stream) +} + +func (codec *anyCodec) EncodeInterface(val interface{}, stream *Stream) { + (val.(Any)).WriteTo(stream) +} + +func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { + return (*((*Any)(ptr))).Size() == 0 +} + +type jsonNumberCodec struct { +} + +func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) +} + +func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*json.Number)(ptr)))) +} + +func (codec *jsonNumberCodec) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteRaw(string(val.(json.Number))) +} + +func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*json.Number)(ptr))) == 0 +} + +type jsoniterNumberCodec struct { +} + +func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) +} + +func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*Number)(ptr)))) +} + +func (codec *jsoniterNumberCodec) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteRaw(string(val.(Number))) +} + +func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*Number)(ptr))) == 0 +} + +type jsonRawMessageCodec struct { +} + +func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) +} + +func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) +} + +func (codec *jsonRawMessageCodec) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteRaw(string(val.(json.RawMessage))) +} + +func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*json.RawMessage)(ptr))) == 0 +} + +type jsoniterRawMessageCodec struct { +} + +func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) +} + +func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*RawMessage)(ptr)))) +} + +func (codec *jsoniterRawMessageCodec) EncodeInterface(val interface{}, stream *Stream) { + stream.WriteRaw(string(val.(RawMessage))) +} + +func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*RawMessage)(ptr))) == 0 +} + +type base64Codec struct { + sliceDecoder ValDecoder +} + +func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + ptrSlice := (*sliceHeader)(ptr) + ptrSlice.Len = 0 + ptrSlice.Cap = 0 + ptrSlice.Data = nil + return + } + switch iter.WhatIsNext() { + case StringValue: + encoding := base64.StdEncoding + src := iter.SkipAndReturnBytes() + src = src[1 : len(src)-1] + decodedLen := encoding.DecodedLen(len(src)) + dst := make([]byte, decodedLen) + len, err := encoding.Decode(dst, src) + if err != nil { + iter.ReportError("decode base64", err.Error()) + } else { + dst = dst[:len] + dstSlice := (*sliceHeader)(unsafe.Pointer(&dst)) + ptrSlice := (*sliceHeader)(ptr) + ptrSlice.Data = dstSlice.Data + ptrSlice.Cap = dstSlice.Cap + ptrSlice.Len = dstSlice.Len + } + case ArrayValue: + codec.sliceDecoder.Decode(ptr, iter) + default: + iter.ReportError("base64Codec", "invalid input") + } +} + +func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + src := *((*[]byte)(ptr)) + if len(src) == 0 { + stream.WriteNil() + return + } + encoding := base64.StdEncoding + stream.writeByte('"') + toGrow := encoding.EncodedLen(len(src)) + stream.ensure(toGrow) + encoding.Encode(stream.buf[stream.n:], src) + stream.n += toGrow + stream.writeByte('"') +} + +func (codec *base64Codec) EncodeInterface(val interface{}, stream *Stream) { + ptr := extractInterface(val).word + src := *((*[]byte)(ptr)) + if len(src) == 0 { + stream.WriteNil() + return + } + encoding := base64.StdEncoding + stream.writeByte('"') + toGrow := encoding.EncodedLen(len(src)) + stream.ensure(toGrow) + encoding.Encode(stream.buf[stream.n:], src) + stream.n += toGrow + stream.writeByte('"') +} + +func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*[]byte)(ptr))) == 0 +} + +type stringModeNumberDecoder struct { + elemDecoder ValDecoder +} + +func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + if c != '"' { + iter.ReportError("stringModeNumberDecoder", `expect "`) + return + } + decoder.elemDecoder.Decode(ptr, iter) + if iter.Error != nil { + return + } + c = iter.readByte() + if c != '"' { + iter.ReportError("stringModeNumberDecoder", `expect "`) + return + } +} + +type stringModeStringDecoder struct { + elemDecoder ValDecoder + cfg *frozenConfig +} + +func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.elemDecoder.Decode(ptr, iter) + str := *((*string)(ptr)) + tempIter := decoder.cfg.BorrowIterator([]byte(str)) + defer decoder.cfg.ReturnIterator(tempIter) + *((*string)(ptr)) = tempIter.ReadString() +} + +type stringModeNumberEncoder struct { + elemEncoder ValEncoder +} + +func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.writeByte('"') + encoder.elemEncoder.Encode(ptr, stream) + stream.writeByte('"') +} + +func (encoder *stringModeNumberEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.elemEncoder.IsEmpty(ptr) +} + +type stringModeStringEncoder struct { + elemEncoder ValEncoder + cfg *frozenConfig +} + +func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + tempStream := encoder.cfg.BorrowStream(nil) + defer encoder.cfg.ReturnStream(tempStream) + encoder.elemEncoder.Encode(ptr, tempStream) + stream.WriteString(string(tempStream.Buffer())) +} + +func (encoder *stringModeStringEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.elemEncoder.IsEmpty(ptr) +} + +type marshalerEncoder struct { + templateInterface emptyInterface + checkIsEmpty checkIsEmpty +} + +func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + templateInterface := encoder.templateInterface + templateInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) + marshaler := (*realInterface).(json.Marshaler) + bytes, err := marshaler.MarshalJSON() + if err != nil { + stream.Error = err + } else { + stream.Write(bytes) + } +} +func (encoder *marshalerEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type textMarshalerEncoder struct { + templateInterface emptyInterface + checkIsEmpty checkIsEmpty +} + +func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + templateInterface := encoder.templateInterface + templateInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) + marshaler := (*realInterface).(encoding.TextMarshaler) + bytes, err := marshaler.MarshalText() + if err != nil { + stream.Error = err + } else { + stream.WriteString(string(bytes)) + } +} + +func (encoder *textMarshalerEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type unmarshalerDecoder struct { + templateInterface emptyInterface +} + +func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + templateInterface := decoder.templateInterface + templateInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) + unmarshaler := (*realInterface).(json.Unmarshaler) + iter.nextToken() + iter.unreadByte() // skip spaces + bytes := iter.SkipAndReturnBytes() + err := unmarshaler.UnmarshalJSON(bytes) + if err != nil { + iter.ReportError("unmarshalerDecoder", err.Error()) + } +} + +type textUnmarshalerDecoder struct { + templateInterface emptyInterface +} + +func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + templateInterface := decoder.templateInterface + templateInterface.word = ptr + realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) + unmarshaler := (*realInterface).(encoding.TextUnmarshaler) + str := iter.ReadString() + err := unmarshaler.UnmarshalText([]byte(str)) + if err != nil { + iter.ReportError("textUnmarshalerDecoder", err.Error()) + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go b/vendor/github.com/json-iterator/go/feature_reflect_object.go similarity index 50% rename from vendor/github.com/json-iterator/go/reflect_struct_encoder.go rename to vendor/github.com/json-iterator/go/feature_reflect_object.go index d0759cf64..59b1235c0 100644 --- a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go +++ b/vendor/github.com/json-iterator/go/feature_reflect_object.go @@ -2,20 +2,23 @@ package jsoniter import ( "fmt" - "github.com/modern-go/reflect2" "io" "reflect" + "strings" "unsafe" ) -func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { +func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { type bindingTo struct { binding *Binding toName string ignored bool } orderedBindings := []*bindingTo{} - structDescriptor := describeStruct(ctx, typ) + structDescriptor, err := describeStruct(cfg, typ) + if err != nil { + return nil, err + } for _, binding := range structDescriptor.Fields { for _, toName := range binding.ToNames { new := &bindingTo{ @@ -26,13 +29,13 @@ func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { if old.toName != toName { continue } - old.ignored, new.ignored = resolveConflictBinding(ctx.frozenConfig, old.binding, new.binding) + old.ignored, new.ignored = resolveConflictBinding(cfg, old.binding, new.binding) } orderedBindings = append(orderedBindings, new) } } if len(orderedBindings) == 0 { - return &emptyStructEncoder{} + return &emptyStructEncoder{}, nil } finalOrderedFields := []structFieldTo{} for _, bindingTo := range orderedBindings { @@ -43,36 +46,12 @@ func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { }) } } - return &structEncoder{typ, finalOrderedFields} -} - -func createCheckIsEmpty(ctx *ctx, typ reflect2.Type) checkIsEmpty { - encoder := createEncoderOfNative(ctx, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{typ} - case reflect.Struct: - return &structEncoder{typ: typ} - case reflect.Array: - return &arrayEncoder{} - case reflect.Slice: - return &sliceEncoder{} - case reflect.Map: - return encoderOfMap(ctx, typ) - case reflect.Ptr: - return &OptionalEncoder{} - default: - return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)} - } + return &structEncoder{structDescriptor.onePtrEmbedded, structDescriptor.onePtrOptimization, finalOrderedFields}, nil } func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) { - newTagged := new.Field.Tag().Get(cfg.getTagKey()) != "" - oldTagged := old.Field.Tag().Get(cfg.getTagKey()) != "" + newTagged := new.Field.Tag.Get(cfg.getTagKey()) != "" + oldTagged := old.Field.Tag.Get(cfg.getTagKey()) != "" if newTagged { if oldTagged { if len(old.levels) > len(new.levels) { @@ -99,41 +78,62 @@ func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ig } } +func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + bindings := map[string]*Binding{} + structDescriptor, err := describeStruct(cfg, typ) + if err != nil { + return nil, err + } + for _, binding := range structDescriptor.Fields { + for _, fromName := range binding.FromNames { + old := bindings[fromName] + if old == nil { + bindings[fromName] = binding + continue + } + ignoreOld, ignoreNew := resolveConflictBinding(cfg, old, binding) + if ignoreOld { + delete(bindings, fromName) + } + if !ignoreNew { + bindings[fromName] = binding + } + } + } + fields := map[string]*structFieldDecoder{} + for k, binding := range bindings { + fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) + } + return createStructDecoder(typ, fields) +} + type structFieldEncoder struct { - field reflect2.StructField + field *reflect.StructField fieldEncoder ValEncoder omitempty bool } func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - fieldPtr := encoder.field.UnsafeGet(ptr) + fieldPtr := unsafe.Pointer(uintptr(ptr) + encoder.field.Offset) encoder.fieldEncoder.Encode(fieldPtr, stream) if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%s: %s", encoder.field.Name(), stream.Error.Error()) + stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error()) } } -func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool { - fieldPtr := encoder.field.UnsafeGet(ptr) - return encoder.fieldEncoder.IsEmpty(fieldPtr) +func (encoder *structFieldEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) } -func (encoder *structFieldEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { - isEmbeddedPtrNil, converted := encoder.fieldEncoder.(IsEmbeddedPtrNil) - if !converted { - return false - } - fieldPtr := encoder.field.UnsafeGet(ptr) - return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) -} - -type IsEmbeddedPtrNil interface { - IsEmbeddedPtrNil(ptr unsafe.Pointer) bool +func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool { + fieldPtr := unsafe.Pointer(uintptr(ptr) + encoder.field.Offset) + return encoder.fieldEncoder.IsEmpty(fieldPtr) } type structEncoder struct { - typ reflect2.Type - fields []structFieldTo + onePtrEmbedded bool + onePtrOptimization bool + fields []structFieldTo } type structFieldTo struct { @@ -148,9 +148,6 @@ func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { if field.encoder.omitempty && field.encoder.IsEmpty(ptr) { continue } - if field.encoder.IsEmbeddedPtrNil(ptr) { - continue - } if isNotFirst { stream.WriteMore() } @@ -159,8 +156,23 @@ func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { isNotFirst = true } stream.WriteObjectEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v.%s", encoder.typ, stream.Error.Error()) +} + +func (encoder *structEncoder) EncodeInterface(val interface{}, stream *Stream) { + e := (*emptyInterface)(unsafe.Pointer(&val)) + if encoder.onePtrOptimization { + if e.word == nil && encoder.onePtrEmbedded { + stream.WriteObjectStart() + stream.WriteObjectEnd() + return + } + ptr := uintptr(e.word) + e.word = unsafe.Pointer(&ptr) + } + if reflect.TypeOf(val).Kind() == reflect.Ptr { + encoder.Encode(unsafe.Pointer(&e.word), stream) + } else { + encoder.Encode(e.word, stream) } } @@ -175,36 +187,10 @@ func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { stream.WriteEmptyObject() } -func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type stringModeNumberEncoder struct { - elemEncoder ValEncoder -} - -func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.elemEncoder.Encode(ptr, stream) - stream.writeByte('"') +func (encoder *emptyStructEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) } -func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} - -type stringModeStringEncoder struct { - elemEncoder ValEncoder - cfg *frozenConfig -} - -func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - tempStream := encoder.cfg.BorrowStream(nil) - defer encoder.cfg.ReturnStream(tempStream) - encoder.elemEncoder.Encode(ptr, tempStream) - stream.WriteString(string(tempStream.Buffer())) -} - -func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) +func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false } diff --git a/vendor/github.com/json-iterator/go/feature_reflect_slice.go b/vendor/github.com/json-iterator/go/feature_reflect_slice.go new file mode 100644 index 000000000..7377eec7b --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_reflect_slice.go @@ -0,0 +1,149 @@ +package jsoniter + +import ( + "fmt" + "io" + "reflect" + "unsafe" +) + +func decoderOfSlice(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { + decoder, err := decoderOfType(cfg, typ.Elem()) + if err != nil { + return nil, err + } + return &sliceDecoder{typ, typ.Elem(), decoder}, nil +} + +func encoderOfSlice(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { + encoder, err := encoderOfType(cfg, typ.Elem()) + if err != nil { + return nil, err + } + if typ.Elem().Kind() == reflect.Map { + encoder = &optionalEncoder{encoder} + } + return &sliceEncoder{typ, typ.Elem(), encoder}, nil +} + +type sliceEncoder struct { + sliceType reflect.Type + elemType reflect.Type + elemEncoder ValEncoder +} + +func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + slice := (*sliceHeader)(ptr) + if slice.Data == nil { + stream.WriteNil() + return + } + if slice.Len == 0 { + stream.WriteEmptyArray() + return + } + stream.WriteArrayStart() + elemPtr := unsafe.Pointer(slice.Data) + encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream) + for i := 1; i < slice.Len; i++ { + stream.WriteMore() + elemPtr = unsafe.Pointer(uintptr(elemPtr) + encoder.elemType.Size()) + encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream) + } + stream.WriteArrayEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) + } +} + +func (encoder *sliceEncoder) EncodeInterface(val interface{}, stream *Stream) { + WriteToStream(val, stream, encoder) +} + +func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + slice := (*sliceHeader)(ptr) + return slice.Len == 0 +} + +type sliceDecoder struct { + sliceType reflect.Type + elemType reflect.Type + elemDecoder ValDecoder +} + +// sliceHeader is a safe version of SliceHeader used within this package. +type sliceHeader struct { + Data unsafe.Pointer + Len int + Cap int +} + +func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.doDecode(ptr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) + } +} + +func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { + slice := (*sliceHeader)(ptr) + if iter.ReadNil() { + slice.Len = 0 + slice.Cap = 0 + slice.Data = nil + return + } + reuseSlice(slice, decoder.sliceType, 4) + slice.Len = 0 + offset := uintptr(0) + iter.ReadArrayCB(func(iter *Iterator) bool { + growOne(slice, decoder.sliceType, decoder.elemType) + decoder.elemDecoder.Decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter) + offset += decoder.elemType.Size() + return true + }) +} + +// grow grows the slice s so that it can hold extra more values, allocating +// more capacity if needed. It also returns the old and new slice lengths. +func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) { + newLen := slice.Len + 1 + if newLen <= slice.Cap { + slice.Len = newLen + return + } + newCap := slice.Cap + if newCap == 0 { + newCap = 1 + } else { + for newCap < newLen { + if slice.Len < 1024 { + newCap += newCap + } else { + newCap += newCap / 4 + } + } + } + newVal := reflect.MakeSlice(sliceType, newLen, newCap) + dst := unsafe.Pointer(newVal.Pointer()) + // copy old array into new array + originalBytesCount := uintptr(slice.Len) * elementType.Size() + srcPtr := (*[1 << 30]byte)(slice.Data) + dstPtr := (*[1 << 30]byte)(dst) + for i := uintptr(0); i < originalBytesCount; i++ { + dstPtr[i] = srcPtr[i] + } + slice.Data = dst + slice.Len = newLen + slice.Cap = newCap +} + +func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) { + if expectedCap <= slice.Cap { + return + } + newVal := reflect.MakeSlice(sliceType, 0, expectedCap) + dst := unsafe.Pointer(newVal.Pointer()) + slice.Data = dst + slice.Cap = expectedCap +} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/feature_reflect_struct_decoder.go similarity index 65% rename from vendor/github.com/json-iterator/go/reflect_struct_decoder.go rename to vendor/github.com/json-iterator/go/feature_reflect_struct_decoder.go index 355d2d116..b3417fd73 100644 --- a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go +++ b/vendor/github.com/json-iterator/go/feature_reflect_struct_decoder.go @@ -3,78 +3,38 @@ package jsoniter import ( "fmt" "io" + "reflect" "strings" "unsafe" - - "github.com/modern-go/reflect2" ) -func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { - bindings := map[string]*Binding{} - structDescriptor := describeStruct(ctx, typ) - for _, binding := range structDescriptor.Fields { - for _, fromName := range binding.FromNames { - old := bindings[fromName] - if old == nil { - bindings[fromName] = binding - continue - } - ignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding) - if ignoreOld { - delete(bindings, fromName) - } - if !ignoreNew { - bindings[fromName] = binding - } - } - } - fields := map[string]*structFieldDecoder{} - for k, binding := range bindings { - fields[k] = binding.Decoder.(*structFieldDecoder) - } - - if !ctx.caseSensitive() { - for k, binding := range bindings { - if _, found := fields[strings.ToLower(k)]; !found { - fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) - } - } - } - - return createStructDecoder(ctx, typ, fields) -} - -func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder { - if ctx.disallowUnknownFields { - return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true} - } - knownHash := map[int64]struct{}{ +func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (ValDecoder, error) { + knownHash := map[int32]struct{}{ 0: {}, } - switch len(fields) { case 0: - return &skipObjectDecoder{typ} + return &skipObjectDecoder{typ}, nil case 1: for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} - return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder} + return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil } case 2: - var fieldHash1 int64 - var fieldHash2 int64 + var fieldHash1 int32 + var fieldHash2 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldHash1 == 0 { @@ -85,19 +45,19 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF fieldDecoder2 = fieldDecoder } } - return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2} + return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil case 3: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -112,23 +72,21 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &threeFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil case 4: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder var fieldDecoder4 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -146,26 +104,24 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &fourFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4}, nil case 5: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 + var fieldName5 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder var fieldDecoder4 *structFieldDecoder var fieldDecoder5 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -186,18 +142,15 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &fiveFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil case 6: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 + var fieldName5 int32 + var fieldName6 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -205,10 +158,10 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder5 *structFieldDecoder var fieldDecoder6 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -232,20 +185,16 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &sixFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil case 7: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 + var fieldName5 int32 + var fieldName6 int32 + var fieldName7 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -254,10 +203,10 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder6 *structFieldDecoder var fieldDecoder7 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -284,22 +233,18 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &sevenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7}, nil case 8: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 + var fieldName5 int32 + var fieldName6 int32 + var fieldName7 int32 + var fieldName8 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -309,10 +254,10 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder7 *structFieldDecoder var fieldDecoder8 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -342,24 +287,19 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &eightFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil case 9: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldName9 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 + var fieldName5 int32 + var fieldName6 int32 + var fieldName7 int32 + var fieldName8 int32 + var fieldName9 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -370,10 +310,10 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder8 *structFieldDecoder var fieldDecoder9 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -406,26 +346,20 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &nineFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8, - fieldName9, fieldDecoder9} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil case 10: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldName9 int64 - var fieldName10 int64 + var fieldName1 int32 + var fieldName2 int32 + var fieldName3 int32 + var fieldName4 int32 + var fieldName5 int32 + var fieldName6 int32 + var fieldName7 int32 + var fieldName8 int32 + var fieldName9 int32 + var fieldName10 int32 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -437,10 +371,10 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder9 *structFieldDecoder var fieldDecoder10 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) + fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -476,80 +410,48 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF } } return &tenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8, - fieldName9, fieldDecoder9, - fieldName10, fieldDecoder10} + fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9, + fieldName10, fieldDecoder10}, nil } - return &generalStructDecoder{typ, fields, false} + return &generalStructDecoder{typ, fields}, nil } type generalStructDecoder struct { - typ reflect2.Type - fields map[string]*structFieldDecoder - disallowUnknownFields bool + typ reflect.Type + fields map[string]*structFieldDecoder } func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { if !iter.readObjectStart() { return } - var c byte - for c = ','; c == ','; c = iter.nextToken() { - decoder.decodeOneField(ptr, iter) - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - if c != '}' { - iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) - } -} - -func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) { - var field string - var fieldDecoder *structFieldDecoder - if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes := iter.ReadStringAsSlice() - field = *(*string)(unsafe.Pointer(&fieldBytes)) - fieldDecoder = decoder.fields[field] - if fieldDecoder == nil && !iter.cfg.caseSensitive { - fieldDecoder = decoder.fields[strings.ToLower(field)] - } + fieldBytes := iter.readObjectFieldAsBytes() + field := *(*string)(unsafe.Pointer(&fieldBytes)) + fieldDecoder := decoder.fields[strings.ToLower(field)] + if fieldDecoder == nil { + iter.Skip() } else { - field = iter.ReadString() - fieldDecoder = decoder.fields[field] - if fieldDecoder == nil && !iter.cfg.caseSensitive { - fieldDecoder = decoder.fields[strings.ToLower(field)] - } + fieldDecoder.Decode(ptr, iter) } - if fieldDecoder == nil { - msg := "found unknown field: " + field - if decoder.disallowUnknownFields { - iter.ReportError("ReadObject", msg) - } - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + for iter.nextToken() == ',' { + fieldBytes = iter.readObjectFieldAsBytes() + field = *(*string)(unsafe.Pointer(&fieldBytes)) + fieldDecoder = decoder.fields[strings.ToLower(field)] + if fieldDecoder == nil { + iter.Skip() + } else { + fieldDecoder.Decode(ptr, iter) } - iter.Skip() - return } - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } - fieldDecoder.Decode(ptr, iter) } type skipObjectDecoder struct { - typ reflect2.Type + typ reflect.Type } func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { @@ -562,8 +464,8 @@ func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { } type oneFieldStructDecoder struct { - typ reflect2.Type - fieldHash int64 + typ reflect.Type + fieldHash int32 fieldDecoder *structFieldDecoder } @@ -582,15 +484,15 @@ func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type twoFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder } @@ -612,17 +514,17 @@ func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type threeFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder } @@ -646,19 +548,19 @@ func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type fourFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder } @@ -684,21 +586,21 @@ func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type fiveFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder - fieldHash5 int64 + fieldHash5 int32 fieldDecoder5 *structFieldDecoder } @@ -726,23 +628,23 @@ func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type sixFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder - fieldHash5 int64 + fieldHash5 int32 fieldDecoder5 *structFieldDecoder - fieldHash6 int64 + fieldHash6 int32 fieldDecoder6 *structFieldDecoder } @@ -772,25 +674,25 @@ func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type sevenFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder - fieldHash5 int64 + fieldHash5 int32 fieldDecoder5 *structFieldDecoder - fieldHash6 int64 + fieldHash6 int32 fieldDecoder6 *structFieldDecoder - fieldHash7 int64 + fieldHash7 int32 fieldDecoder7 *structFieldDecoder } @@ -822,27 +724,27 @@ func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type eightFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder - fieldHash5 int64 + fieldHash5 int32 fieldDecoder5 *structFieldDecoder - fieldHash6 int64 + fieldHash6 int32 fieldDecoder6 *structFieldDecoder - fieldHash7 int64 + fieldHash7 int32 fieldDecoder7 *structFieldDecoder - fieldHash8 int64 + fieldHash8 int32 fieldDecoder8 *structFieldDecoder } @@ -876,29 +778,29 @@ func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type nineFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder - fieldHash5 int64 + fieldHash5 int32 fieldDecoder5 *structFieldDecoder - fieldHash6 int64 + fieldHash6 int32 fieldDecoder6 *structFieldDecoder - fieldHash7 int64 + fieldHash7 int32 fieldDecoder7 *structFieldDecoder - fieldHash8 int64 + fieldHash8 int32 fieldDecoder8 *structFieldDecoder - fieldHash9 int64 + fieldHash9 int32 fieldDecoder9 *structFieldDecoder } @@ -934,31 +836,31 @@ func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type tenFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 + typ reflect.Type + fieldHash1 int32 fieldDecoder1 *structFieldDecoder - fieldHash2 int64 + fieldHash2 int32 fieldDecoder2 *structFieldDecoder - fieldHash3 int64 + fieldHash3 int32 fieldDecoder3 *structFieldDecoder - fieldHash4 int64 + fieldHash4 int32 fieldDecoder4 *structFieldDecoder - fieldHash5 int64 + fieldHash5 int32 fieldDecoder5 *structFieldDecoder - fieldHash6 int64 + fieldHash6 int32 fieldDecoder6 *structFieldDecoder - fieldHash7 int64 + fieldHash7 int32 fieldDecoder7 *structFieldDecoder - fieldHash8 int64 + fieldHash8 int32 fieldDecoder8 *structFieldDecoder - fieldHash9 int64 + fieldHash9 int32 fieldDecoder9 *structFieldDecoder - fieldHash10 int64 + fieldHash10 int32 fieldDecoder10 *structFieldDecoder } @@ -996,53 +898,19 @@ func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) } } type structFieldDecoder struct { - field reflect2.StructField + field *reflect.StructField fieldDecoder ValDecoder } func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - fieldPtr := decoder.field.UnsafeGet(ptr) + fieldPtr := unsafe.Pointer(uintptr(ptr) + decoder.field.Offset) decoder.fieldDecoder.Decode(fieldPtr, iter) if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%s: %s", decoder.field.Name(), iter.Error.Error()) - } -} - -type stringModeStringDecoder struct { - elemDecoder ValDecoder - cfg *frozenConfig -} - -func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.elemDecoder.Decode(ptr, iter) - str := *((*string)(ptr)) - tempIter := decoder.cfg.BorrowIterator([]byte(str)) - defer decoder.cfg.ReturnIterator(tempIter) - *((*string)(ptr)) = tempIter.ReadString() -} - -type stringModeNumberDecoder struct { - elemDecoder ValDecoder -} - -func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } - decoder.elemDecoder.Decode(ptr, iter) - if iter.Error != nil { - return - } - c = iter.readByte() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return + iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error()) } } diff --git a/vendor/github.com/json-iterator/go/stream.go b/vendor/github.com/json-iterator/go/feature_stream.go similarity index 60% rename from vendor/github.com/json-iterator/go/stream.go rename to vendor/github.com/json-iterator/go/feature_stream.go index 17662fded..9c8470a03 100644 --- a/vendor/github.com/json-iterator/go/stream.go +++ b/vendor/github.com/json-iterator/go/feature_stream.go @@ -4,15 +4,15 @@ import ( "io" ) -// stream is a io.Writer like object, with JSON specific write functions. +// Stream is a io.Writer like object, with JSON specific write functions. // Error is not returned as return value, but stored as Error member on this stream instance. type Stream struct { - cfg *frozenConfig - out io.Writer - buf []byte - Error error - indention int - Attachment interface{} // open for customized encoder + cfg *frozenConfig + out io.Writer + buf []byte + n int + Error error + indention int } // NewStream create new stream instance. @@ -23,7 +23,8 @@ func NewStream(cfg API, out io.Writer, bufSize int) *Stream { return &Stream{ cfg: cfg.(*frozenConfig), out: out, - buf: make([]byte, 0, bufSize), + buf: make([]byte, bufSize), + n: 0, Error: nil, indention: 0, } @@ -37,27 +38,22 @@ func (stream *Stream) Pool() StreamPool { // Reset reuse this stream instance by assign a new writer func (stream *Stream) Reset(out io.Writer) { stream.out = out - stream.buf = stream.buf[:0] + stream.n = 0 } // Available returns how many bytes are unused in the buffer. func (stream *Stream) Available() int { - return cap(stream.buf) - len(stream.buf) + return len(stream.buf) - stream.n } // Buffered returns the number of bytes that have been written into the current buffer. func (stream *Stream) Buffered() int { - return len(stream.buf) + return stream.n } // Buffer if writer is nil, use this method to take the result func (stream *Stream) Buffer() []byte { - return stream.buf -} - -// SetBuffer allows to append to the internal buffer directly -func (stream *Stream) SetBuffer(buf []byte) { - stream.buf = buf + return stream.buf[:stream.n] } // Write writes the contents of p into the buffer. @@ -65,34 +61,97 @@ func (stream *Stream) SetBuffer(buf []byte) { // If nn < len(p), it also returns an error explaining // why the write is short. func (stream *Stream) Write(p []byte) (nn int, err error) { - stream.buf = append(stream.buf, p...) - if stream.out != nil { - nn, err = stream.out.Write(stream.buf) - stream.buf = stream.buf[nn:] - return + for len(p) > stream.Available() && stream.Error == nil { + if stream.out == nil { + stream.growAtLeast(len(p)) + } else { + var n int + if stream.Buffered() == 0 { + // Large write, empty buffer. + // Write directly from p to avoid copy. + n, stream.Error = stream.out.Write(p) + } else { + n = copy(stream.buf[stream.n:], p) + stream.n += n + stream.Flush() + } + nn += n + p = p[n:] + } } - return len(p), nil + if stream.Error != nil { + return nn, stream.Error + } + n := copy(stream.buf[stream.n:], p) + stream.n += n + nn += n + return nn, nil } // WriteByte writes a single byte. func (stream *Stream) writeByte(c byte) { - stream.buf = append(stream.buf, c) + if stream.Error != nil { + return + } + if stream.Available() < 1 { + stream.growAtLeast(1) + } + stream.buf[stream.n] = c + stream.n++ } func (stream *Stream) writeTwoBytes(c1 byte, c2 byte) { - stream.buf = append(stream.buf, c1, c2) + if stream.Error != nil { + return + } + if stream.Available() < 2 { + stream.growAtLeast(2) + } + stream.buf[stream.n] = c1 + stream.buf[stream.n+1] = c2 + stream.n += 2 } func (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) { - stream.buf = append(stream.buf, c1, c2, c3) + if stream.Error != nil { + return + } + if stream.Available() < 3 { + stream.growAtLeast(3) + } + stream.buf[stream.n] = c1 + stream.buf[stream.n+1] = c2 + stream.buf[stream.n+2] = c3 + stream.n += 3 } func (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) { - stream.buf = append(stream.buf, c1, c2, c3, c4) + if stream.Error != nil { + return + } + if stream.Available() < 4 { + stream.growAtLeast(4) + } + stream.buf[stream.n] = c1 + stream.buf[stream.n+1] = c2 + stream.buf[stream.n+2] = c3 + stream.buf[stream.n+3] = c4 + stream.n += 4 } func (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) { - stream.buf = append(stream.buf, c1, c2, c3, c4, c5) + if stream.Error != nil { + return + } + if stream.Available() < 5 { + stream.growAtLeast(5) + } + stream.buf[stream.n] = c1 + stream.buf[stream.n+1] = c2 + stream.buf[stream.n+2] = c3 + stream.buf[stream.n+3] = c4 + stream.buf[stream.n+4] = c5 + stream.n += 5 } // Flush writes any buffered data to the underlying io.Writer. @@ -103,20 +162,53 @@ func (stream *Stream) Flush() error { if stream.Error != nil { return stream.Error } - n, err := stream.out.Write(stream.buf) + if stream.n == 0 { + return nil + } + n, err := stream.out.Write(stream.buf[0:stream.n]) + if n < stream.n && err == nil { + err = io.ErrShortWrite + } if err != nil { - if stream.Error == nil { - stream.Error = err + if n > 0 && n < stream.n { + copy(stream.buf[0:stream.n-n], stream.buf[n:stream.n]) } + stream.n -= n + stream.Error = err return err } - stream.buf = stream.buf[n:] + stream.n = 0 return nil } +func (stream *Stream) ensure(minimal int) { + available := stream.Available() + if available < minimal { + stream.growAtLeast(minimal) + } +} + +func (stream *Stream) growAtLeast(minimal int) { + if stream.out != nil { + stream.Flush() + } + toGrow := len(stream.buf) + if toGrow < minimal { + toGrow = minimal + } + newBuf := make([]byte, len(stream.buf)+toGrow) + copy(newBuf, stream.Buffer()) + stream.buf = newBuf +} + // WriteRaw write string out without quotes, just like []byte func (stream *Stream) WriteRaw(s string) { - stream.buf = append(stream.buf, s...) + stream.ensure(len(s)) + if stream.Error != nil { + return + } + n := copy(stream.buf[stream.n:], s) + stream.n += n } // WriteNil write null to stream @@ -177,7 +269,6 @@ func (stream *Stream) WriteEmptyObject() { func (stream *Stream) WriteMore() { stream.writeByte(',') stream.writeIndention(0) - stream.Flush() } // WriteArrayStart write [ with possible indention @@ -189,7 +280,8 @@ func (stream *Stream) WriteArrayStart() { // WriteEmptyArray write [] func (stream *Stream) WriteEmptyArray() { - stream.writeTwoBytes('[', ']') + stream.writeByte('[') + stream.writeByte(']') } // WriteArrayEnd write ] with possible indention @@ -205,7 +297,9 @@ func (stream *Stream) writeIndention(delta int) { } stream.writeByte('\n') toWrite := stream.indention - delta - for i := 0; i < toWrite; i++ { - stream.buf = append(stream.buf, ' ') + stream.ensure(toWrite) + for i := 0; i < toWrite && stream.n < len(stream.buf); i++ { + stream.buf[stream.n] = ' ' + stream.n++ } } diff --git a/vendor/github.com/json-iterator/go/stream_float.go b/vendor/github.com/json-iterator/go/feature_stream_float.go similarity index 85% rename from vendor/github.com/json-iterator/go/stream_float.go rename to vendor/github.com/json-iterator/go/feature_stream_float.go index f318d2c59..9a404e11d 100644 --- a/vendor/github.com/json-iterator/go/stream_float.go +++ b/vendor/github.com/json-iterator/go/feature_stream_float.go @@ -21,7 +21,7 @@ func (stream *Stream) WriteFloat32(val float32) { fmt = 'e' } } - stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32) + stream.WriteRaw(strconv.FormatFloat(float64(val), fmt, -1, 32)) } // WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster @@ -43,12 +43,13 @@ func (stream *Stream) WriteFloat32Lossy(val float32) { return } stream.writeByte('.') + stream.ensure(10) for p := precision - 1; p > 0 && fval < pow10[p]; p-- { stream.writeByte('0') } stream.WriteUint64(fval) - for stream.buf[len(stream.buf)-1] == '0' { - stream.buf = stream.buf[:len(stream.buf)-1] + for stream.buf[stream.n-1] == '0' { + stream.n-- } } @@ -62,7 +63,7 @@ func (stream *Stream) WriteFloat64(val float64) { fmt = 'e' } } - stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64) + stream.WriteRaw(strconv.FormatFloat(float64(val), fmt, -1, 64)) } // WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster @@ -84,11 +85,12 @@ func (stream *Stream) WriteFloat64Lossy(val float64) { return } stream.writeByte('.') + stream.ensure(10) for p := precision - 1; p > 0 && fval < pow10[p]; p-- { stream.writeByte('0') } stream.WriteUint64(fval) - for stream.buf[len(stream.buf)-1] == '0' { - stream.buf = stream.buf[:len(stream.buf)-1] + for stream.buf[stream.n-1] == '0' { + stream.n-- } } diff --git a/vendor/github.com/json-iterator/go/feature_stream_int.go b/vendor/github.com/json-iterator/go/feature_stream_int.go new file mode 100644 index 000000000..7cfd522c1 --- /dev/null +++ b/vendor/github.com/json-iterator/go/feature_stream_int.go @@ -0,0 +1,320 @@ +package jsoniter + +var digits []uint32 + +func init() { + digits = make([]uint32, 1000) + for i := uint32(0); i < 1000; i++ { + digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' + if i < 10 { + digits[i] += 2 << 24 + } else if i < 100 { + digits[i] += 1 << 24 + } + } +} + +func writeFirstBuf(buf []byte, v uint32, n int) int { + start := v >> 24 + if start == 0 { + buf[n] = byte(v >> 16) + n++ + buf[n] = byte(v >> 8) + n++ + } else if start == 1 { + buf[n] = byte(v >> 8) + n++ + } + buf[n] = byte(v) + n++ + return n +} + +func writeBuf(buf []byte, v uint32, n int) { + buf[n] = byte(v >> 16) + buf[n+1] = byte(v >> 8) + buf[n+2] = byte(v) +} + +// WriteUint8 write uint8 to stream +func (stream *Stream) WriteUint8(val uint8) { + stream.ensure(3) + stream.n = writeFirstBuf(stream.buf, digits[val], stream.n) +} + +// WriteInt8 write int8 to stream +func (stream *Stream) WriteInt8(nval int8) { + stream.ensure(4) + n := stream.n + var val uint8 + if nval < 0 { + val = uint8(-nval) + stream.buf[n] = '-' + n++ + } else { + val = uint8(nval) + } + stream.n = writeFirstBuf(stream.buf, digits[val], n) +} + +// WriteUint16 write uint16 to stream +func (stream *Stream) WriteUint16(val uint16) { + stream.ensure(5) + q1 := val / 1000 + if q1 == 0 { + stream.n = writeFirstBuf(stream.buf, digits[val], stream.n) + return + } + r1 := val - q1*1000 + n := writeFirstBuf(stream.buf, digits[q1], stream.n) + writeBuf(stream.buf, digits[r1], n) + stream.n = n + 3 + return +} + +// WriteInt16 write int16 to stream +func (stream *Stream) WriteInt16(nval int16) { + stream.ensure(6) + n := stream.n + var val uint16 + if nval < 0 { + val = uint16(-nval) + stream.buf[n] = '-' + n++ + } else { + val = uint16(nval) + } + q1 := val / 1000 + if q1 == 0 { + stream.n = writeFirstBuf(stream.buf, digits[val], n) + return + } + r1 := val - q1*1000 + n = writeFirstBuf(stream.buf, digits[q1], n) + writeBuf(stream.buf, digits[r1], n) + stream.n = n + 3 + return +} + +// WriteUint32 write uint32 to stream +func (stream *Stream) WriteUint32(val uint32) { + stream.ensure(10) + n := stream.n + q1 := val / 1000 + if q1 == 0 { + stream.n = writeFirstBuf(stream.buf, digits[val], n) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + n := writeFirstBuf(stream.buf, digits[q1], n) + writeBuf(stream.buf, digits[r1], n) + stream.n = n + 3 + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + n = writeFirstBuf(stream.buf, digits[q2], n) + } else { + r3 := q2 - q3*1000 + stream.buf[n] = byte(q3 + '0') + n++ + writeBuf(stream.buf, digits[r3], n) + n += 3 + } + writeBuf(stream.buf, digits[r2], n) + writeBuf(stream.buf, digits[r1], n+3) + stream.n = n + 6 +} + +// WriteInt32 write int32 to stream +func (stream *Stream) WriteInt32(nval int32) { + stream.ensure(11) + n := stream.n + var val uint32 + if nval < 0 { + val = uint32(-nval) + stream.buf[n] = '-' + n++ + } else { + val = uint32(nval) + } + q1 := val / 1000 + if q1 == 0 { + stream.n = writeFirstBuf(stream.buf, digits[val], n) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + n := writeFirstBuf(stream.buf, digits[q1], n) + writeBuf(stream.buf, digits[r1], n) + stream.n = n + 3 + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + n = writeFirstBuf(stream.buf, digits[q2], n) + } else { + r3 := q2 - q3*1000 + stream.buf[n] = byte(q3 + '0') + n++ + writeBuf(stream.buf, digits[r3], n) + n += 3 + } + writeBuf(stream.buf, digits[r2], n) + writeBuf(stream.buf, digits[r1], n+3) + stream.n = n + 6 +} + +// WriteUint64 write uint64 to stream +func (stream *Stream) WriteUint64(val uint64) { + stream.ensure(20) + n := stream.n + q1 := val / 1000 + if q1 == 0 { + stream.n = writeFirstBuf(stream.buf, digits[val], n) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + n := writeFirstBuf(stream.buf, digits[q1], n) + writeBuf(stream.buf, digits[r1], n) + stream.n = n + 3 + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + n = writeFirstBuf(stream.buf, digits[q2], n) + writeBuf(stream.buf, digits[r2], n) + writeBuf(stream.buf, digits[r1], n+3) + stream.n = n + 6 + return + } + r3 := q2 - q3*1000 + q4 := q3 / 1000 + if q4 == 0 { + n = writeFirstBuf(stream.buf, digits[q3], n) + writeBuf(stream.buf, digits[r3], n) + writeBuf(stream.buf, digits[r2], n+3) + writeBuf(stream.buf, digits[r1], n+6) + stream.n = n + 9 + return + } + r4 := q3 - q4*1000 + q5 := q4 / 1000 + if q5 == 0 { + n = writeFirstBuf(stream.buf, digits[q4], n) + writeBuf(stream.buf, digits[r4], n) + writeBuf(stream.buf, digits[r3], n+3) + writeBuf(stream.buf, digits[r2], n+6) + writeBuf(stream.buf, digits[r1], n+9) + stream.n = n + 12 + return + } + r5 := q4 - q5*1000 + q6 := q5 / 1000 + if q6 == 0 { + n = writeFirstBuf(stream.buf, digits[q5], n) + } else { + n = writeFirstBuf(stream.buf, digits[q6], n) + r6 := q5 - q6*1000 + writeBuf(stream.buf, digits[r6], n) + n += 3 + } + writeBuf(stream.buf, digits[r5], n) + writeBuf(stream.buf, digits[r4], n+3) + writeBuf(stream.buf, digits[r3], n+6) + writeBuf(stream.buf, digits[r2], n+9) + writeBuf(stream.buf, digits[r1], n+12) + stream.n = n + 15 +} + +// WriteInt64 write int64 to stream +func (stream *Stream) WriteInt64(nval int64) { + stream.ensure(20) + n := stream.n + var val uint64 + if nval < 0 { + val = uint64(-nval) + stream.buf[n] = '-' + n++ + } else { + val = uint64(nval) + } + q1 := val / 1000 + if q1 == 0 { + stream.n = writeFirstBuf(stream.buf, digits[val], n) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + n := writeFirstBuf(stream.buf, digits[q1], n) + writeBuf(stream.buf, digits[r1], n) + stream.n = n + 3 + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + n = writeFirstBuf(stream.buf, digits[q2], n) + writeBuf(stream.buf, digits[r2], n) + writeBuf(stream.buf, digits[r1], n+3) + stream.n = n + 6 + return + } + r3 := q2 - q3*1000 + q4 := q3 / 1000 + if q4 == 0 { + n = writeFirstBuf(stream.buf, digits[q3], n) + writeBuf(stream.buf, digits[r3], n) + writeBuf(stream.buf, digits[r2], n+3) + writeBuf(stream.buf, digits[r1], n+6) + stream.n = n + 9 + return + } + r4 := q3 - q4*1000 + q5 := q4 / 1000 + if q5 == 0 { + n = writeFirstBuf(stream.buf, digits[q4], n) + writeBuf(stream.buf, digits[r4], n) + writeBuf(stream.buf, digits[r3], n+3) + writeBuf(stream.buf, digits[r2], n+6) + writeBuf(stream.buf, digits[r1], n+9) + stream.n = n + 12 + return + } + r5 := q4 - q5*1000 + q6 := q5 / 1000 + if q6 == 0 { + n = writeFirstBuf(stream.buf, digits[q5], n) + } else { + stream.buf[n] = byte(q6 + '0') + n++ + r6 := q5 - q6*1000 + writeBuf(stream.buf, digits[r6], n) + n += 3 + } + writeBuf(stream.buf, digits[r5], n) + writeBuf(stream.buf, digits[r4], n+3) + writeBuf(stream.buf, digits[r3], n+6) + writeBuf(stream.buf, digits[r2], n+9) + writeBuf(stream.buf, digits[r1], n+12) + stream.n = n + 15 +} + +// WriteInt write int to stream +func (stream *Stream) WriteInt(val int) { + stream.WriteInt64(int64(val)) +} + +// WriteUint write uint to stream +func (stream *Stream) WriteUint(val uint) { + stream.WriteUint64(uint64(val)) +} diff --git a/vendor/github.com/json-iterator/go/stream_str.go b/vendor/github.com/json-iterator/go/feature_stream_string.go similarity index 91% rename from vendor/github.com/json-iterator/go/stream_str.go rename to vendor/github.com/json-iterator/go/feature_stream_string.go index 54c2ba0b3..334282f05 100644 --- a/vendor/github.com/json-iterator/go/stream_str.go +++ b/vendor/github.com/json-iterator/go/feature_stream_string.go @@ -219,22 +219,34 @@ var hex = "0123456789abcdef" // WriteStringWithHTMLEscaped write string to stream with html special characters escaped func (stream *Stream) WriteStringWithHTMLEscaped(s string) { + stream.ensure(32) valLen := len(s) - stream.buf = append(stream.buf, '"') + toWriteLen := valLen + bufLengthMinusTwo := len(stream.buf) - 2 // make room for the quotes + if stream.n+toWriteLen > bufLengthMinusTwo { + toWriteLen = bufLengthMinusTwo - stream.n + } + n := stream.n + stream.buf[n] = '"' + n++ // write string, the fast path, without utf8 and escape support i := 0 - for ; i < valLen; i++ { + for ; i < toWriteLen; i++ { c := s[i] if c < utf8.RuneSelf && htmlSafeSet[c] { - stream.buf = append(stream.buf, c) + stream.buf[n] = c + n++ } else { break } } if i == valLen { - stream.buf = append(stream.buf, '"') + stream.buf[n] = '"' + n++ + stream.n = n return } + stream.n = n writeStringSlowPathWithHTMLEscaped(stream, i, s, valLen) } @@ -309,22 +321,34 @@ func writeStringSlowPathWithHTMLEscaped(stream *Stream, i int, s string, valLen // WriteString write string to stream without html escape func (stream *Stream) WriteString(s string) { + stream.ensure(32) valLen := len(s) - stream.buf = append(stream.buf, '"') + toWriteLen := valLen + bufLengthMinusTwo := len(stream.buf) - 2 // make room for the quotes + if stream.n+toWriteLen > bufLengthMinusTwo { + toWriteLen = bufLengthMinusTwo - stream.n + } + n := stream.n + stream.buf[n] = '"' + n++ // write string, the fast path, without utf8 and escape support i := 0 - for ; i < valLen; i++ { + for ; i < toWriteLen; i++ { c := s[i] if c > 31 && c != '"' && c != '\\' { - stream.buf = append(stream.buf, c) + stream.buf[n] = c + n++ } else { break } } if i == valLen { - stream.buf = append(stream.buf, '"') + stream.buf[n] = '"' + n++ + stream.n = n return } + stream.n = n writeStringSlowPath(stream, i, s, valLen) } diff --git a/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md b/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md new file mode 100644 index 000000000..3095662b0 --- /dev/null +++ b/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md @@ -0,0 +1,7 @@ +| json type \ dest type | bool | int | uint | float |string| +| --- | --- | --- | --- |--|--| +| number | positive => true
negative => true
zero => false| 23.2 => 23
-32.1 => -32| 12.1 => 12
-12.1 => 0|as normal|same as origin| +| string | empty string => false
string "0" => false
other strings => true | "123.32" => 123
"-123.4" => -123
"123.23xxxw" => 123
"abcde12" => 0
"-32.1" => -32| 13.2 => 13
-1.1 => 0 |12.1 => 12.1
-12.3 => -12.3
12.4xxa => 12.4
+1.1e2 =>110 |same as origin| +| bool | true => true
false => false| true => 1
false => 0 | true => 1
false => 0 |true => 1
false => 0|true => "true"
false => "false"| +| object | true | 0 | 0 |0|originnal json| +| array | empty array => false
nonempty array => true| [] => 0
[1,2] => 1 | [] => 0
[1,2] => 1 |[] => 0
[1,2] => 1|original json| \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/reflect.go b/vendor/github.com/json-iterator/go/reflect.go deleted file mode 100644 index 4459e203f..000000000 --- a/vendor/github.com/json-iterator/go/reflect.go +++ /dev/null @@ -1,332 +0,0 @@ -package jsoniter - -import ( - "fmt" - "reflect" - "unsafe" - - "github.com/modern-go/reflect2" -) - -// ValDecoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValDecoder with json.Decoder. -// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). -// -// Reflection on type to create decoders, which is then cached -// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions -// 1. create instance of new value, for example *int will need a int to be allocated -// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New -// 3. assignment to map, both key and value will be reflect.Value -// For a simple struct binding, it will be reflect.Value free and allocation free -type ValDecoder interface { - Decode(ptr unsafe.Pointer, iter *Iterator) -} - -// ValEncoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValEncoder with json.Encoder. -// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). -type ValEncoder interface { - IsEmpty(ptr unsafe.Pointer) bool - Encode(ptr unsafe.Pointer, stream *Stream) -} - -type checkIsEmpty interface { - IsEmpty(ptr unsafe.Pointer) bool -} - -type ctx struct { - *frozenConfig - prefix string - encoders map[reflect2.Type]ValEncoder - decoders map[reflect2.Type]ValDecoder -} - -func (b *ctx) caseSensitive() bool { - if b.frozenConfig == nil { - // default is case-insensitive - return false - } - return b.frozenConfig.caseSensitive -} - -func (b *ctx) append(prefix string) *ctx { - return &ctx{ - frozenConfig: b.frozenConfig, - prefix: b.prefix + " " + prefix, - encoders: b.encoders, - decoders: b.decoders, - } -} - -// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal -func (iter *Iterator) ReadVal(obj interface{}) { - cacheKey := reflect2.RTypeOf(obj) - decoder := iter.cfg.getDecoderFromCache(cacheKey) - if decoder == nil { - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - iter.ReportError("ReadVal", "can only unmarshal into pointer") - return - } - decoder = iter.cfg.DecoderOf(typ) - } - ptr := reflect2.PtrOf(obj) - if ptr == nil { - iter.ReportError("ReadVal", "can not read into nil pointer") - return - } - decoder.Decode(ptr, iter) -} - -// WriteVal copy the go interface into underlying JSON, same as json.Marshal -func (stream *Stream) WriteVal(val interface{}) { - if nil == val { - stream.WriteNil() - return - } - cacheKey := reflect2.RTypeOf(val) - encoder := stream.cfg.getEncoderFromCache(cacheKey) - if encoder == nil { - typ := reflect2.TypeOf(val) - encoder = stream.cfg.EncoderOf(typ) - } - encoder.Encode(reflect2.PtrOf(val), stream) -} - -func (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder { - cacheKey := typ.RType() - decoder := cfg.getDecoderFromCache(cacheKey) - if decoder != nil { - return decoder - } - ctx := &ctx{ - frozenConfig: cfg, - prefix: "", - decoders: map[reflect2.Type]ValDecoder{}, - encoders: map[reflect2.Type]ValEncoder{}, - } - ptrType := typ.(*reflect2.UnsafePtrType) - decoder = decoderOfType(ctx, ptrType.Elem()) - cfg.addDecoderToCache(cacheKey, decoder) - return decoder -} - -func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := getTypeDecoderFromExtension(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfType(ctx, typ) - for _, extension := range extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - decoder = ctx.decoderExtension.DecorateDecoder(typ, decoder) - for _, extension := range ctx.extraExtensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - return decoder -} - -func createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := ctx.decoders[typ] - if decoder != nil { - return decoder - } - placeholder := &placeholderDecoder{} - ctx.decoders[typ] = placeholder - decoder = _createDecoderOfType(ctx, typ) - placeholder.decoder = decoder - return decoder -} - -func _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := createDecoderOfJsonRawMessage(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfJsonNumber(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfMarshaler(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfAny(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfNative(ctx, typ) - if decoder != nil { - return decoder - } - switch typ.Kind() { - case reflect.Interface: - ifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType) - if isIFace { - return &ifaceDecoder{valType: ifaceType} - } - return &efaceDecoder{} - case reflect.Struct: - return decoderOfStruct(ctx, typ) - case reflect.Array: - return decoderOfArray(ctx, typ) - case reflect.Slice: - return decoderOfSlice(ctx, typ) - case reflect.Map: - return decoderOfMap(ctx, typ) - case reflect.Ptr: - return decoderOfOptional(ctx, typ) - default: - return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} - } -} - -func (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder { - cacheKey := typ.RType() - encoder := cfg.getEncoderFromCache(cacheKey) - if encoder != nil { - return encoder - } - ctx := &ctx{ - frozenConfig: cfg, - prefix: "", - decoders: map[reflect2.Type]ValDecoder{}, - encoders: map[reflect2.Type]ValEncoder{}, - } - encoder = encoderOfType(ctx, typ) - if typ.LikePtr() { - encoder = &onePtrEncoder{encoder} - } - cfg.addEncoderToCache(cacheKey, encoder) - return encoder -} - -type onePtrEncoder struct { - encoder ValEncoder -} - -func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) -} - -func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) -} - -func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := getTypeEncoderFromExtension(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfType(ctx, typ) - for _, extension := range extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - encoder = ctx.encoderExtension.DecorateEncoder(typ, encoder) - for _, extension := range ctx.extraExtensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - return encoder -} - -func createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := ctx.encoders[typ] - if encoder != nil { - return encoder - } - placeholder := &placeholderEncoder{} - ctx.encoders[typ] = placeholder - encoder = _createEncoderOfType(ctx, typ) - placeholder.encoder = encoder - return encoder -} -func _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := createEncoderOfJsonRawMessage(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfJsonNumber(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfMarshaler(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfAny(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfNative(ctx, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{typ} - case reflect.Struct: - return encoderOfStruct(ctx, typ) - case reflect.Array: - return encoderOfArray(ctx, typ) - case reflect.Slice: - return encoderOfSlice(ctx, typ) - case reflect.Map: - return encoderOfMap(ctx, typ) - case reflect.Ptr: - return encoderOfOptional(ctx, typ) - default: - return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} - } -} - -type lazyErrorDecoder struct { - err error -} - -func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.WhatIsNext() != NilValue { - if iter.Error == nil { - iter.Error = decoder.err - } - } else { - iter.Skip() - } -} - -type lazyErrorEncoder struct { - err error -} - -func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if ptr == nil { - stream.WriteNil() - } else if stream.Error == nil { - stream.Error = encoder.err - } -} - -func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type placeholderDecoder struct { - decoder ValDecoder -} - -func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.decoder.Decode(ptr, iter) -} - -type placeholderEncoder struct { - encoder ValEncoder -} - -func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(ptr, stream) -} - -func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(ptr) -} diff --git a/vendor/github.com/json-iterator/go/reflect_array.go b/vendor/github.com/json-iterator/go/reflect_array.go deleted file mode 100644 index 13a0b7b08..000000000 --- a/vendor/github.com/json-iterator/go/reflect_array.go +++ /dev/null @@ -1,104 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "unsafe" -) - -func decoderOfArray(ctx *ctx, typ reflect2.Type) ValDecoder { - arrayType := typ.(*reflect2.UnsafeArrayType) - decoder := decoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) - return &arrayDecoder{arrayType, decoder} -} - -func encoderOfArray(ctx *ctx, typ reflect2.Type) ValEncoder { - arrayType := typ.(*reflect2.UnsafeArrayType) - if arrayType.Len() == 0 { - return emptyArrayEncoder{} - } - encoder := encoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) - return &arrayEncoder{arrayType, encoder} -} - -type emptyArrayEncoder struct{} - -func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteEmptyArray() -} - -func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return true -} - -type arrayEncoder struct { - arrayType *reflect2.UnsafeArrayType - elemEncoder ValEncoder -} - -func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteArrayStart() - elemPtr := unsafe.Pointer(ptr) - encoder.elemEncoder.Encode(elemPtr, stream) - for i := 1; i < encoder.arrayType.Len(); i++ { - stream.WriteMore() - elemPtr = encoder.arrayType.UnsafeGetIndex(ptr, i) - encoder.elemEncoder.Encode(elemPtr, stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) - } -} - -func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type arrayDecoder struct { - arrayType *reflect2.UnsafeArrayType - elemDecoder ValDecoder -} - -func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) - } -} - -func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - arrayType := decoder.arrayType - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return - } - if c != '[' { - iter.ReportError("decode array", "expect [ or n, but found "+string([]byte{c})) - return - } - c = iter.nextToken() - if c == ']' { - return - } - iter.unreadByte() - elemPtr := arrayType.UnsafeGetIndex(ptr, 0) - decoder.elemDecoder.Decode(elemPtr, iter) - length := 1 - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - if length >= arrayType.Len() { - iter.Skip() - continue - } - idx := length - length += 1 - elemPtr = arrayType.UnsafeGetIndex(ptr, idx) - decoder.elemDecoder.Decode(elemPtr, iter) - } - if c != ']' { - iter.ReportError("decode array", "expect ], but found "+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_dynamic.go b/vendor/github.com/json-iterator/go/reflect_dynamic.go deleted file mode 100644 index 8b6bc8b43..000000000 --- a/vendor/github.com/json-iterator/go/reflect_dynamic.go +++ /dev/null @@ -1,70 +0,0 @@ -package jsoniter - -import ( - "github.com/modern-go/reflect2" - "reflect" - "unsafe" -) - -type dynamicEncoder struct { - valType reflect2.Type -} - -func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - stream.WriteVal(obj) -} - -func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.valType.UnsafeIndirect(ptr) == nil -} - -type efaceDecoder struct { -} - -func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - pObj := (*interface{})(ptr) - obj := *pObj - if obj == nil { - *pObj = iter.Read() - return - } - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - *pObj = iter.Read() - return - } - ptrType := typ.(*reflect2.UnsafePtrType) - ptrElemType := ptrType.Elem() - if iter.WhatIsNext() == NilValue { - if ptrElemType.Kind() != reflect.Ptr { - iter.skipFourBytes('n', 'u', 'l', 'l') - *pObj = nil - return - } - } - if reflect2.IsNil(obj) { - obj := ptrElemType.New() - iter.ReadVal(obj) - *pObj = obj - return - } - iter.ReadVal(obj) -} - -type ifaceDecoder struct { - valType *reflect2.UnsafeIFaceType -} - -func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew()) - return - } - obj := decoder.valType.UnsafeIndirect(ptr) - if reflect2.IsNil(obj) { - iter.ReportError("decode non empty interface", "can not unmarshal into nil") - return - } - iter.ReadVal(obj) -} diff --git a/vendor/github.com/json-iterator/go/reflect_json_number.go b/vendor/github.com/json-iterator/go/reflect_json_number.go deleted file mode 100644 index 98d45c1ec..000000000 --- a/vendor/github.com/json-iterator/go/reflect_json_number.go +++ /dev/null @@ -1,112 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "github.com/modern-go/reflect2" - "strconv" - "unsafe" -) - -type Number string - -// String returns the literal text of the number. -func (n Number) String() string { return string(n) } - -// Float64 returns the number as a float64. -func (n Number) Float64() (float64, error) { - return strconv.ParseFloat(string(n), 64) -} - -// Int64 returns the number as an int64. -func (n Number) Int64() (int64, error) { - return strconv.ParseInt(string(n), 10, 64) -} - -func CastJsonNumber(val interface{}) (string, bool) { - switch typedVal := val.(type) { - case json.Number: - return string(typedVal), true - case Number: - return string(typedVal), true - } - return "", false -} - -var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem() -var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem() - -func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{} - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{} - } - return nil -} - -func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{} - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{} - } - return nil -} - -type jsonNumberCodec struct { -} - -func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*json.Number)(ptr)) = json.Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*json.Number)(ptr)) = "" - default: - *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - number := *((*json.Number)(ptr)) - if len(number) == 0 { - stream.writeByte('0') - } else { - stream.WriteRaw(string(number)) - } -} - -func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.Number)(ptr))) == 0 -} - -type jsoniterNumberCodec struct { -} - -func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*Number)(ptr)) = Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*Number)(ptr)) = "" - default: - *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - number := *((*Number)(ptr)) - if len(number) == 0 { - stream.writeByte('0') - } else { - stream.WriteRaw(string(number)) - } -} - -func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*Number)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go deleted file mode 100644 index f2619936c..000000000 --- a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go +++ /dev/null @@ -1,60 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "github.com/modern-go/reflect2" - "unsafe" -) - -var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem() -var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem() - -func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{} - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{} - } - return nil -} - -func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{} - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{} - } - return nil -} - -type jsonRawMessageCodec struct { -} - -func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) -} - -func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.RawMessage)(ptr))) == 0 -} - -type jsoniterRawMessageCodec struct { -} - -func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*RawMessage)(ptr)))) -} - -func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*RawMessage)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_map.go b/vendor/github.com/json-iterator/go/reflect_map.go deleted file mode 100644 index 7f66a88b0..000000000 --- a/vendor/github.com/json-iterator/go/reflect_map.go +++ /dev/null @@ -1,326 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "sort" - "unsafe" -) - -func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder { - mapType := typ.(*reflect2.UnsafeMapType) - keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()) - elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem()) - return &mapDecoder{ - mapType: mapType, - keyType: mapType.Key(), - elemType: mapType.Elem(), - keyDecoder: keyDecoder, - elemDecoder: elemDecoder, - } -} - -func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder { - mapType := typ.(*reflect2.UnsafeMapType) - if ctx.sortMapKeys { - return &sortKeysMapEncoder{ - mapType: mapType, - keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), - elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), - } - } - return &mapEncoder{ - mapType: mapType, - keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), - elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), - } -} - -func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := ctx.decoderExtension.CreateMapKeyDecoder(typ) - if decoder != nil { - return decoder - } - for _, extension := range ctx.extraExtensions { - decoder := extension.CreateMapKeyDecoder(typ) - if decoder != nil { - return decoder - } - } - switch typ.Kind() { - case reflect.String: - return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) - case reflect.Bool, - reflect.Uint8, reflect.Int8, - reflect.Uint16, reflect.Int16, - reflect.Uint32, reflect.Int32, - reflect.Uint64, reflect.Int64, - reflect.Uint, reflect.Int, - reflect.Float32, reflect.Float64, - reflect.Uintptr: - typ = reflect2.DefaultTypeOfKind(typ.Kind()) - return &numericMapKeyDecoder{decoderOfType(ctx, typ)} - default: - ptrType := reflect2.PtrTo(typ) - if ptrType.Implements(textMarshalerType) { - return &referenceDecoder{ - &textUnmarshalerDecoder{ - valType: ptrType, - }, - } - } - if typ.Implements(textMarshalerType) { - return &textUnmarshalerDecoder{ - valType: typ, - } - } - return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)} - } -} - -func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := ctx.encoderExtension.CreateMapKeyEncoder(typ) - if encoder != nil { - return encoder - } - for _, extension := range ctx.extraExtensions { - encoder := extension.CreateMapKeyEncoder(typ) - if encoder != nil { - return encoder - } - } - switch typ.Kind() { - case reflect.String: - return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) - case reflect.Bool, - reflect.Uint8, reflect.Int8, - reflect.Uint16, reflect.Int16, - reflect.Uint32, reflect.Int32, - reflect.Uint64, reflect.Int64, - reflect.Uint, reflect.Int, - reflect.Float32, reflect.Float64, - reflect.Uintptr: - typ = reflect2.DefaultTypeOfKind(typ.Kind()) - return &numericMapKeyEncoder{encoderOfType(ctx, typ)} - default: - if typ == textMarshalerType { - return &directTextMarshalerEncoder{ - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - } - if typ.Implements(textMarshalerType) { - return &textMarshalerEncoder{ - valType: typ, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - } - if typ.Kind() == reflect.Interface { - return &dynamicMapKeyEncoder{ctx, typ} - } - return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)} - } -} - -type mapDecoder struct { - mapType *reflect2.UnsafeMapType - keyType reflect2.Type - elemType reflect2.Type - keyDecoder ValDecoder - elemDecoder ValDecoder -} - -func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - mapType := decoder.mapType - c := iter.nextToken() - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - *(*unsafe.Pointer)(ptr) = nil - mapType.UnsafeSet(ptr, mapType.UnsafeNew()) - return - } - if mapType.UnsafeIsNil(ptr) { - mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0)) - } - if c != '{' { - iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) - return - } - c = iter.nextToken() - if c == '}' { - return - } - if c != '"' { - iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) - return - } - iter.unreadByte() - key := decoder.keyType.UnsafeNew() - decoder.keyDecoder.Decode(key, iter) - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return - } - elem := decoder.elemType.UnsafeNew() - decoder.elemDecoder.Decode(elem, iter) - decoder.mapType.UnsafeSetIndex(ptr, key, elem) - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - key := decoder.keyType.UnsafeNew() - decoder.keyDecoder.Decode(key, iter) - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return - } - elem := decoder.elemType.UnsafeNew() - decoder.elemDecoder.Decode(elem, iter) - decoder.mapType.UnsafeSetIndex(ptr, key, elem) - } - if c != '}' { - iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c})) - } -} - -type numericMapKeyDecoder struct { - decoder ValDecoder -} - -func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) - return - } - decoder.decoder.Decode(ptr, iter) - c = iter.nextToken() - if c != '"' { - iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) - return - } -} - -type numericMapKeyEncoder struct { - encoder ValEncoder -} - -func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.encoder.Encode(ptr, stream) - stream.writeByte('"') -} - -func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type dynamicMapKeyEncoder struct { - ctx *ctx - valType reflect2.Type -} - -func (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream) -} - -func (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { - obj := encoder.valType.UnsafeIndirect(ptr) - return encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj)) -} - -type mapEncoder struct { - mapType *reflect2.UnsafeMapType - keyEncoder ValEncoder - elemEncoder ValEncoder -} - -func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteObjectStart() - iter := encoder.mapType.UnsafeIterate(ptr) - for i := 0; iter.HasNext(); i++ { - if i != 0 { - stream.WriteMore() - } - key, elem := iter.UnsafeNext() - encoder.keyEncoder.Encode(key, stream) - if stream.indention > 0 { - stream.writeTwoBytes(byte(':'), byte(' ')) - } else { - stream.writeByte(':') - } - encoder.elemEncoder.Encode(elem, stream) - } - stream.WriteObjectEnd() -} - -func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - iter := encoder.mapType.UnsafeIterate(ptr) - return !iter.HasNext() -} - -type sortKeysMapEncoder struct { - mapType *reflect2.UnsafeMapType - keyEncoder ValEncoder - elemEncoder ValEncoder -} - -func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *(*unsafe.Pointer)(ptr) == nil { - stream.WriteNil() - return - } - stream.WriteObjectStart() - mapIter := encoder.mapType.UnsafeIterate(ptr) - subStream := stream.cfg.BorrowStream(nil) - subIter := stream.cfg.BorrowIterator(nil) - keyValues := encodedKeyValues{} - for mapIter.HasNext() { - subStream.buf = make([]byte, 0, 64) - key, elem := mapIter.UnsafeNext() - encoder.keyEncoder.Encode(key, subStream) - if subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil { - stream.Error = subStream.Error - } - encodedKey := subStream.Buffer() - subIter.ResetBytes(encodedKey) - decodedKey := subIter.ReadString() - if stream.indention > 0 { - subStream.writeTwoBytes(byte(':'), byte(' ')) - } else { - subStream.writeByte(':') - } - encoder.elemEncoder.Encode(elem, subStream) - keyValues = append(keyValues, encodedKV{ - key: decodedKey, - keyValue: subStream.Buffer(), - }) - } - sort.Sort(keyValues) - for i, keyValue := range keyValues { - if i != 0 { - stream.WriteMore() - } - stream.Write(keyValue.keyValue) - } - stream.WriteObjectEnd() - stream.cfg.ReturnStream(subStream) - stream.cfg.ReturnIterator(subIter) -} - -func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - iter := encoder.mapType.UnsafeIterate(ptr) - return !iter.HasNext() -} - -type encodedKeyValues []encodedKV - -type encodedKV struct { - key string - keyValue []byte -} - -func (sv encodedKeyValues) Len() int { return len(sv) } -func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key } diff --git a/vendor/github.com/json-iterator/go/reflect_marshaler.go b/vendor/github.com/json-iterator/go/reflect_marshaler.go deleted file mode 100644 index 58ac959ad..000000000 --- a/vendor/github.com/json-iterator/go/reflect_marshaler.go +++ /dev/null @@ -1,218 +0,0 @@ -package jsoniter - -import ( - "encoding" - "encoding/json" - "github.com/modern-go/reflect2" - "unsafe" -) - -var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem() -var unmarshalerType = reflect2.TypeOfPtr((*json.Unmarshaler)(nil)).Elem() -var textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem() -var textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem() - -func createDecoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValDecoder { - ptrType := reflect2.PtrTo(typ) - if ptrType.Implements(unmarshalerType) { - return &referenceDecoder{ - &unmarshalerDecoder{ptrType}, - } - } - if ptrType.Implements(textUnmarshalerType) { - return &referenceDecoder{ - &textUnmarshalerDecoder{ptrType}, - } - } - return nil -} - -func createEncoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == marshalerType { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &directMarshalerEncoder{ - checkIsEmpty: checkIsEmpty, - } - return encoder - } - if typ.Implements(marshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &marshalerEncoder{ - valType: typ, - checkIsEmpty: checkIsEmpty, - } - return encoder - } - ptrType := reflect2.PtrTo(typ) - if ctx.prefix != "" && ptrType.Implements(marshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, ptrType) - var encoder ValEncoder = &marshalerEncoder{ - valType: ptrType, - checkIsEmpty: checkIsEmpty, - } - return &referenceEncoder{encoder} - } - if typ == textMarshalerType { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &directTextMarshalerEncoder{ - checkIsEmpty: checkIsEmpty, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - return encoder - } - if typ.Implements(textMarshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &textMarshalerEncoder{ - valType: typ, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - checkIsEmpty: checkIsEmpty, - } - return encoder - } - // if prefix is empty, the type is the root type - if ctx.prefix != "" && ptrType.Implements(textMarshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, ptrType) - var encoder ValEncoder = &textMarshalerEncoder{ - valType: ptrType, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - checkIsEmpty: checkIsEmpty, - } - return &referenceEncoder{encoder} - } - return nil -} - -type marshalerEncoder struct { - checkIsEmpty checkIsEmpty - valType reflect2.Type -} - -func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - if encoder.valType.IsNullable() && reflect2.IsNil(obj) { - stream.WriteNil() - return - } - marshaler := obj.(json.Marshaler) - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - stream.Write(bytes) - } -} - -func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type directMarshalerEncoder struct { - checkIsEmpty checkIsEmpty -} - -func (encoder *directMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - marshaler := *(*json.Marshaler)(ptr) - if marshaler == nil { - stream.WriteNil() - return - } - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - stream.Write(bytes) - } -} - -func (encoder *directMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type textMarshalerEncoder struct { - valType reflect2.Type - stringEncoder ValEncoder - checkIsEmpty checkIsEmpty -} - -func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - if encoder.valType.IsNullable() && reflect2.IsNil(obj) { - stream.WriteNil() - return - } - marshaler := (obj).(encoding.TextMarshaler) - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - str := string(bytes) - encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) - } -} - -func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type directTextMarshalerEncoder struct { - stringEncoder ValEncoder - checkIsEmpty checkIsEmpty -} - -func (encoder *directTextMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - marshaler := *(*encoding.TextMarshaler)(ptr) - if marshaler == nil { - stream.WriteNil() - return - } - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - str := string(bytes) - encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) - } -} - -func (encoder *directTextMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type unmarshalerDecoder struct { - valType reflect2.Type -} - -func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valType := decoder.valType - obj := valType.UnsafeIndirect(ptr) - unmarshaler := obj.(json.Unmarshaler) - iter.nextToken() - iter.unreadByte() // skip spaces - bytes := iter.SkipAndReturnBytes() - err := unmarshaler.UnmarshalJSON(bytes) - if err != nil { - iter.ReportError("unmarshalerDecoder", err.Error()) - } -} - -type textUnmarshalerDecoder struct { - valType reflect2.Type -} - -func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valType := decoder.valType - obj := valType.UnsafeIndirect(ptr) - if reflect2.IsNil(obj) { - ptrType := valType.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - elem := elemType.UnsafeNew() - ptrType.UnsafeSet(ptr, unsafe.Pointer(&elem)) - obj = valType.UnsafeIndirect(ptr) - } - unmarshaler := (obj).(encoding.TextUnmarshaler) - str := iter.ReadString() - err := unmarshaler.UnmarshalText([]byte(str)) - if err != nil { - iter.ReportError("textUnmarshalerDecoder", err.Error()) - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go deleted file mode 100644 index 9042eb0cb..000000000 --- a/vendor/github.com/json-iterator/go/reflect_native.go +++ /dev/null @@ -1,451 +0,0 @@ -package jsoniter - -import ( - "encoding/base64" - "reflect" - "strconv" - "unsafe" - - "github.com/modern-go/reflect2" -) - -const ptrSize = 32 << uintptr(^uintptr(0)>>63) - -func createEncoderOfNative(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { - sliceDecoder := decoderOfSlice(ctx, typ) - return &base64Codec{sliceDecoder: sliceDecoder} - } - typeName := typ.String() - kind := typ.Kind() - switch kind { - case reflect.String: - if typeName != "string" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) - } - return &stringCodec{} - case reflect.Int: - if typeName != "int" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &int32Codec{} - } - return &int64Codec{} - case reflect.Int8: - if typeName != "int8" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) - } - return &int8Codec{} - case reflect.Int16: - if typeName != "int16" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) - } - return &int16Codec{} - case reflect.Int32: - if typeName != "int32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) - } - return &int32Codec{} - case reflect.Int64: - if typeName != "int64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) - } - return &int64Codec{} - case reflect.Uint: - if typeName != "uint" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint8: - if typeName != "uint8" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) - } - return &uint8Codec{} - case reflect.Uint16: - if typeName != "uint16" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) - } - return &uint16Codec{} - case reflect.Uint32: - if typeName != "uint32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) - } - return &uint32Codec{} - case reflect.Uintptr: - if typeName != "uintptr" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) - } - if ptrSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint64: - if typeName != "uint64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) - } - return &uint64Codec{} - case reflect.Float32: - if typeName != "float32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) - } - return &float32Codec{} - case reflect.Float64: - if typeName != "float64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) - } - return &float64Codec{} - case reflect.Bool: - if typeName != "bool" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) - } - return &boolCodec{} - } - return nil -} - -func createDecoderOfNative(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { - sliceDecoder := decoderOfSlice(ctx, typ) - return &base64Codec{sliceDecoder: sliceDecoder} - } - typeName := typ.String() - switch typ.Kind() { - case reflect.String: - if typeName != "string" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) - } - return &stringCodec{} - case reflect.Int: - if typeName != "int" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &int32Codec{} - } - return &int64Codec{} - case reflect.Int8: - if typeName != "int8" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) - } - return &int8Codec{} - case reflect.Int16: - if typeName != "int16" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) - } - return &int16Codec{} - case reflect.Int32: - if typeName != "int32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) - } - return &int32Codec{} - case reflect.Int64: - if typeName != "int64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) - } - return &int64Codec{} - case reflect.Uint: - if typeName != "uint" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint8: - if typeName != "uint8" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) - } - return &uint8Codec{} - case reflect.Uint16: - if typeName != "uint16" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) - } - return &uint16Codec{} - case reflect.Uint32: - if typeName != "uint32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) - } - return &uint32Codec{} - case reflect.Uintptr: - if typeName != "uintptr" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) - } - if ptrSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint64: - if typeName != "uint64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) - } - return &uint64Codec{} - case reflect.Float32: - if typeName != "float32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) - } - return &float32Codec{} - case reflect.Float64: - if typeName != "float64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) - } - return &float64Codec{} - case reflect.Bool: - if typeName != "bool" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) - } - return &boolCodec{} - } - return nil -} - -type stringCodec struct { -} - -func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*string)(ptr)) = iter.ReadString() -} - -func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteString(str) -} - -func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -type int8Codec struct { -} - -func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int8)(ptr)) = iter.ReadInt8() - } -} - -func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt8(*((*int8)(ptr))) -} - -func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int8)(ptr)) == 0 -} - -type int16Codec struct { -} - -func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int16)(ptr)) = iter.ReadInt16() - } -} - -func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt16(*((*int16)(ptr))) -} - -func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int16)(ptr)) == 0 -} - -type int32Codec struct { -} - -func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int32)(ptr)) = iter.ReadInt32() - } -} - -func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt32(*((*int32)(ptr))) -} - -func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int32)(ptr)) == 0 -} - -type int64Codec struct { -} - -func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int64)(ptr)) = iter.ReadInt64() - } -} - -func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt64(*((*int64)(ptr))) -} - -func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int64)(ptr)) == 0 -} - -type uint8Codec struct { -} - -func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint8)(ptr)) = iter.ReadUint8() - } -} - -func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint8(*((*uint8)(ptr))) -} - -func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint8)(ptr)) == 0 -} - -type uint16Codec struct { -} - -func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint16)(ptr)) = iter.ReadUint16() - } -} - -func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint16(*((*uint16)(ptr))) -} - -func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint16)(ptr)) == 0 -} - -type uint32Codec struct { -} - -func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint32)(ptr)) = iter.ReadUint32() - } -} - -func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint32(*((*uint32)(ptr))) -} - -func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint32)(ptr)) == 0 -} - -type uint64Codec struct { -} - -func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint64)(ptr)) = iter.ReadUint64() - } -} - -func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint64(*((*uint64)(ptr))) -} - -func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint64)(ptr)) == 0 -} - -type float32Codec struct { -} - -func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float32)(ptr)) = iter.ReadFloat32() - } -} - -func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32(*((*float32)(ptr))) -} - -func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type float64Codec struct { -} - -func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float64)(ptr)) = iter.ReadFloat64() - } -} - -func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64(*((*float64)(ptr))) -} - -func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -type boolCodec struct { -} - -func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*bool)(ptr)) = iter.ReadBool() - } -} - -func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteBool(*((*bool)(ptr))) -} - -func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { - return !(*((*bool)(ptr))) -} - -type base64Codec struct { - sliceType *reflect2.UnsafeSliceType - sliceDecoder ValDecoder -} - -func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - codec.sliceType.UnsafeSetNil(ptr) - return - } - switch iter.WhatIsNext() { - case StringValue: - src := iter.ReadString() - dst, err := base64.StdEncoding.DecodeString(src) - if err != nil { - iter.ReportError("decode base64", err.Error()) - } else { - codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst)) - } - case ArrayValue: - codec.sliceDecoder.Decode(ptr, iter) - default: - iter.ReportError("base64Codec", "invalid input") - } -} - -func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - src := *((*[]byte)(ptr)) - if len(src) == 0 { - stream.WriteNil() - return - } - encoding := base64.StdEncoding - stream.writeByte('"') - size := encoding.EncodedLen(len(src)) - buf := make([]byte, size) - encoding.Encode(buf, src) - stream.buf = append(stream.buf, buf...) - stream.writeByte('"') -} - -func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*[]byte)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_optional.go b/vendor/github.com/json-iterator/go/reflect_optional.go deleted file mode 100644 index 43ec71d6d..000000000 --- a/vendor/github.com/json-iterator/go/reflect_optional.go +++ /dev/null @@ -1,133 +0,0 @@ -package jsoniter - -import ( - "github.com/modern-go/reflect2" - "reflect" - "unsafe" -) - -func decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder { - ptrType := typ.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - decoder := decoderOfType(ctx, elemType) - if ctx.prefix == "" && elemType.Kind() == reflect.Ptr { - return &dereferenceDecoder{elemType, decoder} - } - return &OptionalDecoder{elemType, decoder} -} - -func encoderOfOptional(ctx *ctx, typ reflect2.Type) ValEncoder { - ptrType := typ.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - elemEncoder := encoderOfType(ctx, elemType) - encoder := &OptionalEncoder{elemEncoder} - return encoder -} - -type OptionalDecoder struct { - ValueType reflect2.Type - ValueDecoder ValDecoder -} - -func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - *((*unsafe.Pointer)(ptr)) = nil - } else { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - newPtr := decoder.ValueType.UnsafeNew() - decoder.ValueDecoder.Decode(newPtr, iter) - *((*unsafe.Pointer)(ptr)) = newPtr - } else { - //reuse existing instance - decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } - } -} - -type dereferenceDecoder struct { - // only to deference a pointer - valueType reflect2.Type - valueDecoder ValDecoder -} - -func (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - newPtr := decoder.valueType.UnsafeNew() - decoder.valueDecoder.Decode(newPtr, iter) - *((*unsafe.Pointer)(ptr)) = newPtr - } else { - //reuse existing instance - decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } -} - -type OptionalEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*unsafe.Pointer)(ptr)) == nil -} - -type dereferenceEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - dePtr := *((*unsafe.Pointer)(ptr)) - if dePtr == nil { - return true - } - return encoder.ValueEncoder.IsEmpty(dePtr) -} - -func (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { - deReferenced := *((*unsafe.Pointer)(ptr)) - if deReferenced == nil { - return true - } - isEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil) - if !converted { - return false - } - fieldPtr := unsafe.Pointer(deReferenced) - return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) -} - -type referenceEncoder struct { - encoder ValEncoder -} - -func (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) -} - -func (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) -} - -type referenceDecoder struct { - decoder ValDecoder -} - -func (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.decoder.Decode(unsafe.Pointer(&ptr), iter) -} diff --git a/vendor/github.com/json-iterator/go/reflect_slice.go b/vendor/github.com/json-iterator/go/reflect_slice.go deleted file mode 100644 index 9441d79df..000000000 --- a/vendor/github.com/json-iterator/go/reflect_slice.go +++ /dev/null @@ -1,99 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "unsafe" -) - -func decoderOfSlice(ctx *ctx, typ reflect2.Type) ValDecoder { - sliceType := typ.(*reflect2.UnsafeSliceType) - decoder := decoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) - return &sliceDecoder{sliceType, decoder} -} - -func encoderOfSlice(ctx *ctx, typ reflect2.Type) ValEncoder { - sliceType := typ.(*reflect2.UnsafeSliceType) - encoder := encoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) - return &sliceEncoder{sliceType, encoder} -} - -type sliceEncoder struct { - sliceType *reflect2.UnsafeSliceType - elemEncoder ValEncoder -} - -func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if encoder.sliceType.UnsafeIsNil(ptr) { - stream.WriteNil() - return - } - length := encoder.sliceType.UnsafeLengthOf(ptr) - if length == 0 { - stream.WriteEmptyArray() - return - } - stream.WriteArrayStart() - encoder.elemEncoder.Encode(encoder.sliceType.UnsafeGetIndex(ptr, 0), stream) - for i := 1; i < length; i++ { - stream.WriteMore() - elemPtr := encoder.sliceType.UnsafeGetIndex(ptr, i) - encoder.elemEncoder.Encode(elemPtr, stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) - } -} - -func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.sliceType.UnsafeLengthOf(ptr) == 0 -} - -type sliceDecoder struct { - sliceType *reflect2.UnsafeSliceType - elemDecoder ValDecoder -} - -func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) - } -} - -func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - sliceType := decoder.sliceType - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - sliceType.UnsafeSetNil(ptr) - return - } - if c != '[' { - iter.ReportError("decode slice", "expect [ or n, but found "+string([]byte{c})) - return - } - c = iter.nextToken() - if c == ']' { - sliceType.UnsafeSet(ptr, sliceType.UnsafeMakeSlice(0, 0)) - return - } - iter.unreadByte() - sliceType.UnsafeGrow(ptr, 1) - elemPtr := sliceType.UnsafeGetIndex(ptr, 0) - decoder.elemDecoder.Decode(elemPtr, iter) - length := 1 - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - idx := length - length += 1 - sliceType.UnsafeGrow(ptr, length) - elemPtr = sliceType.UnsafeGetIndex(ptr, idx) - decoder.elemDecoder.Decode(elemPtr, iter) - } - if c != ']' { - iter.ReportError("decode slice", "expect ], but found "+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/skip_tests/array/skip_test.go b/vendor/github.com/json-iterator/go/skip_tests/array/skip_test.go new file mode 120000 index 000000000..0334f5793 --- /dev/null +++ b/vendor/github.com/json-iterator/go/skip_tests/array/skip_test.go @@ -0,0 +1 @@ +../number/skip_test.go \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/skip_tests/object/skip_test.go b/vendor/github.com/json-iterator/go/skip_tests/object/skip_test.go new file mode 120000 index 000000000..0334f5793 --- /dev/null +++ b/vendor/github.com/json-iterator/go/skip_tests/object/skip_test.go @@ -0,0 +1 @@ +../number/skip_test.go \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/skip_tests/string/skip_test.go b/vendor/github.com/json-iterator/go/skip_tests/string/skip_test.go new file mode 120000 index 000000000..0334f5793 --- /dev/null +++ b/vendor/github.com/json-iterator/go/skip_tests/string/skip_test.go @@ -0,0 +1 @@ +../number/skip_test.go \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/stream_int.go b/vendor/github.com/json-iterator/go/stream_int.go deleted file mode 100644 index d1059ee4c..000000000 --- a/vendor/github.com/json-iterator/go/stream_int.go +++ /dev/null @@ -1,190 +0,0 @@ -package jsoniter - -var digits []uint32 - -func init() { - digits = make([]uint32, 1000) - for i := uint32(0); i < 1000; i++ { - digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' - if i < 10 { - digits[i] += 2 << 24 - } else if i < 100 { - digits[i] += 1 << 24 - } - } -} - -func writeFirstBuf(space []byte, v uint32) []byte { - start := v >> 24 - if start == 0 { - space = append(space, byte(v>>16), byte(v>>8)) - } else if start == 1 { - space = append(space, byte(v>>8)) - } - space = append(space, byte(v)) - return space -} - -func writeBuf(buf []byte, v uint32) []byte { - return append(buf, byte(v>>16), byte(v>>8), byte(v)) -} - -// WriteUint8 write uint8 to stream -func (stream *Stream) WriteUint8(val uint8) { - stream.buf = writeFirstBuf(stream.buf, digits[val]) -} - -// WriteInt8 write int8 to stream -func (stream *Stream) WriteInt8(nval int8) { - var val uint8 - if nval < 0 { - val = uint8(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint8(nval) - } - stream.buf = writeFirstBuf(stream.buf, digits[val]) -} - -// WriteUint16 write uint16 to stream -func (stream *Stream) WriteUint16(val uint16) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return -} - -// WriteInt16 write int16 to stream -func (stream *Stream) WriteInt16(nval int16) { - var val uint16 - if nval < 0 { - val = uint16(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint16(nval) - } - stream.WriteUint16(val) -} - -// WriteUint32 write uint32 to stream -func (stream *Stream) WriteUint32(val uint32) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q2]) - } else { - r3 := q2 - q3*1000 - stream.buf = append(stream.buf, byte(q3+'0')) - stream.buf = writeBuf(stream.buf, digits[r3]) - } - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) -} - -// WriteInt32 write int32 to stream -func (stream *Stream) WriteInt32(nval int32) { - var val uint32 - if nval < 0 { - val = uint32(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint32(nval) - } - stream.WriteUint32(val) -} - -// WriteUint64 write uint64 to stream -func (stream *Stream) WriteUint64(val uint64) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q2]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r3 := q2 - q3*1000 - q4 := q3 / 1000 - if q4 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q3]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r4 := q3 - q4*1000 - q5 := q4 / 1000 - if q5 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q4]) - stream.buf = writeBuf(stream.buf, digits[r4]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r5 := q4 - q5*1000 - q6 := q5 / 1000 - if q6 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q5]) - } else { - stream.buf = writeFirstBuf(stream.buf, digits[q6]) - r6 := q5 - q6*1000 - stream.buf = writeBuf(stream.buf, digits[r6]) - } - stream.buf = writeBuf(stream.buf, digits[r5]) - stream.buf = writeBuf(stream.buf, digits[r4]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) -} - -// WriteInt64 write int64 to stream -func (stream *Stream) WriteInt64(nval int64) { - var val uint64 - if nval < 0 { - val = uint64(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint64(nval) - } - stream.WriteUint64(val) -} - -// WriteInt write int to stream -func (stream *Stream) WriteInt(val int) { - stream.WriteInt64(int64(val)) -} - -// WriteUint write uint to stream -func (stream *Stream) WriteUint(val uint) { - stream.WriteUint64(uint64(val)) -} diff --git a/vendor/github.com/json-iterator/go/test.sh b/vendor/github.com/json-iterator/go/test.sh new file mode 100755 index 000000000..466f1141a --- /dev/null +++ b/vendor/github.com/json-iterator/go/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -coverprofile=profile.out $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/kardianos/osext/README.md b/vendor/github.com/kardianos/osext/README.md new file mode 100644 index 000000000..15cbc3d95 --- /dev/null +++ b/vendor/github.com/kardianos/osext/README.md @@ -0,0 +1,21 @@ +### Extensions to the "os" package. + +[![GoDoc](https://godoc.org/github.com/kardianos/osext?status.svg)](https://godoc.org/github.com/kardianos/osext) + +## Find the current Executable and ExecutableFolder. + +As of go1.8 the Executable function may be found in `os`. The Executable function +in the std lib `os` package is used if available. + +There is sometimes utility in finding the current executable file +that is running. This can be used for upgrading the current executable +or finding resources located relative to the executable file. Both +working directory and the os.Args[0] value are arbitrary and cannot +be relied on; os.Args[0] can be "faked". + +Multi-platform and supports: + * Linux + * OS X + * Windows + * Plan 9 + * BSDs. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md new file mode 100644 index 000000000..949b77e30 --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/README.md @@ -0,0 +1,40 @@ +# Windows Terminal Sequences + +This library allow for enabling Windows terminal color support for Go. + +See [Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences) for details. + +## Usage + +```go +import ( + "syscall" + + sequences "github.com/konsorten/go-windows-terminal-sequences" +) + +func main() { + sequences.EnableVirtualTerminalProcessing(syscall.Stdout, true) +} + +``` + +## Authors + +The tool is sponsored by the [marvin + konsorten GmbH](http://www.konsorten.de). + +We thank all the authors who provided code to this library: + +* Felix Kollmann + +## License + +(The MIT License) + +Copyright (c) 2018 marvin + konsorten GmbH (open-source@konsorten.de) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod new file mode 100644 index 000000000..716c61312 --- /dev/null +++ b/vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod @@ -0,0 +1 @@ +module github.com/konsorten/go-windows-terminal-sequences diff --git a/vendor/github.com/kr/binarydist/.gitignore b/vendor/github.com/kr/binarydist/.gitignore new file mode 100644 index 000000000..653f16014 --- /dev/null +++ b/vendor/github.com/kr/binarydist/.gitignore @@ -0,0 +1 @@ +test.* diff --git a/vendor/github.com/kr/binarydist/Readme.md b/vendor/github.com/kr/binarydist/Readme.md new file mode 100644 index 000000000..dadc3683d --- /dev/null +++ b/vendor/github.com/kr/binarydist/Readme.md @@ -0,0 +1,7 @@ +# binarydist + +Package binarydist implements binary diff and patch as described on +. It reads and writes files +compatible with the tools there. + +Documentation at . diff --git a/vendor/github.com/kr/binarydist/go.mod b/vendor/github.com/kr/binarydist/go.mod new file mode 100644 index 000000000..ecdfe3ea1 --- /dev/null +++ b/vendor/github.com/kr/binarydist/go.mod @@ -0,0 +1 @@ +module "github.com/kr/binarydist" diff --git a/vendor/github.com/kr/fs/Readme b/vendor/github.com/kr/fs/Readme new file mode 100644 index 000000000..c95e13fc8 --- /dev/null +++ b/vendor/github.com/kr/fs/Readme @@ -0,0 +1,3 @@ +Filesystem Package + +http://godoc.org/github.com/kr/fs diff --git a/vendor/github.com/kr/fs/go.mod b/vendor/github.com/kr/fs/go.mod new file mode 100644 index 000000000..7c206e04c --- /dev/null +++ b/vendor/github.com/kr/fs/go.mod @@ -0,0 +1 @@ +module "github.com/kr/fs" diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml new file mode 100644 index 000000000..b9f8b239c --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/.travis.yml @@ -0,0 +1,9 @@ +language: go +go: + - tip + +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md new file mode 100644 index 000000000..1e69004bb --- /dev/null +++ b/vendor/github.com/mattn/go-isatty/README.md @@ -0,0 +1,50 @@ +# go-isatty + +[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) +[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) +[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) +[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) + +isatty for golang + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/mattn/go-isatty" + "os" +) + +func main() { + if isatty.IsTerminal(os.Stdout.Fd()) { + fmt.Println("Is Terminal") + } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { + fmt.Println("Is Cygwin/MSYS2 Terminal") + } else { + fmt.Println("Is Not Terminal") + } +} +``` + +## Installation + +``` +$ go get github.com/mattn/go-isatty +``` + +## License + +MIT + +## Author + +Yasuhiro Matsumoto (a.k.a mattn) + +## Thanks + +* k-takata: base idea for IsCygwinTerminal + + https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux.go b/vendor/github.com/mattn/go-isatty/isatty_linux.go index 7384cf991..9d24bac1d 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_linux.go +++ b/vendor/github.com/mattn/go-isatty/isatty_linux.go @@ -1,5 +1,5 @@ // +build linux -// +build !appengine,!ppc64,!ppc64le +// +build !appengine package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go b/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go deleted file mode 100644 index 44e5d2130..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build linux -// +build ppc64 ppc64le - -package isatty - -import ( - "unsafe" - - syscall "golang.org/x/sys/unix" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go index 9d8b4a599..ff4de3d9a 100644 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ b/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -3,7 +3,7 @@ package isatty -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 // terminal. This is also always false on this environment. func IsCygwinTerminal(fd uintptr) bool { return false diff --git a/vendor/github.com/mattn/go-shellwords/.travis.yml b/vendor/github.com/mattn/go-shellwords/.travis.yml new file mode 100644 index 000000000..16d1430aa --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/.travis.yml @@ -0,0 +1,8 @@ +language: go +go: + - tip +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -repotoken 2FMhp57u8LcstKL9B190fLTcEnBtAAiEL diff --git a/vendor/github.com/mattn/go-shellwords/README.md b/vendor/github.com/mattn/go-shellwords/README.md new file mode 100644 index 000000000..b1d235c78 --- /dev/null +++ b/vendor/github.com/mattn/go-shellwords/README.md @@ -0,0 +1,47 @@ +# go-shellwords + +[![Coverage Status](https://coveralls.io/repos/mattn/go-shellwords/badge.png?branch=master)](https://coveralls.io/r/mattn/go-shellwords?branch=master) +[![Build Status](https://travis-ci.org/mattn/go-shellwords.svg?branch=master)](https://travis-ci.org/mattn/go-shellwords) + +Parse line as shell words. + +## Usage + +```go +args, err := shellwords.Parse("./foo --bar=baz") +// args should be ["./foo", "--bar=baz"] +``` + +```go +os.Setenv("FOO", "bar") +p := shellwords.NewParser() +p.ParseEnv = true +args, err := p.Parse("./foo $FOO") +// args should be ["./foo", "bar"] +``` + +```go +p := shellwords.NewParser() +p.ParseBacktick = true +args, err := p.Parse("./foo `echo $SHELL`") +// args should be ["./foo", "/bin/bash"] +``` + +```go +shellwords.ParseBacktick = true +p := shellwords.NewParser() +args, err := p.Parse("./foo `echo $SHELL`") +// args should be ["./foo", "/bin/bash"] +``` + +# Thanks + +This is based on cpan module [Parse::CommandLine](https://metacpan.org/pod/Parse::CommandLine). + +# License + +under the MIT License: http://mattn.mit-license.org/2017 + +# Author + +Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/miekg/dns/.codecov.yml b/vendor/github.com/miekg/dns/.codecov.yml new file mode 100644 index 000000000..f91e5c1fe --- /dev/null +++ b/vendor/github.com/miekg/dns/.codecov.yml @@ -0,0 +1,8 @@ +coverage: + status: + project: + default: + target: 40% + threshold: null + patch: false + changes: false diff --git a/vendor/github.com/miekg/dns/.gitignore b/vendor/github.com/miekg/dns/.gitignore new file mode 100644 index 000000000..776cd950c --- /dev/null +++ b/vendor/github.com/miekg/dns/.gitignore @@ -0,0 +1,4 @@ +*.6 +tags +test.out +a.out diff --git a/vendor/github.com/miekg/dns/.travis.yml b/vendor/github.com/miekg/dns/.travis.yml new file mode 100644 index 000000000..18259374e --- /dev/null +++ b/vendor/github.com/miekg/dns/.travis.yml @@ -0,0 +1,18 @@ +language: go +sudo: false + +go: + - 1.10.x + - 1.11.x + - tip + +before_install: + # don't use the miekg/dns when testing forks + - mkdir -p $GOPATH/src/github.com/miekg + - ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/miekg/ || true + +script: + - go test -race -v -bench=. -coverprofile=coverage.txt -covermode=atomic ./... + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/miekg/dns/Gopkg.lock b/vendor/github.com/miekg/dns/Gopkg.lock new file mode 100644 index 000000000..686632207 --- /dev/null +++ b/vendor/github.com/miekg/dns/Gopkg.lock @@ -0,0 +1,57 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + branch = "master" + digest = "1:6914c49eed986dfb8dffb33516fa129c49929d4d873f41e073c83c11c372b870" + name = "golang.org/x/crypto" + packages = [ + "ed25519", + "ed25519/internal/edwards25519", + ] + pruneopts = "" + revision = "e3636079e1a4c1f337f212cc5cd2aca108f6c900" + +[[projects]] + branch = "master" + digest = "1:08e41d63f8dac84d83797368b56cf0b339e42d0224e5e56668963c28aec95685" + name = "golang.org/x/net" + packages = [ + "bpf", + "context", + "internal/iana", + "internal/socket", + "ipv4", + "ipv6", + ] + pruneopts = "" + revision = "4dfa2610cdf3b287375bbba5b8f2a14d3b01d8de" + +[[projects]] + branch = "master" + digest = "1:b2ea75de0ccb2db2ac79356407f8a4cd8f798fe15d41b381c00abf3ae8e55ed1" + name = "golang.org/x/sync" + packages = ["errgroup"] + pruneopts = "" + revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca" + +[[projects]] + branch = "master" + digest = "1:149a432fabebb8221a80f77731b1cd63597197ded4f14af606ebe3a0959004ec" + name = "golang.org/x/sys" + packages = ["unix"] + pruneopts = "" + revision = "e4b3c5e9061176387e7cea65e4dc5853801f3fb7" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + input-imports = [ + "golang.org/x/crypto/ed25519", + "golang.org/x/net/ipv4", + "golang.org/x/net/ipv6", + "golang.org/x/sync/errgroup", + "golang.org/x/sys/unix", + ] + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/miekg/dns/Gopkg.toml b/vendor/github.com/miekg/dns/Gopkg.toml new file mode 100644 index 000000000..85e6ff31b --- /dev/null +++ b/vendor/github.com/miekg/dns/Gopkg.toml @@ -0,0 +1,38 @@ + +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" + + +[[constraint]] + branch = "master" + name = "golang.org/x/crypto" + +[[constraint]] + branch = "master" + name = "golang.org/x/net" + +[[constraint]] + branch = "master" + name = "golang.org/x/sys" + +[[constraint]] + branch = "master" + name = "golang.org/x/sync" diff --git a/vendor/github.com/miekg/dns/Makefile.fuzz b/vendor/github.com/miekg/dns/Makefile.fuzz new file mode 100644 index 000000000..dc158c4ac --- /dev/null +++ b/vendor/github.com/miekg/dns/Makefile.fuzz @@ -0,0 +1,33 @@ +# Makefile for fuzzing +# +# Use go-fuzz and needs the tools installed. +# See https://blog.cloudflare.com/dns-parser-meet-go-fuzzer/ +# +# Installing go-fuzz: +# $ make -f Makefile.fuzz get +# Installs: +# * github.com/dvyukov/go-fuzz/go-fuzz +# * get github.com/dvyukov/go-fuzz/go-fuzz-build + +all: build + +.PHONY: build +build: + go-fuzz-build -tags fuzz github.com/miekg/dns + +.PHONY: build-newrr +build-newrr: + go-fuzz-build -func FuzzNewRR -tags fuzz github.com/miekg/dns + +.PHONY: fuzz +fuzz: + go-fuzz -bin=dns-fuzz.zip -workdir=fuzz + +.PHONY: get +get: + go get github.com/dvyukov/go-fuzz/go-fuzz + go get github.com/dvyukov/go-fuzz/go-fuzz-build + +.PHONY: clean +clean: + rm *-fuzz.zip diff --git a/vendor/github.com/miekg/dns/Makefile.release b/vendor/github.com/miekg/dns/Makefile.release new file mode 100644 index 000000000..8fb748e8a --- /dev/null +++ b/vendor/github.com/miekg/dns/Makefile.release @@ -0,0 +1,52 @@ +# Makefile for releasing. +# +# The release is controlled from version.go. The version found there is +# used to tag the git repo, we're not building any artifects so there is nothing +# to upload to github. +# +# * Up the version in version.go +# * Run: make -f Makefile.release release +# * will *commit* your change with 'Release $VERSION' +# * push to github +# + +define GO +//+build ignore + +package main + +import ( + "fmt" + + "github.com/miekg/dns" +) + +func main() { + fmt.Println(dns.Version.String()) +} +endef + +$(file > version_release.go,$(GO)) +VERSION:=$(shell go run version_release.go) +TAG="v$(VERSION)" + +all: + @echo Use the \'release\' target to start a release $(VERSION) + rm -f version_release.go + +.PHONY: release +release: commit push + @echo Released $(VERSION) + rm -f version_release.go + +.PHONY: commit +commit: + @echo Committing release $(VERSION) + git commit -am"Release $(VERSION)" + git tag $(TAG) + +.PHONY: push +push: + @echo Pushing release $(VERSION) to master + git push --tags + git push diff --git a/vendor/github.com/miekg/dns/README.md b/vendor/github.com/miekg/dns/README.md new file mode 100644 index 000000000..7f1aaa5de --- /dev/null +++ b/vendor/github.com/miekg/dns/README.md @@ -0,0 +1,172 @@ +[![Build Status](https://travis-ci.org/miekg/dns.svg?branch=master)](https://travis-ci.org/miekg/dns) +[![Code Coverage](https://img.shields.io/codecov/c/github/miekg/dns/master.svg)](https://codecov.io/github/miekg/dns?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/miekg/dns)](https://goreportcard.com/report/miekg/dns) +[![](https://godoc.org/github.com/miekg/dns?status.svg)](https://godoc.org/github.com/miekg/dns) + +# Alternative (more granular) approach to a DNS library + +> Less is more. + +Complete and usable DNS library. All widely used Resource Records are supported, including the +DNSSEC types. It follows a lean and mean philosophy. If there is stuff you should know as a DNS +programmer there isn't a convenience function for it. Server side and client side programming is +supported, i.e. you can build servers and resolvers with it. + +We try to keep the "master" branch as sane as possible and at the bleeding edge of standards, +avoiding breaking changes wherever reasonable. We support the last two versions of Go. + +# Goals + +* KISS; +* Fast; +* Small API. If it's easy to code in Go, don't make a function for it. + +# Users + +A not-so-up-to-date-list-that-may-be-actually-current: + +* https://github.com/coredns/coredns +* https://cloudflare.com +* https://github.com/abh/geodns +* http://www.statdns.com/ +* http://www.dnsinspect.com/ +* https://github.com/chuangbo/jianbing-dictionary-dns +* http://www.dns-lg.com/ +* https://github.com/fcambus/rrda +* https://github.com/kenshinx/godns +* https://github.com/skynetservices/skydns +* https://github.com/hashicorp/consul +* https://github.com/DevelopersPL/godnsagent +* https://github.com/duedil-ltd/discodns +* https://github.com/StalkR/dns-reverse-proxy +* https://github.com/tianon/rawdns +* https://mesosphere.github.io/mesos-dns/ +* https://pulse.turbobytes.com/ +* https://play.google.com/store/apps/details?id=com.turbobytes.dig +* https://github.com/fcambus/statzone +* https://github.com/benschw/dns-clb-go +* https://github.com/corny/dnscheck for http://public-dns.info/ +* https://namesmith.io +* https://github.com/miekg/unbound +* https://github.com/miekg/exdns +* https://dnslookup.org +* https://github.com/looterz/grimd +* https://github.com/phamhongviet/serf-dns +* https://github.com/mehrdadrad/mylg +* https://github.com/bamarni/dockness +* https://github.com/fffaraz/microdns +* http://kelda.io +* https://github.com/ipdcode/hades (JD.COM) +* https://github.com/StackExchange/dnscontrol/ +* https://www.dnsperf.com/ +* https://dnssectest.net/ +* https://dns.apebits.com +* https://github.com/oif/apex +* https://github.com/jedisct1/dnscrypt-proxy +* https://github.com/jedisct1/rpdns +* https://github.com/xor-gate/sshfp +* https://github.com/rs/dnstrace +* https://blitiri.com.ar/p/dnss ([github mirror](https://github.com/albertito/dnss)) +* https://github.com/semihalev/sdns + +Send pull request if you want to be listed here. + +# Features + +* UDP/TCP queries, IPv4 and IPv6; +* RFC 1035 zone file parsing ($INCLUDE, $ORIGIN, $TTL and $GENERATE (for all record types) are supported; +* Fast: + * Reply speed around ~ 80K qps (faster hardware results in more qps); + * Parsing RRs ~ 100K RR/s, that's 5M records in about 50 seconds; +* Server side programming (mimicking the net/http package); +* Client side programming; +* DNSSEC: signing, validating and key generation for DSA, RSA, ECDSA and Ed25519; +* EDNS0, NSID, Cookies; +* AXFR/IXFR; +* TSIG, SIG(0); +* DNS over TLS: optional encrypted connection between client and server; +* DNS name compression; +* Depends only on the standard library. + +Have fun! + +Miek Gieben - 2010-2012 - + +# Building + +Building is done with the `go` tool. If you have setup your GOPATH correctly, the following should +work: + + go get github.com/miekg/dns + go build github.com/miekg/dns + +## Examples + +A short "how to use the API" is at the beginning of doc.go (this also will show +when you call `godoc github.com/miekg/dns`). + +Example programs can be found in the `github.com/miekg/exdns` repository. + +## Supported RFCs + +*all of them* + +* 103{4,5} - DNS standard +* 1348 - NSAP record (removed the record) +* 1982 - Serial Arithmetic +* 1876 - LOC record +* 1995 - IXFR +* 1996 - DNS notify +* 2136 - DNS Update (dynamic updates) +* 2181 - RRset definition - there is no RRset type though, just []RR +* 2537 - RSAMD5 DNS keys +* 2065 - DNSSEC (updated in later RFCs) +* 2671 - EDNS record +* 2782 - SRV record +* 2845 - TSIG record +* 2915 - NAPTR record +* 2929 - DNS IANA Considerations +* 3110 - RSASHA1 DNS keys +* 3225 - DO bit (DNSSEC OK) +* 340{1,2,3} - NAPTR record +* 3445 - Limiting the scope of (DNS)KEY +* 3597 - Unknown RRs +* 403{3,4,5} - DNSSEC + validation functions +* 4255 - SSHFP record +* 4343 - Case insensitivity +* 4408 - SPF record +* 4509 - SHA256 Hash in DS +* 4592 - Wildcards in the DNS +* 4635 - HMAC SHA TSIG +* 4701 - DHCID +* 4892 - id.server +* 5001 - NSID +* 5155 - NSEC3 record +* 5205 - HIP record +* 5702 - SHA2 in the DNS +* 5936 - AXFR +* 5966 - TCP implementation recommendations +* 6605 - ECDSA +* 6725 - IANA Registry Update +* 6742 - ILNP DNS +* 6840 - Clarifications and Implementation Notes for DNS Security +* 6844 - CAA record +* 6891 - EDNS0 update +* 6895 - DNS IANA considerations +* 6975 - Algorithm Understanding in DNSSEC +* 7043 - EUI48/EUI64 records +* 7314 - DNS (EDNS) EXPIRE Option +* 7477 - CSYNC RR +* 7828 - edns-tcp-keepalive EDNS0 Option +* 7553 - URI record +* 7858 - DNS over TLS: Initiation and Performance Considerations +* 7871 - EDNS0 Client Subnet +* 7873 - Domain Name System (DNS) Cookies (draft-ietf-dnsop-cookies) +* 8080 - EdDSA for DNSSEC + +## Loosely based upon + +* `ldns` +* `NSD` +* `Net::DNS` +* `GRONG` diff --git a/vendor/github.com/miekg/dns/client.go b/vendor/github.com/miekg/dns/client.go index 63ced2bd0..770a946cd 100644 --- a/vendor/github.com/miekg/dns/client.go +++ b/vendor/github.com/miekg/dns/client.go @@ -7,11 +7,8 @@ import ( "context" "crypto/tls" "encoding/binary" - "fmt" "io" - "io/ioutil" "net" - "net/http" "strings" "time" ) @@ -19,8 +16,6 @@ import ( const ( dnsTimeout time.Duration = 2 * time.Second tcpIdleTimeout time.Duration = 8 * time.Second - - dohMimeType = "application/dns-message" ) // A Conn represents a connection to a DNS server. @@ -44,7 +39,6 @@ type Client struct { DialTimeout time.Duration // net.DialTimeout, defaults to 2 seconds, or net.Dialer.Timeout if expiring earlier - overridden by Timeout when that value is non-zero ReadTimeout time.Duration // net.Conn.SetReadTimeout value for connections, defaults to 2 seconds - overridden by Timeout when that value is non-zero WriteTimeout time.Duration // net.Conn.SetWriteTimeout value for connections, defaults to 2 seconds - overridden by Timeout when that value is non-zero - HTTPClient *http.Client // The http.Client to use for DNS-over-HTTPS TsigSecret map[string]string // secret(s) for Tsig map[], zonename must be in canonical form (lowercase, fqdn, see RFC 4034 Section 6.2) SingleInflight bool // if true suppress multiple outstanding queries for the same Qname, Qtype and Qclass group singleflight @@ -132,11 +126,6 @@ func (c *Client) Dial(address string) (conn *Conn, err error) { // attribute appropriately func (c *Client) Exchange(m *Msg, address string) (r *Msg, rtt time.Duration, err error) { if !c.SingleInflight { - if c.Net == "https" { - // TODO(tmthrgd): pipe timeouts into exchangeDOH - return c.exchangeDOH(context.TODO(), m, address) - } - return c.exchange(m, address) } @@ -149,11 +138,6 @@ func (c *Client) Exchange(m *Msg, address string) (r *Msg, rtt time.Duration, er cl = cl1 } r, rtt, err, shared := c.group.Do(m.Question[0].Name+t+cl, func() (*Msg, time.Duration, error) { - if c.Net == "https" { - // TODO(tmthrgd): pipe timeouts into exchangeDOH - return c.exchangeDOH(context.TODO(), m, address) - } - return c.exchange(m, address) }) if r != nil && shared { @@ -199,67 +183,6 @@ func (c *Client) exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err erro return r, rtt, err } -func (c *Client) exchangeDOH(ctx context.Context, m *Msg, a string) (r *Msg, rtt time.Duration, err error) { - p, err := m.Pack() - if err != nil { - return nil, 0, err - } - - req, err := http.NewRequest(http.MethodPost, a, bytes.NewReader(p)) - if err != nil { - return nil, 0, err - } - - req.Header.Set("Content-Type", dohMimeType) - req.Header.Set("Accept", dohMimeType) - - hc := http.DefaultClient - if c.HTTPClient != nil { - hc = c.HTTPClient - } - - if ctx != context.Background() && ctx != context.TODO() { - req = req.WithContext(ctx) - } - - t := time.Now() - - resp, err := hc.Do(req) - if err != nil { - return nil, 0, err - } - defer closeHTTPBody(resp.Body) - - if resp.StatusCode != http.StatusOK { - return nil, 0, fmt.Errorf("dns: server returned HTTP %d error: %q", resp.StatusCode, resp.Status) - } - - if ct := resp.Header.Get("Content-Type"); ct != dohMimeType { - return nil, 0, fmt.Errorf("dns: unexpected Content-Type %q; expected %q", ct, dohMimeType) - } - - p, err = ioutil.ReadAll(resp.Body) - if err != nil { - return nil, 0, err - } - - rtt = time.Since(t) - - r = new(Msg) - if err := r.Unpack(p); err != nil { - return r, 0, err - } - - // TODO: TSIG? Is it even supported over DoH? - - return r, rtt, nil -} - -func closeHTTPBody(r io.ReadCloser) error { - io.Copy(ioutil.Discard, io.LimitReader(r, 8<<20)) - return r.Close() -} - // ReadMsg reads a message from the connection co. // If the received message contains a TSIG record the transaction signature // is verified. This method always tries to return the message, however if an @@ -559,10 +482,6 @@ func DialTimeoutWithTLS(network, address string, tlsConfig *tls.Config, timeout // context, if present. If there is both a context deadline and a configured // timeout on the client, the earliest of the two takes effect. func (c *Client) ExchangeContext(ctx context.Context, m *Msg, a string) (r *Msg, rtt time.Duration, err error) { - if !c.SingleInflight && c.Net == "https" { - return c.exchangeDOH(ctx, m, a) - } - var timeout time.Duration if deadline, ok := ctx.Deadline(); !ok { timeout = 0 @@ -571,7 +490,7 @@ func (c *Client) ExchangeContext(ctx context.Context, m *Msg, a string) (r *Msg, } // not passing the context to the underlying calls, as the API does not support // context. For timeouts you should set up Client.Dialer and call Client.Exchange. - // TODO(tmthrgd): this is a race condition + // TODO(tmthrgd,miekg): this is a race condition. c.Dialer = &net.Dialer{Timeout: timeout} return c.Exchange(m, a) } diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index 4b4ec33c8..06984e7ca 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -82,6 +82,7 @@ type ConnectionStater interface { type response struct { msg []byte + closed bool // connection has been closed hijacked bool // connection has been hijacked by handler tsigTimersOnly bool tsigStatus error @@ -728,6 +729,10 @@ func (srv *Server) readUDP(conn *net.UDPConn, timeout time.Duration) ([]byte, *S // WriteMsg implements the ResponseWriter.WriteMsg method. func (w *response) WriteMsg(m *Msg) (err error) { + if w.closed { + return &Error{err: "WriteMsg called after Close"} + } + var data []byte if w.tsigSecret != nil { // if no secrets, dont check for the tsig (which is a longer check) if t := m.IsTsig(); t != nil { @@ -749,6 +754,10 @@ func (w *response) WriteMsg(m *Msg) (err error) { // Write implements the ResponseWriter.Write method. func (w *response) Write(m []byte) (int, error) { + if w.closed { + return 0, &Error{err: "Write called after Close"} + } + switch { case w.udp != nil: n, err := WriteToSessionUDP(w.udp, m, w.udpSession) @@ -768,7 +777,7 @@ func (w *response) Write(m []byte) (int, error) { n, err := io.Copy(w.tcp, bytes.NewReader(m)) return int(n), err default: - panic("dns: Write called after Close") + panic("dns: internal error: udp and tcp both nil") } } @@ -780,7 +789,7 @@ func (w *response) LocalAddr() net.Addr { case w.tcp != nil: return w.tcp.LocalAddr() default: - panic("dns: LocalAddr called after Close") + panic("dns: internal error: udp and tcp both nil") } } @@ -792,7 +801,7 @@ func (w *response) RemoteAddr() net.Addr { case w.tcp != nil: return w.tcp.RemoteAddr() default: - panic("dns: RemoteAddr called after Close") + panic("dns: internal error: udpSession and tcp both nil") } } @@ -807,13 +816,20 @@ func (w *response) Hijack() { w.hijacked = true } // Close implements the ResponseWriter.Close method func (w *response) Close() error { - // Can't close the udp conn, as that is actually the listener. - if w.tcp != nil { - e := w.tcp.Close() - w.tcp = nil - return e + if w.closed { + return &Error{err: "connection already closed"} + } + w.closed = true + + switch { + case w.udp != nil: + // Can't close the udp conn, as that is actually the listener. + return nil + case w.tcp != nil: + return w.tcp.Close() + default: + panic("dns: internal error: udp and tcp both nil") } - return nil } // ConnectionState() implements the ConnectionStater.ConnectionState() interface. diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index 0b0e9b6d8..e7c82e999 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,7 +3,7 @@ package dns import "fmt" // Version is current version of this library. -var Version = V{1, 0, 14} +var Version = V{1, 0, 15} // V holds the version of this library. type V struct { diff --git a/vendor/github.com/mitchellh/go-homedir/README.md b/vendor/github.com/mitchellh/go-homedir/README.md new file mode 100644 index 000000000..d70706d5b --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/README.md @@ -0,0 +1,14 @@ +# go-homedir + +This is a Go library for detecting the user's home directory without +the use of cgo, so the library can be used in cross-compilation environments. + +Usage is incredibly simple, just call `homedir.Dir()` to get the home directory +for a user, and `homedir.Expand()` to expand the `~` in a path to the home +directory. + +**Why not just use `os/user`?** The built-in `os/user` package requires +cgo on Darwin systems. This means that any Go code that uses that package +cannot cross compile. But 99% of the time the use for `os/user` is just to +retrieve the home directory, which we can do for the current user without +cgo. This library does that, enabling cross-compilation. diff --git a/vendor/github.com/mitchellh/go-homedir/go.mod b/vendor/github.com/mitchellh/go-homedir/go.mod new file mode 100644 index 000000000..7efa09a04 --- /dev/null +++ b/vendor/github.com/mitchellh/go-homedir/go.mod @@ -0,0 +1 @@ +module github.com/mitchellh/go-homedir diff --git a/vendor/github.com/modern-go/concurrent/LICENSE b/vendor/github.com/modern-go/concurrent/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/vendor/github.com/modern-go/concurrent/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/modern-go/concurrent/executor.go b/vendor/github.com/modern-go/concurrent/executor.go deleted file mode 100644 index 623dba1ac..000000000 --- a/vendor/github.com/modern-go/concurrent/executor.go +++ /dev/null @@ -1,14 +0,0 @@ -package concurrent - -import "context" - -// Executor replace go keyword to start a new goroutine -// the goroutine should cancel itself if the context passed in has been cancelled -// the goroutine started by the executor, is owned by the executor -// we can cancel all executors owned by the executor just by stop the executor itself -// however Executor interface does not Stop method, the one starting and owning executor -// should use the concrete type of executor, instead of this interface. -type Executor interface { - // Go starts a new goroutine controlled by the context - Go(handler func(ctx context.Context)) -} diff --git a/vendor/github.com/modern-go/concurrent/go_above_19.go b/vendor/github.com/modern-go/concurrent/go_above_19.go deleted file mode 100644 index aeabf8c4f..000000000 --- a/vendor/github.com/modern-go/concurrent/go_above_19.go +++ /dev/null @@ -1,15 +0,0 @@ -//+build go1.9 - -package concurrent - -import "sync" - -// Map is a wrapper for sync.Map introduced in go1.9 -type Map struct { - sync.Map -} - -// NewMap creates a thread safe Map -func NewMap() *Map { - return &Map{} -} diff --git a/vendor/github.com/modern-go/concurrent/go_below_19.go b/vendor/github.com/modern-go/concurrent/go_below_19.go deleted file mode 100644 index b9c8df7f4..000000000 --- a/vendor/github.com/modern-go/concurrent/go_below_19.go +++ /dev/null @@ -1,33 +0,0 @@ -//+build !go1.9 - -package concurrent - -import "sync" - -// Map implements a thread safe map for go version below 1.9 using mutex -type Map struct { - lock sync.RWMutex - data map[interface{}]interface{} -} - -// NewMap creates a thread safe map -func NewMap() *Map { - return &Map{ - data: make(map[interface{}]interface{}, 32), - } -} - -// Load is same as sync.Map Load -func (m *Map) Load(key interface{}) (elem interface{}, found bool) { - m.lock.RLock() - elem, found = m.data[key] - m.lock.RUnlock() - return -} - -// Load is same as sync.Map Store -func (m *Map) Store(key interface{}, elem interface{}) { - m.lock.Lock() - m.data[key] = elem - m.lock.Unlock() -} diff --git a/vendor/github.com/modern-go/concurrent/log.go b/vendor/github.com/modern-go/concurrent/log.go deleted file mode 100644 index 9756fcc75..000000000 --- a/vendor/github.com/modern-go/concurrent/log.go +++ /dev/null @@ -1,13 +0,0 @@ -package concurrent - -import ( - "os" - "log" - "io/ioutil" -) - -// ErrorLogger is used to print out error, can be set to writer other than stderr -var ErrorLogger = log.New(os.Stderr, "", 0) - -// InfoLogger is used to print informational message, default to off -var InfoLogger = log.New(ioutil.Discard, "", 0) \ No newline at end of file diff --git a/vendor/github.com/modern-go/concurrent/unbounded_executor.go b/vendor/github.com/modern-go/concurrent/unbounded_executor.go deleted file mode 100644 index 05a77dceb..000000000 --- a/vendor/github.com/modern-go/concurrent/unbounded_executor.go +++ /dev/null @@ -1,119 +0,0 @@ -package concurrent - -import ( - "context" - "fmt" - "runtime" - "runtime/debug" - "sync" - "time" - "reflect" -) - -// HandlePanic logs goroutine panic by default -var HandlePanic = func(recovered interface{}, funcName string) { - ErrorLogger.Println(fmt.Sprintf("%s panic: %v", funcName, recovered)) - ErrorLogger.Println(string(debug.Stack())) -} - -// UnboundedExecutor is a executor without limits on counts of alive goroutines -// it tracks the goroutine started by it, and can cancel them when shutdown -type UnboundedExecutor struct { - ctx context.Context - cancel context.CancelFunc - activeGoroutinesMutex *sync.Mutex - activeGoroutines map[string]int - HandlePanic func(recovered interface{}, funcName string) -} - -// GlobalUnboundedExecutor has the life cycle of the program itself -// any goroutine want to be shutdown before main exit can be started from this executor -// GlobalUnboundedExecutor expects the main function to call stop -// it does not magically knows the main function exits -var GlobalUnboundedExecutor = NewUnboundedExecutor() - -// NewUnboundedExecutor creates a new UnboundedExecutor, -// UnboundedExecutor can not be created by &UnboundedExecutor{} -// HandlePanic can be set with a callback to override global HandlePanic -func NewUnboundedExecutor() *UnboundedExecutor { - ctx, cancel := context.WithCancel(context.TODO()) - return &UnboundedExecutor{ - ctx: ctx, - cancel: cancel, - activeGoroutinesMutex: &sync.Mutex{}, - activeGoroutines: map[string]int{}, - } -} - -// Go starts a new goroutine and tracks its lifecycle. -// Panic will be recovered and logged automatically, except for StopSignal -func (executor *UnboundedExecutor) Go(handler func(ctx context.Context)) { - pc := reflect.ValueOf(handler).Pointer() - f := runtime.FuncForPC(pc) - funcName := f.Name() - file, line := f.FileLine(pc) - executor.activeGoroutinesMutex.Lock() - defer executor.activeGoroutinesMutex.Unlock() - startFrom := fmt.Sprintf("%s:%d", file, line) - executor.activeGoroutines[startFrom] += 1 - go func() { - defer func() { - recovered := recover() - // if you want to quit a goroutine without trigger HandlePanic - // use runtime.Goexit() to quit - if recovered != nil { - if executor.HandlePanic == nil { - HandlePanic(recovered, funcName) - } else { - executor.HandlePanic(recovered, funcName) - } - } - executor.activeGoroutinesMutex.Lock() - executor.activeGoroutines[startFrom] -= 1 - executor.activeGoroutinesMutex.Unlock() - }() - handler(executor.ctx) - }() -} - -// Stop cancel all goroutines started by this executor without wait -func (executor *UnboundedExecutor) Stop() { - executor.cancel() -} - -// StopAndWaitForever cancel all goroutines started by this executor and -// wait until all goroutines exited -func (executor *UnboundedExecutor) StopAndWaitForever() { - executor.StopAndWait(context.Background()) -} - -// StopAndWait cancel all goroutines started by this executor and wait. -// Wait can be cancelled by the context passed in. -func (executor *UnboundedExecutor) StopAndWait(ctx context.Context) { - executor.cancel() - for { - oneHundredMilliseconds := time.NewTimer(time.Millisecond * 100) - select { - case <-oneHundredMilliseconds.C: - if executor.checkNoActiveGoroutines() { - return - } - case <-ctx.Done(): - return - } - } -} - -func (executor *UnboundedExecutor) checkNoActiveGoroutines() bool { - executor.activeGoroutinesMutex.Lock() - defer executor.activeGoroutinesMutex.Unlock() - for startFrom, count := range executor.activeGoroutines { - if count > 0 { - InfoLogger.Println("UnboundedExecutor is still waiting goroutines to quit", - "startFrom", startFrom, - "count", count) - return false - } - } - return true -} diff --git a/vendor/github.com/modern-go/reflect2/LICENSE b/vendor/github.com/modern-go/reflect2/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/vendor/github.com/modern-go/reflect2/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/modern-go/reflect2/go_above_17.go b/vendor/github.com/modern-go/reflect2/go_above_17.go deleted file mode 100644 index 5c1cea868..000000000 --- a/vendor/github.com/modern-go/reflect2/go_above_17.go +++ /dev/null @@ -1,8 +0,0 @@ -//+build go1.7 - -package reflect2 - -import "unsafe" - -//go:linkname resolveTypeOff reflect.resolveTypeOff -func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer diff --git a/vendor/github.com/modern-go/reflect2/go_above_19.go b/vendor/github.com/modern-go/reflect2/go_above_19.go deleted file mode 100644 index c7e3b7801..000000000 --- a/vendor/github.com/modern-go/reflect2/go_above_19.go +++ /dev/null @@ -1,14 +0,0 @@ -//+build go1.9 - -package reflect2 - -import ( - "unsafe" -) - -//go:linkname makemap reflect.makemap -func makemap(rtype unsafe.Pointer, cap int) (m unsafe.Pointer) - -func makeMapWithSize(rtype unsafe.Pointer, cap int) unsafe.Pointer { - return makemap(rtype, cap) -} diff --git a/vendor/github.com/modern-go/reflect2/go_below_17.go b/vendor/github.com/modern-go/reflect2/go_below_17.go deleted file mode 100644 index 65a93c889..000000000 --- a/vendor/github.com/modern-go/reflect2/go_below_17.go +++ /dev/null @@ -1,9 +0,0 @@ -//+build !go1.7 - -package reflect2 - -import "unsafe" - -func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer { - return nil -} diff --git a/vendor/github.com/modern-go/reflect2/go_below_19.go b/vendor/github.com/modern-go/reflect2/go_below_19.go deleted file mode 100644 index b050ef70c..000000000 --- a/vendor/github.com/modern-go/reflect2/go_below_19.go +++ /dev/null @@ -1,14 +0,0 @@ -//+build !go1.9 - -package reflect2 - -import ( - "unsafe" -) - -//go:linkname makemap reflect.makemap -func makemap(rtype unsafe.Pointer) (m unsafe.Pointer) - -func makeMapWithSize(rtype unsafe.Pointer, cap int) unsafe.Pointer { - return makemap(rtype) -} diff --git a/vendor/github.com/modern-go/reflect2/reflect2.go b/vendor/github.com/modern-go/reflect2/reflect2.go deleted file mode 100644 index 63b49c799..000000000 --- a/vendor/github.com/modern-go/reflect2/reflect2.go +++ /dev/null @@ -1,298 +0,0 @@ -package reflect2 - -import ( - "github.com/modern-go/concurrent" - "reflect" - "unsafe" -) - -type Type interface { - Kind() reflect.Kind - // New return pointer to data of this type - New() interface{} - // UnsafeNew return the allocated space pointed by unsafe.Pointer - UnsafeNew() unsafe.Pointer - // PackEFace cast a unsafe pointer to object represented pointer - PackEFace(ptr unsafe.Pointer) interface{} - // Indirect dereference object represented pointer to this type - Indirect(obj interface{}) interface{} - // UnsafeIndirect dereference pointer to this type - UnsafeIndirect(ptr unsafe.Pointer) interface{} - // Type1 returns reflect.Type - Type1() reflect.Type - Implements(thatType Type) bool - String() string - RType() uintptr - // interface{} of this type has pointer like behavior - LikePtr() bool - IsNullable() bool - IsNil(obj interface{}) bool - UnsafeIsNil(ptr unsafe.Pointer) bool - Set(obj interface{}, val interface{}) - UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) - AssignableTo(anotherType Type) bool -} - -type ListType interface { - Type - Elem() Type - SetIndex(obj interface{}, index int, elem interface{}) - UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) - GetIndex(obj interface{}, index int) interface{} - UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer -} - -type ArrayType interface { - ListType - Len() int -} - -type SliceType interface { - ListType - MakeSlice(length int, cap int) interface{} - UnsafeMakeSlice(length int, cap int) unsafe.Pointer - Grow(obj interface{}, newLength int) - UnsafeGrow(ptr unsafe.Pointer, newLength int) - Append(obj interface{}, elem interface{}) - UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) - LengthOf(obj interface{}) int - UnsafeLengthOf(ptr unsafe.Pointer) int - SetNil(obj interface{}) - UnsafeSetNil(ptr unsafe.Pointer) - Cap(obj interface{}) int - UnsafeCap(ptr unsafe.Pointer) int -} - -type StructType interface { - Type - NumField() int - Field(i int) StructField - FieldByName(name string) StructField - FieldByIndex(index []int) StructField - FieldByNameFunc(match func(string) bool) StructField -} - -type StructField interface { - Offset() uintptr - Name() string - PkgPath() string - Type() Type - Tag() reflect.StructTag - Index() []int - Anonymous() bool - Set(obj interface{}, value interface{}) - UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) - Get(obj interface{}) interface{} - UnsafeGet(obj unsafe.Pointer) unsafe.Pointer -} - -type MapType interface { - Type - Key() Type - Elem() Type - MakeMap(cap int) interface{} - UnsafeMakeMap(cap int) unsafe.Pointer - SetIndex(obj interface{}, key interface{}, elem interface{}) - UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) - TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) - GetIndex(obj interface{}, key interface{}) interface{} - UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer - Iterate(obj interface{}) MapIterator - UnsafeIterate(obj unsafe.Pointer) MapIterator -} - -type MapIterator interface { - HasNext() bool - Next() (key interface{}, elem interface{}) - UnsafeNext() (key unsafe.Pointer, elem unsafe.Pointer) -} - -type PtrType interface { - Type - Elem() Type -} - -type InterfaceType interface { - NumMethod() int -} - -type Config struct { - UseSafeImplementation bool -} - -type API interface { - TypeOf(obj interface{}) Type - Type2(type1 reflect.Type) Type -} - -var ConfigUnsafe = Config{UseSafeImplementation: false}.Froze() -var ConfigSafe = Config{UseSafeImplementation: true}.Froze() - -type frozenConfig struct { - useSafeImplementation bool - cache *concurrent.Map -} - -func (cfg Config) Froze() *frozenConfig { - return &frozenConfig{ - useSafeImplementation: cfg.UseSafeImplementation, - cache: concurrent.NewMap(), - } -} - -func (cfg *frozenConfig) TypeOf(obj interface{}) Type { - cacheKey := uintptr(unpackEFace(obj).rtype) - typeObj, found := cfg.cache.Load(cacheKey) - if found { - return typeObj.(Type) - } - return cfg.Type2(reflect.TypeOf(obj)) -} - -func (cfg *frozenConfig) Type2(type1 reflect.Type) Type { - if type1 == nil { - return nil - } - cacheKey := uintptr(unpackEFace(type1).data) - typeObj, found := cfg.cache.Load(cacheKey) - if found { - return typeObj.(Type) - } - type2 := cfg.wrapType(type1) - cfg.cache.Store(cacheKey, type2) - return type2 -} - -func (cfg *frozenConfig) wrapType(type1 reflect.Type) Type { - safeType := safeType{Type: type1, cfg: cfg} - switch type1.Kind() { - case reflect.Struct: - if cfg.useSafeImplementation { - return &safeStructType{safeType} - } - return newUnsafeStructType(cfg, type1) - case reflect.Array: - if cfg.useSafeImplementation { - return &safeSliceType{safeType} - } - return newUnsafeArrayType(cfg, type1) - case reflect.Slice: - if cfg.useSafeImplementation { - return &safeSliceType{safeType} - } - return newUnsafeSliceType(cfg, type1) - case reflect.Map: - if cfg.useSafeImplementation { - return &safeMapType{safeType} - } - return newUnsafeMapType(cfg, type1) - case reflect.Ptr, reflect.Chan, reflect.Func: - if cfg.useSafeImplementation { - return &safeMapType{safeType} - } - return newUnsafePtrType(cfg, type1) - case reflect.Interface: - if cfg.useSafeImplementation { - return &safeMapType{safeType} - } - if type1.NumMethod() == 0 { - return newUnsafeEFaceType(cfg, type1) - } - return newUnsafeIFaceType(cfg, type1) - default: - if cfg.useSafeImplementation { - return &safeType - } - return newUnsafeType(cfg, type1) - } -} - -func TypeOf(obj interface{}) Type { - return ConfigUnsafe.TypeOf(obj) -} - -func TypeOfPtr(obj interface{}) PtrType { - return TypeOf(obj).(PtrType) -} - -func Type2(type1 reflect.Type) Type { - if type1 == nil { - return nil - } - return ConfigUnsafe.Type2(type1) -} - -func PtrTo(typ Type) Type { - return Type2(reflect.PtrTo(typ.Type1())) -} - -func PtrOf(obj interface{}) unsafe.Pointer { - return unpackEFace(obj).data -} - -func RTypeOf(obj interface{}) uintptr { - return uintptr(unpackEFace(obj).rtype) -} - -func IsNil(obj interface{}) bool { - if obj == nil { - return true - } - return unpackEFace(obj).data == nil -} - -func IsNullable(kind reflect.Kind) bool { - switch kind { - case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func, reflect.Slice, reflect.Interface: - return true - } - return false -} - -func likePtrKind(kind reflect.Kind) bool { - switch kind { - case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func: - return true - } - return false -} - -func likePtrType(typ reflect.Type) bool { - if likePtrKind(typ.Kind()) { - return true - } - if typ.Kind() == reflect.Struct { - if typ.NumField() != 1 { - return false - } - return likePtrType(typ.Field(0).Type) - } - if typ.Kind() == reflect.Array { - if typ.Len() != 1 { - return false - } - return likePtrType(typ.Elem()) - } - return false -} - -// NoEscape hides a pointer from escape analysis. noescape is -// the identity function but escape analysis doesn't think the -// output depends on the input. noescape is inlined and currently -// compiles down to zero instructions. -// USE CAREFULLY! -//go:nosplit -func NoEscape(p unsafe.Pointer) unsafe.Pointer { - x := uintptr(p) - return unsafe.Pointer(x ^ 0) -} - -func UnsafeCastString(str string) []byte { - stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&str)) - sliceHeader := &reflect.SliceHeader{ - Data: stringHeader.Data, - Cap: stringHeader.Len, - Len: stringHeader.Len, - } - return *(*[]byte)(unsafe.Pointer(sliceHeader)) -} diff --git a/vendor/github.com/modern-go/reflect2/reflect2_amd64.s b/vendor/github.com/modern-go/reflect2/reflect2_amd64.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/reflect2_kind.go b/vendor/github.com/modern-go/reflect2/reflect2_kind.go deleted file mode 100644 index 62f299e40..000000000 --- a/vendor/github.com/modern-go/reflect2/reflect2_kind.go +++ /dev/null @@ -1,30 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -// DefaultTypeOfKind return the non aliased default type for the kind -func DefaultTypeOfKind(kind reflect.Kind) Type { - return kindTypes[kind] -} - -var kindTypes = map[reflect.Kind]Type{ - reflect.Bool: TypeOf(true), - reflect.Uint8: TypeOf(uint8(0)), - reflect.Int8: TypeOf(int8(0)), - reflect.Uint16: TypeOf(uint16(0)), - reflect.Int16: TypeOf(int16(0)), - reflect.Uint32: TypeOf(uint32(0)), - reflect.Int32: TypeOf(int32(0)), - reflect.Uint64: TypeOf(uint64(0)), - reflect.Int64: TypeOf(int64(0)), - reflect.Uint: TypeOf(uint(0)), - reflect.Int: TypeOf(int(0)), - reflect.Float32: TypeOf(float32(0)), - reflect.Float64: TypeOf(float64(0)), - reflect.Uintptr: TypeOf(uintptr(0)), - reflect.String: TypeOf(""), - reflect.UnsafePointer: TypeOf(unsafe.Pointer(nil)), -} diff --git a/vendor/github.com/modern-go/reflect2/relfect2_386.s b/vendor/github.com/modern-go/reflect2/relfect2_386.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s b/vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_arm.s b/vendor/github.com/modern-go/reflect2/relfect2_arm.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_arm64.s b/vendor/github.com/modern-go/reflect2/relfect2_arm64.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_mips64x.s b/vendor/github.com/modern-go/reflect2/relfect2_mips64x.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_mipsx.s b/vendor/github.com/modern-go/reflect2/relfect2_mipsx.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s b/vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/relfect2_s390x.s b/vendor/github.com/modern-go/reflect2/relfect2_s390x.s deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/modern-go/reflect2/safe_field.go b/vendor/github.com/modern-go/reflect2/safe_field.go deleted file mode 100644 index d4ba1f4f8..000000000 --- a/vendor/github.com/modern-go/reflect2/safe_field.go +++ /dev/null @@ -1,58 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type safeField struct { - reflect.StructField -} - -func (field *safeField) Offset() uintptr { - return field.StructField.Offset -} - -func (field *safeField) Name() string { - return field.StructField.Name -} - -func (field *safeField) PkgPath() string { - return field.StructField.PkgPath -} - -func (field *safeField) Type() Type { - panic("not implemented") -} - -func (field *safeField) Tag() reflect.StructTag { - return field.StructField.Tag -} - -func (field *safeField) Index() []int { - return field.StructField.Index -} - -func (field *safeField) Anonymous() bool { - return field.StructField.Anonymous -} - -func (field *safeField) Set(obj interface{}, value interface{}) { - val := reflect.ValueOf(obj).Elem() - val.FieldByIndex(field.Index()).Set(reflect.ValueOf(value).Elem()) -} - -func (field *safeField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { - panic("unsafe operation is not supported") -} - -func (field *safeField) Get(obj interface{}) interface{} { - val := reflect.ValueOf(obj).Elem().FieldByIndex(field.Index()) - ptr := reflect.New(val.Type()) - ptr.Elem().Set(val) - return ptr.Interface() -} - -func (field *safeField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { - panic("does not support unsafe operation") -} diff --git a/vendor/github.com/modern-go/reflect2/safe_map.go b/vendor/github.com/modern-go/reflect2/safe_map.go deleted file mode 100644 index 88362205a..000000000 --- a/vendor/github.com/modern-go/reflect2/safe_map.go +++ /dev/null @@ -1,101 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type safeMapType struct { - safeType -} - -func (type2 *safeMapType) Key() Type { - return type2.safeType.cfg.Type2(type2.Type.Key()) -} - -func (type2 *safeMapType) MakeMap(cap int) interface{} { - ptr := reflect.New(type2.Type) - ptr.Elem().Set(reflect.MakeMap(type2.Type)) - return ptr.Interface() -} - -func (type2 *safeMapType) UnsafeMakeMap(cap int) unsafe.Pointer { - panic("does not support unsafe operation") -} - -func (type2 *safeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) { - keyVal := reflect.ValueOf(key) - elemVal := reflect.ValueOf(elem) - val := reflect.ValueOf(obj) - val.Elem().SetMapIndex(keyVal.Elem(), elemVal.Elem()) -} - -func (type2 *safeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) { - panic("does not support unsafe operation") -} - -func (type2 *safeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) { - keyVal := reflect.ValueOf(key) - if key == nil { - keyVal = reflect.New(type2.Type.Key()).Elem() - } - val := reflect.ValueOf(obj).MapIndex(keyVal) - if !val.IsValid() { - return nil, false - } - return val.Interface(), true -} - -func (type2 *safeMapType) GetIndex(obj interface{}, key interface{}) interface{} { - val := reflect.ValueOf(obj).Elem() - keyVal := reflect.ValueOf(key).Elem() - elemVal := val.MapIndex(keyVal) - if !elemVal.IsValid() { - ptr := reflect.New(reflect.PtrTo(val.Type().Elem())) - return ptr.Elem().Interface() - } - ptr := reflect.New(elemVal.Type()) - ptr.Elem().Set(elemVal) - return ptr.Interface() -} - -func (type2 *safeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer { - panic("does not support unsafe operation") -} - -func (type2 *safeMapType) Iterate(obj interface{}) MapIterator { - m := reflect.ValueOf(obj).Elem() - return &safeMapIterator{ - m: m, - keys: m.MapKeys(), - } -} - -func (type2 *safeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator { - panic("does not support unsafe operation") -} - -type safeMapIterator struct { - i int - m reflect.Value - keys []reflect.Value -} - -func (iter *safeMapIterator) HasNext() bool { - return iter.i != len(iter.keys) -} - -func (iter *safeMapIterator) Next() (interface{}, interface{}) { - key := iter.keys[iter.i] - elem := iter.m.MapIndex(key) - iter.i += 1 - keyPtr := reflect.New(key.Type()) - keyPtr.Elem().Set(key) - elemPtr := reflect.New(elem.Type()) - elemPtr.Elem().Set(elem) - return keyPtr.Interface(), elemPtr.Interface() -} - -func (iter *safeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) { - panic("does not support unsafe operation") -} diff --git a/vendor/github.com/modern-go/reflect2/safe_slice.go b/vendor/github.com/modern-go/reflect2/safe_slice.go deleted file mode 100644 index bcce6fd20..000000000 --- a/vendor/github.com/modern-go/reflect2/safe_slice.go +++ /dev/null @@ -1,92 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type safeSliceType struct { - safeType -} - -func (type2 *safeSliceType) SetIndex(obj interface{}, index int, value interface{}) { - val := reflect.ValueOf(obj).Elem() - elem := reflect.ValueOf(value).Elem() - val.Index(index).Set(elem) -} - -func (type2 *safeSliceType) UnsafeSetIndex(obj unsafe.Pointer, index int, value unsafe.Pointer) { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) GetIndex(obj interface{}, index int) interface{} { - val := reflect.ValueOf(obj).Elem() - elem := val.Index(index) - ptr := reflect.New(elem.Type()) - ptr.Elem().Set(elem) - return ptr.Interface() -} - -func (type2 *safeSliceType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) MakeSlice(length int, cap int) interface{} { - val := reflect.MakeSlice(type2.Type, length, cap) - ptr := reflect.New(val.Type()) - ptr.Elem().Set(val) - return ptr.Interface() -} - -func (type2 *safeSliceType) UnsafeMakeSlice(length int, cap int) unsafe.Pointer { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) Grow(obj interface{}, newLength int) { - oldCap := type2.Cap(obj) - oldSlice := reflect.ValueOf(obj).Elem() - delta := newLength - oldCap - deltaVals := make([]reflect.Value, delta) - newSlice := reflect.Append(oldSlice, deltaVals...) - oldSlice.Set(newSlice) -} - -func (type2 *safeSliceType) UnsafeGrow(ptr unsafe.Pointer, newLength int) { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) Append(obj interface{}, elem interface{}) { - val := reflect.ValueOf(obj).Elem() - elemVal := reflect.ValueOf(elem).Elem() - newVal := reflect.Append(val, elemVal) - val.Set(newVal) -} - -func (type2 *safeSliceType) UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) SetNil(obj interface{}) { - val := reflect.ValueOf(obj).Elem() - val.Set(reflect.Zero(val.Type())) -} - -func (type2 *safeSliceType) UnsafeSetNil(ptr unsafe.Pointer) { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) LengthOf(obj interface{}) int { - return reflect.ValueOf(obj).Elem().Len() -} - -func (type2 *safeSliceType) UnsafeLengthOf(ptr unsafe.Pointer) int { - panic("does not support unsafe operation") -} - -func (type2 *safeSliceType) Cap(obj interface{}) int { - return reflect.ValueOf(obj).Elem().Cap() -} - -func (type2 *safeSliceType) UnsafeCap(ptr unsafe.Pointer) int { - panic("does not support unsafe operation") -} diff --git a/vendor/github.com/modern-go/reflect2/safe_struct.go b/vendor/github.com/modern-go/reflect2/safe_struct.go deleted file mode 100644 index e5fb9b313..000000000 --- a/vendor/github.com/modern-go/reflect2/safe_struct.go +++ /dev/null @@ -1,29 +0,0 @@ -package reflect2 - -type safeStructType struct { - safeType -} - -func (type2 *safeStructType) FieldByName(name string) StructField { - field, found := type2.Type.FieldByName(name) - if !found { - panic("field " + name + " not found") - } - return &safeField{StructField: field} -} - -func (type2 *safeStructType) Field(i int) StructField { - return &safeField{StructField: type2.Type.Field(i)} -} - -func (type2 *safeStructType) FieldByIndex(index []int) StructField { - return &safeField{StructField: type2.Type.FieldByIndex(index)} -} - -func (type2 *safeStructType) FieldByNameFunc(match func(string) bool) StructField { - field, found := type2.Type.FieldByNameFunc(match) - if !found { - panic("field match condition not found in " + type2.Type.String()) - } - return &safeField{StructField: field} -} diff --git a/vendor/github.com/modern-go/reflect2/safe_type.go b/vendor/github.com/modern-go/reflect2/safe_type.go deleted file mode 100644 index ee4e7bb6e..000000000 --- a/vendor/github.com/modern-go/reflect2/safe_type.go +++ /dev/null @@ -1,78 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type safeType struct { - reflect.Type - cfg *frozenConfig -} - -func (type2 *safeType) New() interface{} { - return reflect.New(type2.Type).Interface() -} - -func (type2 *safeType) UnsafeNew() unsafe.Pointer { - panic("does not support unsafe operation") -} - -func (type2 *safeType) Elem() Type { - return type2.cfg.Type2(type2.Type.Elem()) -} - -func (type2 *safeType) Type1() reflect.Type { - return type2.Type -} - -func (type2 *safeType) PackEFace(ptr unsafe.Pointer) interface{} { - panic("does not support unsafe operation") -} - -func (type2 *safeType) Implements(thatType Type) bool { - return type2.Type.Implements(thatType.Type1()) -} - -func (type2 *safeType) RType() uintptr { - panic("does not support unsafe operation") -} - -func (type2 *safeType) Indirect(obj interface{}) interface{} { - return reflect.Indirect(reflect.ValueOf(obj)).Interface() -} - -func (type2 *safeType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - panic("does not support unsafe operation") -} - -func (type2 *safeType) LikePtr() bool { - panic("does not support unsafe operation") -} - -func (type2 *safeType) IsNullable() bool { - return IsNullable(type2.Kind()) -} - -func (type2 *safeType) IsNil(obj interface{}) bool { - if obj == nil { - return true - } - return reflect.ValueOf(obj).Elem().IsNil() -} - -func (type2 *safeType) UnsafeIsNil(ptr unsafe.Pointer) bool { - panic("does not support unsafe operation") -} - -func (type2 *safeType) Set(obj interface{}, val interface{}) { - reflect.ValueOf(obj).Elem().Set(reflect.ValueOf(val).Elem()) -} - -func (type2 *safeType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { - panic("does not support unsafe operation") -} - -func (type2 *safeType) AssignableTo(anotherType Type) bool { - return type2.Type1().AssignableTo(anotherType.Type1()) -} diff --git a/vendor/github.com/modern-go/reflect2/type_map.go b/vendor/github.com/modern-go/reflect2/type_map.go deleted file mode 100644 index 6d489112f..000000000 --- a/vendor/github.com/modern-go/reflect2/type_map.go +++ /dev/null @@ -1,103 +0,0 @@ -package reflect2 - -import ( - "reflect" - "runtime" - "strings" - "unsafe" -) - -// typelinks1 for 1.5 ~ 1.6 -//go:linkname typelinks1 reflect.typelinks -func typelinks1() [][]unsafe.Pointer - -// typelinks2 for 1.7 ~ -//go:linkname typelinks2 reflect.typelinks -func typelinks2() (sections []unsafe.Pointer, offset [][]int32) - -var types = map[string]reflect.Type{} -var packages = map[string]map[string]reflect.Type{} - -func init() { - ver := runtime.Version() - if ver == "go1.5" || strings.HasPrefix(ver, "go1.5.") { - loadGo15Types() - } else if ver == "go1.6" || strings.HasPrefix(ver, "go1.6.") { - loadGo15Types() - } else { - loadGo17Types() - } -} - -func loadGo15Types() { - var obj interface{} = reflect.TypeOf(0) - typePtrss := typelinks1() - for _, typePtrs := range typePtrss { - for _, typePtr := range typePtrs { - (*emptyInterface)(unsafe.Pointer(&obj)).word = typePtr - typ := obj.(reflect.Type) - if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { - loadedType := typ.Elem() - pkgTypes := packages[loadedType.PkgPath()] - if pkgTypes == nil { - pkgTypes = map[string]reflect.Type{} - packages[loadedType.PkgPath()] = pkgTypes - } - types[loadedType.String()] = loadedType - pkgTypes[loadedType.Name()] = loadedType - } - if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Ptr && - typ.Elem().Elem().Kind() == reflect.Struct { - loadedType := typ.Elem().Elem() - pkgTypes := packages[loadedType.PkgPath()] - if pkgTypes == nil { - pkgTypes = map[string]reflect.Type{} - packages[loadedType.PkgPath()] = pkgTypes - } - types[loadedType.String()] = loadedType - pkgTypes[loadedType.Name()] = loadedType - } - } - } -} - -func loadGo17Types() { - var obj interface{} = reflect.TypeOf(0) - sections, offset := typelinks2() - for i, offs := range offset { - rodata := sections[i] - for _, off := range offs { - (*emptyInterface)(unsafe.Pointer(&obj)).word = resolveTypeOff(unsafe.Pointer(rodata), off) - typ := obj.(reflect.Type) - if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { - loadedType := typ.Elem() - pkgTypes := packages[loadedType.PkgPath()] - if pkgTypes == nil { - pkgTypes = map[string]reflect.Type{} - packages[loadedType.PkgPath()] = pkgTypes - } - types[loadedType.String()] = loadedType - pkgTypes[loadedType.Name()] = loadedType - } - } - } -} - -type emptyInterface struct { - typ unsafe.Pointer - word unsafe.Pointer -} - -// TypeByName return the type by its name, just like Class.forName in java -func TypeByName(typeName string) Type { - return Type2(types[typeName]) -} - -// TypeByPackageName return the type by its package and name -func TypeByPackageName(pkgPath string, name string) Type { - pkgTypes := packages[pkgPath] - if pkgTypes == nil { - return nil - } - return Type2(pkgTypes[name]) -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_array.go b/vendor/github.com/modern-go/reflect2/unsafe_array.go deleted file mode 100644 index 76cbdba6e..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_array.go +++ /dev/null @@ -1,65 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type UnsafeArrayType struct { - unsafeType - elemRType unsafe.Pointer - pElemRType unsafe.Pointer - elemSize uintptr - likePtr bool -} - -func newUnsafeArrayType(cfg *frozenConfig, type1 reflect.Type) *UnsafeArrayType { - return &UnsafeArrayType{ - unsafeType: *newUnsafeType(cfg, type1), - elemRType: unpackEFace(type1.Elem()).data, - pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data, - elemSize: type1.Elem().Size(), - likePtr: likePtrType(type1), - } -} - -func (type2 *UnsafeArrayType) LikePtr() bool { - return type2.likePtr -} - -func (type2 *UnsafeArrayType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *UnsafeArrayType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - if type2.likePtr { - return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) - } - return packEFace(type2.rtype, ptr) -} - -func (type2 *UnsafeArrayType) SetIndex(obj interface{}, index int, elem interface{}) { - objEFace := unpackEFace(obj) - assertType("ArrayType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) - elemEFace := unpackEFace(elem) - assertType("ArrayType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) - type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data) -} - -func (type2 *UnsafeArrayType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) { - elemPtr := arrayAt(obj, index, type2.elemSize, "i < s.Len") - typedmemmove(type2.elemRType, elemPtr, elem) -} - -func (type2 *UnsafeArrayType) GetIndex(obj interface{}, index int) interface{} { - objEFace := unpackEFace(obj) - assertType("ArrayType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) - elemPtr := type2.UnsafeGetIndex(objEFace.data, index) - return packEFace(type2.pElemRType, elemPtr) -} - -func (type2 *UnsafeArrayType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { - return arrayAt(obj, index, type2.elemSize, "i < s.Len") -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_eface.go b/vendor/github.com/modern-go/reflect2/unsafe_eface.go deleted file mode 100644 index 805010f3a..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_eface.go +++ /dev/null @@ -1,59 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type eface struct { - rtype unsafe.Pointer - data unsafe.Pointer -} - -func unpackEFace(obj interface{}) *eface { - return (*eface)(unsafe.Pointer(&obj)) -} - -func packEFace(rtype unsafe.Pointer, data unsafe.Pointer) interface{} { - var i interface{} - e := (*eface)(unsafe.Pointer(&i)) - e.rtype = rtype - e.data = data - return i -} - -type UnsafeEFaceType struct { - unsafeType -} - -func newUnsafeEFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeEFaceType { - return &UnsafeEFaceType{ - unsafeType: *newUnsafeType(cfg, type1), - } -} - -func (type2 *UnsafeEFaceType) IsNil(obj interface{}) bool { - if obj == nil { - return true - } - objEFace := unpackEFace(obj) - assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIsNil(objEFace.data) -} - -func (type2 *UnsafeEFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { - if ptr == nil { - return true - } - return unpackEFace(*(*interface{})(ptr)).data == nil -} - -func (type2 *UnsafeEFaceType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *UnsafeEFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - return *(*interface{})(ptr) -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_field.go b/vendor/github.com/modern-go/reflect2/unsafe_field.go deleted file mode 100644 index 5eb53130a..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_field.go +++ /dev/null @@ -1,74 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type UnsafeStructField struct { - reflect.StructField - structType *UnsafeStructType - rtype unsafe.Pointer - ptrRType unsafe.Pointer -} - -func newUnsafeStructField(structType *UnsafeStructType, structField reflect.StructField) *UnsafeStructField { - return &UnsafeStructField{ - StructField: structField, - rtype: unpackEFace(structField.Type).data, - ptrRType: unpackEFace(reflect.PtrTo(structField.Type)).data, - structType: structType, - } -} - -func (field *UnsafeStructField) Offset() uintptr { - return field.StructField.Offset -} - -func (field *UnsafeStructField) Name() string { - return field.StructField.Name -} - -func (field *UnsafeStructField) PkgPath() string { - return field.StructField.PkgPath -} - -func (field *UnsafeStructField) Type() Type { - return field.structType.cfg.Type2(field.StructField.Type) -} - -func (field *UnsafeStructField) Tag() reflect.StructTag { - return field.StructField.Tag -} - -func (field *UnsafeStructField) Index() []int { - return field.StructField.Index -} - -func (field *UnsafeStructField) Anonymous() bool { - return field.StructField.Anonymous -} - -func (field *UnsafeStructField) Set(obj interface{}, value interface{}) { - objEFace := unpackEFace(obj) - assertType("StructField.SetIndex argument 1", field.structType.ptrRType, objEFace.rtype) - valueEFace := unpackEFace(value) - assertType("StructField.SetIndex argument 2", field.ptrRType, valueEFace.rtype) - field.UnsafeSet(objEFace.data, valueEFace.data) -} - -func (field *UnsafeStructField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { - fieldPtr := add(obj, field.StructField.Offset, "same as non-reflect &v.field") - typedmemmove(field.rtype, fieldPtr, value) -} - -func (field *UnsafeStructField) Get(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("StructField.GetIndex argument 1", field.structType.ptrRType, objEFace.rtype) - value := field.UnsafeGet(objEFace.data) - return packEFace(field.ptrRType, value) -} - -func (field *UnsafeStructField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { - return add(obj, field.StructField.Offset, "same as non-reflect &v.field") -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_iface.go b/vendor/github.com/modern-go/reflect2/unsafe_iface.go deleted file mode 100644 index b60195533..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_iface.go +++ /dev/null @@ -1,64 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type iface struct { - itab *itab - data unsafe.Pointer -} - -type itab struct { - ignore unsafe.Pointer - rtype unsafe.Pointer -} - -func IFaceToEFace(ptr unsafe.Pointer) interface{} { - iface := (*iface)(ptr) - if iface.itab == nil { - return nil - } - return packEFace(iface.itab.rtype, iface.data) -} - -type UnsafeIFaceType struct { - unsafeType -} - -func newUnsafeIFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeIFaceType { - return &UnsafeIFaceType{ - unsafeType: *newUnsafeType(cfg, type1), - } -} - -func (type2 *UnsafeIFaceType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *UnsafeIFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - return IFaceToEFace(ptr) -} - -func (type2 *UnsafeIFaceType) IsNil(obj interface{}) bool { - if obj == nil { - return true - } - objEFace := unpackEFace(obj) - assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIsNil(objEFace.data) -} - -func (type2 *UnsafeIFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { - if ptr == nil { - return true - } - iface := (*iface)(ptr) - if iface.itab == nil { - return true - } - return false -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_link.go b/vendor/github.com/modern-go/reflect2/unsafe_link.go deleted file mode 100644 index 57229c8db..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_link.go +++ /dev/null @@ -1,70 +0,0 @@ -package reflect2 - -import "unsafe" - -//go:linkname unsafe_New reflect.unsafe_New -func unsafe_New(rtype unsafe.Pointer) unsafe.Pointer - -//go:linkname typedmemmove reflect.typedmemmove -func typedmemmove(rtype unsafe.Pointer, dst, src unsafe.Pointer) - -//go:linkname unsafe_NewArray reflect.unsafe_NewArray -func unsafe_NewArray(rtype unsafe.Pointer, length int) unsafe.Pointer - -// typedslicecopy copies a slice of elemType values from src to dst, -// returning the number of elements copied. -//go:linkname typedslicecopy reflect.typedslicecopy -//go:noescape -func typedslicecopy(elemType unsafe.Pointer, dst, src sliceHeader) int - -//go:linkname mapassign reflect.mapassign -//go:noescape -func mapassign(rtype unsafe.Pointer, m unsafe.Pointer, key, val unsafe.Pointer) - -//go:linkname mapaccess reflect.mapaccess -//go:noescape -func mapaccess(rtype unsafe.Pointer, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer) - -// m escapes into the return value, but the caller of mapiterinit -// doesn't let the return value escape. -//go:noescape -//go:linkname mapiterinit reflect.mapiterinit -func mapiterinit(rtype unsafe.Pointer, m unsafe.Pointer) *hiter - -//go:noescape -//go:linkname mapiternext reflect.mapiternext -func mapiternext(it *hiter) - -//go:linkname ifaceE2I reflect.ifaceE2I -func ifaceE2I(rtype unsafe.Pointer, src interface{}, dst unsafe.Pointer) - -// A hash iteration structure. -// If you modify hiter, also change cmd/internal/gc/reflect.go to indicate -// the layout of this structure. -type hiter struct { - key unsafe.Pointer // Must be in first position. Write nil to indicate iteration end (see cmd/internal/gc/range.go). - value unsafe.Pointer // Must be in second position (see cmd/internal/gc/range.go). - // rest fields are ignored -} - -// add returns p+x. -// -// The whySafe string is ignored, so that the function still inlines -// as efficiently as p+x, but all call sites should use the string to -// record why the addition is safe, which is to say why the addition -// does not cause x to advance to the very end of p's allocation -// and therefore point incorrectly at the next block in memory. -func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer { - return unsafe.Pointer(uintptr(p) + x) -} - -// arrayAt returns the i-th element of p, -// an array whose elements are eltSize bytes wide. -// The array pointed at by p must have at least i+1 elements: -// it is invalid (but impossible to check here) to pass i >= len, -// because then the result will point outside the array. -// whySafe must explain why i < len. (Passing "i < len" is fine; -// the benefit is to surface this assumption at the call site.) -func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer { - return add(p, uintptr(i)*eltSize, "i < len") -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_map.go b/vendor/github.com/modern-go/reflect2/unsafe_map.go deleted file mode 100644 index f2e76e6bb..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_map.go +++ /dev/null @@ -1,138 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type UnsafeMapType struct { - unsafeType - pKeyRType unsafe.Pointer - pElemRType unsafe.Pointer -} - -func newUnsafeMapType(cfg *frozenConfig, type1 reflect.Type) MapType { - return &UnsafeMapType{ - unsafeType: *newUnsafeType(cfg, type1), - pKeyRType: unpackEFace(reflect.PtrTo(type1.Key())).data, - pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data, - } -} - -func (type2 *UnsafeMapType) IsNil(obj interface{}) bool { - if obj == nil { - return true - } - objEFace := unpackEFace(obj) - assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIsNil(objEFace.data) -} - -func (type2 *UnsafeMapType) UnsafeIsNil(ptr unsafe.Pointer) bool { - if ptr == nil { - return true - } - return *(*unsafe.Pointer)(ptr) == nil -} - -func (type2 *UnsafeMapType) LikePtr() bool { - return true -} - -func (type2 *UnsafeMapType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("MapType.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *UnsafeMapType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) -} - -func (type2 *UnsafeMapType) Key() Type { - return type2.cfg.Type2(type2.Type.Key()) -} - -func (type2 *UnsafeMapType) MakeMap(cap int) interface{} { - return packEFace(type2.ptrRType, type2.UnsafeMakeMap(cap)) -} - -func (type2 *UnsafeMapType) UnsafeMakeMap(cap int) unsafe.Pointer { - m := makeMapWithSize(type2.rtype, cap) - return unsafe.Pointer(&m) -} - -func (type2 *UnsafeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) { - objEFace := unpackEFace(obj) - assertType("MapType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) - keyEFace := unpackEFace(key) - assertType("MapType.SetIndex argument 2", type2.pKeyRType, keyEFace.rtype) - elemEFace := unpackEFace(elem) - assertType("MapType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) - type2.UnsafeSetIndex(objEFace.data, keyEFace.data, elemEFace.data) -} - -func (type2 *UnsafeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) { - mapassign(type2.rtype, *(*unsafe.Pointer)(obj), key, elem) -} - -func (type2 *UnsafeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) { - objEFace := unpackEFace(obj) - assertType("MapType.TryGetIndex argument 1", type2.ptrRType, objEFace.rtype) - keyEFace := unpackEFace(key) - assertType("MapType.TryGetIndex argument 2", type2.pKeyRType, keyEFace.rtype) - elemPtr := type2.UnsafeGetIndex(objEFace.data, keyEFace.data) - if elemPtr == nil { - return nil, false - } - return packEFace(type2.pElemRType, elemPtr), true -} - -func (type2 *UnsafeMapType) GetIndex(obj interface{}, key interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("MapType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) - keyEFace := unpackEFace(key) - assertType("MapType.GetIndex argument 2", type2.pKeyRType, keyEFace.rtype) - elemPtr := type2.UnsafeGetIndex(objEFace.data, keyEFace.data) - return packEFace(type2.pElemRType, elemPtr) -} - -func (type2 *UnsafeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer { - return mapaccess(type2.rtype, *(*unsafe.Pointer)(obj), key) -} - -func (type2 *UnsafeMapType) Iterate(obj interface{}) MapIterator { - objEFace := unpackEFace(obj) - assertType("MapType.Iterate argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIterate(objEFace.data) -} - -func (type2 *UnsafeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator { - return &UnsafeMapIterator{ - hiter: mapiterinit(type2.rtype, *(*unsafe.Pointer)(obj)), - pKeyRType: type2.pKeyRType, - pElemRType: type2.pElemRType, - } -} - -type UnsafeMapIterator struct { - *hiter - pKeyRType unsafe.Pointer - pElemRType unsafe.Pointer -} - -func (iter *UnsafeMapIterator) HasNext() bool { - return iter.key != nil -} - -func (iter *UnsafeMapIterator) Next() (interface{}, interface{}) { - key, elem := iter.UnsafeNext() - return packEFace(iter.pKeyRType, key), packEFace(iter.pElemRType, elem) -} - -func (iter *UnsafeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) { - key := iter.key - elem := iter.value - mapiternext(iter.hiter) - return key, elem -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_ptr.go b/vendor/github.com/modern-go/reflect2/unsafe_ptr.go deleted file mode 100644 index 8e5ec9cf4..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_ptr.go +++ /dev/null @@ -1,46 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type UnsafePtrType struct { - unsafeType -} - -func newUnsafePtrType(cfg *frozenConfig, type1 reflect.Type) *UnsafePtrType { - return &UnsafePtrType{ - unsafeType: *newUnsafeType(cfg, type1), - } -} - -func (type2 *UnsafePtrType) IsNil(obj interface{}) bool { - if obj == nil { - return true - } - objEFace := unpackEFace(obj) - assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIsNil(objEFace.data) -} - -func (type2 *UnsafePtrType) UnsafeIsNil(ptr unsafe.Pointer) bool { - if ptr == nil { - return true - } - return *(*unsafe.Pointer)(ptr) == nil -} - -func (type2 *UnsafePtrType) LikePtr() bool { - return true -} - -func (type2 *UnsafePtrType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *UnsafePtrType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_slice.go b/vendor/github.com/modern-go/reflect2/unsafe_slice.go deleted file mode 100644 index 1c6d876c7..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_slice.go +++ /dev/null @@ -1,177 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -// sliceHeader is a safe version of SliceHeader used within this package. -type sliceHeader struct { - Data unsafe.Pointer - Len int - Cap int -} - -type UnsafeSliceType struct { - unsafeType - elemRType unsafe.Pointer - pElemRType unsafe.Pointer - elemSize uintptr -} - -func newUnsafeSliceType(cfg *frozenConfig, type1 reflect.Type) SliceType { - elemType := type1.Elem() - return &UnsafeSliceType{ - unsafeType: *newUnsafeType(cfg, type1), - pElemRType: unpackEFace(reflect.PtrTo(elemType)).data, - elemRType: unpackEFace(elemType).data, - elemSize: elemType.Size(), - } -} - -func (type2 *UnsafeSliceType) Set(obj interface{}, val interface{}) { - objEFace := unpackEFace(obj) - assertType("Type.Set argument 1", type2.ptrRType, objEFace.rtype) - valEFace := unpackEFace(val) - assertType("Type.Set argument 2", type2.ptrRType, valEFace.rtype) - type2.UnsafeSet(objEFace.data, valEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { - *(*sliceHeader)(ptr) = *(*sliceHeader)(val) -} - -func (type2 *UnsafeSliceType) IsNil(obj interface{}) bool { - if obj == nil { - return true - } - objEFace := unpackEFace(obj) - assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIsNil(objEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeIsNil(ptr unsafe.Pointer) bool { - if ptr == nil { - return true - } - return (*sliceHeader)(ptr).Data == nil -} - -func (type2 *UnsafeSliceType) SetNil(obj interface{}) { - objEFace := unpackEFace(obj) - assertType("SliceType.SetNil argument 1", type2.ptrRType, objEFace.rtype) - type2.UnsafeSetNil(objEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeSetNil(ptr unsafe.Pointer) { - header := (*sliceHeader)(ptr) - header.Len = 0 - header.Cap = 0 - header.Data = nil -} - -func (type2 *UnsafeSliceType) MakeSlice(length int, cap int) interface{} { - return packEFace(type2.ptrRType, type2.UnsafeMakeSlice(length, cap)) -} - -func (type2 *UnsafeSliceType) UnsafeMakeSlice(length int, cap int) unsafe.Pointer { - header := &sliceHeader{unsafe_NewArray(type2.elemRType, cap), length, cap} - return unsafe.Pointer(header) -} - -func (type2 *UnsafeSliceType) LengthOf(obj interface{}) int { - objEFace := unpackEFace(obj) - assertType("SliceType.Len argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeLengthOf(objEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeLengthOf(obj unsafe.Pointer) int { - header := (*sliceHeader)(obj) - return header.Len -} - -func (type2 *UnsafeSliceType) SetIndex(obj interface{}, index int, elem interface{}) { - objEFace := unpackEFace(obj) - assertType("SliceType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) - elemEFace := unpackEFace(elem) - assertType("SliceType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) - type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) { - header := (*sliceHeader)(obj) - elemPtr := arrayAt(header.Data, index, type2.elemSize, "i < s.Len") - typedmemmove(type2.elemRType, elemPtr, elem) -} - -func (type2 *UnsafeSliceType) GetIndex(obj interface{}, index int) interface{} { - objEFace := unpackEFace(obj) - assertType("SliceType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) - elemPtr := type2.UnsafeGetIndex(objEFace.data, index) - return packEFace(type2.pElemRType, elemPtr) -} - -func (type2 *UnsafeSliceType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { - header := (*sliceHeader)(obj) - return arrayAt(header.Data, index, type2.elemSize, "i < s.Len") -} - -func (type2 *UnsafeSliceType) Append(obj interface{}, elem interface{}) { - objEFace := unpackEFace(obj) - assertType("SliceType.Append argument 1", type2.ptrRType, objEFace.rtype) - elemEFace := unpackEFace(elem) - assertType("SliceType.Append argument 2", type2.pElemRType, elemEFace.rtype) - type2.UnsafeAppend(objEFace.data, elemEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) { - header := (*sliceHeader)(obj) - oldLen := header.Len - type2.UnsafeGrow(obj, oldLen+1) - type2.UnsafeSetIndex(obj, oldLen, elem) -} - -func (type2 *UnsafeSliceType) Cap(obj interface{}) int { - objEFace := unpackEFace(obj) - assertType("SliceType.Cap argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeCap(objEFace.data) -} - -func (type2 *UnsafeSliceType) UnsafeCap(ptr unsafe.Pointer) int { - return (*sliceHeader)(ptr).Cap -} - -func (type2 *UnsafeSliceType) Grow(obj interface{}, newLength int) { - objEFace := unpackEFace(obj) - assertType("SliceType.Grow argument 1", type2.ptrRType, objEFace.rtype) - type2.UnsafeGrow(objEFace.data, newLength) -} - -func (type2 *UnsafeSliceType) UnsafeGrow(obj unsafe.Pointer, newLength int) { - header := (*sliceHeader)(obj) - if newLength <= header.Cap { - header.Len = newLength - return - } - newCap := calcNewCap(header.Cap, newLength) - newHeader := (*sliceHeader)(type2.UnsafeMakeSlice(header.Len, newCap)) - typedslicecopy(type2.elemRType, *newHeader, *header) - header.Data = newHeader.Data - header.Cap = newHeader.Cap - header.Len = newLength -} - -func calcNewCap(cap int, expectedCap int) int { - if cap == 0 { - cap = expectedCap - } else { - for cap < expectedCap { - if cap < 1024 { - cap += cap - } else { - cap += cap / 4 - } - } - } - return cap -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_struct.go b/vendor/github.com/modern-go/reflect2/unsafe_struct.go deleted file mode 100644 index 804d91663..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_struct.go +++ /dev/null @@ -1,59 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type UnsafeStructType struct { - unsafeType - likePtr bool -} - -func newUnsafeStructType(cfg *frozenConfig, type1 reflect.Type) *UnsafeStructType { - return &UnsafeStructType{ - unsafeType: *newUnsafeType(cfg, type1), - likePtr: likePtrType(type1), - } -} - -func (type2 *UnsafeStructType) LikePtr() bool { - return type2.likePtr -} - -func (type2 *UnsafeStructType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *UnsafeStructType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { - if type2.likePtr { - return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) - } - return packEFace(type2.rtype, ptr) -} - -func (type2 *UnsafeStructType) FieldByName(name string) StructField { - structField, found := type2.Type.FieldByName(name) - if !found { - return nil - } - return newUnsafeStructField(type2, structField) -} - -func (type2 *UnsafeStructType) Field(i int) StructField { - return newUnsafeStructField(type2, type2.Type.Field(i)) -} - -func (type2 *UnsafeStructType) FieldByIndex(index []int) StructField { - return newUnsafeStructField(type2, type2.Type.FieldByIndex(index)) -} - -func (type2 *UnsafeStructType) FieldByNameFunc(match func(string) bool) StructField { - structField, found := type2.Type.FieldByNameFunc(match) - if !found { - panic("field match condition not found in " + type2.Type.String()) - } - return newUnsafeStructField(type2, structField) -} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_type.go b/vendor/github.com/modern-go/reflect2/unsafe_type.go deleted file mode 100644 index 13941716c..000000000 --- a/vendor/github.com/modern-go/reflect2/unsafe_type.go +++ /dev/null @@ -1,85 +0,0 @@ -package reflect2 - -import ( - "reflect" - "unsafe" -) - -type unsafeType struct { - safeType - rtype unsafe.Pointer - ptrRType unsafe.Pointer -} - -func newUnsafeType(cfg *frozenConfig, type1 reflect.Type) *unsafeType { - return &unsafeType{ - safeType: safeType{ - Type: type1, - cfg: cfg, - }, - rtype: unpackEFace(type1).data, - ptrRType: unpackEFace(reflect.PtrTo(type1)).data, - } -} - -func (type2 *unsafeType) Set(obj interface{}, val interface{}) { - objEFace := unpackEFace(obj) - assertType("Type.Set argument 1", type2.ptrRType, objEFace.rtype) - valEFace := unpackEFace(val) - assertType("Type.Set argument 2", type2.ptrRType, valEFace.rtype) - type2.UnsafeSet(objEFace.data, valEFace.data) -} - -func (type2 *unsafeType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { - typedmemmove(type2.rtype, ptr, val) -} - -func (type2 *unsafeType) IsNil(obj interface{}) bool { - objEFace := unpackEFace(obj) - assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIsNil(objEFace.data) -} - -func (type2 *unsafeType) UnsafeIsNil(ptr unsafe.Pointer) bool { - return ptr == nil -} - -func (type2 *unsafeType) UnsafeNew() unsafe.Pointer { - return unsafe_New(type2.rtype) -} - -func (type2 *unsafeType) New() interface{} { - return packEFace(type2.ptrRType, type2.UnsafeNew()) -} - -func (type2 *unsafeType) PackEFace(ptr unsafe.Pointer) interface{} { - return packEFace(type2.ptrRType, ptr) -} - -func (type2 *unsafeType) RType() uintptr { - return uintptr(type2.rtype) -} - -func (type2 *unsafeType) Indirect(obj interface{}) interface{} { - objEFace := unpackEFace(obj) - assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) - return type2.UnsafeIndirect(objEFace.data) -} - -func (type2 *unsafeType) UnsafeIndirect(obj unsafe.Pointer) interface{} { - return packEFace(type2.rtype, obj) -} - -func (type2 *unsafeType) LikePtr() bool { - return false -} - -func assertType(where string, expectRType unsafe.Pointer, actualRType unsafe.Pointer) { - if expectRType != actualRType { - expectType := reflect.TypeOf(0) - (*iface)(unsafe.Pointer(&expectType)).data = expectRType - actualType := reflect.TypeOf(0) - (*iface)(unsafe.Pointer(&actualType)).data = actualRType - panic(where + ": expect " + expectType.String() + ", actual " + actualType.String()) - } -} diff --git a/vendor/github.com/oleksandr/bonjour/.gitignore b/vendor/github.com/oleksandr/bonjour/.gitignore new file mode 100644 index 000000000..daf913b1b --- /dev/null +++ b/vendor/github.com/oleksandr/bonjour/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/oleksandr/bonjour/README.md b/vendor/github.com/oleksandr/bonjour/README.md new file mode 100644 index 000000000..796708e3d --- /dev/null +++ b/vendor/github.com/oleksandr/bonjour/README.md @@ -0,0 +1,165 @@ +bonjour +==== + +This is a simple Multicast DNS-SD (Apple Bonjour) library written in Golang. You can use it to discover services in the LAN. Pay attention to the infrastructure you are planning to use it (clouds or shared infrastructures usually prevent mDNS from functioning). But it should work in the most office, home and private environments. + +**IMPORTANT**: It does NOT pretend to be a full & valid implementation of the RFC 6762 & RFC 6763, but it fulfils the requirements of its authors (we just needed service discovery in the LAN environment for our IoT products). The registration code needs a lot of improvements. This code was not tested for Bonjour conformance but have been manually verified to be working using built-in OSX utility `/usr/bin/dns-sd`. + +Detailed documentation: [![GoDoc](https://godoc.org/github.com/oleksandr/bonjour?status.svg)](https://godoc.org/github.com/oleksandr/bonjour) + + +##Browsing available services in your local network + +Here is an example how to browse services by their type: + +``` +package main + +import ( + "log" + "os" + "time" + + "github.com/oleksandr/bonjour" +) + +func main() { + resolver, err := bonjour.NewResolver(nil) + if err != nil { + log.Println("Failed to initialize resolver:", err.Error()) + os.Exit(1) + } + + results := make(chan *bonjour.ServiceEntry) + + go func(results chan *bonjour.ServiceEntry, exitCh chan<- bool) { + for e := range results { + log.Printf("%s", e.Instance) + exitCh <- true + time.Sleep(1e9) + os.Exit(0) + } + }(results, resolver.Exit) + + err = resolver.Browse("_foobar._tcp", "local.", results) + if err != nil { + log.Println("Failed to browse:", err.Error()) + } + + select {} +} +``` + +##Doing a lookup of a specific service instance + +Here is an example of looking up service by service instance name: + +``` +package main + +import ( + "log" + "os" + "time" + + "github.com/oleksandr/bonjour" +) + +func main() { + resolver, err := bonjour.NewResolver(nil) + if err != nil { + log.Println("Failed to initialize resolver:", err.Error()) + os.Exit(1) + } + + results := make(chan *bonjour.ServiceEntry) + + go func(results chan *bonjour.ServiceEntry, exitCh chan<- bool) { + for e := range results { + log.Printf("%s", e.Instance) + exitCh <- true + time.Sleep(1e9) + os.Exit(0) + } + }(results, resolver.Exit) + + err = resolver.Lookup("DEMO", "_foobar._tcp", "", results) + if err != nil { + log.Println("Failed to browse:", err.Error()) + } + + select {} +} +``` + + +##Registering a service + +Registering a service is as simple as the following: + +``` +package main + +import ( + "log" + "os" + "os/signal" + "time" + + "github.com/oleksandr/bonjour" +) + +func main() { + // Run registration (blocking call) + s, err := bonjour.Register("Foo Service", "_foobar._tcp", "", 9999, []string{"txtv=1", "app=test"}, nil) + if err != nil { + log.Fatalln(err.Error()) + } + + // Ctrl+C handling + handler := make(chan os.Signal, 1) + signal.Notify(handler, os.Interrupt) + for sig := range handler { + if sig == os.Interrupt { + s.Shutdown() + time.Sleep(1e9) + break + } + } +} +``` + + +##Registering a service proxy (manually specifying host/ip and avoiding lookups) + +``` +package main + +import ( + "log" + "os" + "os/signal" + "time" + + "github.com/oleksandr/bonjour" +) + +func main() { + // Run registration (blocking call) + s, err := bonjour.RegisterProxy("Proxy Service", "_foobar._tcp", "", 9999, "octopus", "10.0.0.111", []string{"txtv=1", "app=test"}, nil) + if err != nil { + log.Fatalln(err.Error()) + } + + // Ctrl+C handling + handler := make(chan os.Signal, 1) + signal.Notify(handler, os.Interrupt) + for sig := range handler { + if sig == os.Interrupt { + s.Shutdown() + time.Sleep(1e9) + break + } + } +} +``` \ No newline at end of file diff --git a/vendor/github.com/oxtoacart/bpool/README.md b/vendor/github.com/oxtoacart/bpool/README.md new file mode 100644 index 000000000..9acf3f928 --- /dev/null +++ b/vendor/github.com/oxtoacart/bpool/README.md @@ -0,0 +1,65 @@ +# bpool [![GoDoc](https://godoc.org/github.com/oxtoacart/bpool?status.png)](https://godoc.org/github.com/oxtoacart/bpool) + +Package bpool implements leaky pools of byte arrays and Buffers as bounded channels. +It is based on the leaky buffer example from the Effective Go documentation: http://golang.org/doc/effective_go.html#leaky_buffer + +bpool provides the following pool types: + +* [bpool.BufferPool](https://godoc.org/github.com/oxtoacart/bpool#BufferPool) + which provides a fixed-size pool of + [bytes.Buffers](http://golang.org/pkg/bytes/#Buffer). +* [bpool.BytePool](https://godoc.org/github.com/oxtoacart/bpool#BytePool) which + provides a fixed-size pool of `[]byte` slices with a pre-set width (length). +* [bpool.SizedBufferPool](https://godoc.org/github.com/oxtoacart/bpool#SizedBufferPool), + which is an alternative to `bpool.BufferPool` that pre-sizes the capacity of + buffers issued from the pool and discards buffers that have grown too large + upon return. + +A common use case for this package is to use buffers to execute HTML templates +against (via ExecuteTemplate) or encode JSON into (via json.NewEncoder). This +allows you to catch any rendering or marshalling errors prior to writing to a +`http.ResponseWriter`, which helps to avoid writing incomplete or malformed data +to the response. + +## Install + +`go get github.com/oxtoacart/bpool` + +## Documentation + +See [godoc.org](http://godoc.org/github.com/oxtoacart/bpool) or use `godoc github.com/oxtoacart/bpool` + +## Example + +Here's a quick example for using `bpool.BufferPool`. We create a pool of the +desired size, call the `Get()` method to obtain a buffer for use, and call +`Put(buf)` to return the buffer to the pool. + +```go + +var bufpool *bpool.BufferPool + +func main() { + + bufpool = bpool.NewBufferPool(48) + +} + +func someFunction() error { + + // Get a buffer from the pool + buf := bufpool.Get() + ... + ... + ... + // Return the buffer to the pool + bufpool.Put(buf) + + return nil +} +``` + +## License + +Apache 2.0 Licensed. See the LICENSE file for details. + diff --git a/vendor/github.com/pkg/errors/.gitignore b/vendor/github.com/pkg/errors/.gitignore new file mode 100644 index 000000000..daf913b1b --- /dev/null +++ b/vendor/github.com/pkg/errors/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/pkg/errors/.travis.yml b/vendor/github.com/pkg/errors/.travis.yml new file mode 100644 index 000000000..588ceca18 --- /dev/null +++ b/vendor/github.com/pkg/errors/.travis.yml @@ -0,0 +1,11 @@ +language: go +go_import_path: github.com/pkg/errors +go: + - 1.4.3 + - 1.5.4 + - 1.6.2 + - 1.7.1 + - tip + +script: + - go test -v ./... diff --git a/vendor/github.com/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md new file mode 100644 index 000000000..273db3c98 --- /dev/null +++ b/vendor/github.com/pkg/errors/README.md @@ -0,0 +1,52 @@ +# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) + +Package errors provides simple error handling primitives. + +`go get github.com/pkg/errors` + +The traditional error handling idiom in Go is roughly akin to +```go +if err != nil { + return err +} +``` +which applied recursively up the call stack results in error reports without context or debugging information. The errors package allows programmers to add context to the failure path in their code in a way that does not destroy the original value of the error. + +## Adding context to an error + +The errors.Wrap function returns a new error that adds context to the original error. For example +```go +_, err := ioutil.ReadAll(r) +if err != nil { + return errors.Wrap(err, "read failed") +} +``` +## Retrieving the cause of an error + +Using `errors.Wrap` constructs a stack of errors, adding context to the preceding error. Depending on the nature of the error it may be necessary to reverse the operation of errors.Wrap to retrieve the original error for inspection. Any error value which implements this interface can be inspected by `errors.Cause`. +```go +type causer interface { + Cause() error +} +``` +`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example: +```go +switch err := errors.Cause(err).(type) { +case *MyError: + // handle specifically +default: + // unknown error +} +``` + +[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). + +## Contributing + +We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high. + +Before proposing a change, please discuss your change by raising an issue. + +## Licence + +BSD-2-Clause diff --git a/vendor/github.com/pkg/errors/appveyor.yml b/vendor/github.com/pkg/errors/appveyor.yml new file mode 100644 index 000000000..a932eade0 --- /dev/null +++ b/vendor/github.com/pkg/errors/appveyor.yml @@ -0,0 +1,32 @@ +version: build-{build}.{branch} + +clone_folder: C:\gopath\src\github.com\pkg\errors +shallow_clone: true # for startup speed + +environment: + GOPATH: C:\gopath + +platform: + - x64 + +# http://www.appveyor.com/docs/installed-software +install: + # some helpful output for debugging builds + - go version + - go env + # pre-installed MinGW at C:\MinGW is 32bit only + # but MSYS2 at C:\msys64 has mingw64 + - set PATH=C:\msys64\mingw64\bin;%PATH% + - gcc --version + - g++ --version + +build_script: + - go install -v ./... + +test_script: + - set PATH=C:\gopath\bin;%PATH% + - go test -v ./... + +#artifacts: +# - path: '%GOPATH%\bin\*.exe' +deploy: off diff --git a/vendor/github.com/pkg/sftp/.gitignore b/vendor/github.com/pkg/sftp/.gitignore new file mode 100644 index 000000000..e1ec837c3 --- /dev/null +++ b/vendor/github.com/pkg/sftp/.gitignore @@ -0,0 +1,7 @@ +.*.swo +.*.swp + +server_standalone/server_standalone + +examples/*/id_rsa +examples/*/id_rsa.pub diff --git a/vendor/github.com/pkg/sftp/.travis.yml b/vendor/github.com/pkg/sftp/.travis.yml new file mode 100644 index 000000000..44cd0e2ee --- /dev/null +++ b/vendor/github.com/pkg/sftp/.travis.yml @@ -0,0 +1,38 @@ +language: go +go_import_path: github.com/pkg/sftp + +# current and previous stable releases, plus tip +# remember to exclude previous and tip for macs below +go: + - 1.10.x + - 1.11.x + - tip + +os: + - linux + - osx + +matrix: + exclude: + - os: osx + go: 1.10.x + - os: osx + go: tip + +sudo: false + +addons: + ssh_known_hosts: + - bitbucket.org + +install: + - go get -t -v ./... + - ssh-keygen -t rsa -q -P "" -f $HOME/.ssh/id_rsa + +script: + - go test -integration -v ./... + - go test -testserver -v ./... + - go test -integration -testserver -v ./... + - go test -race -integration -v ./... + - go test -race -testserver -v ./... + - go test -race -integration -testserver -v ./... diff --git a/vendor/github.com/pkg/sftp/README.md b/vendor/github.com/pkg/sftp/README.md new file mode 100644 index 000000000..1fb700c41 --- /dev/null +++ b/vendor/github.com/pkg/sftp/README.md @@ -0,0 +1,44 @@ +sftp +---- + +The `sftp` package provides support for file system operations on remote ssh +servers using the SFTP subsystem. It also implements an SFTP server for serving +files from the filesystem. + +[![UNIX Build Status](https://travis-ci.org/pkg/sftp.svg?branch=master)](https://travis-ci.org/pkg/sftp) [![GoDoc](http://godoc.org/github.com/pkg/sftp?status.svg)](http://godoc.org/github.com/pkg/sftp) + +usage and examples +------------------ + +See [godoc.org/github.com/pkg/sftp](http://godoc.org/github.com/pkg/sftp) for +examples and usage. + +The basic operation of the package mirrors the facilities of the +[os](http://golang.org/pkg/os) package. + +The Walker interface for directory traversal is heavily inspired by Keith +Rarick's [fs](http://godoc.org/github.com/kr/fs) package. + +roadmap +------- + + * There is way too much duplication in the Client methods. If there was an + unmarshal(interface{}) method this would reduce a heap of the duplication. + +contributing +------------ + +We welcome pull requests, bug fixes and issue reports. + +Before proposing a large change, first please discuss your change by raising an +issue. + +For API/code bugs, please include a small, self contained code example to +reproduce the issue. For pull requests, remember test coverage. + +We try to handle issues and pull requests with a 0 open philosophy. That means +we will try to address the submission as soon as possible and will work toward +a resolution. If progress can no longer be made (eg. unreproducible bug) or +stops (eg. unresponsive submitter), we will close the bug. + +Thanks. diff --git a/vendor/github.com/pkg/sftp/request-readme.md b/vendor/github.com/pkg/sftp/request-readme.md new file mode 100644 index 000000000..f887274dc --- /dev/null +++ b/vendor/github.com/pkg/sftp/request-readme.md @@ -0,0 +1,53 @@ +# Request Based SFTP API + +The request based API allows for custom backends in a way similar to the http +package. In order to create a backend you need to implement 4 handler +interfaces; one for reading, one for writing, one for misc commands and one for +listing files. Each has 1 required method and in each case those methods take +the Request as the only parameter and they each return something different. +These 4 interfaces are enough to handle all the SFTP traffic in a simplified +manner. + +The Request structure has 5 public fields which you will deal with. + +- Method (string) - string name of incoming call +- Filepath (string) - POSIX path of file to act on +- Flags (uint32) - 32bit bitmask value of file open/create flags +- Attrs ([]byte) - byte string of file attribute data +- Target (string) - target path for renames and sym-links + +Below are the methods and a brief description of what they need to do. + +### Fileread(*Request) (io.Reader, error) + +Handler for "Get" method and returns an io.Reader for the file which the server +then sends to the client. + +### Filewrite(*Request) (io.Writer, error) + +Handler for "Put" method and returns an io.Writer for the file which the server +then writes the uploaded file to. The file opening "pflags" are currently +preserved in the Request.Flags field as a 32bit bitmask value. See the [SFTP +spec](https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.3) for +details. + +### Filecmd(*Request) error + +Handles "SetStat", "Rename", "Rmdir", "Mkdir" and "Symlink" methods. Makes the +appropriate changes and returns nil for success or an filesystem like error +(eg. os.ErrNotExist). The attributes are currently propagated in their raw form +([]byte) and will need to be unmarshalled to be useful. See the respond method +on sshFxpSetstatPacket for example of you might want to do this. + +### Fileinfo(*Request) ([]os.FileInfo, error) + +Handles "List", "Stat", "Readlink" methods. Gathers/creates FileInfo structs +with the data on the files and returns in a list (list of 1 for Stat and +Readlink). + + +## TODO + +- Add support for API users to see trace/debugging info of what is going on +inside SFTP server. +- Unmarshal the file attributes into a structure on the Request object. diff --git a/vendor/github.com/sfreiberg/simplessh/README.md b/vendor/github.com/sfreiberg/simplessh/README.md new file mode 100644 index 000000000..086b0c88d --- /dev/null +++ b/vendor/github.com/sfreiberg/simplessh/README.md @@ -0,0 +1,47 @@ +# simplessh +[![GoDoc](https://godoc.org/github.com/sfreiberg/simplessh?status.png)](https://godoc.org/github.com/sfreiberg/simplessh) + +SimpleSSH is a simple wrapper around go ssh and sftp libraries. + +## Features +* Multiple authentication methods (password, private key and ssh-agent) +* Sudo support +* Simple file upload/download support + +## Installation +`go get github.com/sfreiberg/simplessh` + +## Example + +``` +package main + +import ( + "fmt" + + "github.com/sfreiberg/simplessh" +) + +func main() { + /* + Leave privKeyPath empty to use $HOME/.ssh/id_rsa. + If username is blank simplessh will attempt to use the current user. + */ + client, err := simplessh.ConnectWithKeyFile("localhost:22", "root", "/home/user/.ssh/id_rsa") + if err != nil { + panic(err) + } + defer client.Close() + + output, err := client.Exec("uptime") + if err != nil { + panic(err) + } + + fmt.Printf("Uptime: %s\n", output) +} + +``` + +## License +SimpleSSH is licensed under the MIT license. \ No newline at end of file diff --git a/vendor/github.com/ugorji/go/codec/0doc.go b/vendor/github.com/ugorji/go/codec/0doc.go index b61a8180e..209f9ebad 100644 --- a/vendor/github.com/ugorji/go/codec/0doc.go +++ b/vendor/github.com/ugorji/go/codec/0doc.go @@ -1,10 +1,9 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. /* -Package codec provides a -High Performance, Feature-Rich Idiomatic Go 1.4+ codec/encoding library -for binc, msgpack, cbor, json. +High Performance, Feature-Rich Idiomatic Go codec/encoding library for +binc, msgpack, cbor, json. Supported Serialization formats are: @@ -12,17 +11,21 @@ Supported Serialization formats are: - binc: http://github.com/ugorji/binc - cbor: http://cbor.io http://tools.ietf.org/html/rfc7049 - json: http://json.org http://tools.ietf.org/html/rfc7159 - - simple: + - simple: To install: go get github.com/ugorji/go/codec -This package will carefully use 'unsafe' for performance reasons in specific places. -You can build without unsafe use by passing the safe or appengine tag -i.e. 'go install -tags=safe ...'. Note that unsafe is only supported for the last 3 -go sdk versions e.g. current go release is go 1.9, so we support unsafe use only from -go 1.7+ . This is because supporting unsafe requires knowledge of implementation details. +This package understands the 'unsafe' tag, to allow using unsafe semantics: + + - When decoding into a struct, you need to read the field name as a string + so you can find the struct field it is mapped to. + Using `unsafe` will bypass the allocation and copying overhead of []byte->string conversion. + +To install using unsafe, pass the 'unsafe' tag: + + go get -tags=unsafe github.com/ugorji/go/codec For detailed usage information, read the primer at http://ugorji.net/blog/go-codec-primer . @@ -32,16 +35,12 @@ the standard library (ie json, xml, gob, etc). Rich Feature Set includes: - Simple but extremely powerful and feature-rich API - - Support for go1.4 and above, while selectively using newer APIs for later releases - - Excellent code coverage ( > 90% ) - Very High Performance. Our extensive benchmarks show us outperforming Gob, Json, Bson, etc by 2-4X. - - Careful selected use of 'unsafe' for targeted performance gains. - 100% mode exists where 'unsafe' is not used at all. - - Lock-free (sans mutex) concurrency for scaling to 100's of cores - - Coerce types where appropriate - e.g. decode an int in the stream into a float, decode numbers from formatted strings, etc - - Corner Cases: + - Multiple conversions: + Package coerces types where appropriate + e.g. decode an int in the stream into a float, etc. + - Corner Cases: Overflows, nil maps/slices, nil values in streams are handled correctly - Standard field renaming via tags - Support for omitting empty fields during an encoding @@ -49,21 +48,15 @@ Rich Feature Set includes: (struct, slice, map, primitives, pointers, interface{}, etc) - Extensions to support efficient encoding/decoding of any named types - Support encoding.(Binary|Text)(M|Unm)arshaler interfaces - - Support IsZero() bool to determine if a value is a zero value. - Analogous to time.Time.IsZero() bool. - Decoding without a schema (into a interface{}). Includes Options to configure what specific map or slice type to use when decoding an encoded list or map into a nil interface{} - - Mapping a non-interface type to an interface, so we can decode appropriately - into any interface type with a correctly configured non-interface value. - Encode a struct as an array, and decode struct from an array in the data stream - - Option to encode struct keys as numbers (instead of strings) - (to support structured streams with fields encoded as numeric codes) - Comprehensive support for anonymous fields - Fast (no-reflection) encoding/decoding of common maps and slices - Code-generation for faster performance. - Support binary (e.g. messagepack, cbor) and text (e.g. json) formats - - Support indefinite-length formats to enable true streaming + - Support indefinite-length formats to enable true streaming (for formats which support it e.g. json, cbor) - Support canonical encoding, where a value is ALWAYS encoded as same sequence of bytes. This mostly applies to maps, where iteration order is non-deterministic. @@ -75,12 +68,12 @@ Rich Feature Set includes: - Encode/Decode from/to chan types (for iterative streaming support) - Drop-in replacement for encoding/json. `json:` key in struct tag supported. - Provides a RPC Server and Client Codec for net/rpc communication protocol. - - Handle unique idiosyncrasies of codecs e.g. - - For messagepack, configure how ambiguities in handling raw bytes are resolved - - For messagepack, provide rpc server/client codec to support + - Handle unique idiosyncrasies of codecs e.g. + - For messagepack, configure how ambiguities in handling raw bytes are resolved + - For messagepack, provide rpc server/client codec to support msgpack-rpc protocol defined at: https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md - + Extension Support Users can register a function to handle the encoding or decoding of @@ -99,27 +92,6 @@ encoded as an empty map because it has no exported fields, while UUID would be encoded as a string. However, with extension support, you can encode any of these however you like. -Custom Encoding and Decoding - -This package maintains symmetry in the encoding and decoding halfs. -We determine how to encode or decode by walking this decision tree - - - is type a codec.Selfer? - - is there an extension registered for the type? - - is format binary, and is type a encoding.BinaryMarshaler and BinaryUnmarshaler? - - is format specifically json, and is type a encoding/json.Marshaler and Unmarshaler? - - is format text-based, and type an encoding.TextMarshaler? - - else we use a pair of functions based on the "kind" of the type e.g. map, slice, int64, etc - -This symmetry is important to reduce chances of issues happening because the -encoding and decoding sides are out of sync e.g. decoded via very specific -encoding.TextUnmarshaler but encoded via kind-specific generalized mode. - -Consequently, if a type only defines one-half of the symmetry -(e.g. it implements UnmarshalJSON() but not MarshalJSON() ), -then that type doesn't satisfy the check and we will continue walking down the -decision tree. - RPC RPC Client and Server Codecs are implemented, so the codecs can be used @@ -188,77 +160,40 @@ Sample usage model: //OR rpcCodec := codec.MsgpackSpecRpc.ClientCodec(conn, h) client := rpc.NewClientWithCodec(rpcCodec) -Running Tests - -To run tests, use the following: - - go test - -To run the full suite of tests, use the following: - - go test -tags alltests -run Suite - -You can run the tag 'safe' to run tests or build in safe mode. e.g. - - go test -tags safe -run Json - go test -tags "alltests safe" -run Suite - -Running Benchmarks - -Please see http://github.com/ugorji/go-codec-bench . - -Caveats - -Struct fields matching the following are ignored during encoding and decoding - - struct tag value set to - - - func, complex numbers, unsafe pointers - - unexported and not embedded - - unexported and embedded and not struct kind - - unexported and embedded pointers (from go1.10) - -Every other field in a struct will be encoded/decoded. - -Embedded fields are encoded as if they exist in the top-level struct, -with some caveats. See Encode documentation. - */ package codec -// TODO: -// - For Go 1.11, when mid-stack inlining is enabled, -// we should use committed functions for writeXXX and readXXX calls. -// This involves uncommenting the methods for decReaderSwitch and encWriterSwitch -// and using those (decReaderSwitch and encWriterSwitch) in all handles -// instead of encWriter and decReader. -// The benefit is that, for the (En|De)coder over []byte, the encWriter/decReader -// will be inlined, giving a performance bump for that typical case. -// However, it will only be inlined if mid-stack inlining is enabled, -// as we call panic to raise errors, and panic currently prevents inlining. -// -// PUNTED: -// - To make Handle comparable, make extHandle in BasicHandle a non-embedded pointer, -// and use overlay methods on *BasicHandle to call through to extHandle after initializing -// the "xh *extHandle" to point to a real slice. +// Benefits of go-codec: // -// BEFORE EACH RELEASE: -// - Look through and fix padding for each type, to eliminate false sharing -// - critical shared objects that are read many times -// TypeInfos -// - pooled objects: -// decNaked, decNakedContainers, codecFner, typeInfoLoadArray, -// - small objects allocated independently, that we read/use much across threads: -// codecFn, typeInfo -// - Objects allocated independently and used a lot -// Decoder, Encoder, -// xxxHandle, xxxEncDriver, xxxDecDriver (xxx = json, msgpack, cbor, binc, simple) -// - In all above, arrange values modified together to be close to each other. -// -// For all of these, either ensure that they occupy full cache lines, -// or ensure that the things just past the cache line boundary are hardly read/written -// e.g. JsonHandle.RawBytesExt - which is copied into json(En|De)cDriver at init +// - encoding/json always reads whole file into memory first. +// This makes it unsuitable for parsing very large files. +// - encoding/xml cannot parse into a map[string]interface{} +// I found this out on reading https://github.com/clbanning/mxj + +// TODO: // -// Occupying full cache lines means they occupy 8*N words (where N is an integer). -// Check this out by running: ./run.sh -z -// - look at those tagged ****, meaning they are not occupying full cache lines -// - look at those tagged <<<<, meaning they are larger than 32 words (something to watch) -// - Run "golint -min_confidence 0.81" +// - optimization for codecgen: +// if len of entity is <= 3 words, then support a value receiver for encode. +// - (En|De)coder should store an error when it occurs. +// Until reset, subsequent calls return that error that was stored. +// This means that free panics must go away. +// All errors must be raised through errorf method. +// - Decoding using a chan is good, but incurs concurrency costs. +// This is because there's no fast way to use a channel without it +// having to switch goroutines constantly. +// Callback pattern is still the best. Maybe consider supporting something like: +// type X struct { +// Name string +// Ys []Y +// Ys chan <- Y +// Ys func(Y) -> call this function for each entry +// } +// - Consider adding a isZeroer interface { isZero() bool } +// It is used within isEmpty, for omitEmpty support. +// - Consider making Handle used AS-IS within the encoding/decoding session. +// This means that we don't cache Handle information within the (En|De)coder, +// except we really need it at Reset(...) +// - Consider adding math/big support +// - Consider reducing the size of the generated functions: +// Maybe use one loop, and put the conditionals in the loop. +// for ... { if cLen > 0 { if j == cLen { break } } else if dd.CheckBreak() { break } } diff --git a/vendor/github.com/ugorji/go/codec/README.md b/vendor/github.com/ugorji/go/codec/README.md new file mode 100644 index 000000000..91cb3a27b --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/README.md @@ -0,0 +1,148 @@ +# Codec + +High Performance, Feature-Rich Idiomatic Go codec/encoding library for +binc, msgpack, cbor, json. + +Supported Serialization formats are: + + - msgpack: https://github.com/msgpack/msgpack + - binc: http://github.com/ugorji/binc + - cbor: http://cbor.io http://tools.ietf.org/html/rfc7049 + - json: http://json.org http://tools.ietf.org/html/rfc7159 + - simple: + +To install: + + go get github.com/ugorji/go/codec + +This package understands the `unsafe` tag, to allow using unsafe semantics: + + - When decoding into a struct, you need to read the field name as a string + so you can find the struct field it is mapped to. + Using `unsafe` will bypass the allocation and copying overhead of `[]byte->string` conversion. + +To use it, you must pass the `unsafe` tag during install: + +``` +go install -tags=unsafe github.com/ugorji/go/codec +``` + +Online documentation: http://godoc.org/github.com/ugorji/go/codec +Detailed Usage/How-to Primer: http://ugorji.net/blog/go-codec-primer + +The idiomatic Go support is as seen in other encoding packages in +the standard library (ie json, xml, gob, etc). + +Rich Feature Set includes: + + - Simple but extremely powerful and feature-rich API + - Very High Performance. + Our extensive benchmarks show us outperforming Gob, Json, Bson, etc by 2-4X. + - Multiple conversions: + Package coerces types where appropriate + e.g. decode an int in the stream into a float, etc. + - Corner Cases: + Overflows, nil maps/slices, nil values in streams are handled correctly + - Standard field renaming via tags + - Support for omitting empty fields during an encoding + - Encoding from any value and decoding into pointer to any value + (struct, slice, map, primitives, pointers, interface{}, etc) + - Extensions to support efficient encoding/decoding of any named types + - Support encoding.(Binary|Text)(M|Unm)arshaler interfaces + - Decoding without a schema (into a interface{}). + Includes Options to configure what specific map or slice type to use + when decoding an encoded list or map into a nil interface{} + - Encode a struct as an array, and decode struct from an array in the data stream + - Comprehensive support for anonymous fields + - Fast (no-reflection) encoding/decoding of common maps and slices + - Code-generation for faster performance. + - Support binary (e.g. messagepack, cbor) and text (e.g. json) formats + - Support indefinite-length formats to enable true streaming + (for formats which support it e.g. json, cbor) + - Support canonical encoding, where a value is ALWAYS encoded as same sequence of bytes. + This mostly applies to maps, where iteration order is non-deterministic. + - NIL in data stream decoded as zero value + - Never silently skip data when decoding. + User decides whether to return an error or silently skip data when keys or indexes + in the data stream do not map to fields in the struct. + - Encode/Decode from/to chan types (for iterative streaming support) + - Drop-in replacement for encoding/json. `json:` key in struct tag supported. + - Provides a RPC Server and Client Codec for net/rpc communication protocol. + - Handle unique idiosyncrasies of codecs e.g. + - For messagepack, configure how ambiguities in handling raw bytes are resolved + - For messagepack, provide rpc server/client codec to support + msgpack-rpc protocol defined at: + https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md + +## Extension Support + +Users can register a function to handle the encoding or decoding of +their custom types. + +There are no restrictions on what the custom type can be. Some examples: + + type BisSet []int + type BitSet64 uint64 + type UUID string + type MyStructWithUnexportedFields struct { a int; b bool; c []int; } + type GifImage struct { ... } + +As an illustration, MyStructWithUnexportedFields would normally be +encoded as an empty map because it has no exported fields, while UUID +would be encoded as a string. However, with extension support, you can +encode any of these however you like. + +## RPC + +RPC Client and Server Codecs are implemented, so the codecs can be used +with the standard net/rpc package. + +## Usage + +Typical usage model: + + // create and configure Handle + var ( + bh codec.BincHandle + mh codec.MsgpackHandle + ch codec.CborHandle + ) + + mh.MapType = reflect.TypeOf(map[string]interface{}(nil)) + + // configure extensions + // e.g. for msgpack, define functions and enable Time support for tag 1 + // mh.SetExt(reflect.TypeOf(time.Time{}), 1, myExt) + + // create and use decoder/encoder + var ( + r io.Reader + w io.Writer + b []byte + h = &bh // or mh to use msgpack + ) + + dec = codec.NewDecoder(r, h) + dec = codec.NewDecoderBytes(b, h) + err = dec.Decode(&v) + + enc = codec.NewEncoder(w, h) + enc = codec.NewEncoderBytes(&b, h) + err = enc.Encode(v) + + //RPC Server + go func() { + for { + conn, err := listener.Accept() + rpcCodec := codec.GoRpc.ServerCodec(conn, h) + //OR rpcCodec := codec.MsgpackSpecRpc.ServerCodec(conn, h) + rpc.ServeCodec(rpcCodec) + } + }() + + //RPC Communication (client side) + conn, err = net.Dial("tcp", "localhost:5555") + rpcCodec := codec.GoRpc.ClientCodec(conn, h) + //OR rpcCodec := codec.MsgpackSpecRpc.ClientCodec(conn, h) + client := rpc.NewClientWithCodec(rpcCodec) + diff --git a/vendor/github.com/ugorji/go/codec/binc.go b/vendor/github.com/ugorji/go/codec/binc.go index a3c96fe74..681b2b0da 100644 --- a/vendor/github.com/ugorji/go/codec/binc.go +++ b/vendor/github.com/ugorji/go/codec/binc.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec @@ -55,77 +55,39 @@ const ( // others not currently supported ) -func bincdesc(vd, vs byte) string { - switch vd { - case bincVdSpecial: - switch vs { - case bincSpNil: - return "nil" - case bincSpFalse: - return "false" - case bincSpTrue: - return "true" - case bincSpNan, bincSpPosInf, bincSpNegInf, bincSpZeroFloat: - return "float" - case bincSpZero: - return "uint" - case bincSpNegOne: - return "int" - default: - return "unknown" - } - case bincVdSmallInt, bincVdPosInt: - return "uint" - case bincVdNegInt: - return "int" - case bincVdFloat: - return "float" - case bincVdSymbol: - return "string" - case bincVdString: - return "string" - case bincVdByteArray: - return "bytes" - case bincVdTimestamp: - return "time" - case bincVdCustomExt: - return "ext" - case bincVdArray: - return "array" - case bincVdMap: - return "map" - default: - return "unknown" - } -} - type bincEncDriver struct { e *Encoder - h *BincHandle w encWriter m map[string]uint16 // symbols - b [16]byte // scratch, used for encoding numbers - bigendian style - s uint16 // symbols sequencer - // c containerState - encDriverTrackContainerWriter - noBuiltInTypes - // encNoSeparator + b [scratchByteArrayLen]byte + s uint16 // symbols sequencer + encNoSeparator } -func (e *bincEncDriver) EncodeNil() { - e.w.writen1(bincVdSpecial<<4 | bincSpNil) +func (e *bincEncDriver) IsBuiltinType(rt uintptr) bool { + return rt == timeTypId } -func (e *bincEncDriver) EncodeTime(t time.Time) { - if t.IsZero() { - e.EncodeNil() - } else { - bs := bincEncodeTime(t) +func (e *bincEncDriver) EncodeBuiltin(rt uintptr, v interface{}) { + if rt == timeTypId { + var bs []byte + switch x := v.(type) { + case time.Time: + bs = encodeTime(x) + case *time.Time: + bs = encodeTime(*x) + default: + e.e.errorf("binc error encoding builtin: expect time.Time, received %T", v) + } e.w.writen1(bincVdTimestamp<<4 | uint8(len(bs))) e.w.writeb(bs) } } +func (e *bincEncDriver) EncodeNil() { + e.w.writen1(bincVdSpecial<<4 | bincSpNil) +} + func (e *bincEncDriver) EncodeBool(b bool) { if b { e.w.writen1(bincVdSpecial<<4 | bincSpTrue) @@ -233,21 +195,15 @@ func (e *bincEncDriver) encodeExtPreamble(xtag byte, length int) { e.w.writen1(xtag) } -func (e *bincEncDriver) WriteArrayStart(length int) { +func (e *bincEncDriver) EncodeArrayStart(length int) { e.encLen(bincVdArray<<4, uint64(length)) - e.c = containerArrayStart } -func (e *bincEncDriver) WriteMapStart(length int) { +func (e *bincEncDriver) EncodeMapStart(length int) { e.encLen(bincVdMap<<4, uint64(length)) - e.c = containerMapStart } func (e *bincEncDriver) EncodeString(c charEncoding, v string) { - if e.c == containerMapKey && c == cUTF8 && (e.h.AsSymbols == 0 || e.h.AsSymbols == 1) { - e.EncodeSymbol(v) - return - } l := uint64(len(v)) e.encBytesLen(c, l) if l > 0 { @@ -257,7 +213,7 @@ func (e *bincEncDriver) EncodeString(c charEncoding, v string) { func (e *bincEncDriver) EncodeSymbol(v string) { // if WriteSymbolsNoRefs { - // e.encodeString(cUTF8, v) + // e.encodeString(c_UTF8, v) // return // } @@ -267,10 +223,10 @@ func (e *bincEncDriver) EncodeSymbol(v string) { l := len(v) if l == 0 { - e.encBytesLen(cUTF8, 0) + e.encBytesLen(c_UTF8, 0) return } else if l == 1 { - e.encBytesLen(cUTF8, 1) + e.encBytesLen(c_UTF8, 1) e.w.writen1(v[0]) return } @@ -320,10 +276,6 @@ func (e *bincEncDriver) EncodeSymbol(v string) { } func (e *bincEncDriver) EncodeStringBytes(c charEncoding, v []byte) { - if v == nil { - e.EncodeNil() - return - } l := uint64(len(v)) e.encBytesLen(c, l) if l > 0 { @@ -333,7 +285,7 @@ func (e *bincEncDriver) EncodeStringBytes(c charEncoding, v []byte) { func (e *bincEncDriver) encBytesLen(c charEncoding, length uint64) { //TODO: support bincUnicodeOther (for now, just use string or bytearray) - if c == cRAW { + if c == c_RAW { e.encLen(bincVdByteArray<<4, length) } else { e.encLen(bincVdString<<4, length) @@ -372,9 +324,6 @@ type bincDecSymbol struct { } type bincDecDriver struct { - decDriverNoopContainerReader - noBuiltInTypes - d *Decoder h *BincHandle r decReader @@ -383,15 +332,13 @@ type bincDecDriver struct { bd byte vd byte vs byte - _ [3]byte // padding + noStreamingCodec + decNoSeparator + b [scratchByteArrayLen]byte + // linear searching on this slice is ok, // because we typically expect < 32 symbols in each stream. s []bincDecSymbol - - // noStreamingCodec - // decNoSeparator - - b [8 * 8]byte // scratch } func (d *bincDecDriver) readNextBd() { @@ -409,9 +356,6 @@ func (d *bincDecDriver) uncacheRead() { } func (d *bincDecDriver) ContainerType() (vt valueType) { - if !d.bdRead { - d.readNextBd() - } if d.vd == bincVdSpecial && d.vs == bincSpNil { return valueTypeNil } else if d.vd == bincVdByteArray { @@ -422,10 +366,9 @@ func (d *bincDecDriver) ContainerType() (vt valueType) { return valueTypeArray } else if d.vd == bincVdMap { return valueTypeMap + } else { + // d.d.errorf("isContainerType: unsupported parameter: %v", vt) } - // else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - // } return valueTypeUnset } @@ -440,24 +383,27 @@ func (d *bincDecDriver) TryDecodeAsNil() bool { return false } -func (d *bincDecDriver) DecodeTime() (t time.Time) { +func (d *bincDecDriver) IsBuiltinType(rt uintptr) bool { + return rt == timeTypId +} + +func (d *bincDecDriver) DecodeBuiltin(rt uintptr, v interface{}) { if !d.bdRead { d.readNextBd() } - if d.bd == bincVdSpecial<<4|bincSpNil { + if rt == timeTypId { + if d.vd != bincVdTimestamp { + d.d.errorf("Invalid d.vd. Expecting 0x%x. Received: 0x%x", bincVdTimestamp, d.vd) + return + } + tt, err := decodeTime(d.r.readx(int(d.vs))) + if err != nil { + panic(err) + } + var vt *time.Time = v.(*time.Time) + *vt = tt d.bdRead = false - return - } - if d.vd != bincVdTimestamp { - d.d.errorf("cannot decode time - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) - return - } - t, err := bincDecodeTime(d.r.readx(int(d.vs))) - if err != nil { - panic(err) } - d.bdRead = false - return } func (d *bincDecDriver) decFloatPre(vs, defaultLen byte) { @@ -466,7 +412,7 @@ func (d *bincDecDriver) decFloatPre(vs, defaultLen byte) { } else { l := d.r.readn1() if l > 8 { - d.d.errorf("cannot read float - at most 8 bytes used to represent float - received %v bytes", l) + d.d.errorf("At most 8 bytes used to represent float. Received: %v bytes", l) return } for i := l; i < 8; i++ { @@ -485,7 +431,7 @@ func (d *bincDecDriver) decFloat() (f float64) { d.decFloatPre(d.vs, 8) f = math.Float64frombits(bigen.Uint64(d.b[0:8])) } else { - d.d.errorf("read float - only float32 and float64 are supported - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("only float32 and float64 are supported. d.vd: 0x%x, d.vs: 0x%x", d.vd, d.vs) return } return @@ -542,38 +488,49 @@ func (d *bincDecDriver) decCheckInteger() (ui uint64, neg bool) { neg = true ui = 1 } else { - d.d.errorf("integer decode fails - invalid special value from descriptor %x-%x/%s", - d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("numeric decode fails for special value: d.vs: 0x%x", d.vs) return } } else { - d.d.errorf("integer can only be decoded from int/uint. d.bd: 0x%x, d.vd: 0x%x", d.bd, d.vd) + d.d.errorf("number can only be decoded from uint or int values. d.bd: 0x%x, d.vd: 0x%x", d.bd, d.vd) return } return } -func (d *bincDecDriver) DecodeInt64() (i int64) { +func (d *bincDecDriver) DecodeInt(bitsize uint8) (i int64) { ui, neg := d.decCheckInteger() - i = chkOvf.SignedIntV(ui) + i, overflow := chkOvf.SignedInt(ui) + if overflow { + d.d.errorf("simple: overflow converting %v to signed integer", ui) + return + } if neg { i = -i } + if chkOvf.Int(i, bitsize) { + d.d.errorf("binc: overflow integer: %v", i) + return + } d.bdRead = false return } -func (d *bincDecDriver) DecodeUint64() (ui uint64) { +func (d *bincDecDriver) DecodeUint(bitsize uint8) (ui uint64) { ui, neg := d.decCheckInteger() if neg { - d.d.errorf("assigning negative signed value to unsigned integer type") + d.d.errorf("Assigning negative signed value to unsigned type") + return + } + if chkOvf.Uint(ui, bitsize) { + d.d.errorf("binc: overflow integer: %v", ui) return } d.bdRead = false return } -func (d *bincDecDriver) DecodeFloat64() (f float64) { +func (d *bincDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { if !d.bdRead { d.readNextBd() } @@ -589,14 +546,17 @@ func (d *bincDecDriver) DecodeFloat64() (f float64) { } else if vs == bincSpNegInf { return math.Inf(-1) } else { - d.d.errorf("float - invalid special value from descriptor %x-%x/%s", - d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid d.vs decoding float where d.vd=bincVdSpecial: %v", d.vs) return } } else if vd == bincVdFloat { f = d.decFloat() } else { - f = float64(d.DecodeInt64()) + f = float64(d.DecodeInt(64)) + } + if chkOverflow32 && chkOvf.Float32(f) { + d.d.errorf("binc: float32 overflow: %v", f) + return } d.bdRead = false return @@ -612,7 +572,7 @@ func (d *bincDecDriver) DecodeBool() (b bool) { } else if bd == (bincVdSpecial | bincSpTrue) { b = true } else { - d.d.errorf("bool - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) return } d.bdRead = false @@ -620,11 +580,8 @@ func (d *bincDecDriver) DecodeBool() (b bool) { } func (d *bincDecDriver) ReadMapStart() (length int) { - if !d.bdRead { - d.readNextBd() - } if d.vd != bincVdMap { - d.d.errorf("map - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid d.vd for map. Expecting 0x%x. Got: 0x%x", bincVdMap, d.vd) return } length = d.decLen() @@ -633,11 +590,8 @@ func (d *bincDecDriver) ReadMapStart() (length int) { } func (d *bincDecDriver) ReadArrayStart() (length int) { - if !d.bdRead { - d.readNextBd() - } if d.vd != bincVdArray { - d.d.errorf("array - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid d.vd for array. Expecting 0x%x. Got: 0x%x", bincVdArray, d.vd) return } length = d.decLen() @@ -668,8 +622,7 @@ func (d *bincDecDriver) decLenNumber() (v uint64) { return } -func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy bool) ( - bs2 []byte, s string) { +func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy bool) (bs2 []byte, s string) { if !d.bdRead { d.readNextBd() } @@ -677,7 +630,7 @@ func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy bool) d.bdRead = false return } - var slen = -1 + var slen int = -1 // var ok bool switch d.vd { case bincVdString, bincVdByteArray: @@ -750,7 +703,8 @@ func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy bool) d.s = append(d.s, bincDecSymbol{i: symbol, s: s, b: bs2}) } default: - d.d.errorf("string/bytes - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid d.vd. Expecting string:0x%x, bytearray:0x%x or symbol: 0x%x. Got: 0x%x", + bincVdString, bincVdByteArray, bincVdSymbol, d.vd) return } d.bdRead = false @@ -765,12 +719,11 @@ func (d *bincDecDriver) DecodeString() (s string) { return } -func (d *bincDecDriver) DecodeStringAsBytes() (s []byte) { - s, _ = d.decStringAndBytes(d.b[:], false, true) - return -} - -func (d *bincDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { +func (d *bincDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { + if isstring { + bsOut, _ = d.decStringAndBytes(bs, false, zerocopy) + return + } if !d.bdRead { d.readNextBd() } @@ -778,16 +731,12 @@ func (d *bincDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { d.bdRead = false return nil } - // check if an "array" of uint8's (see ContainerType for how to infer if an array) - if d.vd == bincVdArray { - bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d) - return - } var clen int if d.vd == bincVdString || d.vd == bincVdByteArray { clen = d.decLen() } else { - d.d.errorf("bytes - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid d.vd for bytes. Expecting string:0x%x or bytearray:0x%x. Got: 0x%x", + bincVdString, bincVdByteArray, d.vd) return } d.bdRead = false @@ -803,7 +752,7 @@ func (d *bincDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { func (d *bincDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { if xtag > 0xff { - d.d.errorf("ext: tag must be <= 0xff; got: %v", xtag) + d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag) return } realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag)) @@ -826,14 +775,14 @@ func (d *bincDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs []b l := d.decLen() xtag = d.r.readn1() if verifyTag && xtag != tag { - d.d.errorf("wrong extension tag - got %b, expecting: %v", xtag, tag) + d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", xtag, tag) return } xbs = d.r.readx(l) } else if d.vd == bincVdByteArray { - xbs = d.DecodeBytes(nil, true) + xbs = d.DecodeBytes(nil, false, true) } else { - d.d.errorf("ext - expecting extensions or byte array - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("Invalid d.vd for extensions (Expecting extensions or byte array). Got: 0x%x", d.vd) return } d.bdRead = false @@ -845,7 +794,7 @@ func (d *bincDecDriver) DecodeNaked() { d.readNextBd() } - n := d.d.n + n := &d.d.n var decodeFurther bool switch d.vd { @@ -878,7 +827,7 @@ func (d *bincDecDriver) DecodeNaked() { n.v = valueTypeInt n.i = int64(-1) // int8(-1) default: - d.d.errorf("cannot infer value - unrecognized special value from descriptor %x-%x/%s", d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("decodeNaked: Unrecognized special value 0x%x", d.vs) } case bincVdSmallInt: n.v = valueTypeUint @@ -900,10 +849,10 @@ func (d *bincDecDriver) DecodeNaked() { n.s = d.DecodeString() case bincVdByteArray: n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false) + n.l = d.DecodeBytes(nil, false, false) case bincVdTimestamp: - n.v = valueTypeTime - tt, err := bincDecodeTime(d.r.readx(int(d.vs))) + n.v = valueTypeTimestamp + tt, err := decodeTime(d.r.readx(int(d.vs))) if err != nil { panic(err) } @@ -920,7 +869,7 @@ func (d *bincDecDriver) DecodeNaked() { n.v = valueTypeMap decodeFurther = true default: - d.d.errorf("cannot infer value - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs)) + d.d.errorf("decodeNaked: Unrecognized d.vd: 0x%x", d.vd) } if !decodeFurther { @@ -950,219 +899,31 @@ func (d *bincDecDriver) DecodeNaked() { type BincHandle struct { BasicHandle binaryEncodingType - noElemSeparators - - // AsSymbols defines what should be encoded as symbols. - // - // Encoding as symbols can reduce the encoded size significantly. - // - // However, during decoding, each string to be encoded as a symbol must - // be checked to see if it has been seen before. Consequently, encoding time - // will increase if using symbols, because string comparisons has a clear cost. - // - // Values: - // - 0: default: library uses best judgement - // - 1: use symbols - // - 2: do not use symbols - AsSymbols uint8 - - // AsSymbols: may later on introduce more options ... - // - m: map keys - // - s: struct fields - // - n: none - // - a: all: same as m, s, ... - - // _ [1]uint64 // padding } -// Name returns the name of the handle: binc -func (h *BincHandle) Name() string { return "binc" } - -// SetBytesExt sets an extension func (h *BincHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) { - return h.SetExt(rt, tag, &extWrapper{ext, interfaceExtFailer{}}) + return h.SetExt(rt, tag, &setExtWrapper{b: ext}) } func (h *BincHandle) newEncDriver(e *Encoder) encDriver { - return &bincEncDriver{e: e, h: h, w: e.w} + return &bincEncDriver{e: e, w: e.w} } func (h *BincHandle) newDecDriver(d *Decoder) decDriver { - return &bincDecDriver{d: d, h: h, r: d.r, br: d.bytes} + return &bincDecDriver{d: d, r: d.r, h: h, br: d.bytes} } func (e *bincEncDriver) reset() { e.w = e.e.w e.s = 0 - e.c = 0 e.m = nil } func (d *bincDecDriver) reset() { - d.r, d.br = d.d.r, d.d.bytes + d.r = d.d.r d.s = nil d.bd, d.bdRead, d.vd, d.vs = 0, false, 0, 0 } -// var timeDigits = [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} - -// EncodeTime encodes a time.Time as a []byte, including -// information on the instant in time and UTC offset. -// -// Format Description -// -// A timestamp is composed of 3 components: -// -// - secs: signed integer representing seconds since unix epoch -// - nsces: unsigned integer representing fractional seconds as a -// nanosecond offset within secs, in the range 0 <= nsecs < 1e9 -// - tz: signed integer representing timezone offset in minutes east of UTC, -// and a dst (daylight savings time) flag -// -// When encoding a timestamp, the first byte is the descriptor, which -// defines which components are encoded and how many bytes are used to -// encode secs and nsecs components. *If secs/nsecs is 0 or tz is UTC, it -// is not encoded in the byte array explicitly*. -// -// Descriptor 8 bits are of the form `A B C DDD EE`: -// A: Is secs component encoded? 1 = true -// B: Is nsecs component encoded? 1 = true -// C: Is tz component encoded? 1 = true -// DDD: Number of extra bytes for secs (range 0-7). -// If A = 1, secs encoded in DDD+1 bytes. -// If A = 0, secs is not encoded, and is assumed to be 0. -// If A = 1, then we need at least 1 byte to encode secs. -// DDD says the number of extra bytes beyond that 1. -// E.g. if DDD=0, then secs is represented in 1 byte. -// if DDD=2, then secs is represented in 3 bytes. -// EE: Number of extra bytes for nsecs (range 0-3). -// If B = 1, nsecs encoded in EE+1 bytes (similar to secs/DDD above) -// -// Following the descriptor bytes, subsequent bytes are: -// -// secs component encoded in `DDD + 1` bytes (if A == 1) -// nsecs component encoded in `EE + 1` bytes (if B == 1) -// tz component encoded in 2 bytes (if C == 1) -// -// secs and nsecs components are integers encoded in a BigEndian -// 2-complement encoding format. -// -// tz component is encoded as 2 bytes (16 bits). Most significant bit 15 to -// Least significant bit 0 are described below: -// -// Timezone offset has a range of -12:00 to +14:00 (ie -720 to +840 minutes). -// Bit 15 = have\_dst: set to 1 if we set the dst flag. -// Bit 14 = dst\_on: set to 1 if dst is in effect at the time, or 0 if not. -// Bits 13..0 = timezone offset in minutes. It is a signed integer in Big Endian format. -// -func bincEncodeTime(t time.Time) []byte { - //t := rv.Interface().(time.Time) - tsecs, tnsecs := t.Unix(), t.Nanosecond() - var ( - bd byte - btmp [8]byte - bs [16]byte - i int = 1 - ) - l := t.Location() - if l == time.UTC { - l = nil - } - if tsecs != 0 { - bd = bd | 0x80 - bigen.PutUint64(btmp[:], uint64(tsecs)) - f := pruneSignExt(btmp[:], tsecs >= 0) - bd = bd | (byte(7-f) << 2) - copy(bs[i:], btmp[f:]) - i = i + (8 - f) - } - if tnsecs != 0 { - bd = bd | 0x40 - bigen.PutUint32(btmp[:4], uint32(tnsecs)) - f := pruneSignExt(btmp[:4], true) - bd = bd | byte(3-f) - copy(bs[i:], btmp[f:4]) - i = i + (4 - f) - } - if l != nil { - bd = bd | 0x20 - // Note that Go Libs do not give access to dst flag. - _, zoneOffset := t.Zone() - //zoneName, zoneOffset := t.Zone() - zoneOffset /= 60 - z := uint16(zoneOffset) - bigen.PutUint16(btmp[:2], z) - // clear dst flags - bs[i] = btmp[0] & 0x3f - bs[i+1] = btmp[1] - i = i + 2 - } - bs[0] = bd - return bs[0:i] -} - -// bincDecodeTime decodes a []byte into a time.Time. -func bincDecodeTime(bs []byte) (tt time.Time, err error) { - bd := bs[0] - var ( - tsec int64 - tnsec uint32 - tz uint16 - i byte = 1 - i2 byte - n byte - ) - if bd&(1<<7) != 0 { - var btmp [8]byte - n = ((bd >> 2) & 0x7) + 1 - i2 = i + n - copy(btmp[8-n:], bs[i:i2]) - //if first bit of bs[i] is set, then fill btmp[0..8-n] with 0xff (ie sign extend it) - if bs[i]&(1<<7) != 0 { - copy(btmp[0:8-n], bsAll0xff) - //for j,k := byte(0), 8-n; j < k; j++ { btmp[j] = 0xff } - } - i = i2 - tsec = int64(bigen.Uint64(btmp[:])) - } - if bd&(1<<6) != 0 { - var btmp [4]byte - n = (bd & 0x3) + 1 - i2 = i + n - copy(btmp[4-n:], bs[i:i2]) - i = i2 - tnsec = bigen.Uint32(btmp[:]) - } - if bd&(1<<5) == 0 { - tt = time.Unix(tsec, int64(tnsec)).UTC() - return - } - // In stdlib time.Parse, when a date is parsed without a zone name, it uses "" as zone name. - // However, we need name here, so it can be shown when time is printed. - // Zone name is in form: UTC-08:00. - // Note that Go Libs do not give access to dst flag, so we ignore dst bits - - i2 = i + 2 - tz = bigen.Uint16(bs[i:i2]) - // i = i2 - // sign extend sign bit into top 2 MSB (which were dst bits): - if tz&(1<<13) == 0 { // positive - tz = tz & 0x3fff //clear 2 MSBs: dst bits - } else { // negative - tz = tz | 0xc000 //set 2 MSBs: dst bits - } - tzint := int16(tz) - if tzint == 0 { - tt = time.Unix(tsec, int64(tnsec)).UTC() - } else { - // For Go Time, do not use a descriptive timezone. - // It's unnecessary, and makes it harder to do a reflect.DeepEqual. - // The Offset already tells what the offset should be, if not on UTC and unknown zone name. - // var zoneName = timeLocUTCName(tzint) - tt = time.Unix(tsec, int64(tnsec)).In(time.FixedZone("", int(tzint)*60)) - } - return -} - var _ decDriver = (*bincDecDriver)(nil) var _ encDriver = (*bincEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/cbor.go b/vendor/github.com/ugorji/go/codec/cbor.go index 7633c04ac..c87e3f4d4 100644 --- a/vendor/github.com/ugorji/go/codec/cbor.go +++ b/vendor/github.com/ugorji/go/codec/cbor.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec @@ -6,7 +6,6 @@ package codec import ( "math" "reflect" - "time" ) const ( @@ -39,8 +38,6 @@ const ( cborBdBreak = 0xff ) -// These define some in-stream descriptors for -// manual encoding e.g. when doing explicit indefinite-length const ( CborStreamBytes byte = 0x5f CborStreamString = 0x7f @@ -60,57 +57,15 @@ const ( cborBaseSimple = 0xe0 ) -func cbordesc(bd byte) string { - switch bd { - case cborBdNil: - return "nil" - case cborBdFalse: - return "false" - case cborBdTrue: - return "true" - case cborBdFloat16, cborBdFloat32, cborBdFloat64: - return "float" - case cborBdIndefiniteBytes: - return "bytes*" - case cborBdIndefiniteString: - return "string*" - case cborBdIndefiniteArray: - return "array*" - case cborBdIndefiniteMap: - return "map*" - default: - switch { - case bd >= cborBaseUint && bd < cborBaseNegInt: - return "(u)int" - case bd >= cborBaseNegInt && bd < cborBaseBytes: - return "int" - case bd >= cborBaseBytes && bd < cborBaseString: - return "bytes" - case bd >= cborBaseString && bd < cborBaseArray: - return "string" - case bd >= cborBaseArray && bd < cborBaseMap: - return "array" - case bd >= cborBaseMap && bd < cborBaseTag: - return "map" - case bd >= cborBaseTag && bd < cborBaseSimple: - return "ext" - default: - return "unknown" - } - } -} - // ------------------- type cborEncDriver struct { noBuiltInTypes - encDriverNoopContainerWriter - // encNoSeparator + encNoSeparator e *Encoder w encWriter h *CborHandle x [8]byte - _ [3]uint64 // padding } func (e *cborEncDriver) EncodeNil() { @@ -168,24 +123,6 @@ func (e *cborEncDriver) encLen(bd byte, length int) { e.encUint(uint64(length), bd) } -func (e *cborEncDriver) EncodeTime(t time.Time) { - if t.IsZero() { - e.EncodeNil() - } else if e.h.TimeRFC3339 { - e.encUint(0, cborBaseTag) - e.EncodeString(cUTF8, t.Format(time.RFC3339Nano)) - } else { - e.encUint(1, cborBaseTag) - t = t.UTC().Round(time.Microsecond) - sec, nsec := t.Unix(), uint64(t.Nanosecond()) - if nsec == 0 { - e.EncodeInt(sec) - } else { - e.EncodeFloat64(float64(sec) + float64(nsec)/1e9) - } - } -} - func (e *cborEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en *Encoder) { e.encUint(uint64(xtag), cborBaseTag) if v := ext.ConvertExt(rv); v == nil { @@ -197,103 +134,53 @@ func (e *cborEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en *Enco func (e *cborEncDriver) EncodeRawExt(re *RawExt, en *Encoder) { e.encUint(uint64(re.Tag), cborBaseTag) - if false && re.Data != nil { + if re.Data != nil { en.encode(re.Data) - } else if re.Value != nil { - en.encode(re.Value) - } else { + } else if re.Value == nil { e.EncodeNil() - } -} - -func (e *cborEncDriver) WriteArrayStart(length int) { - if e.h.IndefiniteLength { - e.w.writen1(cborBdIndefiniteArray) } else { - e.encLen(cborBaseArray, length) - } -} - -func (e *cborEncDriver) WriteMapStart(length int) { - if e.h.IndefiniteLength { - e.w.writen1(cborBdIndefiniteMap) - } else { - e.encLen(cborBaseMap, length) + en.encode(re.Value) } } -func (e *cborEncDriver) WriteMapEnd() { - if e.h.IndefiniteLength { - e.w.writen1(cborBdBreak) - } +func (e *cborEncDriver) EncodeArrayStart(length int) { + e.encLen(cborBaseArray, length) } -func (e *cborEncDriver) WriteArrayEnd() { - if e.h.IndefiniteLength { - e.w.writen1(cborBdBreak) - } +func (e *cborEncDriver) EncodeMapStart(length int) { + e.encLen(cborBaseMap, length) } func (e *cborEncDriver) EncodeString(c charEncoding, v string) { - e.encStringBytesS(cborBaseString, v) + e.encLen(cborBaseString, len(v)) + e.w.writestr(v) } -func (e *cborEncDriver) EncodeStringBytes(c charEncoding, v []byte) { - if v == nil { - e.EncodeNil() - } else if c == cRAW { - e.encStringBytesS(cborBaseBytes, stringView(v)) - } else { - e.encStringBytesS(cborBaseString, stringView(v)) - } +func (e *cborEncDriver) EncodeSymbol(v string) { + e.EncodeString(c_UTF8, v) } -func (e *cborEncDriver) encStringBytesS(bb byte, v string) { - if e.h.IndefiniteLength { - if bb == cborBaseBytes { - e.w.writen1(cborBdIndefiniteBytes) - } else { - e.w.writen1(cborBdIndefiniteString) - } - blen := len(v) / 4 - if blen == 0 { - blen = 64 - } else if blen > 1024 { - blen = 1024 - } - for i := 0; i < len(v); { - var v2 string - i2 := i + blen - if i2 < len(v) { - v2 = v[i:i2] - } else { - v2 = v[i:] - } - e.encLen(bb, len(v2)) - e.w.writestr(v2) - i = i2 - } - e.w.writen1(cborBdBreak) +func (e *cborEncDriver) EncodeStringBytes(c charEncoding, v []byte) { + if c == c_RAW { + e.encLen(cborBaseBytes, len(v)) } else { - e.encLen(bb, len(v)) - e.w.writestr(v) + e.encLen(cborBaseString, len(v)) } + e.w.writeb(v) } // ---------------------- type cborDecDriver struct { - d *Decoder - h *CborHandle - r decReader - // b [scratchByteArrayLen]byte + d *Decoder + h *CborHandle + r decReader + b [scratchByteArrayLen]byte br bool // bytes reader bdRead bool bd byte noBuiltInTypes - // decNoSeparator - decDriverNoopContainerReader - _ [3]uint64 // padding + decNoSeparator } func (d *cborDecDriver) readNextBd() { @@ -309,9 +196,6 @@ func (d *cborDecDriver) uncacheRead() { } func (d *cborDecDriver) ContainerType() (vt valueType) { - if !d.bdRead { - d.readNextBd() - } if d.bd == cborBdNil { return valueTypeNil } else if d.bd == cborBdIndefiniteBytes || (d.bd >= cborBaseBytes && d.bd < cborBaseString) { @@ -322,10 +206,9 @@ func (d *cborDecDriver) ContainerType() (vt valueType) { return valueTypeArray } else if d.bd == cborBdIndefiniteMap || (d.bd >= cborBaseMap && d.bd < cborBaseTag) { return valueTypeMap + } else { + // d.d.errorf("isContainerType: unsupported parameter: %v", vt) } - // else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - // } return valueTypeUnset } @@ -366,7 +249,7 @@ func (d *cborDecDriver) decUint() (ui uint64) { } else if v == 0x1b { ui = uint64(bigen.Uint64(d.r.readx(8))) } else { - d.d.errorf("invalid descriptor decoding uint: %x/%s", d.bd, cbordesc(d.bd)) + d.d.errorf("decUint: Invalid descriptor: %v", d.bd) return } } @@ -382,36 +265,52 @@ func (d *cborDecDriver) decCheckInteger() (neg bool) { } else if major == cborMajorNegInt { neg = true } else { - d.d.errorf("not an integer - invalid major %v from descriptor %x/%s", major, d.bd, cbordesc(d.bd)) + d.d.errorf("invalid major: %v (bd: %v)", major, d.bd) return } return } -func (d *cborDecDriver) DecodeInt64() (i int64) { +func (d *cborDecDriver) DecodeInt(bitsize uint8) (i int64) { neg := d.decCheckInteger() ui := d.decUint() // check if this number can be converted to an int without overflow + var overflow bool if neg { - i = -(chkOvf.SignedIntV(ui + 1)) + if i, overflow = chkOvf.SignedInt(ui + 1); overflow { + d.d.errorf("cbor: overflow converting %v to signed integer", ui+1) + return + } + i = -i } else { - i = chkOvf.SignedIntV(ui) + if i, overflow = chkOvf.SignedInt(ui); overflow { + d.d.errorf("cbor: overflow converting %v to signed integer", ui) + return + } + } + if chkOvf.Int(i, bitsize) { + d.d.errorf("cbor: overflow integer: %v", i) + return } d.bdRead = false return } -func (d *cborDecDriver) DecodeUint64() (ui uint64) { +func (d *cborDecDriver) DecodeUint(bitsize uint8) (ui uint64) { if d.decCheckInteger() { - d.d.errorf("assigning negative signed value to unsigned type") + d.d.errorf("Assigning negative signed value to unsigned type") return } ui = d.decUint() + if chkOvf.Uint(ui, bitsize) { + d.d.errorf("cbor: overflow integer: %v", ui) + return + } d.bdRead = false return } -func (d *cborDecDriver) DecodeFloat64() (f float64) { +func (d *cborDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { if !d.bdRead { d.readNextBd() } @@ -422,9 +321,13 @@ func (d *cborDecDriver) DecodeFloat64() (f float64) { } else if bd == cborBdFloat64 { f = math.Float64frombits(bigen.Uint64(d.r.readx(8))) } else if bd >= cborBaseUint && bd < cborBaseBytes { - f = float64(d.DecodeInt64()) + f = float64(d.DecodeInt(64)) } else { - d.d.errorf("float only valid from float16/32/64 - invalid descriptor %x/%s", bd, cbordesc(bd)) + d.d.errorf("Float only valid from float16/32/64: Invalid descriptor: %v", bd) + return + } + if chkOverflow32 && chkOvf.Float32(f) { + d.d.errorf("cbor: float32 overflow: %v", f) return } d.bdRead = false @@ -440,7 +343,7 @@ func (d *cborDecDriver) DecodeBool() (b bool) { b = true } else if bd == cborBdFalse { } else { - d.d.errorf("not bool - %s %x/%s", msgBadDesc, d.bd, cbordesc(d.bd)) + d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) return } d.bdRead = false @@ -448,9 +351,6 @@ func (d *cborDecDriver) DecodeBool() (b bool) { } func (d *cborDecDriver) ReadMapStart() (length int) { - if !d.bdRead { - d.readNextBd() - } d.bdRead = false if d.bd == cborBdIndefiniteMap { return -1 @@ -459,9 +359,6 @@ func (d *cborDecDriver) ReadMapStart() (length int) { } func (d *cborDecDriver) ReadArrayStart() (length int) { - if !d.bdRead { - d.readNextBd() - } d.bdRead = false if d.bd == cborBdIndefiniteArray { return -1 @@ -480,8 +377,7 @@ func (d *cborDecDriver) decAppendIndefiniteBytes(bs []byte) []byte { break } if major := d.bd >> 5; major != cborMajorBytes && major != cborMajorText { - d.d.errorf("expect bytes/string major type in indefinite string/bytes;"+ - " got major %v from descriptor %x/%x", major, d.bd, cbordesc(d.bd)) + d.d.errorf("cbor: expect bytes or string major type in indefinite string/bytes; got: %v, byte: %v", major, d.bd) return nil } n := d.decLen() @@ -502,7 +398,7 @@ func (d *cborDecDriver) decAppendIndefiniteBytes(bs []byte) []byte { return bs } -func (d *cborDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { +func (d *cborDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { if !d.bdRead { d.readNextBd() } @@ -511,84 +407,25 @@ func (d *cborDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { return nil } if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString { - d.bdRead = false if bs == nil { - if zerocopy { - return d.decAppendIndefiniteBytes(d.d.b[:0]) - } - return d.decAppendIndefiniteBytes(zeroByteSlice) + return d.decAppendIndefiniteBytes(nil) } return d.decAppendIndefiniteBytes(bs[:0]) } - // check if an "array" of uint8's (see ContainerType for how to infer if an array) - if d.bd == cborBdIndefiniteArray || (d.bd >= cborBaseArray && d.bd < cborBaseMap) { - bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d) - return - } clen := d.decLen() d.bdRead = false if zerocopy { if d.br { return d.r.readx(clen) } else if len(bs) == 0 { - bs = d.d.b[:] + bs = d.b[:] } } - return decByteSlice(d.r, clen, d.h.MaxInitLen, bs) + return decByteSlice(d.r, clen, d.d.h.MaxInitLen, bs) } func (d *cborDecDriver) DecodeString() (s string) { - return string(d.DecodeBytes(d.d.b[:], true)) -} - -func (d *cborDecDriver) DecodeStringAsBytes() (s []byte) { - return d.DecodeBytes(d.d.b[:], true) -} - -func (d *cborDecDriver) DecodeTime() (t time.Time) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == cborBdNil || d.bd == cborBdUndefined { - d.bdRead = false - return - } - xtag := d.decUint() - d.bdRead = false - return d.decodeTime(xtag) -} - -func (d *cborDecDriver) decodeTime(xtag uint64) (t time.Time) { - if !d.bdRead { - d.readNextBd() - } - switch xtag { - case 0: - var err error - if t, err = time.Parse(time.RFC3339, stringView(d.DecodeStringAsBytes())); err != nil { - d.d.errorv(err) - } - case 1: - // decode an int64 or a float, and infer time.Time from there. - // for floats, round to microseconds, as that is what is guaranteed to fit well. - switch { - case d.bd == cborBdFloat16, d.bd == cborBdFloat32: - f1, f2 := math.Modf(d.DecodeFloat64()) - t = time.Unix(int64(f1), int64(f2*1e9)) - case d.bd == cborBdFloat64: - f1, f2 := math.Modf(d.DecodeFloat64()) - t = time.Unix(int64(f1), int64(f2*1e9)) - case d.bd >= cborBaseUint && d.bd < cborBaseNegInt, - d.bd >= cborBaseNegInt && d.bd < cborBaseBytes: - t = time.Unix(d.DecodeInt64(), 0) - default: - d.d.errorf("time.Time can only be decoded from a number (or RFC3339 string)") - } - default: - d.d.errorf("invalid tag for time.Time - expecting 0 or 1, got 0x%x", xtag) - } - t = t.UTC().Round(time.Microsecond) - return + return string(d.DecodeBytes(d.b[:], true, true)) } func (d *cborDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { @@ -619,7 +456,7 @@ func (d *cborDecDriver) DecodeNaked() { d.readNextBd() } - n := d.d.n + n := &d.d.n var decodeFurther bool switch d.bd { @@ -631,12 +468,15 @@ func (d *cborDecDriver) DecodeNaked() { case cborBdTrue: n.v = valueTypeBool n.b = true - case cborBdFloat16, cborBdFloat32, cborBdFloat64: + case cborBdFloat16, cborBdFloat32: n.v = valueTypeFloat - n.f = d.DecodeFloat64() + n.f = d.DecodeFloat(true) + case cborBdFloat64: + n.v = valueTypeFloat + n.f = d.DecodeFloat(false) case cborBdIndefiniteBytes: n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false) + n.l = d.DecodeBytes(nil, false, false) case cborBdIndefiniteString: n.v = valueTypeString n.s = d.DecodeString() @@ -651,17 +491,17 @@ func (d *cborDecDriver) DecodeNaked() { case d.bd >= cborBaseUint && d.bd < cborBaseNegInt: if d.h.SignedInteger { n.v = valueTypeInt - n.i = d.DecodeInt64() + n.i = d.DecodeInt(64) } else { n.v = valueTypeUint - n.u = d.DecodeUint64() + n.u = d.DecodeUint(64) } case d.bd >= cborBaseNegInt && d.bd < cborBaseBytes: n.v = valueTypeInt - n.i = d.DecodeInt64() + n.i = d.DecodeInt(64) case d.bd >= cborBaseBytes && d.bd < cborBaseString: n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false) + n.l = d.DecodeBytes(nil, false, false) case d.bd >= cborBaseString && d.bd < cborBaseArray: n.v = valueTypeString n.s = d.DecodeString() @@ -675,11 +515,6 @@ func (d *cborDecDriver) DecodeNaked() { n.v = valueTypeExt n.u = d.decUint() n.l = nil - if n.u == 0 || n.u == 1 { - d.bdRead = false - n.v = valueTypeTime - n.t = d.decodeTime(n.u) - } // d.bdRead = false // d.d.decode(&re.Value) // handled by decode itself. // decodeFurther = true @@ -710,29 +545,30 @@ func (d *cborDecDriver) DecodeNaked() { // // None of the optional extensions (with tags) defined in the spec are supported out-of-the-box. // Users can implement them as needed (using SetExt), including spec-documented ones: -// - timestamp, BigNum, BigFloat, Decimals, -// - Encoded Text (e.g. URL, regexp, base64, MIME Message), etc. +// - timestamp, BigNum, BigFloat, Decimals, Encoded Text (e.g. URL, regexp, base64, MIME Message), etc. +// +// To encode with indefinite lengths (streaming), users will use +// (Must)Encode methods of *Encoder, along with writing CborStreamXXX constants. +// +// For example, to encode "one-byte" as an indefinite length string: +// var buf bytes.Buffer +// e := NewEncoder(&buf, new(CborHandle)) +// buf.WriteByte(CborStreamString) +// e.MustEncode("one-") +// e.MustEncode("byte") +// buf.WriteByte(CborStreamBreak) +// encodedBytes := buf.Bytes() +// var vv interface{} +// NewDecoderBytes(buf.Bytes(), new(CborHandle)).MustDecode(&vv) +// // Now, vv contains the same string "one-byte" +// type CborHandle struct { binaryEncodingType - noElemSeparators BasicHandle - - // IndefiniteLength=true, means that we encode using indefinitelength - IndefiniteLength bool - - // TimeRFC3339 says to encode time.Time using RFC3339 format. - // If unset, we encode time.Time using seconds past epoch. - TimeRFC3339 bool - - // _ [1]uint64 // padding } -// Name returns the name of the handle: cbor -func (h *CborHandle) Name() string { return "cbor" } - -// SetInterfaceExt sets an extension func (h *CborHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext InterfaceExt) (err error) { - return h.SetExt(rt, tag, &extWrapper{bytesExtFailer{}, ext}) + return h.SetExt(rt, tag, &setExtWrapper{i: ext}) } func (h *CborHandle) newEncDriver(e *Encoder) encDriver { @@ -740,7 +576,7 @@ func (h *CborHandle) newEncDriver(e *Encoder) encDriver { } func (h *CborHandle) newDecDriver(d *Decoder) decDriver { - return &cborDecDriver{d: d, h: h, r: d.r, br: d.bytes} + return &cborDecDriver{d: d, r: d.r, h: h, br: d.bytes} } func (e *cborEncDriver) reset() { @@ -748,7 +584,7 @@ func (e *cborEncDriver) reset() { } func (d *cborDecDriver) reset() { - d.r, d.br = d.d.r, d.d.bytes + d.r = d.d.r d.bd, d.bdRead = 0, false } diff --git a/vendor/github.com/ugorji/go/codec/decode.go b/vendor/github.com/ugorji/go/codec/decode.go index 1c0817aaf..e30e8e8c1 100644 --- a/vendor/github.com/ugorji/go/codec/decode.go +++ b/vendor/github.com/ugorji/go/codec/decode.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec @@ -9,33 +9,18 @@ import ( "fmt" "io" "reflect" - "strconv" - "sync" "time" ) // Some tagging information for error messages. const ( - msgBadDesc = "unrecognized descriptor byte" + msgBadDesc = "Unrecognized descriptor byte" msgDecCannotExpandArr = "cannot expand go array from %v to stream length: %v" ) -const decDefSliceCap = 8 -const decDefChanCap = 64 // should be large, as cap cannot be expanded -const decScratchByteArrayLen = cacheLineSize - 8 - var ( - errstrOnlyMapOrArrayCanDecodeIntoStruct = "only encoded map or array can be decoded into a struct" - errstrCannotDecodeIntoNil = "cannot decode into nil" - - errmsgExpandSliceOverflow = "expand slice: slice overflow" - errmsgExpandSliceCannotChange = "expand slice: cannot change" - - errDecoderNotInitialized = errors.New("Decoder not initialized") - - errDecUnreadByteNothingToRead = errors.New("cannot unread - nothing has been read") - errDecUnreadByteLastByteNotRead = errors.New("cannot unread - last byte has not been read") - errDecUnreadByteUnknown = errors.New("cannot unread - reason unknown") + onlyMapOrArrayCanDecodeIntoStructErr = errors.New("only encoded map or array can be decoded into a struct") + cannotDecodeIntoNilErr = errors.New("cannot decode into nil") ) // decReader abstracts the reading source, allowing implementations that can @@ -49,29 +34,25 @@ type decReader interface { readx(n int) []byte readb([]byte) readn1() uint8 + readn1eof() (v uint8, eof bool) numread() int // number of bytes read track() stopTrack() []byte +} - // skip will skip any byte that matches, and return the first non-matching byte - skip(accept *bitset256) (token byte) - // readTo will read any byte that matches, stopping once no-longer matching. - readTo(in []byte, accept *bitset256) (out []byte) - // readUntil will read, only stopping once it matches the 'stop' byte. - readUntil(in []byte, stop byte) (out []byte) +type decReaderByteScanner interface { + io.Reader + io.ByteScanner } type decDriver interface { // this will check if the next token is a break. CheckBreak() bool - // Note: TryDecodeAsNil should be careful not to share any temporary []byte with - // the rest of the decDriver. This is because sometimes, we optimize by holding onto - // a transient []byte, and ensuring the only other call we make to the decDriver - // during that time is maybe a TryDecodeAsNil() call. TryDecodeAsNil() bool // vt is one of: Bytes, String, Nil, Slice or Map. Return unSet if not known. ContainerType() (vt valueType) - // IsBuiltinType(rt uintptr) bool + IsBuiltinType(rt uintptr) bool + DecodeBuiltin(rt uintptr, v interface{}) // DecodeNaked will decode primitives (number, bool, string, []byte) and RawExt. // For maps and arrays, it will not do the decoding in-band, but will signal @@ -85,15 +66,9 @@ type decDriver interface { // extensions should also use readx to decode them, for efficiency. // kInterface will extract the detached byte slice if it has to pass it outside its realm. DecodeNaked() - - // Deprecated: use DecodeInt64 and DecodeUint64 instead - // DecodeInt(bitsize uint8) (i int64) - // DecodeUint(bitsize uint8) (ui uint64) - - DecodeInt64() (i int64) - DecodeUint64() (ui uint64) - - DecodeFloat64() (f float64) + DecodeInt(bitsize uint8) (i int64) + DecodeUint(bitsize uint8) (ui uint64) + DecodeFloat(chkOverflow32 bool) (f float64) DecodeBool() (b bool) // DecodeString can also decode symbols. // It looks redundant as DecodeBytes is available. @@ -101,69 +76,45 @@ type decDriver interface { // return a pre-stored string value, meaning that it can bypass // the cost of []byte->string conversion. DecodeString() (s string) - DecodeStringAsBytes() (v []byte) // DecodeBytes may be called directly, without going through reflection. // Consequently, it must be designed to handle possible nil. - DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) - // DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) + DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) // decodeExt will decode into a *RawExt or into an extension. DecodeExt(v interface{}, xtag uint64, ext Ext) (realxtag uint64) // decodeExt(verifyTag bool, tag byte) (xtag byte, xbs []byte) - - DecodeTime() (t time.Time) - - ReadArrayStart() int - ReadArrayElem() - ReadArrayEnd() ReadMapStart() int - ReadMapElemKey() - ReadMapElemValue() - ReadMapEnd() + ReadArrayStart() int reset() uncacheRead() } -type decDriverNoopContainerReader struct{} +type decNoSeparator struct { +} -func (x decDriverNoopContainerReader) ReadArrayStart() (v int) { return } -func (x decDriverNoopContainerReader) ReadArrayElem() {} -func (x decDriverNoopContainerReader) ReadArrayEnd() {} -func (x decDriverNoopContainerReader) ReadMapStart() (v int) { return } -func (x decDriverNoopContainerReader) ReadMapElemKey() {} -func (x decDriverNoopContainerReader) ReadMapElemValue() {} -func (x decDriverNoopContainerReader) ReadMapEnd() {} -func (x decDriverNoopContainerReader) CheckBreak() (v bool) { return } +func (_ decNoSeparator) ReadEnd() {} -// func (x decNoSeparator) uncacheRead() {} +// func (_ decNoSeparator) uncacheRead() {} -// DecodeOptions captures configuration options during decode. type DecodeOptions struct { // MapType specifies type to use during schema-less decoding of a map in the stream. - // If nil (unset), we default to map[string]interface{} iff json handle and MapStringAsKey=true, - // else map[interface{}]interface{}. + // If nil, we use map[interface{}]interface{} MapType reflect.Type // SliceType specifies type to use during schema-less decoding of an array in the stream. - // If nil (unset), we default to []interface{} for all formats. + // If nil, we use []interface{} SliceType reflect.Type - // MaxInitLen defines the maxinum initial length that we "make" a collection - // (string, slice, map, chan). If 0 or negative, we default to a sensible value - // based on the size of an element in the collection. + // MaxInitLen defines the maxinum initial length that we "make" a collection (string, slice, map, chan). + // If 0 or negative, we default to a sensible value based on the size of an element in the collection. // // For example, when decoding, a stream may say that it has 2^64 elements. - // We should not auto-matically provision a slice of that size, to prevent Out-Of-Memory crash. + // We should not auto-matically provision a slice of that length, to prevent Out-Of-Memory crash. // Instead, we provision up to MaxInitLen, fill that up, and start appending after that. MaxInitLen int - // ReaderBufferSize is the size of the buffer used when reading. - // - // if > 0, we use a smart buffer internally for performance purposes. - ReaderBufferSize int - // If ErrorIfNoField, return an error when decoding a map // from a codec stream into a struct, and no matching struct field is found. ErrorIfNoField bool @@ -190,11 +141,6 @@ type DecodeOptions struct { // or is an interface. MapValueReset bool - // SliceElementReset: on decoding a slice, reset the element to a zero value first. - // - // concern: if the slice already contained some garbage, we will decode into that garbage. - SliceElementReset bool - // InterfaceReset controls how we decode into an interface. // // By default, when we see a field that is an interface{...}, @@ -215,9 +161,7 @@ type DecodeOptions struct { // look them up from a map (than to allocate them afresh). // // Note: Handles will be smart when using the intern functionality. - // Every string should not be interned. - // An excellent use-case for interning is struct field names, - // or map keys where key type is string. + // So everything will not be interned. InternString bool // PreferArrayOverSlice controls whether to decode to an array or a slice. @@ -228,355 +172,20 @@ type DecodeOptions struct { // *Note*: This only applies if using go1.5 and above, // as it requires reflect.ArrayOf support which was absent before go1.5. PreferArrayOverSlice bool - - // DeleteOnNilMapValue controls how to decode a nil value in the stream. - // - // If true, we will delete the mapping of the key. - // Else, just set the mapping to the zero value of the type. - DeleteOnNilMapValue bool } // ------------------------------------ -type bufioDecReader struct { - buf []byte - r io.Reader - - c int // cursor - n int // num read - err error - - tr []byte - trb bool - b [4]byte -} - -func (z *bufioDecReader) reset(r io.Reader) { - z.r, z.c, z.n, z.err, z.trb = r, 0, 0, nil, false - if z.tr != nil { - z.tr = z.tr[:0] - } -} - -func (z *bufioDecReader) Read(p []byte) (n int, err error) { - if z.err != nil { - return 0, z.err - } - p0 := p - n = copy(p, z.buf[z.c:]) - z.c += n - if z.c == len(z.buf) { - z.c = 0 - } - z.n += n - if len(p) == n { - if z.c == 0 { - z.buf = z.buf[:1] - z.buf[0] = p[len(p)-1] - z.c = 1 - } - if z.trb { - z.tr = append(z.tr, p0[:n]...) - } - return - } - p = p[n:] - var n2 int - // if we are here, then z.buf is all read - if len(p) > len(z.buf) { - n2, err = decReadFull(z.r, p) - n += n2 - z.n += n2 - z.err = err - // don't return EOF if some bytes were read. keep for next time. - if n > 0 && err == io.EOF { - err = nil - } - // always keep last byte in z.buf - z.buf = z.buf[:1] - z.buf[0] = p[len(p)-1] - z.c = 1 - if z.trb { - z.tr = append(z.tr, p0[:n]...) - } - return - } - // z.c is now 0, and len(p) <= len(z.buf) - for len(p) > 0 && z.err == nil { - // println("len(p) loop starting ... ") - z.c = 0 - z.buf = z.buf[0:cap(z.buf)] - n2, err = z.r.Read(z.buf) - if n2 > 0 { - if err == io.EOF { - err = nil - } - z.buf = z.buf[:n2] - n2 = copy(p, z.buf) - z.c = n2 - n += n2 - z.n += n2 - p = p[n2:] - } - z.err = err - // println("... len(p) loop done") - } - if z.c == 0 { - z.buf = z.buf[:1] - z.buf[0] = p[len(p)-1] - z.c = 1 - } - if z.trb { - z.tr = append(z.tr, p0[:n]...) - } - return -} - -func (z *bufioDecReader) ReadByte() (b byte, err error) { - z.b[0] = 0 - _, err = z.Read(z.b[:1]) - b = z.b[0] - return -} - -func (z *bufioDecReader) UnreadByte() (err error) { - if z.err != nil { - return z.err - } - if z.c > 0 { - z.c-- - z.n-- - if z.trb { - z.tr = z.tr[:len(z.tr)-1] - } - return - } - return errDecUnreadByteNothingToRead +// ioDecByteScanner implements Read(), ReadByte(...), UnreadByte(...) methods +// of io.Reader, io.ByteScanner. +type ioDecByteScanner struct { + r io.Reader + l byte // last byte + ls byte // last byte status. 0: init-canDoNothing, 1: canRead, 2: canUnread + b [1]byte // tiny buffer for reading single bytes } -func (z *bufioDecReader) numread() int { - return z.n -} - -func (z *bufioDecReader) readx(n int) (bs []byte) { - if n <= 0 || z.err != nil { - return - } - if z.c+n <= len(z.buf) { - bs = z.buf[z.c : z.c+n] - z.n += n - z.c += n - if z.trb { - z.tr = append(z.tr, bs...) - } - return - } - bs = make([]byte, n) - _, err := z.Read(bs) - if err != nil { - panic(err) - } - return -} - -func (z *bufioDecReader) readb(bs []byte) { - _, err := z.Read(bs) - if err != nil { - panic(err) - } -} - -// func (z *bufioDecReader) readn1eof() (b uint8, eof bool) { -// b, err := z.ReadByte() -// if err != nil { -// if err == io.EOF { -// eof = true -// } else { -// panic(err) -// } -// } -// return -// } - -func (z *bufioDecReader) readn1() (b uint8) { - b, err := z.ReadByte() - if err != nil { - panic(err) - } - return -} - -func (z *bufioDecReader) search(in []byte, accept *bitset256, stop, flag uint8) (token byte, out []byte) { - // flag: 1 (skip), 2 (readTo), 4 (readUntil) - if flag == 4 { - for i := z.c; i < len(z.buf); i++ { - if z.buf[i] == stop { - token = z.buf[i] - z.n = z.n + (i - z.c) - 1 - i++ - out = z.buf[z.c:i] - if z.trb { - z.tr = append(z.tr, z.buf[z.c:i]...) - } - z.c = i - return - } - } - } else { - for i := z.c; i < len(z.buf); i++ { - if !accept.isset(z.buf[i]) { - token = z.buf[i] - z.n = z.n + (i - z.c) - 1 - if flag == 1 { - i++ - } else { - out = z.buf[z.c:i] - } - if z.trb { - z.tr = append(z.tr, z.buf[z.c:i]...) - } - z.c = i - return - } - } - } - z.n += len(z.buf) - z.c - if flag != 1 { - out = append(in, z.buf[z.c:]...) - } - if z.trb { - z.tr = append(z.tr, z.buf[z.c:]...) - } - var n2 int - if z.err != nil { - return - } - for { - z.c = 0 - z.buf = z.buf[0:cap(z.buf)] - n2, z.err = z.r.Read(z.buf) - if n2 > 0 && z.err != nil { - z.err = nil - } - z.buf = z.buf[:n2] - if flag == 4 { - for i := 0; i < n2; i++ { - if z.buf[i] == stop { - token = z.buf[i] - z.n += i - 1 - i++ - out = append(out, z.buf[z.c:i]...) - if z.trb { - z.tr = append(z.tr, z.buf[z.c:i]...) - } - z.c = i - return - } - } - } else { - for i := 0; i < n2; i++ { - if !accept.isset(z.buf[i]) { - token = z.buf[i] - z.n += i - 1 - if flag == 1 { - i++ - } - if flag != 1 { - out = append(out, z.buf[z.c:i]...) - } - if z.trb { - z.tr = append(z.tr, z.buf[z.c:i]...) - } - z.c = i - return - } - } - } - if flag != 1 { - out = append(out, z.buf[:n2]...) - } - z.n += n2 - if z.err != nil { - return - } - if z.trb { - z.tr = append(z.tr, z.buf[:n2]...) - } - } -} - -func (z *bufioDecReader) skip(accept *bitset256) (token byte) { - token, _ = z.search(nil, accept, 0, 1) - return -} - -func (z *bufioDecReader) readTo(in []byte, accept *bitset256) (out []byte) { - _, out = z.search(in, accept, 0, 2) - return -} - -func (z *bufioDecReader) readUntil(in []byte, stop byte) (out []byte) { - _, out = z.search(in, nil, stop, 4) - return -} - -func (z *bufioDecReader) unreadn1() { - err := z.UnreadByte() - if err != nil { - panic(err) - } -} - -func (z *bufioDecReader) track() { - if z.tr != nil { - z.tr = z.tr[:0] - } - z.trb = true -} - -func (z *bufioDecReader) stopTrack() (bs []byte) { - z.trb = false - return z.tr -} - -// ioDecReader is a decReader that reads off an io.Reader. -// -// It also has a fallback implementation of ByteScanner if needed. -type ioDecReader struct { - r io.Reader // the reader passed in - - rr io.Reader - br io.ByteScanner - - l byte // last byte - ls byte // last byte status. 0: init-canDoNothing, 1: canRead, 2: canUnread - trb bool // tracking bytes turned on - _ bool - b [4]byte // tiny buffer for reading single bytes - - x [scratchByteArrayLen]byte // for: get struct field name, swallow valueTypeBytes, etc - n int // num read - tr []byte // tracking bytes read -} - -func (z *ioDecReader) reset(r io.Reader) { - z.r = r - z.rr = r - z.l, z.ls, z.n, z.trb = 0, 0, 0, false - if z.tr != nil { - z.tr = z.tr[:0] - } - var ok bool - if z.br, ok = r.(io.ByteScanner); !ok { - z.br = z - z.rr = z - } -} - -func (z *ioDecReader) Read(p []byte) (n int, err error) { - if len(p) == 0 { - return - } +func (z *ioDecByteScanner) Read(p []byte) (n int, err error) { var firstByte bool if z.ls == 1 { z.ls = 2 @@ -602,8 +211,8 @@ func (z *ioDecReader) Read(p []byte) (n int, err error) { return } -func (z *ioDecReader) ReadByte() (c byte, err error) { - n, err := z.Read(z.b[:1]) +func (z *ioDecByteScanner) ReadByte() (c byte, err error) { + n, err := z.Read(z.b[:]) if n == 1 { c = z.b[0] if err == io.EOF { @@ -613,20 +222,30 @@ func (z *ioDecReader) ReadByte() (c byte, err error) { return } -func (z *ioDecReader) UnreadByte() (err error) { - switch z.ls { - case 2: +func (z *ioDecByteScanner) UnreadByte() (err error) { + x := z.ls + if x == 0 { + err = errors.New("cannot unread - nothing has been read") + } else if x == 1 { + err = errors.New("cannot unread - last byte has not been read") + } else if x == 2 { z.ls = 1 - case 0: - err = errDecUnreadByteNothingToRead - case 1: - err = errDecUnreadByteLastByteNotRead - default: - err = errDecUnreadByteUnknown } return } +// ioDecReader is a decReader that reads off an io.Reader +type ioDecReader struct { + br decReaderByteScanner + // temp byte array re-used internally for efficiency during read. + // shares buffer with Decoder, so we keep size of struct within 8 words. + x *[scratchByteArrayLen]byte + bs ioDecByteScanner + n int // num read + tr []byte // tracking bytes read + trb bool +} + func (z *ioDecReader) numread() int { return z.n } @@ -640,7 +259,7 @@ func (z *ioDecReader) readx(n int) (bs []byte) { } else { bs = make([]byte, n) } - if _, err := decReadFull(z.rr, bs); err != nil { + if _, err := io.ReadAtLeast(z.br, bs, n); err != nil { panic(err) } z.n += len(bs) @@ -651,18 +270,31 @@ func (z *ioDecReader) readx(n int) (bs []byte) { } func (z *ioDecReader) readb(bs []byte) { - // if len(bs) == 0 { - // return - // } - if _, err := decReadFull(z.rr, bs); err != nil { + if len(bs) == 0 { + return + } + n, err := io.ReadAtLeast(z.br, bs, len(bs)) + z.n += n + if err != nil { panic(err) } - z.n += len(bs) if z.trb { z.tr = append(z.tr, bs...) } } +func (z *ioDecReader) readn1() (b uint8) { + b, err := z.br.ReadByte() + if err != nil { + panic(err) + } + z.n++ + if z.trb { + z.tr = append(z.tr, b) + } + return b +} + func (z *ioDecReader) readn1eof() (b uint8, eof bool) { b, err := z.br.ReadByte() if err == nil { @@ -678,62 +310,6 @@ func (z *ioDecReader) readn1eof() (b uint8, eof bool) { return } -func (z *ioDecReader) readn1() (b uint8) { - var err error - if b, err = z.br.ReadByte(); err == nil { - z.n++ - if z.trb { - z.tr = append(z.tr, b) - } - return - } - panic(err) -} - -func (z *ioDecReader) skip(accept *bitset256) (token byte) { - for { - var eof bool - token, eof = z.readn1eof() - if eof { - return - } - if accept.isset(token) { - continue - } - return - } -} - -func (z *ioDecReader) readTo(in []byte, accept *bitset256) (out []byte) { - out = in - for { - token, eof := z.readn1eof() - if eof { - return - } - if accept.isset(token) { - out = append(out, token) - } else { - z.unreadn1() - return - } - } -} - -func (z *ioDecReader) readUntil(in []byte, stop byte) (out []byte) { - out = in - for { - token, eof := z.readn1eof() - if eof { - panic(io.EOF) - } - out = append(out, token) - if token == stop { - return - } - } -} - func (z *ioDecReader) unreadn1() { err := z.br.UnreadByte() if err != nil { @@ -761,7 +337,7 @@ func (z *ioDecReader) stopTrack() (bs []byte) { // ------------------------------------ -var errBytesDecReaderCannotUnread = errors.New("cannot unread last byte read") +var bytesDecReaderCannotUnreadErr = errors.New("cannot unread last byte read") // bytesDecReader is a decReader that reads off a byte slice with zero copying type bytesDecReader struct { @@ -784,7 +360,7 @@ func (z *bytesDecReader) numread() int { func (z *bytesDecReader) unreadn1() { if z.c == 0 || len(z.b) == 0 { - panic(errBytesDecReaderCannotUnread) + panic(bytesDecReaderCannotUnreadErr) } z.c-- z.a++ @@ -810,10 +386,6 @@ func (z *bytesDecReader) readx(n int) (bs []byte) { return } -func (z *bytesDecReader) readb(bs []byte) { - copy(bs, z.readx(len(bs))) -} - func (z *bytesDecReader) readn1() (v uint8) { if z.a == 0 { panic(io.EOF) @@ -824,69 +396,19 @@ func (z *bytesDecReader) readn1() (v uint8) { return } -// func (z *bytesDecReader) readn1eof() (v uint8, eof bool) { -// if z.a == 0 { -// eof = true -// return -// } -// v = z.b[z.c] -// z.c++ -// z.a-- -// return -// } - -func (z *bytesDecReader) skip(accept *bitset256) (token byte) { - if z.a == 0 { - return - } - blen := len(z.b) - for i := z.c; i < blen; i++ { - if !accept.isset(z.b[i]) { - token = z.b[i] - i++ - z.a -= (i - z.c) - z.c = i - return - } - } - z.a, z.c = 0, blen - return -} - -func (z *bytesDecReader) readTo(_ []byte, accept *bitset256) (out []byte) { +func (z *bytesDecReader) readn1eof() (v uint8, eof bool) { if z.a == 0 { + eof = true return } - blen := len(z.b) - for i := z.c; i < blen; i++ { - if !accept.isset(z.b[i]) { - out = z.b[z.c:i] - z.a -= (i - z.c) - z.c = i - return - } - } - out = z.b[z.c:] - z.a, z.c = 0, blen + v = z.b[z.c] + z.c++ + z.a-- return } -func (z *bytesDecReader) readUntil(_ []byte, stop byte) (out []byte) { - if z.a == 0 { - panic(io.EOF) - } - blen := len(z.b) - for i := z.c; i < blen; i++ { - if z.b[i] == stop { - i++ - out = z.b[z.c:i] - z.a -= (i - z.c) - z.c = i - return - } - } - z.a, z.c = 0, blen - panic(io.EOF) +func (z *bytesDecReader) readb(bs []byte) { + copy(bs, z.readx(len(bs))) } func (z *bytesDecReader) track() { @@ -897,66 +419,172 @@ func (z *bytesDecReader) stopTrack() (bs []byte) { return z.b[z.t:z.c] } +// ------------------------------------ + +type decFnInfo struct { + d *Decoder + ti *typeInfo + xfFn Ext + xfTag uint64 + seq seqType +} + // ---------------------------------------- -// func (d *Decoder) builtin(f *codecFnInfo, rv reflect.Value) { -// d.d.DecodeBuiltin(f.ti.rtid, rv2i(rv)) -// } +type decFn struct { + i decFnInfo + f func(*decFnInfo, reflect.Value) +} + +func (f *decFnInfo) builtin(rv reflect.Value) { + f.d.d.DecodeBuiltin(f.ti.rtid, rv.Addr().Interface()) +} + +func (f *decFnInfo) rawExt(rv reflect.Value) { + f.d.d.DecodeExt(rv.Addr().Interface(), 0, nil) +} -func (d *Decoder) rawExt(f *codecFnInfo, rv reflect.Value) { - d.d.DecodeExt(rv2i(rv), 0, nil) +func (f *decFnInfo) raw(rv reflect.Value) { + rv.SetBytes(f.d.raw()) } -func (d *Decoder) ext(f *codecFnInfo, rv reflect.Value) { - d.d.DecodeExt(rv2i(rv), f.xfTag, f.xfFn) +func (f *decFnInfo) ext(rv reflect.Value) { + f.d.d.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn) } -func (d *Decoder) selferUnmarshal(f *codecFnInfo, rv reflect.Value) { - rv2i(rv).(Selfer).CodecDecodeSelf(d) +func (f *decFnInfo) getValueForUnmarshalInterface(rv reflect.Value, indir int8) (v interface{}) { + if indir == -1 { + v = rv.Addr().Interface() + } else if indir == 0 { + v = rv.Interface() + } else { + for j := int8(0); j < indir; j++ { + if rv.IsNil() { + rv.Set(reflect.New(rv.Type().Elem())) + } + rv = rv.Elem() + } + v = rv.Interface() + } + return } -func (d *Decoder) binaryUnmarshal(f *codecFnInfo, rv reflect.Value) { - bm := rv2i(rv).(encoding.BinaryUnmarshaler) - xbs := d.d.DecodeBytes(nil, true) +func (f *decFnInfo) selferUnmarshal(rv reflect.Value) { + f.getValueForUnmarshalInterface(rv, f.ti.csIndir).(Selfer).CodecDecodeSelf(f.d) +} + +func (f *decFnInfo) binaryUnmarshal(rv reflect.Value) { + bm := f.getValueForUnmarshalInterface(rv, f.ti.bunmIndir).(encoding.BinaryUnmarshaler) + xbs := f.d.d.DecodeBytes(nil, false, true) if fnerr := bm.UnmarshalBinary(xbs); fnerr != nil { panic(fnerr) } } -func (d *Decoder) textUnmarshal(f *codecFnInfo, rv reflect.Value) { - tm := rv2i(rv).(encoding.TextUnmarshaler) - fnerr := tm.UnmarshalText(d.d.DecodeStringAsBytes()) +func (f *decFnInfo) textUnmarshal(rv reflect.Value) { + tm := f.getValueForUnmarshalInterface(rv, f.ti.tunmIndir).(encoding.TextUnmarshaler) + fnerr := tm.UnmarshalText(f.d.d.DecodeBytes(f.d.b[:], true, true)) if fnerr != nil { panic(fnerr) } } -func (d *Decoder) jsonUnmarshal(f *codecFnInfo, rv reflect.Value) { - tm := rv2i(rv).(jsonUnmarshaler) - // bs := d.d.DecodeBytes(d.b[:], true, true) +func (f *decFnInfo) jsonUnmarshal(rv reflect.Value) { + tm := f.getValueForUnmarshalInterface(rv, f.ti.junmIndir).(jsonUnmarshaler) + // bs := f.d.d.DecodeBytes(f.d.b[:], true, true) // grab the bytes to be read, as UnmarshalJSON needs the full JSON so as to unmarshal it itself. - fnerr := tm.UnmarshalJSON(d.nextValueBytes()) + fnerr := tm.UnmarshalJSON(f.d.nextValueBytes()) if fnerr != nil { panic(fnerr) } } -func (d *Decoder) kErr(f *codecFnInfo, rv reflect.Value) { - d.errorf("no decoding function defined for kind %v", rv.Kind()) +func (f *decFnInfo) kErr(rv reflect.Value) { + f.d.errorf("no decoding function defined for kind %v", rv.Kind()) +} + +func (f *decFnInfo) kString(rv reflect.Value) { + rv.SetString(f.d.d.DecodeString()) +} + +func (f *decFnInfo) kBool(rv reflect.Value) { + rv.SetBool(f.d.d.DecodeBool()) +} + +func (f *decFnInfo) kInt(rv reflect.Value) { + rv.SetInt(f.d.d.DecodeInt(intBitsize)) } +func (f *decFnInfo) kInt64(rv reflect.Value) { + rv.SetInt(f.d.d.DecodeInt(64)) +} + +func (f *decFnInfo) kInt32(rv reflect.Value) { + rv.SetInt(f.d.d.DecodeInt(32)) +} + +func (f *decFnInfo) kInt8(rv reflect.Value) { + rv.SetInt(f.d.d.DecodeInt(8)) +} + +func (f *decFnInfo) kInt16(rv reflect.Value) { + rv.SetInt(f.d.d.DecodeInt(16)) +} + +func (f *decFnInfo) kFloat32(rv reflect.Value) { + rv.SetFloat(f.d.d.DecodeFloat(true)) +} + +func (f *decFnInfo) kFloat64(rv reflect.Value) { + rv.SetFloat(f.d.d.DecodeFloat(false)) +} + +func (f *decFnInfo) kUint8(rv reflect.Value) { + rv.SetUint(f.d.d.DecodeUint(8)) +} + +func (f *decFnInfo) kUint64(rv reflect.Value) { + rv.SetUint(f.d.d.DecodeUint(64)) +} + +func (f *decFnInfo) kUint(rv reflect.Value) { + rv.SetUint(f.d.d.DecodeUint(uintBitsize)) +} + +func (f *decFnInfo) kUintptr(rv reflect.Value) { + rv.SetUint(f.d.d.DecodeUint(uintBitsize)) +} + +func (f *decFnInfo) kUint32(rv reflect.Value) { + rv.SetUint(f.d.d.DecodeUint(32)) +} + +func (f *decFnInfo) kUint16(rv reflect.Value) { + rv.SetUint(f.d.d.DecodeUint(16)) +} + +// func (f *decFnInfo) kPtr(rv reflect.Value) { +// debugf(">>>>>>> ??? decode kPtr called - shouldn't get called") +// if rv.IsNil() { +// rv.Set(reflect.New(rv.Type().Elem())) +// } +// f.d.decodeValue(rv.Elem()) +// } + // var kIntfCtr uint64 -func (d *Decoder) kInterfaceNaked(f *codecFnInfo) (rvn reflect.Value) { +func (f *decFnInfo) kInterfaceNaked() (rvn reflect.Value) { // nil interface: // use some hieristics to decode it appropriately // based on the detected next value in the stream. - n := d.naked() + d := f.d d.d.DecodeNaked() + n := &d.n if n.v == valueTypeNil { return } // We cannot decode non-nil stream value into nil interface with methods (e.g. io.Reader). + // if num := f.ti.rt.NumMethod(); num > 0 { if f.ti.numMeth > 0 { d.errorf("cannot decode non-nil codec value into nil %v (%v methods)", f.ti.rt, f.ti.numMeth) return @@ -964,311 +592,268 @@ func (d *Decoder) kInterfaceNaked(f *codecFnInfo) (rvn reflect.Value) { // var useRvn bool switch n.v { case valueTypeMap: - // if json, default to a map type with string keys - mtid := d.mtid - if mtid == 0 { - if d.jsms { - mtid = mapStrIntfTypId - } else { - mtid = mapIntfIntfTypId - } - } - if mtid == mapIntfIntfTypId { - n.initContainers() - if n.lm < arrayCacheLen { - n.ma[n.lm] = nil - rvn = n.rma[n.lm] - n.lm++ - d.decode(&n.ma[n.lm-1]) - n.lm-- - } else { - var v2 map[interface{}]interface{} - d.decode(&v2) - rvn = reflect.ValueOf(&v2).Elem() - } - } else if mtid == mapStrIntfTypId { // for json performance - n.initContainers() - if n.ln < arrayCacheLen { - n.na[n.ln] = nil - rvn = n.rna[n.ln] - n.ln++ - d.decode(&n.na[n.ln-1]) - n.ln-- - } else { - var v2 map[string]interface{} - d.decode(&v2) - rvn = reflect.ValueOf(&v2).Elem() - } + // if d.h.MapType == nil || d.h.MapType == mapIntfIntfTyp { + // } else if d.h.MapType == mapStrIntfTyp { // for json performance + // } + if d.mtid == 0 || d.mtid == mapIntfIntfTypId { + l := len(n.ms) + n.ms = append(n.ms, nil) + var v2 interface{} = &n.ms[l] + d.decode(v2) + rvn = reflect.ValueOf(v2).Elem() + n.ms = n.ms[:l] + } else if d.mtid == mapStrIntfTypId { // for json performance + l := len(n.ns) + n.ns = append(n.ns, nil) + var v2 interface{} = &n.ns[l] + d.decode(v2) + rvn = reflect.ValueOf(v2).Elem() + n.ns = n.ns[:l] } else { - if d.mtr { - rvn = reflect.New(d.h.MapType) - d.decode(rv2i(rvn)) - rvn = rvn.Elem() - } else { - rvn = reflect.New(d.h.MapType).Elem() - d.decodeValue(rvn, nil, true) - } + rvn = reflect.New(d.h.MapType).Elem() + d.decodeValue(rvn, nil) } case valueTypeArray: + // if d.h.SliceType == nil || d.h.SliceType == intfSliceTyp { if d.stid == 0 || d.stid == intfSliceTypId { - n.initContainers() - if n.ls < arrayCacheLen { - n.sa[n.ls] = nil - rvn = n.rsa[n.ls] - n.ls++ - d.decode(&n.sa[n.ls-1]) - n.ls-- - } else { - var v2 []interface{} - d.decode(&v2) - rvn = reflect.ValueOf(&v2).Elem() - } + l := len(n.ss) + n.ss = append(n.ss, nil) + var v2 interface{} = &n.ss[l] + d.decode(v2) + n.ss = n.ss[:l] + rvn = reflect.ValueOf(v2).Elem() if reflectArrayOfSupported && d.stid == 0 && d.h.PreferArrayOverSlice { - rvn2 := reflect.New(reflectArrayOf(rvn.Len(), intfTyp)).Elem() - reflect.Copy(rvn2, rvn) - rvn = rvn2 + rvn = reflectArrayOf(rvn) } } else { - if d.str { - rvn = reflect.New(d.h.SliceType) - d.decode(rv2i(rvn)) - rvn = rvn.Elem() - } else { - rvn = reflect.New(d.h.SliceType).Elem() - d.decodeValue(rvn, nil, true) - } + rvn = reflect.New(d.h.SliceType).Elem() + d.decodeValue(rvn, nil) } case valueTypeExt: var v interface{} tag, bytes := n.u, n.l // calling decode below might taint the values if bytes == nil { - n.initContainers() - if n.li < arrayCacheLen { - n.ia[n.li] = nil - n.li++ - d.decode(&n.ia[n.li-1]) - // v = *(&n.ia[l]) - n.li-- - v = n.ia[n.li] - n.ia[n.li] = nil - } else { - d.decode(&v) - } + l := len(n.is) + n.is = append(n.is, nil) + v2 := &n.is[l] + d.decode(v2) + v = *v2 + n.is = n.is[:l] } bfn := d.h.getExtForTag(tag) if bfn == nil { var re RawExt re.Tag = tag re.Data = detachZeroCopyBytes(d.bytes, nil, bytes) - re.Value = v - rvn = reflect.ValueOf(&re).Elem() + rvn = reflect.ValueOf(re) } else { rvnA := reflect.New(bfn.rt) + rvn = rvnA.Elem() if bytes != nil { - bfn.ext.ReadExt(rv2i(rvnA), bytes) + bfn.ext.ReadExt(rvnA.Interface(), bytes) } else { - bfn.ext.UpdateExt(rv2i(rvnA), v) + bfn.ext.UpdateExt(rvnA.Interface(), v) } - rvn = rvnA.Elem() } case valueTypeNil: // no-op case valueTypeInt: - rvn = n.ri + rvn = reflect.ValueOf(&n.i).Elem() case valueTypeUint: - rvn = n.ru + rvn = reflect.ValueOf(&n.u).Elem() case valueTypeFloat: - rvn = n.rf + rvn = reflect.ValueOf(&n.f).Elem() case valueTypeBool: - rvn = n.rb + rvn = reflect.ValueOf(&n.b).Elem() case valueTypeString, valueTypeSymbol: - rvn = n.rs + rvn = reflect.ValueOf(&n.s).Elem() case valueTypeBytes: - rvn = n.rl - case valueTypeTime: - rvn = n.rt + rvn = reflect.ValueOf(&n.l).Elem() + case valueTypeTimestamp: + rvn = reflect.ValueOf(&n.t).Elem() default: - panicv.errorf("kInterfaceNaked: unexpected valueType: %d", n.v) + panic(fmt.Errorf("kInterfaceNaked: unexpected valueType: %d", n.v)) } return } -func (d *Decoder) kInterface(f *codecFnInfo, rv reflect.Value) { +func (f *decFnInfo) kInterface(rv reflect.Value) { + // debugf("\t===> kInterface") + // Note: // A consequence of how kInterface works, is that // if an interface already contains something, we try // to decode into what was there before. // We do not replace with a generic value (as got from decodeNaked). - // every interface passed here MUST be settable. var rvn reflect.Value - if rv.IsNil() || d.h.InterfaceReset { - // check if mapping to a type: if so, initialize it and move on - rvn = d.h.intf2impl(f.ti.rtid) + if rv.IsNil() { + rvn = f.kInterfaceNaked() + if rvn.IsValid() { + rv.Set(rvn) + } + } else if f.d.h.InterfaceReset { + rvn = f.kInterfaceNaked() if rvn.IsValid() { rv.Set(rvn) } else { - rvn = d.kInterfaceNaked(f) - if rvn.IsValid() { - rv.Set(rvn) - } else if d.h.InterfaceReset { - // reset to zero value based on current type in there. - rv.Set(reflect.Zero(rv.Elem().Type())) - } - return + // reset to zero value based on current type in there. + rv.Set(reflect.Zero(rv.Elem().Type())) } } else { - // now we have a non-nil interface value, meaning it contains a type rvn = rv.Elem() + // Note: interface{} is settable, but underlying type may not be. + // Consequently, we have to set the reflect.Value directly. + // if underlying type is settable (e.g. ptr or interface), + // we just decode into it. + // Else we create a settable value, decode into it, and set on the interface. + if rvn.CanSet() { + f.d.decodeValue(rvn, nil) + } else { + rvn2 := reflect.New(rvn.Type()).Elem() + rvn2.Set(rvn) + f.d.decodeValue(rvn2, nil) + rv.Set(rvn2) + } } - if d.d.TryDecodeAsNil() { - rv.Set(reflect.Zero(rvn.Type())) - return - } - - // Note: interface{} is settable, but underlying type may not be. - // Consequently, we MAY have to create a decodable value out of the underlying value, - // decode into it, and reset the interface itself. - // fmt.Printf(">>>> kInterface: rvn type: %v, rv type: %v\n", rvn.Type(), rv.Type()) - - rvn2, canDecode := isDecodeable(rvn) - if canDecode { - d.decodeValue(rvn2, nil, true) - return - } - - rvn2 = reflect.New(rvn.Type()).Elem() - rvn2.Set(rvn) - d.decodeValue(rvn2, nil, true) - rv.Set(rvn2) -} - -func decStructFieldKey(dd decDriver, keyType valueType, b *[decScratchByteArrayLen]byte) (rvkencname []byte) { - // use if-else-if, not switch (which compiles to binary-search) - // since keyType is typically valueTypeString, branch prediction is pretty good. - - if keyType == valueTypeString { - rvkencname = dd.DecodeStringAsBytes() - } else if keyType == valueTypeInt { - rvkencname = strconv.AppendInt(b[:0], dd.DecodeInt64(), 10) - } else if keyType == valueTypeUint { - rvkencname = strconv.AppendUint(b[:0], dd.DecodeUint64(), 10) - } else if keyType == valueTypeFloat { - rvkencname = strconv.AppendFloat(b[:0], dd.DecodeFloat64(), 'f', -1, 64) - } else { - rvkencname = dd.DecodeStringAsBytes() - } - return rvkencname } -func (d *Decoder) kStruct(f *codecFnInfo, rv reflect.Value) { +func (f *decFnInfo) kStruct(rv reflect.Value) { fti := f.ti + d := f.d dd := d.d - elemsep := d.esep - sfn := structFieldNode{v: rv, update: true} + cr := d.cr ctyp := dd.ContainerType() if ctyp == valueTypeMap { containerLen := dd.ReadMapStart() if containerLen == 0 { - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return } - tisfi := fti.sfiSort + tisfi := fti.sfi hasLen := containerLen >= 0 - - var rvkencname []byte - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if elemsep { - dd.ReadMapElemKey() - } - rvkencname = decStructFieldKey(dd, fti.keyType, &d.b) - if elemsep { - dd.ReadMapElemValue() + if hasLen { + for j := 0; j < containerLen; j++ { + // rvkencname := dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapKey) + } + rvkencname := stringView(dd.DecodeBytes(f.d.b[:], true, true)) + // rvksi := ti.getForEncName(rvkencname) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if k := fti.indexForEncName(rvkencname); k > -1 { + si := tisfi[k] + if dd.TryDecodeAsNil() { + si.setToZeroValue(rv) + } else { + d.decodeValue(si.field(rv, true), nil) + } + } else { + d.structFieldNotFound(-1, rvkencname) + } } - if k := fti.indexForEncName(rvkencname); k > -1 { - si := tisfi[k] - if dd.TryDecodeAsNil() { - si.setToZeroValue(rv) + } else { + for j := 0; !dd.CheckBreak(); j++ { + // rvkencname := dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapKey) + } + rvkencname := stringView(dd.DecodeBytes(f.d.b[:], true, true)) + // rvksi := ti.getForEncName(rvkencname) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if k := fti.indexForEncName(rvkencname); k > -1 { + si := tisfi[k] + if dd.TryDecodeAsNil() { + si.setToZeroValue(rv) + } else { + d.decodeValue(si.field(rv, true), nil) + } } else { - d.decodeValue(sfn.field(si), nil, true) + d.structFieldNotFound(-1, rvkencname) } - } else { - d.structFieldNotFound(-1, stringView(rvkencname)) } - // keepAlive4StringView(rvkencnameB) // not needed, as reference is outside loop } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } else if ctyp == valueTypeArray { containerLen := dd.ReadArrayStart() if containerLen == 0 { - dd.ReadArrayEnd() + if cr != nil { + cr.sendContainerState(containerArrayEnd) + } return } // Not much gain from doing it two ways for array. // Arrays are not used as much for structs. hasLen := containerLen >= 0 - for j, si := range fti.sfiSrc { - if (hasLen && j == containerLen) || (!hasLen && dd.CheckBreak()) { + for j, si := range fti.sfip { + if hasLen { + if j == containerLen { + break + } + } else if dd.CheckBreak() { break } - if elemsep { - dd.ReadArrayElem() + if cr != nil { + cr.sendContainerState(containerArrayElem) } if dd.TryDecodeAsNil() { si.setToZeroValue(rv) } else { - d.decodeValue(sfn.field(si), nil, true) + d.decodeValue(si.field(rv, true), nil) } } - if containerLen > len(fti.sfiSrc) { + if containerLen > len(fti.sfip) { // read remaining values and throw away - for j := len(fti.sfiSrc); j < containerLen; j++ { - if elemsep { - dd.ReadArrayElem() + for j := len(fti.sfip); j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerArrayElem) } d.structFieldNotFound(j, "") } } - dd.ReadArrayEnd() + if cr != nil { + cr.sendContainerState(containerArrayEnd) + } } else { - d.errorstr(errstrOnlyMapOrArrayCanDecodeIntoStruct) + f.d.error(onlyMapOrArrayCanDecodeIntoStructErr) return } } -func (d *Decoder) kSlice(f *codecFnInfo, rv reflect.Value) { +func (f *decFnInfo) kSlice(rv reflect.Value) { // A slice can be set from a map or array in stream. // This way, the order can be kept (as order is lost with map). ti := f.ti - if f.seq == seqTypeChan && ti.chandir&uint8(reflect.SendDir) == 0 { - d.errorf("receive-only channel cannot be decoded") - } + d := f.d dd := d.d - rtelem0 := ti.elem + rtelem0 := ti.rt.Elem() ctyp := dd.ContainerType() if ctyp == valueTypeBytes || ctyp == valueTypeString { // you can only decode bytes or string in the stream into a slice or array of bytes if !(ti.rtid == uint8SliceTypId || rtelem0.Kind() == reflect.Uint8) { - d.errorf("bytes/string in stream must decode into slice/array of bytes, not %v", ti.rt) + f.d.errorf("bytes or string in the stream must be decoded into a slice or array of bytes, not %v", ti.rt) } if f.seq == seqTypeChan { - bs2 := dd.DecodeBytes(nil, true) - irv := rv2i(rv) - ch, ok := irv.(chan<- byte) - if !ok { - ch = irv.(chan byte) - } + bs2 := dd.DecodeBytes(nil, false, true) + ch := rv.Interface().(chan<- byte) for _, b := range bs2 { ch <- b } } else { rvbs := rv.Bytes() - bs2 := dd.DecodeBytes(rvbs, false) - // if rvbs == nil && bs2 != nil || rvbs != nil && bs2 == nil || len(bs2) != len(rvbs) { - if !(len(bs2) > 0 && len(bs2) == len(rvbs) && &bs2[0] == &rvbs[0]) { + bs2 := dd.DecodeBytes(rvbs, false, false) + if rvbs == nil && bs2 != nil || rvbs != nil && bs2 == nil || len(bs2) != len(rvbs) { if rv.CanSet() { rv.SetBytes(bs2) - } else if len(rvbs) > 0 && len(bs2) > 0 { + } else { copy(rvbs, bs2) } } @@ -1280,225 +865,199 @@ func (d *Decoder) kSlice(f *codecFnInfo, rv reflect.Value) { slh, containerLenS := d.decSliceHelperStart() // only expects valueType(Array|Map) - // an array can never return a nil slice. so no need to check f.array here. + // // an array can never return a nil slice. so no need to check f.array here. if containerLenS == 0 { - if rv.CanSet() { - if f.seq == seqTypeSlice { - if rv.IsNil() { - rv.Set(reflect.MakeSlice(ti.rt, 0, 0)) - } else { - rv.SetLen(0) - } - } else if f.seq == seqTypeChan { - if rv.IsNil() { - rv.Set(reflect.MakeChan(ti.rt, 0)) - } + if f.seq == seqTypeSlice { + if rv.IsNil() { + rv.Set(reflect.MakeSlice(ti.rt, 0, 0)) + } else { + rv.SetLen(0) + } + } else if f.seq == seqTypeChan { + if rv.IsNil() { + rv.Set(reflect.MakeChan(ti.rt, 0)) } } slh.End() return } - rtelem0Size := int(rtelem0.Size()) - rtElem0Kind := rtelem0.Kind() - rtelem0Mut := !isImmutableKind(rtElem0Kind) rtelem := rtelem0 - rtelemkind := rtelem.Kind() - for rtelemkind == reflect.Ptr { + for rtelem.Kind() == reflect.Ptr { rtelem = rtelem.Elem() - rtelemkind = rtelem.Kind() - } - - var fn *codecFn - - var rvCanset = rv.CanSet() - var rvChanged bool - var rv0 = rv - var rv9 reflect.Value - - rvlen := rv.Len() - rvcap := rv.Cap() - hasLen := containerLenS > 0 - if hasLen && f.seq == seqTypeSlice { - if containerLenS > rvcap { - oldRvlenGtZero := rvlen > 0 - rvlen = decInferLen(containerLenS, d.h.MaxInitLen, int(rtelem0.Size())) - if rvlen <= rvcap { - if rvCanset { - rv.SetLen(rvlen) - } - } else if rvCanset { - rv = reflect.MakeSlice(ti.rt, rvlen, rvlen) - rvcap = rvlen - rvChanged = true - } else { - d.errorf("cannot decode into non-settable slice") - } - if rvChanged && oldRvlenGtZero && !isImmutableKind(rtelem0.Kind()) { - reflect.Copy(rv, rv0) // only copy up to length NOT cap i.e. rv0.Slice(0, rvcap) - } - } else if containerLenS != rvlen { - rvlen = containerLenS - if rvCanset { - rv.SetLen(rvlen) - } - // else { - // rv = rv.Slice(0, rvlen) - // rvChanged = true - // d.errorf("cannot decode into non-settable slice") - // } - } } + fn := d.getDecFn(rtelem, true, true) - // consider creating new element once, and just decoding into it. - var rtelem0Zero reflect.Value - var rtelem0ZeroValid bool - var decodeAsNil bool - var j int - d.cfer() - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && (f.seq == seqTypeSlice || f.seq == seqTypeChan) && rv.IsNil() { - if hasLen { - rvlen = decInferLen(containerLenS, d.h.MaxInitLen, rtelem0Size) - } else if f.seq == seqTypeSlice { - rvlen = decDefSliceCap - } else { - rvlen = decDefChanCap - } - if rvCanset { - if f.seq == seqTypeSlice { - rv = reflect.MakeSlice(ti.rt, rvlen, rvlen) - rvChanged = true - } else { // chan - // xdebugf(">>>>>> haslen = %v, make chan of type '%v' with length: %v", hasLen, ti.rt, rvlen) - rv = reflect.MakeChan(ti.rt, rvlen) - rvChanged = true - } - } else { - d.errorf("cannot decode into non-settable slice") - } - } - slh.ElemContainerState(j) - decodeAsNil = dd.TryDecodeAsNil() + var rv0, rv9 reflect.Value + rv0 = rv + rvChanged := false + + // for j := 0; j < containerLenS; j++ { + var rvlen int + if containerLenS > 0 { // hasLen if f.seq == seqTypeChan { - if decodeAsNil { - rv.Send(reflect.Zero(rtelem0)) - continue + if rv.IsNil() { + rvlen, _ = decInferLen(containerLenS, f.d.h.MaxInitLen, int(rtelem0.Size())) + rv.Set(reflect.MakeChan(ti.rt, rvlen)) } - if rtelem0Mut || !rv9.IsValid() { // || (rtElem0Kind == reflect.Ptr && rv9.IsNil()) { + // handle chan specially: + for j := 0; j < containerLenS; j++ { rv9 = reflect.New(rtelem0).Elem() + slh.ElemContainerState(j) + d.decodeValue(rv9, fn) + rv.Send(rv9) } - if fn == nil { - fn = d.cf.get(rtelem, true, true) - } - d.decodeValue(rv9, fn, true) - // xdebugf(">>>> rv9 sent on %v during decode: %v, with len=%v, cap=%v", rv.Type(), rv9, rv.Len(), rv.Cap()) - rv.Send(rv9) - } else { - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= rvlen { + } else { // slice or array + var truncated bool // says len of sequence is not same as expected number of elements + numToRead := containerLenS // if truncated, reset numToRead + + rvcap := rv.Cap() + rvlen = rv.Len() + if containerLenS > rvcap { if f.seq == seqTypeArray { - d.arrayCannotExpand(rvlen, j+1) - decodeIntoBlank = true - } else { // if f.seq == seqTypeSlice - // rv = reflect.Append(rv, reflect.Zero(rtelem0)) // append logic + varargs - var rvcap2 int - var rvErrmsg2 string - rv9, rvcap2, rvChanged, rvErrmsg2 = - expandSliceRV(rv, ti.rt, rvCanset, rtelem0Size, 1, rvlen, rvcap) - if rvErrmsg2 != "" { - d.errorf(rvErrmsg2) + d.arrayCannotExpand(rvlen, containerLenS) + } else { + oldRvlenGtZero := rvlen > 0 + rvlen, truncated = decInferLen(containerLenS, f.d.h.MaxInitLen, int(rtelem0.Size())) + if truncated { + if rvlen <= rvcap { + rv.SetLen(rvlen) + } else { + rv = reflect.MakeSlice(ti.rt, rvlen, rvlen) + rvChanged = true + } + } else { + rv = reflect.MakeSlice(ti.rt, rvlen, rvlen) + rvChanged = true } - rvlen++ - if rvChanged { - rv = rv9 - rvcap = rvcap2 + if rvChanged && oldRvlenGtZero && !isImmutableKind(rtelem0.Kind()) { + reflect.Copy(rv, rv0) // only copy up to length NOT cap i.e. rv0.Slice(0, rvcap) } + rvcap = rvlen + } + numToRead = rvlen + } else if containerLenS != rvlen { + if f.seq == seqTypeSlice { + rv.SetLen(containerLenS) + rvlen = containerLenS } } - if decodeIntoBlank { - if !decodeAsNil { + j := 0 + // we read up to the numToRead + for ; j < numToRead; j++ { + slh.ElemContainerState(j) + d.decodeValue(rv.Index(j), fn) + } + + // if slice, expand and read up to containerLenS (or EOF) iff truncated + // if array, swallow all the rest. + + if f.seq == seqTypeArray { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) d.swallow() } - } else { - rv9 = rv.Index(j) - if d.h.SliceElementReset || decodeAsNil { - if !rtelem0ZeroValid { - rtelem0ZeroValid = true - rtelem0Zero = reflect.Zero(rtelem0) + } else if truncated { // slice was truncated, as chan NOT in this block + for ; j < containerLenS; j++ { + rv = expandSliceValue(rv, 1) + rv9 = rv.Index(j) + if resetSliceElemToZeroValue { + rv9.Set(reflect.Zero(rtelem0)) } - rv9.Set(rtelem0Zero) + slh.ElemContainerState(j) + d.decodeValue(rv9, fn) } - if decodeAsNil { - continue + } + } + } else { + rvlen = rv.Len() + j := 0 + for ; !dd.CheckBreak(); j++ { + if f.seq == seqTypeChan { + slh.ElemContainerState(j) + rv9 = reflect.New(rtelem0).Elem() + d.decodeValue(rv9, fn) + rv.Send(rv9) + } else { + // if indefinite, etc, then expand the slice if necessary + var decodeIntoBlank bool + if j >= rvlen { + if f.seq == seqTypeArray { + d.arrayCannotExpand(rvlen, j+1) + decodeIntoBlank = true + } else { // if f.seq == seqTypeSlice + // rv = reflect.Append(rv, reflect.Zero(rtelem0)) // uses append logic, plus varargs + rv = expandSliceValue(rv, 1) + rv9 = rv.Index(j) + // rv.Index(rv.Len() - 1).Set(reflect.Zero(rtelem0)) + if resetSliceElemToZeroValue { + rv9.Set(reflect.Zero(rtelem0)) + } + rvlen++ + rvChanged = true + } + } else { // slice or array + rv9 = rv.Index(j) } - - if fn == nil { - fn = d.cf.get(rtelem, true, true) + slh.ElemContainerState(j) + if decodeIntoBlank { + d.swallow() + } else { // seqTypeSlice + d.decodeValue(rv9, fn) } - d.decodeValue(rv9, fn, true) } } - } - if f.seq == seqTypeSlice { - if j < rvlen { - if rv.CanSet() { + if f.seq == seqTypeSlice { + if j < rvlen { rv.SetLen(j) - } else if rvCanset { - rv = rv.Slice(0, j) - rvChanged = true - } // else { d.errorf("kSlice: cannot change non-settable slice") } - rvlen = j - } else if j == 0 && rv.IsNil() { - if rvCanset { + } else if j == 0 && rv.IsNil() { rv = reflect.MakeSlice(ti.rt, 0, 0) rvChanged = true - } // else { d.errorf("kSlice: cannot change non-settable slice") } + } } } slh.End() - if rvChanged { // infers rvCanset=true, so it can be reset + if rvChanged { rv0.Set(rv) } } -// func (d *Decoder) kArray(f *codecFnInfo, rv reflect.Value) { -// // d.decodeValueFn(rv.Slice(0, rv.Len())) -// f.kSlice(rv.Slice(0, rv.Len())) -// } +func (f *decFnInfo) kArray(rv reflect.Value) { + // f.d.decodeValue(rv.Slice(0, rv.Len())) + f.kSlice(rv.Slice(0, rv.Len())) +} -func (d *Decoder) kMap(f *codecFnInfo, rv reflect.Value) { +func (f *decFnInfo) kMap(rv reflect.Value) { + d := f.d dd := d.d containerLen := dd.ReadMapStart() - elemsep := d.esep + cr := d.cr ti := f.ti if rv.IsNil() { - rv.Set(makeMapReflect(ti.rt, containerLen)) + rv.Set(reflect.MakeMap(ti.rt)) } if containerLen == 0 { - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return } - ktype, vtype := ti.key, ti.elem - ktypeId := rt2id(ktype) + ktype, vtype := ti.rt.Key(), ti.rt.Elem() + ktypeId := reflect.ValueOf(ktype).Pointer() vtypeKind := vtype.Kind() - - var keyFn, valFn *codecFn - var ktypeLo, vtypeLo reflect.Type - - for ktypeLo = ktype; ktypeLo.Kind() == reflect.Ptr; ktypeLo = ktypeLo.Elem() { + var keyFn, valFn *decFn + var xtyp reflect.Type + for xtyp = ktype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() { } - - for vtypeLo = vtype; vtypeLo.Kind() == reflect.Ptr; vtypeLo = vtypeLo.Elem() { + keyFn = d.getDecFn(xtyp, true, true) + for xtyp = vtype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() { } - + valFn = d.getDecFn(xtyp, true, true) var mapGet, mapSet bool - rvvImmut := isImmutableKind(vtypeKind) - if !d.h.MapValueReset { + if !f.d.h.MapValueReset { // if pointer, mapGet = true // if interface, mapGet = true if !DecodeNakedAlways (else false) // if builtin, mapGet = false @@ -1506,124 +1065,118 @@ func (d *Decoder) kMap(f *codecFnInfo, rv reflect.Value) { if vtypeKind == reflect.Ptr { mapGet = true } else if vtypeKind == reflect.Interface { - if !d.h.InterfaceReset { + if !f.d.h.InterfaceReset { mapGet = true } - } else if !rvvImmut { + } else if !isImmutableKind(vtypeKind) { mapGet = true } } - var rvk, rvkp, rvv, rvz reflect.Value - rvkMut := !isImmutableKind(ktype.Kind()) // if ktype is immutable, then re-use the same rvk. - ktypeIsString := ktypeId == stringTypId - ktypeIsIntf := ktypeId == intfTypId - hasLen := containerLen > 0 - var kstrbs []byte - d.cfer() - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if rvkMut || !rvkp.IsValid() { - rvkp = reflect.New(ktype) - rvk = rvkp.Elem() - } - if elemsep { - dd.ReadMapElemKey() - } - if false && dd.TryDecodeAsNil() { // nil cannot be a map key, so disregard this block - // Previously, if a nil key, we just ignored the mapped value and continued. - // However, that makes the result of encoding and then decoding map[intf]intf{nil:nil} - // to be an empty map. - // Instead, we treat a nil key as the zero value of the type. - rvk.Set(reflect.Zero(ktype)) - } else if ktypeIsString { - kstrbs = dd.DecodeStringAsBytes() - rvk.SetString(stringView(kstrbs)) - // NOTE: if doing an insert, you MUST use a real string (not stringview) - } else { - if keyFn == nil { - keyFn = d.cf.get(ktypeLo, true, true) + var rvk, rvv, rvz reflect.Value + + // for j := 0; j < containerLen; j++ { + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + rvk = reflect.New(ktype).Elem() + if cr != nil { + cr.sendContainerState(containerMapKey) } - d.decodeValue(rvk, keyFn, true) - } - // special case if a byte array. - if ktypeIsIntf { - if rvk2 := rvk.Elem(); rvk2.IsValid() { - if rvk2.Type() == uint8SliceTyp { - rvk = reflect.ValueOf(d.string(rvk2.Bytes())) + d.decodeValue(rvk, keyFn) + + // special case if a byte array. + if ktypeId == intfTypId { + rvk = rvk.Elem() + if rvk.Type() == uint8SliceTyp { + rvk = reflect.ValueOf(d.string(rvk.Bytes())) + } + } + mapSet = true // set to false if u do a get, and its a pointer, and exists + if mapGet { + rvv = rv.MapIndex(rvk) + if rvv.IsValid() { + if vtypeKind == reflect.Ptr { + mapSet = false + } } else { - rvk = rvk2 + if rvz.IsValid() { + rvz.Set(reflect.Zero(vtype)) + } else { + rvz = reflect.New(vtype).Elem() + } + rvv = rvz } + } else { + if rvz.IsValid() { + rvz.Set(reflect.Zero(vtype)) + } else { + rvz = reflect.New(vtype).Elem() + } + rvv = rvz } - } - - if elemsep { - dd.ReadMapElemValue() - } - - // Brittle, but OK per TryDecodeAsNil() contract. - // i.e. TryDecodeAsNil never shares slices with other decDriver procedures - if dd.TryDecodeAsNil() { - if ktypeIsString { - rvk.SetString(d.string(kstrbs)) + if cr != nil { + cr.sendContainerState(containerMapValue) } - if d.h.DeleteOnNilMapValue { - rv.SetMapIndex(rvk, reflect.Value{}) - } else { - rv.SetMapIndex(rvk, reflect.Zero(vtype)) + d.decodeValue(rvv, valFn) + if mapSet { + rv.SetMapIndex(rvk, rvv) } - continue } + } else { + for j := 0; !dd.CheckBreak(); j++ { + rvk = reflect.New(ktype).Elem() + if cr != nil { + cr.sendContainerState(containerMapKey) + } + d.decodeValue(rvk, keyFn) - mapSet = true // set to false if u do a get, and its a non-nil pointer - if mapGet { - // mapGet true only in case where kind=Ptr|Interface or kind is otherwise mutable. - rvv = rv.MapIndex(rvk) - if !rvv.IsValid() { - rvv = reflect.New(vtype).Elem() - } else if vtypeKind == reflect.Ptr { - if rvv.IsNil() { - rvv = reflect.New(vtype).Elem() + // special case if a byte array. + if ktypeId == intfTypId { + rvk = rvk.Elem() + if rvk.Type() == uint8SliceTyp { + rvk = reflect.ValueOf(d.string(rvk.Bytes())) + } + } + mapSet = true // set to false if u do a get, and its a pointer, and exists + if mapGet { + rvv = rv.MapIndex(rvk) + if rvv.IsValid() { + if vtypeKind == reflect.Ptr { + mapSet = false + } } else { - mapSet = false + if rvz.IsValid() { + rvz.Set(reflect.Zero(vtype)) + } else { + rvz = reflect.New(vtype).Elem() + } + rvv = rvz } - } else if vtypeKind == reflect.Interface { - // not addressable, and thus not settable. - // e MUST create a settable/addressable variant - rvv2 := reflect.New(rvv.Type()).Elem() - if !rvv.IsNil() { - rvv2.Set(rvv) + } else { + if rvz.IsValid() { + rvz.Set(reflect.Zero(vtype)) + } else { + rvz = reflect.New(vtype).Elem() } - rvv = rvv2 + rvv = rvz } - // else it is ~mutable, and we can just decode into it directly - } else if rvvImmut { - if !rvz.IsValid() { - rvz = reflect.New(vtype).Elem() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + d.decodeValue(rvv, valFn) + if mapSet { + rv.SetMapIndex(rvk, rvv) } - rvv = rvz - } else { - rvv = reflect.New(vtype).Elem() - } - - // We MUST be done with the stringview of the key, before decoding the value - // so that we don't bastardize the reused byte array. - if mapSet && ktypeIsString { - rvk.SetString(d.string(kstrbs)) - } - if valFn == nil { - valFn = d.cf.get(vtypeLo, true, true) - } - d.decodeValue(rvv, valFn, true) - // d.decodeValueFn(rvv, valFn) - if mapSet { - rv.SetMapIndex(rvk, rvv) } - // if ktypeIsString { - // // keepAlive4StringView(kstrbs) // not needed, as reference is outside loop - // } } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} - dd.ReadMapEnd() +type decRtidFn struct { + rtid uintptr + fn decFn } // decNaked is used to keep track of the primitives decoded. @@ -1644,202 +1197,80 @@ func (d *Decoder) kMap(f *codecFnInfo, rv reflect.Value) { // // kInterfaceNaked will ensure that there is no allocation for the common // uses. - -type decNakedContainers struct { - // array/stacks for reducing allocation - // keep arrays at the bottom? Chance is that they are not used much. - ia [arrayCacheLen]interface{} - ma [arrayCacheLen]map[interface{}]interface{} - na [arrayCacheLen]map[string]interface{} - sa [arrayCacheLen][]interface{} - - // ria [arrayCacheLen]reflect.Value // not needed, as we decode directly into &ia[n] - rma, rna, rsa [arrayCacheLen]reflect.Value // reflect.Value mapping to above -} - -func (n *decNakedContainers) init() { - for i := 0; i < arrayCacheLen; i++ { - // n.ria[i] = reflect.ValueOf(&(n.ia[i])).Elem() - n.rma[i] = reflect.ValueOf(&(n.ma[i])).Elem() - n.rna[i] = reflect.ValueOf(&(n.na[i])).Elem() - n.rsa[i] = reflect.ValueOf(&(n.sa[i])).Elem() - } -} - type decNaked struct { // r RawExt // used for RawExt, uint, []byte. - - // primitives below u uint64 i int64 f float64 l []byte s string - - // ---- cpu cache line boundary? t time.Time - b bool - - // state - v valueType - li, lm, ln, ls int8 - inited bool - - *decNakedContainers - - ru, ri, rf, rl, rs, rb, rt reflect.Value // mapping to the primitives above - - // _ [6]uint64 // padding // no padding - rt goes into next cache line -} - -func (n *decNaked) init() { - if n.inited { - return - } - n.ru = reflect.ValueOf(&n.u).Elem() - n.ri = reflect.ValueOf(&n.i).Elem() - n.rf = reflect.ValueOf(&n.f).Elem() - n.rl = reflect.ValueOf(&n.l).Elem() - n.rs = reflect.ValueOf(&n.s).Elem() - n.rt = reflect.ValueOf(&n.t).Elem() - n.rb = reflect.ValueOf(&n.b).Elem() + b bool + v valueType - n.inited = true - // n.rr[] = reflect.ValueOf(&n.) -} + // stacks for reducing allocation + is []interface{} + ms []map[interface{}]interface{} + ns []map[string]interface{} + ss [][]interface{} + // rs []RawExt -func (n *decNaked) initContainers() { - if n.decNakedContainers == nil { - n.decNakedContainers = new(decNakedContainers) - n.decNakedContainers.init() - } + // keep arrays at the bottom? Chance is that they are not used much. + ia [4]interface{} + ma [4]map[interface{}]interface{} + na [4]map[string]interface{} + sa [4][]interface{} + // ra [2]RawExt } func (n *decNaked) reset() { - if n == nil { - return + if n.ss != nil { + n.ss = n.ss[:0] + } + if n.is != nil { + n.is = n.is[:0] + } + if n.ms != nil { + n.ms = n.ms[:0] + } + if n.ns != nil { + n.ns = n.ns[:0] } - n.li, n.lm, n.ln, n.ls = 0, 0, 0, 0 -} - -type rtid2rv struct { - rtid uintptr - rv reflect.Value -} - -// -------------- - -type decReaderSwitch struct { - rb bytesDecReader - // ---- cpu cache line boundary? - ri *ioDecReader - mtr, str bool // whether maptype or slicetype are known types - - be bool // is binary encoding - bytes bool // is bytes reader - js bool // is json handle - jsms bool // is json handle, and MapKeyAsString - esep bool // has elem separators } -// TODO: Uncomment after mid-stack inlining enabled in go 1.11 -// -// func (z *decReaderSwitch) unreadn1() { -// if z.bytes { -// z.rb.unreadn1() -// } else { -// z.ri.unreadn1() -// } -// } -// func (z *decReaderSwitch) readx(n int) []byte { -// if z.bytes { -// return z.rb.readx(n) -// } -// return z.ri.readx(n) -// } -// func (z *decReaderSwitch) readb(s []byte) { -// if z.bytes { -// z.rb.readb(s) -// } else { -// z.ri.readb(s) -// } -// } -// func (z *decReaderSwitch) readn1() uint8 { -// if z.bytes { -// return z.rb.readn1() -// } -// return z.ri.readn1() -// } -// func (z *decReaderSwitch) numread() int { -// if z.bytes { -// return z.rb.numread() -// } -// return z.ri.numread() -// } -// func (z *decReaderSwitch) track() { -// if z.bytes { -// z.rb.track() -// } else { -// z.ri.track() -// } -// } -// func (z *decReaderSwitch) stopTrack() []byte { -// if z.bytes { -// return z.rb.stopTrack() -// } -// return z.ri.stopTrack() -// } -// func (z *decReaderSwitch) skip(accept *bitset256) (token byte) { -// if z.bytes { -// return z.rb.skip(accept) -// } -// return z.ri.skip(accept) -// } -// func (z *decReaderSwitch) readTo(in []byte, accept *bitset256) (out []byte) { -// if z.bytes { -// return z.rb.readTo(in, accept) -// } -// return z.ri.readTo(in, accept) -// } -// func (z *decReaderSwitch) readUntil(in []byte, stop byte) (out []byte) { -// if z.bytes { -// return z.rb.readUntil(in, stop) -// } -// return z.ri.readUntil(in, stop) -// } - // A Decoder reads and decodes an object from an input stream in the codec format. type Decoder struct { - panicHdl // hopefully, reduce derefencing cost by laying the decReader inside the Decoder. // Try to put things that go together to fit within a cache line (8 words). d decDriver // NOTE: Decoder shouldn't call it's read methods, // as the handler MAY need to do some coordination. - r decReader + r decReader + // sa [initCollectionCap]decRtidFn h *BasicHandle - bi *bufioDecReader - // cache the mapTypeId and sliceTypeId for faster comparisons - mtid uintptr - stid uintptr + hh Handle + + be bool // is binary encoding + bytes bool // is bytes reader + js bool // is json handle + + rb bytesDecReader + ri ioDecReader + cr containerStateRecv - // ---- cpu cache line boundary? - decReaderSwitch + s []decRtidFn + f map[uintptr]*decFn - // ---- cpu cache line boundary? - codecFnPooler - // cr containerStateRecv - n *decNaked - nsp *sync.Pool - err error + // _ uintptr // for alignment purposes, so next one starts from a cache line - // ---- cpu cache line boundary? - b [decScratchByteArrayLen]byte // scratch buffer, used by Decoder and xxxEncDrivers - is map[string]string // used for interning strings + // cache the mapTypeId and sliceTypeId for faster comparisons + mtid uintptr + stid uintptr - // padding - false sharing help // modify 232 if Decoder struct changes. - // _ [cacheLineSize - 232%cacheLineSize]byte + n decNaked + b [scratchByteArrayLen]byte + is map[string]string // used for interning strings } // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader. @@ -1860,100 +1291,63 @@ func NewDecoderBytes(in []byte, h Handle) *Decoder { return d } -var defaultDecNaked decNaked - func newDecoder(h Handle) *Decoder { - d := &Decoder{h: h.getBasicHandle(), err: errDecoderNotInitialized} - d.hh = h - d.be = h.isBinary() - // NOTE: do not initialize d.n here. It is lazily initialized in d.naked() - var jh *JsonHandle - jh, d.js = h.(*JsonHandle) - if d.js { - d.jsms = jh.MapKeyAsString - } - d.esep = d.hh.hasElemSeparators() + d := &Decoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()} + n := &d.n + // n.rs = n.ra[:0] + n.ms = n.ma[:0] + n.is = n.ia[:0] + n.ns = n.na[:0] + n.ss = n.sa[:0] + _, d.js = h.(*JsonHandle) if d.h.InternString { d.is = make(map[string]string, 32) } d.d = h.newDecDriver(d) - // d.cr, _ = d.d.(containerStateRecv) + d.cr, _ = d.d.(containerStateRecv) + // d.d = h.newDecDriver(decReaderT{true, &d.rb, &d.ri}) return d } func (d *Decoder) resetCommon() { d.n.reset() d.d.reset() - d.err = nil - // reset all things which were cached from the Handle, but could change + // reset all things which were cached from the Handle, + // but could be changed. d.mtid, d.stid = 0, 0 - d.mtr, d.str = false, false if d.h.MapType != nil { - d.mtid = rt2id(d.h.MapType) - d.mtr = fastpathAV.index(d.mtid) != -1 + d.mtid = reflect.ValueOf(d.h.MapType).Pointer() } if d.h.SliceType != nil { - d.stid = rt2id(d.h.SliceType) - d.str = fastpathAV.index(d.stid) != -1 + d.stid = reflect.ValueOf(d.h.SliceType).Pointer() } } -// Reset the Decoder with a new Reader to decode from, -// clearing all state from last run(s). func (d *Decoder) Reset(r io.Reader) { - if r == nil { - return - } - if d.bi == nil { - d.bi = new(bufioDecReader) - } - d.bytes = false - if d.h.ReaderBufferSize > 0 { - d.bi.buf = make([]byte, 0, d.h.ReaderBufferSize) - d.bi.reset(r) - d.r = d.bi - } else { - // d.ri.x = &d.b - // d.s = d.sa[:0] - if d.ri == nil { - d.ri = new(ioDecReader) - } - d.ri.reset(r) - d.r = d.ri + d.ri.x = &d.b + // d.s = d.sa[:0] + d.ri.bs.r = r + var ok bool + d.ri.br, ok = r.(decReaderByteScanner) + if !ok { + d.ri.br = &d.ri.bs } + d.r = &d.ri d.resetCommon() } -// ResetBytes resets the Decoder with a new []byte to decode from, -// clearing all state from last run(s). func (d *Decoder) ResetBytes(in []byte) { - if in == nil { - return - } - d.bytes = true + // d.s = d.sa[:0] d.rb.reset(in) d.r = &d.rb d.resetCommon() } -// naked must be called before each call to .DecodeNaked, -// as they will use it. -func (d *Decoder) naked() *decNaked { - if d.n == nil { - // consider one of: - // - get from sync.Pool (if GC is frequent, there's no value here) - // - new alloc (safest. only init'ed if it a naked decode will be done) - // - field in Decoder (makes the Decoder struct very big) - // To support using a decoder where a DecodeNaked is not needed, - // we prefer #1 or #2. - // d.n = new(decNaked) // &d.nv // new(decNaked) // grab from a sync.Pool - // d.n.init() - var v interface{} - d.nsp, v = pool.decNaked() - d.n = v.(*decNaked) - } - return d.n -} +// func (d *Decoder) sendContainerState(c containerState) { +// if d.cr != nil { +// d.cr.sendContainerState(c) +// } +// } // Decode decodes the stream from reader and stores the result in the // value pointed to by v. v cannot be a nil pointer. v can also be @@ -2005,282 +1399,424 @@ func (d *Decoder) naked() *decNaked { // However, when decoding a stream nil, we reset the destination container // to its "zero" value (e.g. nil for slice/map, etc). // -// Note: we allow nil values in the stream anywhere except for map keys. -// A nil value in the encoded stream where a map key is expected is treated as an error. func (d *Decoder) Decode(v interface{}) (err error) { - defer d.deferred(&err) - d.MustDecode(v) + defer panicToErr(&err) + d.decode(v) return } -// MustDecode is like Decode, but panics if unable to Decode. -// This provides insight to the code location that triggered the error. -func (d *Decoder) MustDecode(v interface{}) { - // TODO: Top-level: ensure that v is a pointer and not nil. - if d.err != nil { - panic(d.err) - } - if d.d.TryDecodeAsNil() { - setZero(v) - } else { - d.decode(v) - } - d.alwaysAtEnd() - // xprintf(">>>>>>>> >>>>>>>> num decFns: %v\n", d.cf.sn) -} - -func (d *Decoder) deferred(err1 *error) { - d.alwaysAtEnd() - if recoverPanicToErr { - if x := recover(); x != nil { - panicValToErr(d, x, err1) - panicValToErr(d, x, &d.err) - } - } -} - -func (d *Decoder) alwaysAtEnd() { - if d.n != nil { - // if n != nil, then nsp != nil (they are always set together) - d.nsp.Put(d.n) - d.n, d.nsp = nil, nil - } - d.codecFnPooler.alwaysAtEnd() +// this is not a smart swallow, as it allocates objects and does unnecessary work. +func (d *Decoder) swallowViaHammer() { + var blank interface{} + d.decodeValue(reflect.ValueOf(&blank).Elem(), nil) } -// // this is not a smart swallow, as it allocates objects and does unnecessary work. -// func (d *Decoder) swallowViaHammer() { -// var blank interface{} -// d.decodeValueNoFn(reflect.ValueOf(&blank).Elem()) -// } - func (d *Decoder) swallow() { // smarter decode that just swallows the content dd := d.d if dd.TryDecodeAsNil() { return } - elemsep := d.esep + cr := d.cr switch dd.ContainerType() { case valueTypeMap: containerLen := dd.ReadMapStart() - hasLen := containerLen >= 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - // if clenGtEqualZero {if j >= containerLen {break} } else if dd.CheckBreak() {break} - if elemsep { - dd.ReadMapElemKey() + clenGtEqualZero := containerLen >= 0 + for j := 0; ; j++ { + if clenGtEqualZero { + if j >= containerLen { + break + } + } else if dd.CheckBreak() { + break + } + if cr != nil { + cr.sendContainerState(containerMapKey) } d.swallow() - if elemsep { - dd.ReadMapElemValue() + if cr != nil { + cr.sendContainerState(containerMapValue) } d.swallow() } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } case valueTypeArray: - containerLen := dd.ReadArrayStart() - hasLen := containerLen >= 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if elemsep { - dd.ReadArrayElem() + containerLenS := dd.ReadArrayStart() + clenGtEqualZero := containerLenS >= 0 + for j := 0; ; j++ { + if clenGtEqualZero { + if j >= containerLenS { + break + } + } else if dd.CheckBreak() { + break + } + if cr != nil { + cr.sendContainerState(containerArrayElem) } d.swallow() } - dd.ReadArrayEnd() + if cr != nil { + cr.sendContainerState(containerArrayEnd) + } case valueTypeBytes: - dd.DecodeBytes(d.b[:], true) + dd.DecodeBytes(d.b[:], false, true) case valueTypeString: - dd.DecodeStringAsBytes() + dd.DecodeBytes(d.b[:], true, true) + // dd.DecodeStringAsBytes(d.b[:]) default: // these are all primitives, which we can get from decodeNaked // if RawExt using Value, complete the processing. - n := d.naked() dd.DecodeNaked() - if n.v == valueTypeExt && n.l == nil { - n.initContainers() - if n.li < arrayCacheLen { - n.ia[n.li] = nil - n.li++ - d.decode(&n.ia[n.li-1]) - n.ia[n.li-1] = nil - n.li-- - } else { - var v2 interface{} - d.decode(&v2) - } + if n := &d.n; n.v == valueTypeExt && n.l == nil { + l := len(n.is) + n.is = append(n.is, nil) + v2 := &n.is[l] + d.decode(v2) + n.is = n.is[:l] } } } -func setZero(iv interface{}) { - if iv == nil || definitelyNil(iv) { - return - } - var canDecode bool - switch v := iv.(type) { - case *string: - *v = "" - case *bool: - *v = false - case *int: - *v = 0 - case *int8: - *v = 0 - case *int16: - *v = 0 - case *int32: - *v = 0 - case *int64: - *v = 0 - case *uint: - *v = 0 - case *uint8: - *v = 0 - case *uint16: - *v = 0 - case *uint32: - *v = 0 - case *uint64: - *v = 0 - case *float32: - *v = 0 - case *float64: - *v = 0 - case *[]uint8: - *v = nil - case *Raw: - *v = nil - case *time.Time: - *v = time.Time{} - case reflect.Value: - if v, canDecode = isDecodeable(v); canDecode && v.CanSet() { - v.Set(reflect.Zero(v.Type())) - } // TODO: else drain if chan, clear if map, set all to nil if slice??? - default: - if !fastpathDecodeSetZeroTypeSwitch(iv) { - v := reflect.ValueOf(iv) - if v, canDecode = isDecodeable(v); canDecode && v.CanSet() { - v.Set(reflect.Zero(v.Type())) - } // TODO: else drain if chan, clear if map, set all to nil if slice??? - } - } +// MustDecode is like Decode, but panics if unable to Decode. +// This provides insight to the code location that triggered the error. +func (d *Decoder) MustDecode(v interface{}) { + d.decode(v) } func (d *Decoder) decode(iv interface{}) { - // check nil and interfaces explicitly, - // so that type switches just have a run of constant non-interface types. - if iv == nil { - d.errorstr(errstrCannotDecodeIntoNil) - return - } - if v, ok := iv.(Selfer); ok { - v.CodecDecodeSelf(d) + // if ics, ok := iv.(Selfer); ok { + // ics.CodecDecodeSelf(d) + // return + // } + + if d.d.TryDecodeAsNil() { + switch v := iv.(type) { + case nil: + case *string: + *v = "" + case *bool: + *v = false + case *int: + *v = 0 + case *int8: + *v = 0 + case *int16: + *v = 0 + case *int32: + *v = 0 + case *int64: + *v = 0 + case *uint: + *v = 0 + case *uint8: + *v = 0 + case *uint16: + *v = 0 + case *uint32: + *v = 0 + case *uint64: + *v = 0 + case *float32: + *v = 0 + case *float64: + *v = 0 + case *[]uint8: + *v = nil + case *Raw: + *v = nil + case reflect.Value: + if v.Kind() != reflect.Ptr || v.IsNil() { + d.errNotValidPtrValue(v) + } + // d.chkPtrValue(v) + v = v.Elem() + if v.IsValid() { + v.Set(reflect.Zero(v.Type())) + } + default: + rv := reflect.ValueOf(iv) + if rv.Kind() != reflect.Ptr || rv.IsNil() { + d.errNotValidPtrValue(rv) + } + // d.chkPtrValue(rv) + rv = rv.Elem() + if rv.IsValid() { + rv.Set(reflect.Zero(rv.Type())) + } + } return } switch v := iv.(type) { - // case nil: - // case Selfer: + case nil: + d.error(cannotDecodeIntoNilErr) + return + + case Selfer: + v.CodecDecodeSelf(d) case reflect.Value: - v = d.ensureDecodeable(v) - d.decodeValue(v, nil, true) + if v.Kind() != reflect.Ptr || v.IsNil() { + d.errNotValidPtrValue(v) + } + // d.chkPtrValue(v) + d.decodeValueNotNil(v.Elem(), nil) case *string: *v = d.d.DecodeString() case *bool: *v = d.d.DecodeBool() case *int: - *v = int(chkOvf.IntV(d.d.DecodeInt64(), intBitsize)) + *v = int(d.d.DecodeInt(intBitsize)) case *int8: - *v = int8(chkOvf.IntV(d.d.DecodeInt64(), 8)) + *v = int8(d.d.DecodeInt(8)) case *int16: - *v = int16(chkOvf.IntV(d.d.DecodeInt64(), 16)) + *v = int16(d.d.DecodeInt(16)) case *int32: - *v = int32(chkOvf.IntV(d.d.DecodeInt64(), 32)) + *v = int32(d.d.DecodeInt(32)) case *int64: - *v = d.d.DecodeInt64() + *v = d.d.DecodeInt(64) case *uint: - *v = uint(chkOvf.UintV(d.d.DecodeUint64(), uintBitsize)) + *v = uint(d.d.DecodeUint(uintBitsize)) case *uint8: - *v = uint8(chkOvf.UintV(d.d.DecodeUint64(), 8)) + *v = uint8(d.d.DecodeUint(8)) case *uint16: - *v = uint16(chkOvf.UintV(d.d.DecodeUint64(), 16)) + *v = uint16(d.d.DecodeUint(16)) case *uint32: - *v = uint32(chkOvf.UintV(d.d.DecodeUint64(), 32)) + *v = uint32(d.d.DecodeUint(32)) case *uint64: - *v = d.d.DecodeUint64() + *v = d.d.DecodeUint(64) case *float32: - f64 := d.d.DecodeFloat64() - if chkOvf.Float32(f64) { - d.errorf("float32 overflow: %v", f64) - } - *v = float32(f64) + *v = float32(d.d.DecodeFloat(true)) case *float64: - *v = d.d.DecodeFloat64() + *v = d.d.DecodeFloat(false) case *[]uint8: - *v = d.d.DecodeBytes(*v, false) - case []uint8: - b := d.d.DecodeBytes(v, false) - if !(len(b) > 0 && len(b) == len(v) && &b[0] == &v[0]) { - copy(v, b) - } - case *time.Time: - *v = d.d.DecodeTime() + *v = d.d.DecodeBytes(*v, false, false) + case *Raw: - *v = d.rawBytes() + *v = d.raw() case *interface{}: - d.decodeValue(reflect.ValueOf(iv).Elem(), nil, true) - // d.decodeValueNotNil(reflect.ValueOf(iv).Elem()) + d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), nil) default: if !fastpathDecodeTypeSwitch(iv, d) { - v := reflect.ValueOf(iv) - v = d.ensureDecodeable(v) - d.decodeValue(v, nil, false) - // d.decodeValueFallback(v) + d.decodeI(iv, true, false, false, false) } } } -func (d *Decoder) decodeValue(rv reflect.Value, fn *codecFn, chkAll bool) { +func (d *Decoder) preDecodeValue(rv reflect.Value, tryNil bool) (rv2 reflect.Value, proceed bool) { + if tryNil && d.d.TryDecodeAsNil() { + // No need to check if a ptr, recursively, to determine + // whether to set value to nil. + // Just always set value to its zero type. + if rv.IsValid() { // rv.CanSet() // always settable, except it's invalid + rv.Set(reflect.Zero(rv.Type())) + } + return + } + // If stream is not containing a nil value, then we can deref to the base // non-pointer value, and decode into that. - var rvp reflect.Value - var rvpValid bool - if rv.Kind() == reflect.Ptr { - rvpValid = true - for { - if rv.IsNil() { - rv.Set(reflect.New(rv.Type().Elem())) - } - rvp = rv - rv = rv.Elem() - if rv.Kind() != reflect.Ptr { + for rv.Kind() == reflect.Ptr { + if rv.IsNil() { + rv.Set(reflect.New(rv.Type().Elem())) + } + rv = rv.Elem() + } + return rv, true +} + +func (d *Decoder) decodeI(iv interface{}, checkPtr, tryNil, checkFastpath, checkCodecSelfer bool) { + rv := reflect.ValueOf(iv) + if checkPtr { + if rv.Kind() != reflect.Ptr || rv.IsNil() { + d.errNotValidPtrValue(rv) + } + // d.chkPtrValue(rv) + } + rv, proceed := d.preDecodeValue(rv, tryNil) + if proceed { + fn := d.getDecFn(rv.Type(), checkFastpath, checkCodecSelfer) + fn.f(&fn.i, rv) + } +} + +func (d *Decoder) decodeValue(rv reflect.Value, fn *decFn) { + if rv, proceed := d.preDecodeValue(rv, true); proceed { + if fn == nil { + fn = d.getDecFn(rv.Type(), true, true) + } + fn.f(&fn.i, rv) + } +} + +func (d *Decoder) decodeValueNotNil(rv reflect.Value, fn *decFn) { + if rv, proceed := d.preDecodeValue(rv, false); proceed { + if fn == nil { + fn = d.getDecFn(rv.Type(), true, true) + } + fn.f(&fn.i, rv) + } +} + +func (d *Decoder) getDecFn(rt reflect.Type, checkFastpath, checkCodecSelfer bool) (fn *decFn) { + rtid := reflect.ValueOf(rt).Pointer() + + // retrieve or register a focus'ed function for this type + // to eliminate need to do the retrieval multiple times + + // if d.f == nil && d.s == nil { debugf("---->Creating new dec f map for type: %v\n", rt) } + var ok bool + if useMapForCodecCache { + fn, ok = d.f[rtid] + } else { + for i := range d.s { + v := &(d.s[i]) + if v.rtid == rtid { + fn, ok = &(v.fn), true break } } } - - if fn == nil { - // always pass checkCodecSelfer=true, in case T or ****T is passed, where *T is a Selfer - fn = d.cfer().get(rv.Type(), chkAll, true) // chkAll, chkAll) + if ok { + return } - if fn.i.addrD { - if rvpValid { - fn.fd(d, &fn.i, rvp) - } else if rv.CanAddr() { - fn.fd(d, &fn.i, rv.Addr()) - } else if !fn.i.addrF { - fn.fd(d, &fn.i, rv) - } else { - d.errorf("cannot decode into a non-pointer value") + + if useMapForCodecCache { + if d.f == nil { + d.f = make(map[uintptr]*decFn, initCollectionCap) + } + fn = new(decFn) + d.f[rtid] = fn + } else { + if d.s == nil { + d.s = make([]decRtidFn, 0, initCollectionCap) } + d.s = append(d.s, decRtidFn{rtid: rtid}) + fn = &(d.s[len(d.s)-1]).fn + } + + // debugf("\tCreating new dec fn for type: %v\n", rt) + ti := d.h.getTypeInfo(rtid, rt) + fi := &(fn.i) + fi.d = d + fi.ti = ti + + // An extension can be registered for any type, regardless of the Kind + // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc. + // + // We can't check if it's an extension byte here first, because the user may have + // registered a pointer or non-pointer type, meaning we may have to recurse first + // before matching a mapped type, even though the extension byte is already detected. + // + // NOTE: if decoding into a nil interface{}, we return a non-nil + // value except even if the container registers a length of 0. + if checkCodecSelfer && ti.cs { + fn.f = (*decFnInfo).selferUnmarshal + } else if rtid == rawExtTypId { + fn.f = (*decFnInfo).rawExt + } else if rtid == rawTypId { + fn.f = (*decFnInfo).raw + } else if d.d.IsBuiltinType(rtid) { + fn.f = (*decFnInfo).builtin + } else if xfFn := d.h.getExt(rtid); xfFn != nil { + fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext + fn.f = (*decFnInfo).ext + } else if supportMarshalInterfaces && d.be && ti.bunm { + fn.f = (*decFnInfo).binaryUnmarshal + } else if supportMarshalInterfaces && !d.be && d.js && ti.junm { + //If JSON, we should check JSONUnmarshal before textUnmarshal + fn.f = (*decFnInfo).jsonUnmarshal + } else if supportMarshalInterfaces && !d.be && ti.tunm { + fn.f = (*decFnInfo).textUnmarshal } else { - fn.fd(d, &fn.i, rv) + rk := rt.Kind() + if fastpathEnabled && checkFastpath && (rk == reflect.Map || rk == reflect.Slice) { + if rt.PkgPath() == "" { + if idx := fastpathAV.index(rtid); idx != -1 { + fn.f = fastpathAV[idx].decfn + } + } else { + // use mapping for underlying type if there + ok = false + var rtu reflect.Type + if rk == reflect.Map { + rtu = reflect.MapOf(rt.Key(), rt.Elem()) + } else { + rtu = reflect.SliceOf(rt.Elem()) + } + rtuid := reflect.ValueOf(rtu).Pointer() + if idx := fastpathAV.index(rtuid); idx != -1 { + xfnf := fastpathAV[idx].decfn + xrt := fastpathAV[idx].rt + fn.f = func(xf *decFnInfo, xrv reflect.Value) { + // xfnf(xf, xrv.Convert(xrt)) + xfnf(xf, xrv.Addr().Convert(reflect.PtrTo(xrt)).Elem()) + } + } + } + } + if fn.f == nil { + switch rk { + case reflect.String: + fn.f = (*decFnInfo).kString + case reflect.Bool: + fn.f = (*decFnInfo).kBool + case reflect.Int: + fn.f = (*decFnInfo).kInt + case reflect.Int64: + fn.f = (*decFnInfo).kInt64 + case reflect.Int32: + fn.f = (*decFnInfo).kInt32 + case reflect.Int8: + fn.f = (*decFnInfo).kInt8 + case reflect.Int16: + fn.f = (*decFnInfo).kInt16 + case reflect.Float32: + fn.f = (*decFnInfo).kFloat32 + case reflect.Float64: + fn.f = (*decFnInfo).kFloat64 + case reflect.Uint8: + fn.f = (*decFnInfo).kUint8 + case reflect.Uint64: + fn.f = (*decFnInfo).kUint64 + case reflect.Uint: + fn.f = (*decFnInfo).kUint + case reflect.Uint32: + fn.f = (*decFnInfo).kUint32 + case reflect.Uint16: + fn.f = (*decFnInfo).kUint16 + // case reflect.Ptr: + // fn.f = (*decFnInfo).kPtr + case reflect.Uintptr: + fn.f = (*decFnInfo).kUintptr + case reflect.Interface: + fn.f = (*decFnInfo).kInterface + case reflect.Struct: + fn.f = (*decFnInfo).kStruct + case reflect.Chan: + fi.seq = seqTypeChan + fn.f = (*decFnInfo).kSlice + case reflect.Slice: + fi.seq = seqTypeSlice + fn.f = (*decFnInfo).kSlice + case reflect.Array: + fi.seq = seqTypeArray + fn.f = (*decFnInfo).kArray + case reflect.Map: + fn.f = (*decFnInfo).kMap + default: + fn.f = (*decFnInfo).kErr + } + } } - // return rv + + return } func (d *Decoder) structFieldNotFound(index int, rvkencname string) { @@ -2303,73 +1839,66 @@ func (d *Decoder) arrayCannotExpand(sliceLen, streamLen int) { } } -func isDecodeable(rv reflect.Value) (rv2 reflect.Value, canDecode bool) { - switch rv.Kind() { - case reflect.Array: - return rv, true - case reflect.Ptr: - if !rv.IsNil() { - return rv.Elem(), true - } - case reflect.Slice, reflect.Chan, reflect.Map: - if !rv.IsNil() { - return rv, true - } +func (d *Decoder) chkPtrValue(rv reflect.Value) { + // We can only decode into a non-nil pointer + if rv.Kind() == reflect.Ptr && !rv.IsNil() { + return } - return + d.errNotValidPtrValue(rv) } -func (d *Decoder) ensureDecodeable(rv reflect.Value) (rv2 reflect.Value) { - // decode can take any reflect.Value that is a inherently addressable i.e. - // - array - // - non-nil chan (we will SEND to it) - // - non-nil slice (we will set its elements) - // - non-nil map (we will put into it) - // - non-nil pointer (we can "update" it) - rv2, canDecode := isDecodeable(rv) - if canDecode { - return - } +func (d *Decoder) errNotValidPtrValue(rv reflect.Value) { if !rv.IsValid() { - d.errorstr(errstrCannotDecodeIntoNil) + d.error(cannotDecodeIntoNilErr) return } if !rv.CanInterface() { d.errorf("cannot decode into a value without an interface: %v", rv) return } - rvi := rv2i(rv) - rvk := rv.Kind() - d.errorf("cannot decode into value of kind: %v, type: %T, %v", rvk, rvi, rvi) - return + rvi := rv.Interface() + d.errorf("cannot decode into non-pointer or nil pointer. Got: %v, %T, %v", rv.Kind(), rvi, rvi) +} + +func (d *Decoder) error(err error) { + panic(err) +} + +func (d *Decoder) errorf(format string, params ...interface{}) { + params2 := make([]interface{}, len(params)+1) + params2[0] = d.r.numread() + copy(params2[1:], params) + err := fmt.Errorf("[pos %d]: "+format, params2...) + panic(err) } -// Possibly get an interned version of a string -// -// This should mostly be used for map keys, where the key type is string. -// This is because keys of a map/struct are typically reused across many objects. func (d *Decoder) string(v []byte) (s string) { - if d.is == nil { - return string(v) // don't return stringView, as we need a real string here. + if d.is != nil { + s, ok := d.is[string(v)] // no allocation here. + if !ok { + s = string(v) + d.is[s] = s + } + return s } - s, ok := d.is[string(v)] // no allocation here, per go implementation - if !ok { - s = string(v) // new allocation here + return string(v) // don't return stringView, as we need a real string here. +} + +func (d *Decoder) intern(s string) { + if d.is != nil { d.is[s] = s } - return s } // nextValueBytes returns the next value in the stream as a set of bytes. -func (d *Decoder) nextValueBytes() (bs []byte) { +func (d *Decoder) nextValueBytes() []byte { d.d.uncacheRead() d.r.track() d.swallow() - bs = d.r.stopTrack() - return + return d.r.stopTrack() } -func (d *Decoder) rawBytes() []byte { +func (d *Decoder) raw() []byte { // ensure that this is not a view into the bytes // i.e. make new copy always. bs := d.nextValueBytes() @@ -2378,10 +1907,6 @@ func (d *Decoder) rawBytes() []byte { return bs2 } -func (d *Decoder) wrapErrstr(v interface{}, err *error) { - *err = fmt.Errorf("%s decode error [pos %d]: %v", d.hh.Name(), d.r.numread(), v) -} - // -------------------------------------------------- // decSliceHelper assists when decoding into a slice, from a map or an array in the stream. @@ -2395,13 +1920,12 @@ type decSliceHelper struct { func (d *Decoder) decSliceHelperStart() (x decSliceHelper, clen int) { dd := d.d ctyp := dd.ContainerType() - switch ctyp { - case valueTypeArray: + if ctyp == valueTypeArray { x.array = true clen = dd.ReadArrayStart() - case valueTypeMap: + } else if ctyp == valueTypeMap { clen = dd.ReadMapStart() * 2 - default: + } else { d.errorf("only encoded map or array can be decoded into a slice (%d)", ctyp) } // x.ct = ctyp @@ -2410,20 +1934,30 @@ func (d *Decoder) decSliceHelperStart() (x decSliceHelper, clen int) { } func (x decSliceHelper) End() { + cr := x.d.cr + if cr == nil { + return + } if x.array { - x.d.d.ReadArrayEnd() + cr.sendContainerState(containerArrayEnd) } else { - x.d.d.ReadMapEnd() + cr.sendContainerState(containerMapEnd) } } func (x decSliceHelper) ElemContainerState(index int) { + cr := x.d.cr + if cr == nil { + return + } if x.array { - x.d.d.ReadArrayElem() - } else if index%2 == 0 { - x.d.d.ReadMapElemKey() + cr.sendContainerState(containerArrayElem) } else { - x.d.d.ReadMapElemValue() + if index%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) + } } } @@ -2439,11 +1973,12 @@ func decByteSlice(r decReader, clen, maxInitLen int, bs []byte) (bsOut []byte) { r.readb(bsOut) } else { // bsOut = make([]byte, clen) - len2 := decInferLen(clen, maxInitLen, 1) + len2, _ := decInferLen(clen, maxInitLen, 1) bsOut = make([]byte, len2) r.readb(bsOut) for len2 < clen { - len3 := decInferLen(clen-len2, maxInitLen, 1) + len3, _ := decInferLen(clen-len2, maxInitLen, 1) + // fmt.Printf(">>>>> TESTING: in loop: clen: %v, maxInitLen: %v, len2: %v, len3: %v\n", clen, maxInitLen, len2, len3) bs3 := bsOut bsOut = make([]byte, len2+len3) copy(bsOut, bs3) @@ -2474,14 +2009,11 @@ func detachZeroCopyBytes(isBytesReader bool, dest []byte, in []byte) (out []byte // - maxlen: max length to be returned. // if <= 0, it is unset, and we infer it based on the unit size // - unit: number of bytes for each element of the collection -func decInferLen(clen, maxlen, unit int) (rvlen int) { +func decInferLen(clen, maxlen, unit int) (rvlen int, truncated bool) { // handle when maxlen is not set i.e. <= 0 if clen <= 0 { return } - if unit == 0 { - return clen - } if maxlen <= 0 { // no maxlen defined. Use maximum of 256K memory, with a floor of 4K items. // maxlen = 256 * 1024 / unit @@ -2496,57 +2028,39 @@ func decInferLen(clen, maxlen, unit int) (rvlen int) { } if clen > maxlen { rvlen = maxlen + truncated = true } else { rvlen = clen } return + // if clen <= 0 { + // rvlen = 0 + // } else if maxlen > 0 && clen > maxlen { + // rvlen = maxlen + // truncated = true + // } else { + // rvlen = clen + // } + // return } -func expandSliceRV(s reflect.Value, st reflect.Type, canChange bool, stElemSize, num, slen, scap int) ( - s2 reflect.Value, scap2 int, changed bool, err string) { - l1 := slen + num // new slice length - if l1 < slen { - err = errmsgExpandSliceOverflow - return - } - if l1 <= scap { - if s.CanSet() { - s.SetLen(l1) - } else if canChange { - s2 = s.Slice(0, l1) - scap2 = scap - changed = true - } else { - err = errmsgExpandSliceCannotChange - return - } - return - } - if !canChange { - err = errmsgExpandSliceCannotChange - return - } - scap2 = growCap(scap, stElemSize, num) - s2 = reflect.MakeSlice(st, l1, scap2) - changed = true - reflect.Copy(s2, s) - return -} - -func decReadFull(r io.Reader, bs []byte) (n int, err error) { - var nn int - for n < len(bs) && err == nil { - nn, err = r.Read(bs[n:]) - if nn > 0 { - if err == io.EOF { - // leave EOF for next time - err = nil - } - n += nn - } - } - - // do not do this - it serves no purpose - // if n != len(bs) && err == io.EOF { err = io.ErrUnexpectedEOF } - return -} +// // implement overall decReader wrapping both, for possible use inline: +// type decReaderT struct { +// bytes bool +// rb *bytesDecReader +// ri *ioDecReader +// } +// +// // implement *Decoder as a decReader. +// // Using decReaderT (defined just above) caused performance degradation +// // possibly because of constant copying the value, +// // and some value->interface conversion causing allocation. +// func (d *Decoder) unreadn1() { +// if d.bytes { +// d.rb.unreadn1() +// } else { +// d.ri.unreadn1() +// } +// } +// ... for other methods of decReader. +// Testing showed that performance improvement was negligible. diff --git a/vendor/github.com/ugorji/go/codec/decode_go.go b/vendor/github.com/ugorji/go/codec/decode_go.go new file mode 100644 index 000000000..ba289cef6 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/decode_go.go @@ -0,0 +1,16 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.5 + +package codec + +import "reflect" + +const reflectArrayOfSupported = true + +func reflectArrayOf(rvn reflect.Value) (rvn2 reflect.Value) { + rvn2 = reflect.New(reflect.ArrayOf(rvn.Len(), intfTyp)).Elem() + reflect.Copy(rvn2, rvn) + return +} diff --git a/vendor/github.com/ugorji/go/codec/decode_go14.go b/vendor/github.com/ugorji/go/codec/decode_go14.go new file mode 100644 index 000000000..50063bc8f --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/decode_go14.go @@ -0,0 +1,14 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build !go1.5 + +package codec + +import "reflect" + +const reflectArrayOfSupported = false + +func reflectArrayOf(rvn reflect.Value) (rvn2 reflect.Value) { + panic("reflect.ArrayOf unsupported") +} diff --git a/vendor/github.com/ugorji/go/codec/encode.go b/vendor/github.com/ugorji/go/codec/encode.go index ef4652945..c2cef812e 100644 --- a/vendor/github.com/ugorji/go/codec/encode.go +++ b/vendor/github.com/ugorji/go/codec/encode.go @@ -1,24 +1,42 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec import ( - "bufio" "encoding" - "errors" "fmt" "io" "reflect" "sort" - "strconv" "sync" - "time" ) -const defEncByteBufSize = 1 << 6 // 4:16, 6:64, 8:256, 10:1024 +const ( + defEncByteBufSize = 1 << 6 // 4:16, 6:64, 8:256, 10:1024 +) + +// AsSymbolFlag defines what should be encoded as symbols. +type AsSymbolFlag uint8 + +const ( + // AsSymbolDefault is default. + // Currently, this means only encode struct field names as symbols. + // The default is subject to change. + AsSymbolDefault AsSymbolFlag = iota + + // AsSymbolAll means encode anything which could be a symbol as a symbol. + AsSymbolAll = 0xfe -var errEncoderNotInitialized = errors.New("Encoder not initialized") + // AsSymbolNone means do not encode anything as a symbol. + AsSymbolNone = 1 << iota + + // AsSymbolMapStringKeys means encode keys in map[string]XXX as symbols. + AsSymbolMapStringKeysFlag + + // AsSymbolStructFieldName means encode struct field names as symbols. + AsSymbolStructFieldNameFlag +) // encWriter abstracts writing to a byte array or to an io.Writer. type encWriter interface { @@ -31,6 +49,8 @@ type encWriter interface { // encDriver abstracts the actual codec (binc vs msgpack, etc) type encDriver interface { + IsBuiltinType(rt uintptr) bool + EncodeBuiltin(rt uintptr, v interface{}) EncodeNil() EncodeInt(i int64) EncodeUint(i uint64) @@ -40,78 +60,38 @@ type encDriver interface { // encodeExtPreamble(xtag byte, length int) EncodeRawExt(re *RawExt, e *Encoder) EncodeExt(v interface{}, xtag uint64, ext Ext, e *Encoder) + EncodeArrayStart(length int) + EncodeMapStart(length int) EncodeString(c charEncoding, v string) - // EncodeSymbol(v string) + EncodeSymbol(v string) EncodeStringBytes(c charEncoding, v []byte) - EncodeTime(time.Time) + //TODO //encBignum(f *big.Int) //encStringRunes(c charEncoding, v []rune) - WriteArrayStart(length int) - WriteArrayElem() - WriteArrayEnd() - WriteMapStart(length int) - WriteMapElemKey() - WriteMapElemValue() - WriteMapEnd() reset() - atEndOfEncode() -} - -type ioEncStringWriter interface { - WriteString(s string) (n int, err error) } type encDriverAsis interface { EncodeAsis(v []byte) } -type encDriverNoopContainerWriter struct{} +type encNoSeparator struct{} -func (encDriverNoopContainerWriter) WriteArrayStart(length int) {} -func (encDriverNoopContainerWriter) WriteArrayElem() {} -func (encDriverNoopContainerWriter) WriteArrayEnd() {} -func (encDriverNoopContainerWriter) WriteMapStart(length int) {} -func (encDriverNoopContainerWriter) WriteMapElemKey() {} -func (encDriverNoopContainerWriter) WriteMapElemValue() {} -func (encDriverNoopContainerWriter) WriteMapEnd() {} -func (encDriverNoopContainerWriter) atEndOfEncode() {} +func (_ encNoSeparator) EncodeEnd() {} -type encDriverTrackContainerWriter struct { - c containerState +type ioEncWriterWriter interface { + WriteByte(c byte) error + WriteString(s string) (n int, err error) + Write(p []byte) (n int, err error) } -func (e *encDriverTrackContainerWriter) WriteArrayStart(length int) { e.c = containerArrayStart } -func (e *encDriverTrackContainerWriter) WriteArrayElem() { e.c = containerArrayElem } -func (e *encDriverTrackContainerWriter) WriteArrayEnd() { e.c = containerArrayEnd } -func (e *encDriverTrackContainerWriter) WriteMapStart(length int) { e.c = containerMapStart } -func (e *encDriverTrackContainerWriter) WriteMapElemKey() { e.c = containerMapKey } -func (e *encDriverTrackContainerWriter) WriteMapElemValue() { e.c = containerMapValue } -func (e *encDriverTrackContainerWriter) WriteMapEnd() { e.c = containerMapEnd } -func (e *encDriverTrackContainerWriter) atEndOfEncode() {} - -// type ioEncWriterWriter interface { -// WriteByte(c byte) error -// WriteString(s string) (n int, err error) -// Write(p []byte) (n int, err error) -// } +type ioEncStringWriter interface { + WriteString(s string) (n int, err error) +} -// EncodeOptions captures configuration options during encode. type EncodeOptions struct { - // WriterBufferSize is the size of the buffer used when writing. - // - // if > 0, we use a smart buffer internally for performance purposes. - WriterBufferSize int - - // ChanRecvTimeout is the timeout used when selecting from a chan. - // - // Configuring this controls how we receive from a chan during the encoding process. - // - If ==0, we only consume the elements currently available in the chan. - // - if <0, we consume until the chan is closed. - // - If >0, we consume until this timeout. - ChanRecvTimeout time.Duration - - // StructToArray specifies to encode a struct as an array, and not as a map + // Encode a struct as an array, and not as a map StructToArray bool // Canonical representation means that encoding a value will always result in the same @@ -152,191 +132,330 @@ type EncodeOptions struct { // If unset, we error out. Raw bool - // // AsSymbols defines what should be encoded as symbols. - // // - // // Encoding as symbols can reduce the encoded size significantly. - // // - // // However, during decoding, each string to be encoded as a symbol must - // // be checked to see if it has been seen before. Consequently, encoding time - // // will increase if using symbols, because string comparisons has a clear cost. - // // - // // Sample values: - // // AsSymbolNone - // // AsSymbolAll - // // AsSymbolMapStringKeys - // // AsSymbolMapStringKeysFlag | AsSymbolStructFieldNameFlag - // AsSymbols AsSymbolFlag + // AsSymbols defines what should be encoded as symbols. + // + // Encoding as symbols can reduce the encoded size significantly. + // + // However, during decoding, each string to be encoded as a symbol must + // be checked to see if it has been seen before. Consequently, encoding time + // will increase if using symbols, because string comparisons has a clear cost. + // + // Sample values: + // AsSymbolNone + // AsSymbolAll + // AsSymbolMapStringKeys + // AsSymbolMapStringKeysFlag | AsSymbolStructFieldNameFlag + AsSymbols AsSymbolFlag } // --------------------------------------------- -// ioEncWriter implements encWriter and can write to an io.Writer implementation -type ioEncWriter struct { +type simpleIoEncWriterWriter struct { w io.Writer - ww io.Writer bw io.ByteWriter sw ioEncStringWriter - fw ioFlusher - b [8]byte + bs [1]byte } -func (z *ioEncWriter) WriteByte(b byte) (err error) { - z.b[0] = b - _, err = z.w.Write(z.b[:1]) +func (o *simpleIoEncWriterWriter) WriteByte(c byte) (err error) { + if o.bw != nil { + return o.bw.WriteByte(c) + } + // _, err = o.w.Write([]byte{c}) + o.bs[0] = c + _, err = o.w.Write(o.bs[:]) return } -func (z *ioEncWriter) WriteString(s string) (n int, err error) { - return z.w.Write(bytesView(s)) +func (o *simpleIoEncWriterWriter) WriteString(s string) (n int, err error) { + if o.sw != nil { + return o.sw.WriteString(s) + } + // return o.w.Write([]byte(s)) + return o.w.Write(bytesView(s)) +} + +func (o *simpleIoEncWriterWriter) Write(p []byte) (n int, err error) { + return o.w.Write(p) +} + +// ---------------------------------------- + +// ioEncWriter implements encWriter and can write to an io.Writer implementation +type ioEncWriter struct { + w ioEncWriterWriter + s simpleIoEncWriterWriter + // x [8]byte // temp byte array re-used internally for efficiency } func (z *ioEncWriter) writeb(bs []byte) { - if _, err := z.ww.Write(bs); err != nil { + if len(bs) == 0 { + return + } + n, err := z.w.Write(bs) + if err != nil { panic(err) } + if n != len(bs) { + panic(fmt.Errorf("incorrect num bytes written. Expecting: %v, Wrote: %v", len(bs), n)) + } } func (z *ioEncWriter) writestr(s string) { - if _, err := z.sw.WriteString(s); err != nil { + n, err := z.w.WriteString(s) + if err != nil { panic(err) } + if n != len(s) { + panic(fmt.Errorf("incorrect num bytes written. Expecting: %v, Wrote: %v", len(s), n)) + } } func (z *ioEncWriter) writen1(b byte) { - if err := z.bw.WriteByte(b); err != nil { + if err := z.w.WriteByte(b); err != nil { panic(err) } } -func (z *ioEncWriter) writen2(b1, b2 byte) { - var err error - if err = z.bw.WriteByte(b1); err == nil { - if err = z.bw.WriteByte(b2); err == nil { - return - } +func (z *ioEncWriter) writen2(b1 byte, b2 byte) { + z.writen1(b1) + z.writen1(b2) +} + +func (z *ioEncWriter) atEndOfEncode() {} + +// ---------------------------------------- + +// bytesEncWriter implements encWriter and can write to an byte slice. +// It is used by Marshal function. +type bytesEncWriter struct { + b []byte + c int // cursor + out *[]byte // write out on atEndOfEncode +} + +func (z *bytesEncWriter) writeb(s []byte) { + if len(s) == 0 { + return } - panic(err) + oc, a := z.growNoAlloc(len(s)) + if a { + z.growAlloc(len(s), oc) + } + copy(z.b[oc:], s) } -// func (z *ioEncWriter) writen5(b1, b2, b3, b4, b5 byte) { -// z.b[0], z.b[1], z.b[2], z.b[3], z.b[4] = b1, b2, b3, b4, b5 -// if _, err := z.ww.Write(z.b[:5]); err != nil { -// panic(err) -// } -// } +func (z *bytesEncWriter) writestr(s string) { + if len(s) == 0 { + return + } + oc, a := z.growNoAlloc(len(s)) + if a { + z.growAlloc(len(s), oc) + } + copy(z.b[oc:], s) +} + +func (z *bytesEncWriter) writen1(b1 byte) { + oc, a := z.growNoAlloc(1) + if a { + z.growAlloc(1, oc) + } + z.b[oc] = b1 +} + +func (z *bytesEncWriter) writen2(b1 byte, b2 byte) { + oc, a := z.growNoAlloc(2) + if a { + z.growAlloc(2, oc) + } + z.b[oc+1] = b2 + z.b[oc] = b1 +} + +func (z *bytesEncWriter) atEndOfEncode() { + *(z.out) = z.b[:z.c] +} + +// have a growNoalloc(n int), which can be inlined. +// if allocation is needed, then call growAlloc(n int) -func (z *ioEncWriter) atEndOfEncode() { - if z.fw != nil { - if err := z.fw.Flush(); err != nil { - panic(err) +func (z *bytesEncWriter) growNoAlloc(n int) (oldcursor int, allocNeeded bool) { + oldcursor = z.c + z.c = z.c + n + if z.c > len(z.b) { + if z.c > cap(z.b) { + allocNeeded = true + } else { + z.b = z.b[:cap(z.b)] } } + return +} + +func (z *bytesEncWriter) growAlloc(n int, oldcursor int) { + // appendslice logic (if cap < 1024, *2, else *1.25): more expensive. many copy calls. + // bytes.Buffer model (2*cap + n): much better + // bs := make([]byte, 2*cap(z.b)+n) + bs := make([]byte, growCap(cap(z.b), 1, n)) + copy(bs, z.b[:oldcursor]) + z.b = bs } // --------------------------------------------- -// bytesEncAppender implements encWriter and can write to an byte slice. -type bytesEncAppender struct { - b []byte - out *[]byte +type encFnInfo struct { + e *Encoder + ti *typeInfo + xfFn Ext + xfTag uint64 + seq seqType } -func (z *bytesEncAppender) writeb(s []byte) { - z.b = append(z.b, s...) +func (f *encFnInfo) builtin(rv reflect.Value) { + f.e.e.EncodeBuiltin(f.ti.rtid, rv.Interface()) } -func (z *bytesEncAppender) writestr(s string) { - z.b = append(z.b, s...) + +func (f *encFnInfo) raw(rv reflect.Value) { + f.e.raw(rv.Interface().(Raw)) } -func (z *bytesEncAppender) writen1(b1 byte) { - z.b = append(z.b, b1) + +func (f *encFnInfo) rawExt(rv reflect.Value) { + // rev := rv.Interface().(RawExt) + // f.e.e.EncodeRawExt(&rev, f.e) + var re *RawExt + if rv.CanAddr() { + re = rv.Addr().Interface().(*RawExt) + } else { + rev := rv.Interface().(RawExt) + re = &rev + } + f.e.e.EncodeRawExt(re, f.e) } -func (z *bytesEncAppender) writen2(b1, b2 byte) { - z.b = append(z.b, b1, b2) + +func (f *encFnInfo) ext(rv reflect.Value) { + // if this is a struct|array and it was addressable, then pass the address directly (not the value) + if k := rv.Kind(); (k == reflect.Struct || k == reflect.Array) && rv.CanAddr() { + rv = rv.Addr() + } + f.e.e.EncodeExt(rv.Interface(), f.xfTag, f.xfFn, f.e) } -func (z *bytesEncAppender) atEndOfEncode() { - *(z.out) = z.b + +func (f *encFnInfo) getValueForMarshalInterface(rv reflect.Value, indir int8) (v interface{}, proceed bool) { + if indir == 0 { + v = rv.Interface() + } else if indir == -1 { + // If a non-pointer was passed to Encode(), then that value is not addressable. + // Take addr if addressable, else copy value to an addressable value. + if rv.CanAddr() { + v = rv.Addr().Interface() + } else { + rv2 := reflect.New(rv.Type()) + rv2.Elem().Set(rv) + v = rv2.Interface() + // fmt.Printf("rv.Type: %v, rv2.Type: %v, v: %v\n", rv.Type(), rv2.Type(), v) + } + } else { + for j := int8(0); j < indir; j++ { + if rv.IsNil() { + f.e.e.EncodeNil() + return + } + rv = rv.Elem() + } + v = rv.Interface() + } + return v, true } -func (z *bytesEncAppender) reset(in []byte, out *[]byte) { - z.b = in[:0] - z.out = out + +func (f *encFnInfo) selferMarshal(rv reflect.Value) { + if v, proceed := f.getValueForMarshalInterface(rv, f.ti.csIndir); proceed { + v.(Selfer).CodecEncodeSelf(f.e) + } } -// --------------------------------------------- +func (f *encFnInfo) binaryMarshal(rv reflect.Value) { + if v, proceed := f.getValueForMarshalInterface(rv, f.ti.bmIndir); proceed { + bs, fnerr := v.(encoding.BinaryMarshaler).MarshalBinary() + f.e.marshal(bs, fnerr, false, c_RAW) + } +} -func (e *Encoder) rawExt(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeRawExt(rv2i(rv).(*RawExt), e) +func (f *encFnInfo) textMarshal(rv reflect.Value) { + if v, proceed := f.getValueForMarshalInterface(rv, f.ti.tmIndir); proceed { + // debugf(">>>> encoding.TextMarshaler: %T", rv.Interface()) + bs, fnerr := v.(encoding.TextMarshaler).MarshalText() + f.e.marshal(bs, fnerr, false, c_UTF8) + } +} + +func (f *encFnInfo) jsonMarshal(rv reflect.Value) { + if v, proceed := f.getValueForMarshalInterface(rv, f.ti.jmIndir); proceed { + bs, fnerr := v.(jsonMarshaler).MarshalJSON() + f.e.marshal(bs, fnerr, true, c_UTF8) + } } -func (e *Encoder) ext(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeExt(rv2i(rv), f.xfTag, f.xfFn, e) +func (f *encFnInfo) kBool(rv reflect.Value) { + f.e.e.EncodeBool(rv.Bool()) } -func (e *Encoder) selferMarshal(f *codecFnInfo, rv reflect.Value) { - rv2i(rv).(Selfer).CodecEncodeSelf(e) +func (f *encFnInfo) kString(rv reflect.Value) { + f.e.e.EncodeString(c_UTF8, rv.String()) } -func (e *Encoder) binaryMarshal(f *codecFnInfo, rv reflect.Value) { - bs, fnerr := rv2i(rv).(encoding.BinaryMarshaler).MarshalBinary() - e.marshal(bs, fnerr, false, cRAW) +func (f *encFnInfo) kFloat64(rv reflect.Value) { + f.e.e.EncodeFloat64(rv.Float()) } -func (e *Encoder) textMarshal(f *codecFnInfo, rv reflect.Value) { - bs, fnerr := rv2i(rv).(encoding.TextMarshaler).MarshalText() - e.marshal(bs, fnerr, false, cUTF8) +func (f *encFnInfo) kFloat32(rv reflect.Value) { + f.e.e.EncodeFloat32(float32(rv.Float())) } -func (e *Encoder) jsonMarshal(f *codecFnInfo, rv reflect.Value) { - bs, fnerr := rv2i(rv).(jsonMarshaler).MarshalJSON() - e.marshal(bs, fnerr, true, cUTF8) +func (f *encFnInfo) kInt(rv reflect.Value) { + f.e.e.EncodeInt(rv.Int()) } -func (e *Encoder) raw(f *codecFnInfo, rv reflect.Value) { - e.rawBytes(rv2i(rv).(Raw)) +func (f *encFnInfo) kUint(rv reflect.Value) { + f.e.e.EncodeUint(rv.Uint()) } -func (e *Encoder) kInvalid(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeNil() +func (f *encFnInfo) kInvalid(rv reflect.Value) { + f.e.e.EncodeNil() } -func (e *Encoder) kErr(f *codecFnInfo, rv reflect.Value) { - e.errorf("unsupported kind %s, for %#v", rv.Kind(), rv) +func (f *encFnInfo) kErr(rv reflect.Value) { + f.e.errorf("unsupported kind %s, for %#v", rv.Kind(), rv) } -func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) { +func (f *encFnInfo) kSlice(rv reflect.Value) { ti := f.ti - ee := e.e // array may be non-addressable, so we have to manage with care // (don't call rv.Bytes, rv.Slice, etc). // E.g. type struct S{B [2]byte}; // Encode(S{}) will bomb on "panic: slice of unaddressable array". + e := f.e if f.seq != seqTypeArray { if rv.IsNil() { - ee.EncodeNil() + e.e.EncodeNil() return } // If in this method, then there was no extension function defined. // So it's okay to treat as []byte. if ti.rtid == uint8SliceTypId { - ee.EncodeStringBytes(cRAW, rv.Bytes()) + e.e.EncodeStringBytes(c_RAW, rv.Bytes()) return } } - if f.seq == seqTypeChan && ti.chandir&uint8(reflect.RecvDir) == 0 { - e.errorf("send-only channel cannot be encoded") - } - elemsep := e.esep - rtelem := ti.elem - rtelemIsByte := uint8TypId == rt2id(rtelem) // NOT rtelem.Kind() == reflect.Uint8 - var l int - // if a slice, array or chan of bytes, treat specially - if rtelemIsByte { + cr := e.cr + rtelem := ti.rt.Elem() + l := rv.Len() + if ti.rtid == uint8SliceTypId || rtelem.Kind() == reflect.Uint8 { switch f.seq { - case seqTypeSlice: - ee.EncodeStringBytes(cRAW, rv.Bytes()) case seqTypeArray: - l = rv.Len() + // if l == 0 { e.e.encodeStringBytes(c_RAW, nil) } else if rv.CanAddr() { - ee.EncodeStringBytes(cRAW, rv.Slice(0, l).Bytes()) + e.e.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes()) } else { var bs []byte if l <= cap(e.b) { @@ -345,263 +464,116 @@ func (e *Encoder) kSlice(f *codecFnInfo, rv reflect.Value) { bs = make([]byte, l) } reflect.Copy(reflect.ValueOf(bs), rv) - ee.EncodeStringBytes(cRAW, bs) + // TODO: Test that reflect.Copy works instead of manual one-by-one + // for i := 0; i < l; i++ { + // bs[i] = byte(rv.Index(i).Uint()) + // } + e.e.EncodeStringBytes(c_RAW, bs) } + case seqTypeSlice: + e.e.EncodeStringBytes(c_RAW, rv.Bytes()) case seqTypeChan: + bs := e.b[:0] // do not use range, so that the number of elements encoded // does not change, and encoding does not hang waiting on someone to close chan. - // for b := range rv2i(rv).(<-chan byte) { bs = append(bs, b) } - // ch := rv2i(rv).(<-chan byte) // fix error - that this is a chan byte, not a <-chan byte. - - if rv.IsNil() { - ee.EncodeNil() - break - } - bs := e.b[:0] - irv := rv2i(rv) - ch, ok := irv.(<-chan byte) - if !ok { - ch = irv.(chan byte) - } - - L1: - switch timeout := e.h.ChanRecvTimeout; { - case timeout == 0: // only consume available - for { - select { - case b := <-ch: - bs = append(bs, b) - default: - break L1 - } - } - case timeout > 0: // consume until timeout - tt := time.NewTimer(timeout) - for { - select { - case b := <-ch: - bs = append(bs, b) - case <-tt.C: - // close(tt.C) - break L1 - } - } - default: // consume until close - for b := range ch { - bs = append(bs, b) - } + // for b := range rv.Interface().(<-chan byte) { + // bs = append(bs, b) + // } + ch := rv.Interface().(<-chan byte) + for i := 0; i < l; i++ { + bs = append(bs, <-ch) } - - ee.EncodeStringBytes(cRAW, bs) + e.e.EncodeStringBytes(c_RAW, bs) } return } - // if chan, consume chan into a slice, and work off that slice. - var rvcs reflect.Value - if f.seq == seqTypeChan { - rvcs = reflect.Zero(reflect.SliceOf(rtelem)) - timeout := e.h.ChanRecvTimeout - if timeout < 0 { // consume until close - for { - recv, recvOk := rv.Recv() - if !recvOk { - break - } - rvcs = reflect.Append(rvcs, recv) - } - } else { - cases := make([]reflect.SelectCase, 2) - cases[0] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: rv} - if timeout == 0 { - cases[1] = reflect.SelectCase{Dir: reflect.SelectDefault} - } else { - tt := time.NewTimer(timeout) - cases[1] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(tt.C)} - } - for { - chosen, recv, recvOk := reflect.Select(cases) - if chosen == 1 || !recvOk { - break - } - rvcs = reflect.Append(rvcs, recv) - } - } - rv = rvcs // TODO: ensure this doesn't mess up anywhere that rv of kind chan is expected - } - - l = rv.Len() if ti.mbs { if l%2 == 1 { e.errorf("mapBySlice requires even slice length, but got %v", l) return } - ee.WriteMapStart(l / 2) + e.e.EncodeMapStart(l / 2) } else { - ee.WriteArrayStart(l) + e.e.EncodeArrayStart(l) } if l > 0 { - var fn *codecFn for rtelem.Kind() == reflect.Ptr { rtelem = rtelem.Elem() } // if kind is reflect.Interface, do not pre-determine the // encoding type, because preEncodeValue may break it down to // a concrete type and kInterface will bomb. + var fn *encFn if rtelem.Kind() != reflect.Interface { - fn = e.cfer().get(rtelem, true, true) + rtelemid := reflect.ValueOf(rtelem).Pointer() + fn = e.getEncFn(rtelemid, rtelem, true, true) } + // TODO: Consider perf implication of encoding odd index values as symbols if type is string for j := 0; j < l; j++ { - if elemsep { + if cr != nil { if ti.mbs { if j%2 == 0 { - ee.WriteMapElemKey() + cr.sendContainerState(containerMapKey) } else { - ee.WriteMapElemValue() + cr.sendContainerState(containerMapValue) } } else { - ee.WriteArrayElem() + cr.sendContainerState(containerArrayElem) } } - e.encodeValue(rv.Index(j), fn, true) + if f.seq == seqTypeChan { + if rv2, ok2 := rv.Recv(); ok2 { + e.encodeValue(rv2, fn) + } else { + e.encode(nil) // WE HAVE TO DO SOMETHING, so nil if nothing received. + } + } else { + e.encodeValue(rv.Index(j), fn) + } } } - if ti.mbs { - ee.WriteMapEnd() - } else { - ee.WriteArrayEnd() - } -} - -func (e *Encoder) kStructNoOmitempty(f *codecFnInfo, rv reflect.Value) { - fti := f.ti - elemsep := e.esep - tisfi := fti.sfiSrc - toMap := !(fti.toArray || e.h.StructToArray) - if toMap { - tisfi = fti.sfiSort - } - ee := e.e - - sfn := structFieldNode{v: rv, update: false} - if toMap { - ee.WriteMapStart(len(tisfi)) - if elemsep { - for _, si := range tisfi { - ee.WriteMapElemKey() - // ee.EncodeString(cUTF8, si.encName) - encStructFieldKey(ee, fti.keyType, si.encName) - ee.WriteMapElemValue() - e.encodeValue(sfn.field(si), nil, true) - } - } else { - for _, si := range tisfi { - // ee.EncodeString(cUTF8, si.encName) - encStructFieldKey(ee, fti.keyType, si.encName) - e.encodeValue(sfn.field(si), nil, true) - } - } - ee.WriteMapEnd() - } else { - ee.WriteArrayStart(len(tisfi)) - if elemsep { - for _, si := range tisfi { - ee.WriteArrayElem() - e.encodeValue(sfn.field(si), nil, true) - } + if cr != nil { + if ti.mbs { + cr.sendContainerState(containerMapEnd) } else { - for _, si := range tisfi { - e.encodeValue(sfn.field(si), nil, true) - } + cr.sendContainerState(containerArrayEnd) } - ee.WriteArrayEnd() } } -func encStructFieldKey(ee encDriver, keyType valueType, s string) { - var m must - - // use if-else-if, not switch (which compiles to binary-search) - // since keyType is typically valueTypeString, branch prediction is pretty good. - - if keyType == valueTypeString { - ee.EncodeString(cUTF8, s) - } else if keyType == valueTypeInt { - ee.EncodeInt(m.Int(strconv.ParseInt(s, 10, 64))) - } else if keyType == valueTypeUint { - ee.EncodeUint(m.Uint(strconv.ParseUint(s, 10, 64))) - } else if keyType == valueTypeFloat { - ee.EncodeFloat64(m.Float(strconv.ParseFloat(s, 64))) - } else { - ee.EncodeString(cUTF8, s) - } -} - -func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) { +func (f *encFnInfo) kStruct(rv reflect.Value) { fti := f.ti - elemsep := e.esep - tisfi := fti.sfiSrc + e := f.e + cr := e.cr + tisfi := fti.sfip toMap := !(fti.toArray || e.h.StructToArray) - // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct) - if toMap { - tisfi = fti.sfiSort - } - newlen := len(fti.sfiSort) - ee := e.e + newlen := len(fti.sfi) // Use sync.Pool to reduce allocating slices unnecessarily. // The cost of sync.Pool is less than the cost of new allocation. - // - // Each element of the array pools one of encStructPool(8|16|32|64). - // It allows the re-use of slices up to 64 in length. - // A performance cost of encoding structs was collecting - // which values were empty and should be omitted. - // We needed slices of reflect.Value and string to collect them. - // This shared pool reduces the amount of unnecessary creation we do. - // The cost is that of locking sometimes, but sync.Pool is efficient - // enough to reduce thread contention. - - var spool *sync.Pool - var poolv interface{} - var fkvs []stringRv - // fmt.Printf(">>>>>>>>>>>>>> encode.kStruct: newlen: %d\n", newlen) - if newlen <= 8 { - spool, poolv = pool.stringRv8() - fkvs = poolv.(*[8]stringRv)[:newlen] - } else if newlen <= 16 { - spool, poolv = pool.stringRv16() - fkvs = poolv.(*[16]stringRv)[:newlen] - } else if newlen <= 32 { - spool, poolv = pool.stringRv32() - fkvs = poolv.(*[32]stringRv)[:newlen] - } else if newlen <= 64 { - spool, poolv = pool.stringRv64() - fkvs = poolv.(*[64]stringRv)[:newlen] - } else if newlen <= 128 { - spool, poolv = pool.stringRv128() - fkvs = poolv.(*[128]stringRv)[:newlen] - } else { - fkvs = make([]stringRv, newlen) - } + pool, poolv, fkvs := encStructPoolGet(newlen) + // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct) + if toMap { + tisfi = fti.sfi + } newlen = 0 var kv stringRv recur := e.h.RecursiveEmptyCheck - sfn := structFieldNode{v: rv, update: false} for _, si := range tisfi { - // kv.r = si.field(rv, false) - kv.r = sfn.field(si) + kv.r = si.field(rv, false) if toMap { - if si.omitEmpty() && isEmptyValue(kv.r, e.h.TypeInfos, recur, recur) { + if si.omitEmpty && isEmptyValue(kv.r, recur, recur) { continue } kv.v = si.encName } else { // use the zero value. // if a reference or struct, set to nil (so you do not output too much) - if si.omitEmpty() && isEmptyValue(kv.r, e.h.TypeInfos, recur, recur) { + if si.omitEmpty && isEmptyValue(kv.r, recur, recur) { switch kv.r.Kind() { case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array, reflect.Map, reflect.Slice: kv.r = reflect.Value{} //encode as nil @@ -612,64 +584,91 @@ func (e *Encoder) kStruct(f *codecFnInfo, rv reflect.Value) { newlen++ } + // debugf(">>>> kStruct: newlen: %v", newlen) + // sep := !e.be + ee := e.e //don't dereference every time + if toMap { - ee.WriteMapStart(newlen) - if elemsep { - for j := 0; j < newlen; j++ { - kv = fkvs[j] - ee.WriteMapElemKey() - // ee.EncodeString(cUTF8, kv.v) - encStructFieldKey(ee, fti.keyType, kv.v) - ee.WriteMapElemValue() - e.encodeValue(kv.r, nil, true) + ee.EncodeMapStart(newlen) + // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0 + asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0 + for j := 0; j < newlen; j++ { + kv = fkvs[j] + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for j := 0; j < newlen; j++ { - kv = fkvs[j] - // ee.EncodeString(cUTF8, kv.v) - encStructFieldKey(ee, fti.keyType, kv.v) - e.encodeValue(kv.r, nil, true) + if asSymbols { + ee.EncodeSymbol(kv.v) + } else { + ee.EncodeString(c_UTF8, kv.v) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(kv.r, nil) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } else { - ee.WriteArrayStart(newlen) - if elemsep { - for j := 0; j < newlen; j++ { - ee.WriteArrayElem() - e.encodeValue(fkvs[j].r, nil, true) - } - } else { - for j := 0; j < newlen; j++ { - e.encodeValue(fkvs[j].r, nil, true) + ee.EncodeArrayStart(newlen) + for j := 0; j < newlen; j++ { + kv = fkvs[j] + if cr != nil { + cr.sendContainerState(containerArrayElem) } + e.encodeValue(kv.r, nil) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteArrayEnd() } // do not use defer. Instead, use explicit pool return at end of function. // defer has a cost we are trying to avoid. // If there is a panic and these slices are not returned, it is ok. - if spool != nil { - spool.Put(poolv) + if pool != nil { + pool.Put(poolv) } } -func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) { - ee := e.e +// func (f *encFnInfo) kPtr(rv reflect.Value) { +// debugf(">>>>>>> ??? encode kPtr called - shouldn't get called") +// if rv.IsNil() { +// f.e.e.encodeNil() +// return +// } +// f.e.encodeValue(rv.Elem()) +// } + +// func (f *encFnInfo) kInterface(rv reflect.Value) { +// println("kInterface called") +// debug.PrintStack() +// if rv.IsNil() { +// f.e.e.EncodeNil() +// return +// } +// f.e.encodeValue(rv.Elem(), nil) +// } + +func (f *encFnInfo) kMap(rv reflect.Value) { + ee := f.e.e if rv.IsNil() { ee.EncodeNil() return } l := rv.Len() - ee.WriteMapStart(l) - elemsep := e.esep + ee.EncodeMapStart(l) + e := f.e + cr := e.cr if l == 0 { - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return } - // var asSymbols bool + var asSymbols bool // determine the underlying key and val encFn's for the map. // This eliminates some work which is done for each loop iteration i.e. // rv.Type(), ref.ValueOf(rt).Pointer(), then check map/list for fn. @@ -677,295 +676,269 @@ func (e *Encoder) kMap(f *codecFnInfo, rv reflect.Value) { // However, if kind is reflect.Interface, do not pre-determine the // encoding type, because preEncodeValue may break it down to // a concrete type and kInterface will bomb. - var keyFn, valFn *codecFn + var keyFn, valFn *encFn ti := f.ti - rtkey0 := ti.key - rtkey := rtkey0 - rtval0 := ti.elem - rtval := rtval0 - // rtkeyid := rt2id(rtkey0) + rtkey := ti.rt.Key() + rtval := ti.rt.Elem() + rtkeyid := reflect.ValueOf(rtkey).Pointer() + // keyTypeIsString := f.ti.rt.Key().Kind() == reflect.String + var keyTypeIsString = rtkeyid == stringTypId + if keyTypeIsString { + asSymbols = e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 + } else { + for rtkey.Kind() == reflect.Ptr { + rtkey = rtkey.Elem() + } + if rtkey.Kind() != reflect.Interface { + rtkeyid = reflect.ValueOf(rtkey).Pointer() + keyFn = e.getEncFn(rtkeyid, rtkey, true, true) + } + } for rtval.Kind() == reflect.Ptr { rtval = rtval.Elem() } if rtval.Kind() != reflect.Interface { - valFn = e.cfer().get(rtval, true, true) + rtvalid := reflect.ValueOf(rtval).Pointer() + valFn = e.getEncFn(rtvalid, rtval, true, true) } mks := rv.MapKeys() + // for j, lmks := 0, len(mks); j < lmks; j++ { if e.h.Canonical { - e.kMapCanonical(rtkey, rv, mks, valFn) - ee.WriteMapEnd() - return - } - - var keyTypeIsString = stringTypId == rt2id(rtkey0) // rtkeyid - if !keyTypeIsString { - for rtkey.Kind() == reflect.Ptr { - rtkey = rtkey.Elem() - } - if rtkey.Kind() != reflect.Interface { - // rtkeyid = rt2id(rtkey) - keyFn = e.cfer().get(rtkey, true, true) + e.kMapCanonical(rtkeyid, rtkey, rv, mks, valFn, asSymbols) + } else { + for j := range mks { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + if keyTypeIsString { + if asSymbols { + ee.EncodeSymbol(mks[j].String()) + } else { + ee.EncodeString(c_UTF8, mks[j].String()) + } + } else { + e.encodeValue(mks[j], keyFn) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mks[j]), valFn) } } - - // for j, lmks := 0, len(mks); j < lmks; j++ { - for j := range mks { - if elemsep { - ee.WriteMapElemKey() - } - if keyTypeIsString { - ee.EncodeString(cUTF8, mks[j].String()) - } else { - e.encodeValue(mks[j], keyFn, true) - } - if elemsep { - ee.WriteMapElemValue() - } - e.encodeValue(rv.MapIndex(mks[j]), valFn, true) - + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) kMapCanonical(rtkey reflect.Type, rv reflect.Value, mks []reflect.Value, valFn *codecFn) { +func (e *Encoder) kMapCanonical(rtkeyid uintptr, rtkey reflect.Type, rv reflect.Value, mks []reflect.Value, valFn *encFn, asSymbols bool) { ee := e.e - elemsep := e.esep + cr := e.cr // we previously did out-of-band if an extension was registered. // This is not necessary, as the natural kind is sufficient for ordering. - switch rtkey.Kind() { - case reflect.Bool: - mksv := make([]boolRv, len(mks)) + if rtkeyid == uint8SliceTypId { + mksv := make([]bytesRv, len(mks)) for i, k := range mks { v := &mksv[i] v.r = k - v.v = k.Bool() + v.v = k.Bytes() } - sort.Sort(boolRvSlice(mksv)) + sort.Sort(bytesRvSlice(mksv)) for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + if cr != nil { + cr.sendContainerState(containerMapKey) } - ee.EncodeBool(mksv[i].v) - if elemsep { - ee.WriteMapElemValue() + ee.EncodeStringBytes(c_RAW, mksv[i].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) - } - case reflect.String: - mksv := make([]stringRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.String() + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - sort.Sort(stringRvSlice(mksv)) - for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + } else { + switch rtkey.Kind() { + case reflect.Bool: + mksv := make([]boolRv, len(mks)) + for i, k := range mks { + v := &mksv[i] + v.r = k + v.v = k.Bool() } - ee.EncodeString(cUTF8, mksv[i].v) - if elemsep { - ee.WriteMapElemValue() + sort.Sort(boolRvSlice(mksv)) + for i := range mksv { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(mksv[i].v) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) - } - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, reflect.Uintptr: - mksv := make([]uintRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Uint() - } - sort.Sort(uintRvSlice(mksv)) - for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + case reflect.String: + mksv := make([]stringRv, len(mks)) + for i, k := range mks { + v := &mksv[i] + v.r = k + v.v = k.String() } - ee.EncodeUint(mksv[i].v) - if elemsep { - ee.WriteMapElemValue() + sort.Sort(stringRvSlice(mksv)) + for i := range mksv { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + if asSymbols { + ee.EncodeSymbol(mksv[i].v) + } else { + ee.EncodeString(c_UTF8, mksv[i].v) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) - } - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - mksv := make([]intRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Int() - } - sort.Sort(intRvSlice(mksv)) - for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, reflect.Uintptr: + mksv := make([]uintRv, len(mks)) + for i, k := range mks { + v := &mksv[i] + v.r = k + v.v = k.Uint() } - ee.EncodeInt(mksv[i].v) - if elemsep { - ee.WriteMapElemValue() + sort.Sort(uintRvSlice(mksv)) + for i := range mksv { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeUint(mksv[i].v) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) - } - case reflect.Float32: - mksv := make([]floatRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Float() - } - sort.Sort(floatRvSlice(mksv)) - for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + mksv := make([]intRv, len(mks)) + for i, k := range mks { + v := &mksv[i] + v.r = k + v.v = k.Int() } - ee.EncodeFloat32(float32(mksv[i].v)) - if elemsep { - ee.WriteMapElemValue() + sort.Sort(intRvSlice(mksv)) + for i := range mksv { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(mksv[i].v) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) - } - case reflect.Float64: - mksv := make([]floatRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Float() - } - sort.Sort(floatRvSlice(mksv)) - for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + case reflect.Float32: + mksv := make([]floatRv, len(mks)) + for i, k := range mks { + v := &mksv[i] + v.r = k + v.v = k.Float() } - ee.EncodeFloat64(mksv[i].v) - if elemsep { - ee.WriteMapElemValue() + sort.Sort(floatRvSlice(mksv)) + for i := range mksv { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeFloat32(float32(mksv[i].v)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) - } - case reflect.Struct: - if rv.Type() == timeTyp { - mksv := make([]timeRv, len(mks)) + case reflect.Float64: + mksv := make([]floatRv, len(mks)) for i, k := range mks { v := &mksv[i] v.r = k - v.v = rv2i(k).(time.Time) + v.v = k.Float() } - sort.Sort(timeRvSlice(mksv)) + sort.Sort(floatRvSlice(mksv)) for i := range mksv { - if elemsep { - ee.WriteMapElemKey() + if cr != nil { + cr.sendContainerState(containerMapKey) } - ee.EncodeTime(mksv[i].v) - if elemsep { - ee.WriteMapElemValue() + ee.EncodeFloat64(mksv[i].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn, true) + e.encodeValue(rv.MapIndex(mksv[i].r), valFn) } - break - } - fallthrough - default: - // out-of-band - // first encode each key to a []byte first, then sort them, then record - var mksv []byte = make([]byte, 0, len(mks)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - mksbv := make([]bytesRv, len(mks)) - for i, k := range mks { - v := &mksbv[i] - l := len(mksv) - e2.MustEncode(k) - v.r = k - v.v = mksv[l:] - } - sort.Sort(bytesRvSlice(mksbv)) - for j := range mksbv { - if elemsep { - ee.WriteMapElemKey() + default: + // out-of-band + // first encode each key to a []byte first, then sort them, then record + var mksv []byte = make([]byte, 0, len(mks)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + mksbv := make([]bytesRv, len(mks)) + for i, k := range mks { + v := &mksbv[i] + l := len(mksv) + e2.MustEncode(k) + v.r = k + v.v = mksv[l:] + // fmt.Printf(">>>>> %s\n", mksv[l:]) } - e.asis(mksbv[j].v) - if elemsep { - ee.WriteMapElemValue() + sort.Sort(bytesRvSlice(mksbv)) + for j := range mksbv { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + e.asis(mksbv[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encodeValue(rv.MapIndex(mksbv[j].r), valFn) } - e.encodeValue(rv.MapIndex(mksbv[j].r), valFn, true) } } } -// // -------------------------------------------------- +// -------------------------------------------------- -type encWriterSwitch struct { - wi *ioEncWriter - // wb bytesEncWriter - wb bytesEncAppender - wx bool // if bytes, wx=true - esep bool // whether it has elem separators - isas bool // whether e.as != nil +// encFn encapsulates the captured variables and the encode function. +// This way, we only do some calculations one times, and pass to the +// code block that should be called (encapsulated in a function) +// instead of executing the checks every time. +type encFn struct { + i encFnInfo + f func(*encFnInfo, reflect.Value) } -// // TODO: Uncomment after mid-stack inlining enabled in go 1.11 +// -------------------------------------------------- -// func (z *encWriterSwitch) writeb(s []byte) { -// if z.wx { -// z.wb.writeb(s) -// } else { -// z.wi.writeb(s) -// } -// } -// func (z *encWriterSwitch) writestr(s string) { -// if z.wx { -// z.wb.writestr(s) -// } else { -// z.wi.writestr(s) -// } -// } -// func (z *encWriterSwitch) writen1(b1 byte) { -// if z.wx { -// z.wb.writen1(b1) -// } else { -// z.wi.writen1(b1) -// } -// } -// func (z *encWriterSwitch) writen2(b1, b2 byte) { -// if z.wx { -// z.wb.writen2(b1, b2) -// } else { -// z.wi.writen2(b1, b2) -// } -// } +type encRtidFn struct { + rtid uintptr + fn encFn +} // An Encoder writes an object to an output stream in the codec format. type Encoder struct { - panicHdl // hopefully, reduce derefencing cost by laying the encWriter inside the Encoder e encDriver // NOTE: Encoder shouldn't call it's write methods, // as the handler MAY need to do some coordination. - w encWriter - - h *BasicHandle - bw *bufio.Writer - as encDriverAsis - - // ---- cpu cache line boundary? + w encWriter + s []encRtidFn + ci set + be bool // is binary encoding + js bool // is json handle - // ---- cpu cache line boundary? - encWriterSwitch - err error + wi ioEncWriter + wb bytesEncWriter - // ---- cpu cache line boundary? - codecFnPooler - ci set - js bool // here, so that no need to piggy back on *codecFner for this - be bool // here, so that no need to piggy back on *codecFner for this - _ [6]byte // padding + h *BasicHandle + hh Handle - // ---- writable fields during execution --- *try* to keep in sep cache line + cr containerStateRecv + as encDriverAsis - // ---- cpu cache line boundary? - // b [scratchByteArrayLen]byte - // _ [cacheLineSize - scratchByteArrayLen]byte // padding - b [cacheLineSize - 0]byte // used for encoding a chan or (non-addressable) array of bytes + f map[uintptr]*encFn + b [scratchByteArrayLen]byte } // NewEncoder returns an Encoder for encoding into an io.Writer. @@ -990,95 +963,59 @@ func NewEncoderBytes(out *[]byte, h Handle) *Encoder { } func newEncoder(h Handle) *Encoder { - e := &Encoder{h: h.getBasicHandle(), err: errEncoderNotInitialized} - e.hh = h - e.esep = h.hasElemSeparators() + e := &Encoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()} + _, e.js = h.(*JsonHandle) + e.e = h.newEncDriver(e) + e.as, _ = e.e.(encDriverAsis) + e.cr, _ = e.e.(containerStateRecv) return e } -func (e *Encoder) resetCommon() { - if e.e == nil || e.hh.recreateEncDriver(e.e) { - e.e = e.hh.newEncDriver(e) - e.as, e.isas = e.e.(encDriverAsis) - // e.cr, _ = e.e.(containerStateRecv) - } - e.be = e.hh.isBinary() - _, e.js = e.hh.(*JsonHandle) - e.e.reset() - e.err = nil -} - -// Reset resets the Encoder with a new output stream. +// Reset the Encoder with a new output stream. // // This accommodates using the state of the Encoder, // where it has "cached" information about sub-engines. func (e *Encoder) Reset(w io.Writer) { - if w == nil { - return - } - if e.wi == nil { - e.wi = new(ioEncWriter) - } - var ok bool - e.wx = false - e.wi.w = w - if e.h.WriterBufferSize > 0 { - e.bw = bufio.NewWriterSize(w, e.h.WriterBufferSize) - e.wi.bw = e.bw - e.wi.sw = e.bw - e.wi.fw = e.bw - e.wi.ww = e.bw + ww, ok := w.(ioEncWriterWriter) + if ok { + e.wi.w = ww } else { - if e.wi.bw, ok = w.(io.ByteWriter); !ok { - e.wi.bw = e.wi - } - if e.wi.sw, ok = w.(ioEncStringWriter); !ok { - e.wi.sw = e.wi - } - e.wi.fw, _ = w.(ioFlusher) - e.wi.ww = w + sww := &e.wi.s + sww.w = w + sww.bw, _ = w.(io.ByteWriter) + sww.sw, _ = w.(ioEncStringWriter) + e.wi.w = sww + //ww = bufio.NewWriterSize(w, defEncByteBufSize) } - e.w = e.wi - e.resetCommon() + e.w = &e.wi + e.e.reset() } -// ResetBytes resets the Encoder with a new destination output []byte. func (e *Encoder) ResetBytes(out *[]byte) { - if out == nil { - return - } - var in []byte - if out != nil { - in = *out - } + in := *out if in == nil { in = make([]byte, defEncByteBufSize) } - e.wx = true - e.wb.reset(in, out) + e.wb.b, e.wb.out, e.wb.c = in, out, 0 e.w = &e.wb - e.resetCommon() + e.e.reset() } +// func (e *Encoder) sendContainerState(c containerState) { +// if e.cr != nil { +// e.cr.sendContainerState(c) +// } +// } + // Encode writes an object into a stream. // // Encoding can be configured via the struct tag for the fields. -// The key (in the struct tags) that we look at is configurable. -// -// By default, we look up the "codec" key in the struct field's tags, -// and fall bak to the "json" key if "codec" is absent. -// That key in struct field's tag value is the key name, +// The "codec" key in struct field's tag value is the key name, // followed by an optional comma and options. +// Note that the "json" key is used in the absence of the "codec" key. // // To set an option on all fields (e.g. omitempty on all fields), you -// can create a field called _struct, and set flags on it. The options -// which can be set on _struct are: -// - omitempty: so all fields are omitted if empty -// - toarray: so struct is encoded as an array -// - int: so struct key names are encoded as signed integers (instead of strings) -// - uint: so struct key names are encoded as unsigned integers (instead of strings) -// - float: so struct key names are encoded as floats (instead of strings) -// More details on these below. +// can create a field called _struct, and set flags on it. // // Struct values "usually" encode as maps. Each exported struct field is encoded unless: // - the field's tag is "-", OR @@ -1086,19 +1023,10 @@ func (e *Encoder) ResetBytes(out *[]byte) { // // When encoding as a map, the first string in the tag (before the comma) // is the map key string to use when encoding. -// ... -// This key is typically encoded as a string. -// However, there are instances where the encoded stream has mapping keys encoded as numbers. -// For example, some cbor streams have keys as integer codes in the stream, but they should map -// to fields in a structured object. Consequently, a struct is the natural representation in code. -// For these, configure the struct to encode/decode the keys as numbers (instead of string). -// This is done with the int,uint or float option on the _struct field (see above). // // However, struct values may encode as arrays. This happens when: // - StructToArray Encode option is set, OR // - the tag on the _struct field sets the "toarray" option -// Note that omitempty is ignored when encoding struct values as arrays, -// as an entry must be encoded for each field, to maintain its position. // // Values with types that implement MapBySlice are encoded as stream maps. // @@ -1125,77 +1053,51 @@ func (e *Encoder) ResetBytes(out *[]byte) { // } // // type MyStruct struct { -// _struct bool `codec:",toarray"` //encode struct as an array -// } -// -// type MyStruct struct { -// _struct bool `codec:",uint"` //encode struct with "unsigned integer" keys -// Field1 string `codec:"1"` //encode Field1 key using: EncodeInt(1) -// Field2 string `codec:"2"` //encode Field2 key using: EncodeInt(2) +// _struct bool `codec:",omitempty,toarray"` //set omitempty for every field +// //and encode struct as an array // } // // The mode of encoding is based on the type of the value. When a value is seen: // - If a Selfer, call its CodecEncodeSelf method // - If an extension is registered for it, call that extension function -// - If implements encoding.(Binary|Text|JSON)Marshaler, call Marshal(Binary|Text|JSON) method +// - If it implements encoding.(Binary|Text|JSON)Marshaler, call its Marshal(Binary|Text|JSON) method // - Else encode it based on its reflect.Kind // // Note that struct field names and keys in map[string]XXX will be treated as symbols. // Some formats support symbols (e.g. binc) and will properly encode the string // only once in the stream, and use a tag to refer to it thereafter. func (e *Encoder) Encode(v interface{}) (err error) { - defer e.deferred(&err) - e.MustEncode(v) + defer panicToErr(&err) + e.encode(v) + e.w.atEndOfEncode() return } // MustEncode is like Encode, but panics if unable to Encode. // This provides insight to the code location that triggered the error. func (e *Encoder) MustEncode(v interface{}) { - if e.err != nil { - panic(e.err) - } e.encode(v) - e.e.atEndOfEncode() e.w.atEndOfEncode() - e.alwaysAtEnd() } -func (e *Encoder) deferred(err1 *error) { - e.alwaysAtEnd() - if recoverPanicToErr { - if x := recover(); x != nil { - panicValToErr(e, x, err1) - panicValToErr(e, x, &e.err) - } - } -} - -// func (e *Encoder) alwaysAtEnd() { -// e.codecFnPooler.alwaysAtEnd() -// } - func (e *Encoder) encode(iv interface{}) { - if iv == nil || definitelyNil(iv) { - e.e.EncodeNil() - return - } - if v, ok := iv.(Selfer); ok { - v.CodecEncodeSelf(e) - return - } - - // a switch with only concrete types can be optimized. - // consequently, we deal with nil and interfaces outside. + // if ics, ok := iv.(Selfer); ok { + // ics.CodecEncodeSelf(e) + // return + // } switch v := iv.(type) { + case nil: + e.e.EncodeNil() + case Selfer: + v.CodecEncodeSelf(e) case Raw: - e.rawBytes(v) + e.raw(v) case reflect.Value: - e.encodeValue(v, nil, true) + e.encodeValue(v, nil) case string: - e.e.EncodeString(cUTF8, v) + e.e.EncodeString(c_UTF8, v) case bool: e.e.EncodeBool(v) case int: @@ -1218,22 +1120,16 @@ func (e *Encoder) encode(iv interface{}) { e.e.EncodeUint(uint64(v)) case uint64: e.e.EncodeUint(v) - case uintptr: - e.e.EncodeUint(uint64(v)) case float32: e.e.EncodeFloat32(v) case float64: e.e.EncodeFloat64(v) - case time.Time: - e.e.EncodeTime(v) - case []uint8: - e.e.EncodeStringBytes(cRAW, v) - case *Raw: - e.rawBytes(*v) + case []uint8: + e.e.EncodeStringBytes(c_RAW, v) case *string: - e.e.EncodeString(cUTF8, *v) + e.e.EncodeString(c_UTF8, *v) case *bool: e.e.EncodeBool(*v) case *int: @@ -1256,31 +1152,24 @@ func (e *Encoder) encode(iv interface{}) { e.e.EncodeUint(uint64(*v)) case *uint64: e.e.EncodeUint(*v) - case *uintptr: - e.e.EncodeUint(uint64(*v)) case *float32: e.e.EncodeFloat32(*v) case *float64: e.e.EncodeFloat64(*v) - case *time.Time: - e.e.EncodeTime(*v) case *[]uint8: - e.e.EncodeStringBytes(cRAW, *v) + e.e.EncodeStringBytes(c_RAW, *v) default: + const checkCodecSelfer1 = true // in case T is passed, where *T is a Selfer, still checkCodecSelfer if !fastpathEncodeTypeSwitch(iv, e) { - // checkfastpath=true (not false), as underlying slice/map type may be fast-path - e.encodeValue(reflect.ValueOf(iv), nil, true) + e.encodeI(iv, false, checkCodecSelfer1) } } } -func (e *Encoder) encodeValue(rv reflect.Value, fn *codecFn, checkFastpath bool) { - // if a valid fn is passed, it MUST BE for the dereferenced type of rv - var sptr uintptr - var rvp reflect.Value - var rvpValid bool +func (e *Encoder) preEncodeValue(rv reflect.Value) (rv2 reflect.Value, sptr uintptr, proceed bool) { + // use a goto statement instead of a recursive function for ptr/interface. TOP: switch rv.Kind() { case reflect.Ptr: @@ -1288,8 +1177,6 @@ TOP: e.e.EncodeNil() return } - rvpValid = true - rvp = rv rv = rv.Elem() if e.h.CheckCircularRef && rv.Kind() == reflect.Struct { // TODO: Movable pointers will be an issue here. Future problem. @@ -1314,31 +1201,165 @@ TOP: return } - if sptr != 0 && (&e.ci).add(sptr) { - e.errorf("circular reference found: # %d", sptr) - } + proceed = true + rv2 = rv + return +} +func (e *Encoder) doEncodeValue(rv reflect.Value, fn *encFn, sptr uintptr, + checkFastpath, checkCodecSelfer bool) { + if sptr != 0 { + if (&e.ci).add(sptr) { + e.errorf("circular reference found: # %d", sptr) + } + } if fn == nil { rt := rv.Type() - // always pass checkCodecSelfer=true, in case T or ****T is passed, where *T is a Selfer - fn = e.cfer().get(rt, checkFastpath, true) + rtid := reflect.ValueOf(rt).Pointer() + // fn = e.getEncFn(rtid, rt, true, true) + fn = e.getEncFn(rtid, rt, checkFastpath, checkCodecSelfer) } - if fn.i.addrE { - if rvpValid { - fn.fe(e, &fn.i, rvp) - } else if rv.CanAddr() { - fn.fe(e, &fn.i, rv.Addr()) - } else { - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - fn.fe(e, &fn.i, rv2) + fn.f(&fn.i, rv) + if sptr != 0 { + (&e.ci).remove(sptr) + } +} + +func (e *Encoder) encodeI(iv interface{}, checkFastpath, checkCodecSelfer bool) { + if rv, sptr, proceed := e.preEncodeValue(reflect.ValueOf(iv)); proceed { + e.doEncodeValue(rv, nil, sptr, checkFastpath, checkCodecSelfer) + } +} + +func (e *Encoder) encodeValue(rv reflect.Value, fn *encFn) { + // if a valid fn is passed, it MUST BE for the dereferenced type of rv + if rv, sptr, proceed := e.preEncodeValue(rv); proceed { + e.doEncodeValue(rv, fn, sptr, true, true) + } +} + +func (e *Encoder) getEncFn(rtid uintptr, rt reflect.Type, checkFastpath, checkCodecSelfer bool) (fn *encFn) { + // rtid := reflect.ValueOf(rt).Pointer() + var ok bool + if useMapForCodecCache { + fn, ok = e.f[rtid] + } else { + for i := range e.s { + v := &(e.s[i]) + if v.rtid == rtid { + fn, ok = &(v.fn), true + break + } } + } + if ok { + return + } + + if useMapForCodecCache { + if e.f == nil { + e.f = make(map[uintptr]*encFn, initCollectionCap) + } + fn = new(encFn) + e.f[rtid] = fn } else { - fn.fe(e, &fn.i, rv) + if e.s == nil { + e.s = make([]encRtidFn, 0, initCollectionCap) + } + e.s = append(e.s, encRtidFn{rtid: rtid}) + fn = &(e.s[len(e.s)-1]).fn } - if sptr != 0 { - (&e.ci).remove(sptr) + + ti := e.h.getTypeInfo(rtid, rt) + fi := &(fn.i) + fi.e = e + fi.ti = ti + + if checkCodecSelfer && ti.cs { + fn.f = (*encFnInfo).selferMarshal + } else if rtid == rawTypId { + fn.f = (*encFnInfo).raw + } else if rtid == rawExtTypId { + fn.f = (*encFnInfo).rawExt + } else if e.e.IsBuiltinType(rtid) { + fn.f = (*encFnInfo).builtin + } else if xfFn := e.h.getExt(rtid); xfFn != nil { + fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext + fn.f = (*encFnInfo).ext + } else if supportMarshalInterfaces && e.be && ti.bm { + fn.f = (*encFnInfo).binaryMarshal + } else if supportMarshalInterfaces && !e.be && e.js && ti.jm { + //If JSON, we should check JSONMarshal before textMarshal + fn.f = (*encFnInfo).jsonMarshal + } else if supportMarshalInterfaces && !e.be && ti.tm { + fn.f = (*encFnInfo).textMarshal + } else { + rk := rt.Kind() + if fastpathEnabled && checkFastpath && (rk == reflect.Map || rk == reflect.Slice) { + if rt.PkgPath() == "" { // un-named slice or map + if idx := fastpathAV.index(rtid); idx != -1 { + fn.f = fastpathAV[idx].encfn + } + } else { + ok = false + // use mapping for underlying type if there + var rtu reflect.Type + if rk == reflect.Map { + rtu = reflect.MapOf(rt.Key(), rt.Elem()) + } else { + rtu = reflect.SliceOf(rt.Elem()) + } + rtuid := reflect.ValueOf(rtu).Pointer() + if idx := fastpathAV.index(rtuid); idx != -1 { + xfnf := fastpathAV[idx].encfn + xrt := fastpathAV[idx].rt + fn.f = func(xf *encFnInfo, xrv reflect.Value) { + xfnf(xf, xrv.Convert(xrt)) + } + } + } + } + if fn.f == nil { + switch rk { + case reflect.Bool: + fn.f = (*encFnInfo).kBool + case reflect.String: + fn.f = (*encFnInfo).kString + case reflect.Float64: + fn.f = (*encFnInfo).kFloat64 + case reflect.Float32: + fn.f = (*encFnInfo).kFloat32 + case reflect.Int, reflect.Int8, reflect.Int64, reflect.Int32, reflect.Int16: + fn.f = (*encFnInfo).kInt + case reflect.Uint8, reflect.Uint64, reflect.Uint, reflect.Uint32, reflect.Uint16, reflect.Uintptr: + fn.f = (*encFnInfo).kUint + case reflect.Invalid: + fn.f = (*encFnInfo).kInvalid + case reflect.Chan: + fi.seq = seqTypeChan + fn.f = (*encFnInfo).kSlice + case reflect.Slice: + fi.seq = seqTypeSlice + fn.f = (*encFnInfo).kSlice + case reflect.Array: + fi.seq = seqTypeArray + fn.f = (*encFnInfo).kSlice + case reflect.Struct: + fn.f = (*encFnInfo).kStruct + // reflect.Ptr and reflect.Interface are handled already by preEncodeValue + // case reflect.Ptr: + // fn.f = (*encFnInfo).kPtr + // case reflect.Interface: + // fn.f = (*encFnInfo).kInterface + case reflect.Map: + fn.f = (*encFnInfo).kMap + default: + fn.f = (*encFnInfo).kErr + } + } } + + return } func (e *Encoder) marshal(bs []byte, fnerr error, asis bool, c charEncoding) { @@ -1355,21 +1376,86 @@ func (e *Encoder) marshal(bs []byte, fnerr error, asis bool, c charEncoding) { } func (e *Encoder) asis(v []byte) { - if e.isas { - e.as.EncodeAsis(v) - } else { + if e.as == nil { e.w.writeb(v) + } else { + e.as.EncodeAsis(v) } } -func (e *Encoder) rawBytes(vv Raw) { +func (e *Encoder) raw(vv Raw) { v := []byte(vv) if !e.h.Raw { e.errorf("Raw values cannot be encoded: %v", v) } - e.asis(v) + if e.as == nil { + e.w.writeb(v) + } else { + e.as.EncodeAsis(v) + } +} + +func (e *Encoder) errorf(format string, params ...interface{}) { + err := fmt.Errorf(format, params...) + panic(err) } -func (e *Encoder) wrapErrstr(v interface{}, err *error) { - *err = fmt.Errorf("%s encode error: %v", e.hh.Name(), v) +// ---------------------------------------- + +const encStructPoolLen = 5 + +// encStructPool is an array of sync.Pool. +// Each element of the array pools one of encStructPool(8|16|32|64). +// It allows the re-use of slices up to 64 in length. +// A performance cost of encoding structs was collecting +// which values were empty and should be omitted. +// We needed slices of reflect.Value and string to collect them. +// This shared pool reduces the amount of unnecessary creation we do. +// The cost is that of locking sometimes, but sync.Pool is efficient +// enough to reduce thread contention. +var encStructPool [encStructPoolLen]sync.Pool + +func init() { + encStructPool[0].New = func() interface{} { return new([8]stringRv) } + encStructPool[1].New = func() interface{} { return new([16]stringRv) } + encStructPool[2].New = func() interface{} { return new([32]stringRv) } + encStructPool[3].New = func() interface{} { return new([64]stringRv) } + encStructPool[4].New = func() interface{} { return new([128]stringRv) } } + +func encStructPoolGet(newlen int) (p *sync.Pool, v interface{}, s []stringRv) { + // if encStructPoolLen != 5 { // constant chec, so removed at build time. + // panic(errors.New("encStructPoolLen must be equal to 4")) // defensive, in case it is changed + // } + // idxpool := newlen / 8 + if newlen <= 8 { + p = &encStructPool[0] + v = p.Get() + s = v.(*[8]stringRv)[:newlen] + } else if newlen <= 16 { + p = &encStructPool[1] + v = p.Get() + s = v.(*[16]stringRv)[:newlen] + } else if newlen <= 32 { + p = &encStructPool[2] + v = p.Get() + s = v.(*[32]stringRv)[:newlen] + } else if newlen <= 64 { + p = &encStructPool[3] + v = p.Get() + s = v.(*[64]stringRv)[:newlen] + } else if newlen <= 128 { + p = &encStructPool[4] + v = p.Get() + s = v.(*[128]stringRv)[:newlen] + } else { + s = make([]stringRv, newlen) + } + return +} + +// ---------------------------------------- + +// func encErr(format string, params ...interface{}) { +// doPanic(msgTagEnc, format, params...) +// } diff --git a/vendor/github.com/ugorji/go/codec/fast-path.generated.go b/vendor/github.com/ugorji/go/codec/fast-path.generated.go index 87f2562f6..f2e5d2dcf 100644 --- a/vendor/github.com/ugorji/go/codec/fast-path.generated.go +++ b/vendor/github.com/ugorji/go/codec/fast-path.generated.go @@ -3,7 +3,10 @@ // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. -// Code generated from fast-path.go.tmpl - DO NOT EDIT. +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED from fast-path.go.tmpl +// ************************************************************ package codec @@ -15,19 +18,19 @@ package codec // This file can be omitted without causing a build failure. // // The advantage of fast paths is: -// - Many calls bypass reflection altogether +// - Many calls bypass reflection altogether // // Currently support -// - slice of all builtin types, -// - map of all builtin types to string or interface value -// - symmetrical maps of all builtin types (e.g. str-str, uint8-uint8) +// - slice of all builtin types, +// - map of all builtin types to string or interface value +// - symmetrical maps of all builtin types (e.g. str-str, uint8-uint8) // This should provide adequate "typical" implementations. // // Note that fast track decode functions must handle values for which an address cannot be obtained. // For example: -// m2 := map[string]int{} -// p2 := []interface{}{m2} -// // decoding into p2 will bomb if fast track functions do not treat like unaddressable. +// m2 := map[string]int{} +// p2 := []interface{}{m2} +// // decoding into p2 will bomb if fast track functions do not treat like unaddressable. // import ( @@ -37,6 +40,9 @@ import ( const fastpathEnabled = true +const fastpathCheckNilFalse = false // for reflect +const fastpathCheckNilTrue = true // for type switch + type fastpathT struct{} var fastpathTV fastpathT @@ -44,8 +50,8 @@ var fastpathTV fastpathT type fastpathE struct { rtid uintptr rt reflect.Type - encfn func(*Encoder, *codecFnInfo, reflect.Value) - decfn func(*Decoder, *codecFnInfo, reflect.Value) + encfn func(*encFnInfo, reflect.Value) + decfn func(*decFnInfo, reflect.Value) } type fastpathA [271]fastpathE @@ -78,288 +84,286 @@ var fastpathAV fastpathA // due to possible initialization loop error, make fastpath in an init() func init() { i := 0 - fn := func(v interface{}, - fe func(*Encoder, *codecFnInfo, reflect.Value), - fd func(*Decoder, *codecFnInfo, reflect.Value)) (f fastpathE) { + fn := func(v interface{}, fe func(*encFnInfo, reflect.Value), fd func(*decFnInfo, reflect.Value)) (f fastpathE) { xrt := reflect.TypeOf(v) - xptr := rt2id(xrt) + xptr := reflect.ValueOf(xrt).Pointer() fastpathAV[i] = fastpathE{xptr, xrt, fe, fd} i++ return } - fn([]interface{}(nil), (*Encoder).fastpathEncSliceIntfR, (*Decoder).fastpathDecSliceIntfR) - fn([]string(nil), (*Encoder).fastpathEncSliceStringR, (*Decoder).fastpathDecSliceStringR) - fn([]float32(nil), (*Encoder).fastpathEncSliceFloat32R, (*Decoder).fastpathDecSliceFloat32R) - fn([]float64(nil), (*Encoder).fastpathEncSliceFloat64R, (*Decoder).fastpathDecSliceFloat64R) - fn([]uint(nil), (*Encoder).fastpathEncSliceUintR, (*Decoder).fastpathDecSliceUintR) - fn([]uint16(nil), (*Encoder).fastpathEncSliceUint16R, (*Decoder).fastpathDecSliceUint16R) - fn([]uint32(nil), (*Encoder).fastpathEncSliceUint32R, (*Decoder).fastpathDecSliceUint32R) - fn([]uint64(nil), (*Encoder).fastpathEncSliceUint64R, (*Decoder).fastpathDecSliceUint64R) - fn([]uintptr(nil), (*Encoder).fastpathEncSliceUintptrR, (*Decoder).fastpathDecSliceUintptrR) - fn([]int(nil), (*Encoder).fastpathEncSliceIntR, (*Decoder).fastpathDecSliceIntR) - fn([]int8(nil), (*Encoder).fastpathEncSliceInt8R, (*Decoder).fastpathDecSliceInt8R) - fn([]int16(nil), (*Encoder).fastpathEncSliceInt16R, (*Decoder).fastpathDecSliceInt16R) - fn([]int32(nil), (*Encoder).fastpathEncSliceInt32R, (*Decoder).fastpathDecSliceInt32R) - fn([]int64(nil), (*Encoder).fastpathEncSliceInt64R, (*Decoder).fastpathDecSliceInt64R) - fn([]bool(nil), (*Encoder).fastpathEncSliceBoolR, (*Decoder).fastpathDecSliceBoolR) - - fn(map[interface{}]interface{}(nil), (*Encoder).fastpathEncMapIntfIntfR, (*Decoder).fastpathDecMapIntfIntfR) - fn(map[interface{}]string(nil), (*Encoder).fastpathEncMapIntfStringR, (*Decoder).fastpathDecMapIntfStringR) - fn(map[interface{}]uint(nil), (*Encoder).fastpathEncMapIntfUintR, (*Decoder).fastpathDecMapIntfUintR) - fn(map[interface{}]uint8(nil), (*Encoder).fastpathEncMapIntfUint8R, (*Decoder).fastpathDecMapIntfUint8R) - fn(map[interface{}]uint16(nil), (*Encoder).fastpathEncMapIntfUint16R, (*Decoder).fastpathDecMapIntfUint16R) - fn(map[interface{}]uint32(nil), (*Encoder).fastpathEncMapIntfUint32R, (*Decoder).fastpathDecMapIntfUint32R) - fn(map[interface{}]uint64(nil), (*Encoder).fastpathEncMapIntfUint64R, (*Decoder).fastpathDecMapIntfUint64R) - fn(map[interface{}]uintptr(nil), (*Encoder).fastpathEncMapIntfUintptrR, (*Decoder).fastpathDecMapIntfUintptrR) - fn(map[interface{}]int(nil), (*Encoder).fastpathEncMapIntfIntR, (*Decoder).fastpathDecMapIntfIntR) - fn(map[interface{}]int8(nil), (*Encoder).fastpathEncMapIntfInt8R, (*Decoder).fastpathDecMapIntfInt8R) - fn(map[interface{}]int16(nil), (*Encoder).fastpathEncMapIntfInt16R, (*Decoder).fastpathDecMapIntfInt16R) - fn(map[interface{}]int32(nil), (*Encoder).fastpathEncMapIntfInt32R, (*Decoder).fastpathDecMapIntfInt32R) - fn(map[interface{}]int64(nil), (*Encoder).fastpathEncMapIntfInt64R, (*Decoder).fastpathDecMapIntfInt64R) - fn(map[interface{}]float32(nil), (*Encoder).fastpathEncMapIntfFloat32R, (*Decoder).fastpathDecMapIntfFloat32R) - fn(map[interface{}]float64(nil), (*Encoder).fastpathEncMapIntfFloat64R, (*Decoder).fastpathDecMapIntfFloat64R) - fn(map[interface{}]bool(nil), (*Encoder).fastpathEncMapIntfBoolR, (*Decoder).fastpathDecMapIntfBoolR) - fn(map[string]interface{}(nil), (*Encoder).fastpathEncMapStringIntfR, (*Decoder).fastpathDecMapStringIntfR) - fn(map[string]string(nil), (*Encoder).fastpathEncMapStringStringR, (*Decoder).fastpathDecMapStringStringR) - fn(map[string]uint(nil), (*Encoder).fastpathEncMapStringUintR, (*Decoder).fastpathDecMapStringUintR) - fn(map[string]uint8(nil), (*Encoder).fastpathEncMapStringUint8R, (*Decoder).fastpathDecMapStringUint8R) - fn(map[string]uint16(nil), (*Encoder).fastpathEncMapStringUint16R, (*Decoder).fastpathDecMapStringUint16R) - fn(map[string]uint32(nil), (*Encoder).fastpathEncMapStringUint32R, (*Decoder).fastpathDecMapStringUint32R) - fn(map[string]uint64(nil), (*Encoder).fastpathEncMapStringUint64R, (*Decoder).fastpathDecMapStringUint64R) - fn(map[string]uintptr(nil), (*Encoder).fastpathEncMapStringUintptrR, (*Decoder).fastpathDecMapStringUintptrR) - fn(map[string]int(nil), (*Encoder).fastpathEncMapStringIntR, (*Decoder).fastpathDecMapStringIntR) - fn(map[string]int8(nil), (*Encoder).fastpathEncMapStringInt8R, (*Decoder).fastpathDecMapStringInt8R) - fn(map[string]int16(nil), (*Encoder).fastpathEncMapStringInt16R, (*Decoder).fastpathDecMapStringInt16R) - fn(map[string]int32(nil), (*Encoder).fastpathEncMapStringInt32R, (*Decoder).fastpathDecMapStringInt32R) - fn(map[string]int64(nil), (*Encoder).fastpathEncMapStringInt64R, (*Decoder).fastpathDecMapStringInt64R) - fn(map[string]float32(nil), (*Encoder).fastpathEncMapStringFloat32R, (*Decoder).fastpathDecMapStringFloat32R) - fn(map[string]float64(nil), (*Encoder).fastpathEncMapStringFloat64R, (*Decoder).fastpathDecMapStringFloat64R) - fn(map[string]bool(nil), (*Encoder).fastpathEncMapStringBoolR, (*Decoder).fastpathDecMapStringBoolR) - fn(map[float32]interface{}(nil), (*Encoder).fastpathEncMapFloat32IntfR, (*Decoder).fastpathDecMapFloat32IntfR) - fn(map[float32]string(nil), (*Encoder).fastpathEncMapFloat32StringR, (*Decoder).fastpathDecMapFloat32StringR) - fn(map[float32]uint(nil), (*Encoder).fastpathEncMapFloat32UintR, (*Decoder).fastpathDecMapFloat32UintR) - fn(map[float32]uint8(nil), (*Encoder).fastpathEncMapFloat32Uint8R, (*Decoder).fastpathDecMapFloat32Uint8R) - fn(map[float32]uint16(nil), (*Encoder).fastpathEncMapFloat32Uint16R, (*Decoder).fastpathDecMapFloat32Uint16R) - fn(map[float32]uint32(nil), (*Encoder).fastpathEncMapFloat32Uint32R, (*Decoder).fastpathDecMapFloat32Uint32R) - fn(map[float32]uint64(nil), (*Encoder).fastpathEncMapFloat32Uint64R, (*Decoder).fastpathDecMapFloat32Uint64R) - fn(map[float32]uintptr(nil), (*Encoder).fastpathEncMapFloat32UintptrR, (*Decoder).fastpathDecMapFloat32UintptrR) - fn(map[float32]int(nil), (*Encoder).fastpathEncMapFloat32IntR, (*Decoder).fastpathDecMapFloat32IntR) - fn(map[float32]int8(nil), (*Encoder).fastpathEncMapFloat32Int8R, (*Decoder).fastpathDecMapFloat32Int8R) - fn(map[float32]int16(nil), (*Encoder).fastpathEncMapFloat32Int16R, (*Decoder).fastpathDecMapFloat32Int16R) - fn(map[float32]int32(nil), (*Encoder).fastpathEncMapFloat32Int32R, (*Decoder).fastpathDecMapFloat32Int32R) - fn(map[float32]int64(nil), (*Encoder).fastpathEncMapFloat32Int64R, (*Decoder).fastpathDecMapFloat32Int64R) - fn(map[float32]float32(nil), (*Encoder).fastpathEncMapFloat32Float32R, (*Decoder).fastpathDecMapFloat32Float32R) - fn(map[float32]float64(nil), (*Encoder).fastpathEncMapFloat32Float64R, (*Decoder).fastpathDecMapFloat32Float64R) - fn(map[float32]bool(nil), (*Encoder).fastpathEncMapFloat32BoolR, (*Decoder).fastpathDecMapFloat32BoolR) - fn(map[float64]interface{}(nil), (*Encoder).fastpathEncMapFloat64IntfR, (*Decoder).fastpathDecMapFloat64IntfR) - fn(map[float64]string(nil), (*Encoder).fastpathEncMapFloat64StringR, (*Decoder).fastpathDecMapFloat64StringR) - fn(map[float64]uint(nil), (*Encoder).fastpathEncMapFloat64UintR, (*Decoder).fastpathDecMapFloat64UintR) - fn(map[float64]uint8(nil), (*Encoder).fastpathEncMapFloat64Uint8R, (*Decoder).fastpathDecMapFloat64Uint8R) - fn(map[float64]uint16(nil), (*Encoder).fastpathEncMapFloat64Uint16R, (*Decoder).fastpathDecMapFloat64Uint16R) - fn(map[float64]uint32(nil), (*Encoder).fastpathEncMapFloat64Uint32R, (*Decoder).fastpathDecMapFloat64Uint32R) - fn(map[float64]uint64(nil), (*Encoder).fastpathEncMapFloat64Uint64R, (*Decoder).fastpathDecMapFloat64Uint64R) - fn(map[float64]uintptr(nil), (*Encoder).fastpathEncMapFloat64UintptrR, (*Decoder).fastpathDecMapFloat64UintptrR) - fn(map[float64]int(nil), (*Encoder).fastpathEncMapFloat64IntR, (*Decoder).fastpathDecMapFloat64IntR) - fn(map[float64]int8(nil), (*Encoder).fastpathEncMapFloat64Int8R, (*Decoder).fastpathDecMapFloat64Int8R) - fn(map[float64]int16(nil), (*Encoder).fastpathEncMapFloat64Int16R, (*Decoder).fastpathDecMapFloat64Int16R) - fn(map[float64]int32(nil), (*Encoder).fastpathEncMapFloat64Int32R, (*Decoder).fastpathDecMapFloat64Int32R) - fn(map[float64]int64(nil), (*Encoder).fastpathEncMapFloat64Int64R, (*Decoder).fastpathDecMapFloat64Int64R) - fn(map[float64]float32(nil), (*Encoder).fastpathEncMapFloat64Float32R, (*Decoder).fastpathDecMapFloat64Float32R) - fn(map[float64]float64(nil), (*Encoder).fastpathEncMapFloat64Float64R, (*Decoder).fastpathDecMapFloat64Float64R) - fn(map[float64]bool(nil), (*Encoder).fastpathEncMapFloat64BoolR, (*Decoder).fastpathDecMapFloat64BoolR) - fn(map[uint]interface{}(nil), (*Encoder).fastpathEncMapUintIntfR, (*Decoder).fastpathDecMapUintIntfR) - fn(map[uint]string(nil), (*Encoder).fastpathEncMapUintStringR, (*Decoder).fastpathDecMapUintStringR) - fn(map[uint]uint(nil), (*Encoder).fastpathEncMapUintUintR, (*Decoder).fastpathDecMapUintUintR) - fn(map[uint]uint8(nil), (*Encoder).fastpathEncMapUintUint8R, (*Decoder).fastpathDecMapUintUint8R) - fn(map[uint]uint16(nil), (*Encoder).fastpathEncMapUintUint16R, (*Decoder).fastpathDecMapUintUint16R) - fn(map[uint]uint32(nil), (*Encoder).fastpathEncMapUintUint32R, (*Decoder).fastpathDecMapUintUint32R) - fn(map[uint]uint64(nil), (*Encoder).fastpathEncMapUintUint64R, (*Decoder).fastpathDecMapUintUint64R) - fn(map[uint]uintptr(nil), (*Encoder).fastpathEncMapUintUintptrR, (*Decoder).fastpathDecMapUintUintptrR) - fn(map[uint]int(nil), (*Encoder).fastpathEncMapUintIntR, (*Decoder).fastpathDecMapUintIntR) - fn(map[uint]int8(nil), (*Encoder).fastpathEncMapUintInt8R, (*Decoder).fastpathDecMapUintInt8R) - fn(map[uint]int16(nil), (*Encoder).fastpathEncMapUintInt16R, (*Decoder).fastpathDecMapUintInt16R) - fn(map[uint]int32(nil), (*Encoder).fastpathEncMapUintInt32R, (*Decoder).fastpathDecMapUintInt32R) - fn(map[uint]int64(nil), (*Encoder).fastpathEncMapUintInt64R, (*Decoder).fastpathDecMapUintInt64R) - fn(map[uint]float32(nil), (*Encoder).fastpathEncMapUintFloat32R, (*Decoder).fastpathDecMapUintFloat32R) - fn(map[uint]float64(nil), (*Encoder).fastpathEncMapUintFloat64R, (*Decoder).fastpathDecMapUintFloat64R) - fn(map[uint]bool(nil), (*Encoder).fastpathEncMapUintBoolR, (*Decoder).fastpathDecMapUintBoolR) - fn(map[uint8]interface{}(nil), (*Encoder).fastpathEncMapUint8IntfR, (*Decoder).fastpathDecMapUint8IntfR) - fn(map[uint8]string(nil), (*Encoder).fastpathEncMapUint8StringR, (*Decoder).fastpathDecMapUint8StringR) - fn(map[uint8]uint(nil), (*Encoder).fastpathEncMapUint8UintR, (*Decoder).fastpathDecMapUint8UintR) - fn(map[uint8]uint8(nil), (*Encoder).fastpathEncMapUint8Uint8R, (*Decoder).fastpathDecMapUint8Uint8R) - fn(map[uint8]uint16(nil), (*Encoder).fastpathEncMapUint8Uint16R, (*Decoder).fastpathDecMapUint8Uint16R) - fn(map[uint8]uint32(nil), (*Encoder).fastpathEncMapUint8Uint32R, (*Decoder).fastpathDecMapUint8Uint32R) - fn(map[uint8]uint64(nil), (*Encoder).fastpathEncMapUint8Uint64R, (*Decoder).fastpathDecMapUint8Uint64R) - fn(map[uint8]uintptr(nil), (*Encoder).fastpathEncMapUint8UintptrR, (*Decoder).fastpathDecMapUint8UintptrR) - fn(map[uint8]int(nil), (*Encoder).fastpathEncMapUint8IntR, (*Decoder).fastpathDecMapUint8IntR) - fn(map[uint8]int8(nil), (*Encoder).fastpathEncMapUint8Int8R, (*Decoder).fastpathDecMapUint8Int8R) - fn(map[uint8]int16(nil), (*Encoder).fastpathEncMapUint8Int16R, (*Decoder).fastpathDecMapUint8Int16R) - fn(map[uint8]int32(nil), (*Encoder).fastpathEncMapUint8Int32R, (*Decoder).fastpathDecMapUint8Int32R) - fn(map[uint8]int64(nil), (*Encoder).fastpathEncMapUint8Int64R, (*Decoder).fastpathDecMapUint8Int64R) - fn(map[uint8]float32(nil), (*Encoder).fastpathEncMapUint8Float32R, (*Decoder).fastpathDecMapUint8Float32R) - fn(map[uint8]float64(nil), (*Encoder).fastpathEncMapUint8Float64R, (*Decoder).fastpathDecMapUint8Float64R) - fn(map[uint8]bool(nil), (*Encoder).fastpathEncMapUint8BoolR, (*Decoder).fastpathDecMapUint8BoolR) - fn(map[uint16]interface{}(nil), (*Encoder).fastpathEncMapUint16IntfR, (*Decoder).fastpathDecMapUint16IntfR) - fn(map[uint16]string(nil), (*Encoder).fastpathEncMapUint16StringR, (*Decoder).fastpathDecMapUint16StringR) - fn(map[uint16]uint(nil), (*Encoder).fastpathEncMapUint16UintR, (*Decoder).fastpathDecMapUint16UintR) - fn(map[uint16]uint8(nil), (*Encoder).fastpathEncMapUint16Uint8R, (*Decoder).fastpathDecMapUint16Uint8R) - fn(map[uint16]uint16(nil), (*Encoder).fastpathEncMapUint16Uint16R, (*Decoder).fastpathDecMapUint16Uint16R) - fn(map[uint16]uint32(nil), (*Encoder).fastpathEncMapUint16Uint32R, (*Decoder).fastpathDecMapUint16Uint32R) - fn(map[uint16]uint64(nil), (*Encoder).fastpathEncMapUint16Uint64R, (*Decoder).fastpathDecMapUint16Uint64R) - fn(map[uint16]uintptr(nil), (*Encoder).fastpathEncMapUint16UintptrR, (*Decoder).fastpathDecMapUint16UintptrR) - fn(map[uint16]int(nil), (*Encoder).fastpathEncMapUint16IntR, (*Decoder).fastpathDecMapUint16IntR) - fn(map[uint16]int8(nil), (*Encoder).fastpathEncMapUint16Int8R, (*Decoder).fastpathDecMapUint16Int8R) - fn(map[uint16]int16(nil), (*Encoder).fastpathEncMapUint16Int16R, (*Decoder).fastpathDecMapUint16Int16R) - fn(map[uint16]int32(nil), (*Encoder).fastpathEncMapUint16Int32R, (*Decoder).fastpathDecMapUint16Int32R) - fn(map[uint16]int64(nil), (*Encoder).fastpathEncMapUint16Int64R, (*Decoder).fastpathDecMapUint16Int64R) - fn(map[uint16]float32(nil), (*Encoder).fastpathEncMapUint16Float32R, (*Decoder).fastpathDecMapUint16Float32R) - fn(map[uint16]float64(nil), (*Encoder).fastpathEncMapUint16Float64R, (*Decoder).fastpathDecMapUint16Float64R) - fn(map[uint16]bool(nil), (*Encoder).fastpathEncMapUint16BoolR, (*Decoder).fastpathDecMapUint16BoolR) - fn(map[uint32]interface{}(nil), (*Encoder).fastpathEncMapUint32IntfR, (*Decoder).fastpathDecMapUint32IntfR) - fn(map[uint32]string(nil), (*Encoder).fastpathEncMapUint32StringR, (*Decoder).fastpathDecMapUint32StringR) - fn(map[uint32]uint(nil), (*Encoder).fastpathEncMapUint32UintR, (*Decoder).fastpathDecMapUint32UintR) - fn(map[uint32]uint8(nil), (*Encoder).fastpathEncMapUint32Uint8R, (*Decoder).fastpathDecMapUint32Uint8R) - fn(map[uint32]uint16(nil), (*Encoder).fastpathEncMapUint32Uint16R, (*Decoder).fastpathDecMapUint32Uint16R) - fn(map[uint32]uint32(nil), (*Encoder).fastpathEncMapUint32Uint32R, (*Decoder).fastpathDecMapUint32Uint32R) - fn(map[uint32]uint64(nil), (*Encoder).fastpathEncMapUint32Uint64R, (*Decoder).fastpathDecMapUint32Uint64R) - fn(map[uint32]uintptr(nil), (*Encoder).fastpathEncMapUint32UintptrR, (*Decoder).fastpathDecMapUint32UintptrR) - fn(map[uint32]int(nil), (*Encoder).fastpathEncMapUint32IntR, (*Decoder).fastpathDecMapUint32IntR) - fn(map[uint32]int8(nil), (*Encoder).fastpathEncMapUint32Int8R, (*Decoder).fastpathDecMapUint32Int8R) - fn(map[uint32]int16(nil), (*Encoder).fastpathEncMapUint32Int16R, (*Decoder).fastpathDecMapUint32Int16R) - fn(map[uint32]int32(nil), (*Encoder).fastpathEncMapUint32Int32R, (*Decoder).fastpathDecMapUint32Int32R) - fn(map[uint32]int64(nil), (*Encoder).fastpathEncMapUint32Int64R, (*Decoder).fastpathDecMapUint32Int64R) - fn(map[uint32]float32(nil), (*Encoder).fastpathEncMapUint32Float32R, (*Decoder).fastpathDecMapUint32Float32R) - fn(map[uint32]float64(nil), (*Encoder).fastpathEncMapUint32Float64R, (*Decoder).fastpathDecMapUint32Float64R) - fn(map[uint32]bool(nil), (*Encoder).fastpathEncMapUint32BoolR, (*Decoder).fastpathDecMapUint32BoolR) - fn(map[uint64]interface{}(nil), (*Encoder).fastpathEncMapUint64IntfR, (*Decoder).fastpathDecMapUint64IntfR) - fn(map[uint64]string(nil), (*Encoder).fastpathEncMapUint64StringR, (*Decoder).fastpathDecMapUint64StringR) - fn(map[uint64]uint(nil), (*Encoder).fastpathEncMapUint64UintR, (*Decoder).fastpathDecMapUint64UintR) - fn(map[uint64]uint8(nil), (*Encoder).fastpathEncMapUint64Uint8R, (*Decoder).fastpathDecMapUint64Uint8R) - fn(map[uint64]uint16(nil), (*Encoder).fastpathEncMapUint64Uint16R, (*Decoder).fastpathDecMapUint64Uint16R) - fn(map[uint64]uint32(nil), (*Encoder).fastpathEncMapUint64Uint32R, (*Decoder).fastpathDecMapUint64Uint32R) - fn(map[uint64]uint64(nil), (*Encoder).fastpathEncMapUint64Uint64R, (*Decoder).fastpathDecMapUint64Uint64R) - fn(map[uint64]uintptr(nil), (*Encoder).fastpathEncMapUint64UintptrR, (*Decoder).fastpathDecMapUint64UintptrR) - fn(map[uint64]int(nil), (*Encoder).fastpathEncMapUint64IntR, (*Decoder).fastpathDecMapUint64IntR) - fn(map[uint64]int8(nil), (*Encoder).fastpathEncMapUint64Int8R, (*Decoder).fastpathDecMapUint64Int8R) - fn(map[uint64]int16(nil), (*Encoder).fastpathEncMapUint64Int16R, (*Decoder).fastpathDecMapUint64Int16R) - fn(map[uint64]int32(nil), (*Encoder).fastpathEncMapUint64Int32R, (*Decoder).fastpathDecMapUint64Int32R) - fn(map[uint64]int64(nil), (*Encoder).fastpathEncMapUint64Int64R, (*Decoder).fastpathDecMapUint64Int64R) - fn(map[uint64]float32(nil), (*Encoder).fastpathEncMapUint64Float32R, (*Decoder).fastpathDecMapUint64Float32R) - fn(map[uint64]float64(nil), (*Encoder).fastpathEncMapUint64Float64R, (*Decoder).fastpathDecMapUint64Float64R) - fn(map[uint64]bool(nil), (*Encoder).fastpathEncMapUint64BoolR, (*Decoder).fastpathDecMapUint64BoolR) - fn(map[uintptr]interface{}(nil), (*Encoder).fastpathEncMapUintptrIntfR, (*Decoder).fastpathDecMapUintptrIntfR) - fn(map[uintptr]string(nil), (*Encoder).fastpathEncMapUintptrStringR, (*Decoder).fastpathDecMapUintptrStringR) - fn(map[uintptr]uint(nil), (*Encoder).fastpathEncMapUintptrUintR, (*Decoder).fastpathDecMapUintptrUintR) - fn(map[uintptr]uint8(nil), (*Encoder).fastpathEncMapUintptrUint8R, (*Decoder).fastpathDecMapUintptrUint8R) - fn(map[uintptr]uint16(nil), (*Encoder).fastpathEncMapUintptrUint16R, (*Decoder).fastpathDecMapUintptrUint16R) - fn(map[uintptr]uint32(nil), (*Encoder).fastpathEncMapUintptrUint32R, (*Decoder).fastpathDecMapUintptrUint32R) - fn(map[uintptr]uint64(nil), (*Encoder).fastpathEncMapUintptrUint64R, (*Decoder).fastpathDecMapUintptrUint64R) - fn(map[uintptr]uintptr(nil), (*Encoder).fastpathEncMapUintptrUintptrR, (*Decoder).fastpathDecMapUintptrUintptrR) - fn(map[uintptr]int(nil), (*Encoder).fastpathEncMapUintptrIntR, (*Decoder).fastpathDecMapUintptrIntR) - fn(map[uintptr]int8(nil), (*Encoder).fastpathEncMapUintptrInt8R, (*Decoder).fastpathDecMapUintptrInt8R) - fn(map[uintptr]int16(nil), (*Encoder).fastpathEncMapUintptrInt16R, (*Decoder).fastpathDecMapUintptrInt16R) - fn(map[uintptr]int32(nil), (*Encoder).fastpathEncMapUintptrInt32R, (*Decoder).fastpathDecMapUintptrInt32R) - fn(map[uintptr]int64(nil), (*Encoder).fastpathEncMapUintptrInt64R, (*Decoder).fastpathDecMapUintptrInt64R) - fn(map[uintptr]float32(nil), (*Encoder).fastpathEncMapUintptrFloat32R, (*Decoder).fastpathDecMapUintptrFloat32R) - fn(map[uintptr]float64(nil), (*Encoder).fastpathEncMapUintptrFloat64R, (*Decoder).fastpathDecMapUintptrFloat64R) - fn(map[uintptr]bool(nil), (*Encoder).fastpathEncMapUintptrBoolR, (*Decoder).fastpathDecMapUintptrBoolR) - fn(map[int]interface{}(nil), (*Encoder).fastpathEncMapIntIntfR, (*Decoder).fastpathDecMapIntIntfR) - fn(map[int]string(nil), (*Encoder).fastpathEncMapIntStringR, (*Decoder).fastpathDecMapIntStringR) - fn(map[int]uint(nil), (*Encoder).fastpathEncMapIntUintR, (*Decoder).fastpathDecMapIntUintR) - fn(map[int]uint8(nil), (*Encoder).fastpathEncMapIntUint8R, (*Decoder).fastpathDecMapIntUint8R) - fn(map[int]uint16(nil), (*Encoder).fastpathEncMapIntUint16R, (*Decoder).fastpathDecMapIntUint16R) - fn(map[int]uint32(nil), (*Encoder).fastpathEncMapIntUint32R, (*Decoder).fastpathDecMapIntUint32R) - fn(map[int]uint64(nil), (*Encoder).fastpathEncMapIntUint64R, (*Decoder).fastpathDecMapIntUint64R) - fn(map[int]uintptr(nil), (*Encoder).fastpathEncMapIntUintptrR, (*Decoder).fastpathDecMapIntUintptrR) - fn(map[int]int(nil), (*Encoder).fastpathEncMapIntIntR, (*Decoder).fastpathDecMapIntIntR) - fn(map[int]int8(nil), (*Encoder).fastpathEncMapIntInt8R, (*Decoder).fastpathDecMapIntInt8R) - fn(map[int]int16(nil), (*Encoder).fastpathEncMapIntInt16R, (*Decoder).fastpathDecMapIntInt16R) - fn(map[int]int32(nil), (*Encoder).fastpathEncMapIntInt32R, (*Decoder).fastpathDecMapIntInt32R) - fn(map[int]int64(nil), (*Encoder).fastpathEncMapIntInt64R, (*Decoder).fastpathDecMapIntInt64R) - fn(map[int]float32(nil), (*Encoder).fastpathEncMapIntFloat32R, (*Decoder).fastpathDecMapIntFloat32R) - fn(map[int]float64(nil), (*Encoder).fastpathEncMapIntFloat64R, (*Decoder).fastpathDecMapIntFloat64R) - fn(map[int]bool(nil), (*Encoder).fastpathEncMapIntBoolR, (*Decoder).fastpathDecMapIntBoolR) - fn(map[int8]interface{}(nil), (*Encoder).fastpathEncMapInt8IntfR, (*Decoder).fastpathDecMapInt8IntfR) - fn(map[int8]string(nil), (*Encoder).fastpathEncMapInt8StringR, (*Decoder).fastpathDecMapInt8StringR) - fn(map[int8]uint(nil), (*Encoder).fastpathEncMapInt8UintR, (*Decoder).fastpathDecMapInt8UintR) - fn(map[int8]uint8(nil), (*Encoder).fastpathEncMapInt8Uint8R, (*Decoder).fastpathDecMapInt8Uint8R) - fn(map[int8]uint16(nil), (*Encoder).fastpathEncMapInt8Uint16R, (*Decoder).fastpathDecMapInt8Uint16R) - fn(map[int8]uint32(nil), (*Encoder).fastpathEncMapInt8Uint32R, (*Decoder).fastpathDecMapInt8Uint32R) - fn(map[int8]uint64(nil), (*Encoder).fastpathEncMapInt8Uint64R, (*Decoder).fastpathDecMapInt8Uint64R) - fn(map[int8]uintptr(nil), (*Encoder).fastpathEncMapInt8UintptrR, (*Decoder).fastpathDecMapInt8UintptrR) - fn(map[int8]int(nil), (*Encoder).fastpathEncMapInt8IntR, (*Decoder).fastpathDecMapInt8IntR) - fn(map[int8]int8(nil), (*Encoder).fastpathEncMapInt8Int8R, (*Decoder).fastpathDecMapInt8Int8R) - fn(map[int8]int16(nil), (*Encoder).fastpathEncMapInt8Int16R, (*Decoder).fastpathDecMapInt8Int16R) - fn(map[int8]int32(nil), (*Encoder).fastpathEncMapInt8Int32R, (*Decoder).fastpathDecMapInt8Int32R) - fn(map[int8]int64(nil), (*Encoder).fastpathEncMapInt8Int64R, (*Decoder).fastpathDecMapInt8Int64R) - fn(map[int8]float32(nil), (*Encoder).fastpathEncMapInt8Float32R, (*Decoder).fastpathDecMapInt8Float32R) - fn(map[int8]float64(nil), (*Encoder).fastpathEncMapInt8Float64R, (*Decoder).fastpathDecMapInt8Float64R) - fn(map[int8]bool(nil), (*Encoder).fastpathEncMapInt8BoolR, (*Decoder).fastpathDecMapInt8BoolR) - fn(map[int16]interface{}(nil), (*Encoder).fastpathEncMapInt16IntfR, (*Decoder).fastpathDecMapInt16IntfR) - fn(map[int16]string(nil), (*Encoder).fastpathEncMapInt16StringR, (*Decoder).fastpathDecMapInt16StringR) - fn(map[int16]uint(nil), (*Encoder).fastpathEncMapInt16UintR, (*Decoder).fastpathDecMapInt16UintR) - fn(map[int16]uint8(nil), (*Encoder).fastpathEncMapInt16Uint8R, (*Decoder).fastpathDecMapInt16Uint8R) - fn(map[int16]uint16(nil), (*Encoder).fastpathEncMapInt16Uint16R, (*Decoder).fastpathDecMapInt16Uint16R) - fn(map[int16]uint32(nil), (*Encoder).fastpathEncMapInt16Uint32R, (*Decoder).fastpathDecMapInt16Uint32R) - fn(map[int16]uint64(nil), (*Encoder).fastpathEncMapInt16Uint64R, (*Decoder).fastpathDecMapInt16Uint64R) - fn(map[int16]uintptr(nil), (*Encoder).fastpathEncMapInt16UintptrR, (*Decoder).fastpathDecMapInt16UintptrR) - fn(map[int16]int(nil), (*Encoder).fastpathEncMapInt16IntR, (*Decoder).fastpathDecMapInt16IntR) - fn(map[int16]int8(nil), (*Encoder).fastpathEncMapInt16Int8R, (*Decoder).fastpathDecMapInt16Int8R) - fn(map[int16]int16(nil), (*Encoder).fastpathEncMapInt16Int16R, (*Decoder).fastpathDecMapInt16Int16R) - fn(map[int16]int32(nil), (*Encoder).fastpathEncMapInt16Int32R, (*Decoder).fastpathDecMapInt16Int32R) - fn(map[int16]int64(nil), (*Encoder).fastpathEncMapInt16Int64R, (*Decoder).fastpathDecMapInt16Int64R) - fn(map[int16]float32(nil), (*Encoder).fastpathEncMapInt16Float32R, (*Decoder).fastpathDecMapInt16Float32R) - fn(map[int16]float64(nil), (*Encoder).fastpathEncMapInt16Float64R, (*Decoder).fastpathDecMapInt16Float64R) - fn(map[int16]bool(nil), (*Encoder).fastpathEncMapInt16BoolR, (*Decoder).fastpathDecMapInt16BoolR) - fn(map[int32]interface{}(nil), (*Encoder).fastpathEncMapInt32IntfR, (*Decoder).fastpathDecMapInt32IntfR) - fn(map[int32]string(nil), (*Encoder).fastpathEncMapInt32StringR, (*Decoder).fastpathDecMapInt32StringR) - fn(map[int32]uint(nil), (*Encoder).fastpathEncMapInt32UintR, (*Decoder).fastpathDecMapInt32UintR) - fn(map[int32]uint8(nil), (*Encoder).fastpathEncMapInt32Uint8R, (*Decoder).fastpathDecMapInt32Uint8R) - fn(map[int32]uint16(nil), (*Encoder).fastpathEncMapInt32Uint16R, (*Decoder).fastpathDecMapInt32Uint16R) - fn(map[int32]uint32(nil), (*Encoder).fastpathEncMapInt32Uint32R, (*Decoder).fastpathDecMapInt32Uint32R) - fn(map[int32]uint64(nil), (*Encoder).fastpathEncMapInt32Uint64R, (*Decoder).fastpathDecMapInt32Uint64R) - fn(map[int32]uintptr(nil), (*Encoder).fastpathEncMapInt32UintptrR, (*Decoder).fastpathDecMapInt32UintptrR) - fn(map[int32]int(nil), (*Encoder).fastpathEncMapInt32IntR, (*Decoder).fastpathDecMapInt32IntR) - fn(map[int32]int8(nil), (*Encoder).fastpathEncMapInt32Int8R, (*Decoder).fastpathDecMapInt32Int8R) - fn(map[int32]int16(nil), (*Encoder).fastpathEncMapInt32Int16R, (*Decoder).fastpathDecMapInt32Int16R) - fn(map[int32]int32(nil), (*Encoder).fastpathEncMapInt32Int32R, (*Decoder).fastpathDecMapInt32Int32R) - fn(map[int32]int64(nil), (*Encoder).fastpathEncMapInt32Int64R, (*Decoder).fastpathDecMapInt32Int64R) - fn(map[int32]float32(nil), (*Encoder).fastpathEncMapInt32Float32R, (*Decoder).fastpathDecMapInt32Float32R) - fn(map[int32]float64(nil), (*Encoder).fastpathEncMapInt32Float64R, (*Decoder).fastpathDecMapInt32Float64R) - fn(map[int32]bool(nil), (*Encoder).fastpathEncMapInt32BoolR, (*Decoder).fastpathDecMapInt32BoolR) - fn(map[int64]interface{}(nil), (*Encoder).fastpathEncMapInt64IntfR, (*Decoder).fastpathDecMapInt64IntfR) - fn(map[int64]string(nil), (*Encoder).fastpathEncMapInt64StringR, (*Decoder).fastpathDecMapInt64StringR) - fn(map[int64]uint(nil), (*Encoder).fastpathEncMapInt64UintR, (*Decoder).fastpathDecMapInt64UintR) - fn(map[int64]uint8(nil), (*Encoder).fastpathEncMapInt64Uint8R, (*Decoder).fastpathDecMapInt64Uint8R) - fn(map[int64]uint16(nil), (*Encoder).fastpathEncMapInt64Uint16R, (*Decoder).fastpathDecMapInt64Uint16R) - fn(map[int64]uint32(nil), (*Encoder).fastpathEncMapInt64Uint32R, (*Decoder).fastpathDecMapInt64Uint32R) - fn(map[int64]uint64(nil), (*Encoder).fastpathEncMapInt64Uint64R, (*Decoder).fastpathDecMapInt64Uint64R) - fn(map[int64]uintptr(nil), (*Encoder).fastpathEncMapInt64UintptrR, (*Decoder).fastpathDecMapInt64UintptrR) - fn(map[int64]int(nil), (*Encoder).fastpathEncMapInt64IntR, (*Decoder).fastpathDecMapInt64IntR) - fn(map[int64]int8(nil), (*Encoder).fastpathEncMapInt64Int8R, (*Decoder).fastpathDecMapInt64Int8R) - fn(map[int64]int16(nil), (*Encoder).fastpathEncMapInt64Int16R, (*Decoder).fastpathDecMapInt64Int16R) - fn(map[int64]int32(nil), (*Encoder).fastpathEncMapInt64Int32R, (*Decoder).fastpathDecMapInt64Int32R) - fn(map[int64]int64(nil), (*Encoder).fastpathEncMapInt64Int64R, (*Decoder).fastpathDecMapInt64Int64R) - fn(map[int64]float32(nil), (*Encoder).fastpathEncMapInt64Float32R, (*Decoder).fastpathDecMapInt64Float32R) - fn(map[int64]float64(nil), (*Encoder).fastpathEncMapInt64Float64R, (*Decoder).fastpathDecMapInt64Float64R) - fn(map[int64]bool(nil), (*Encoder).fastpathEncMapInt64BoolR, (*Decoder).fastpathDecMapInt64BoolR) - fn(map[bool]interface{}(nil), (*Encoder).fastpathEncMapBoolIntfR, (*Decoder).fastpathDecMapBoolIntfR) - fn(map[bool]string(nil), (*Encoder).fastpathEncMapBoolStringR, (*Decoder).fastpathDecMapBoolStringR) - fn(map[bool]uint(nil), (*Encoder).fastpathEncMapBoolUintR, (*Decoder).fastpathDecMapBoolUintR) - fn(map[bool]uint8(nil), (*Encoder).fastpathEncMapBoolUint8R, (*Decoder).fastpathDecMapBoolUint8R) - fn(map[bool]uint16(nil), (*Encoder).fastpathEncMapBoolUint16R, (*Decoder).fastpathDecMapBoolUint16R) - fn(map[bool]uint32(nil), (*Encoder).fastpathEncMapBoolUint32R, (*Decoder).fastpathDecMapBoolUint32R) - fn(map[bool]uint64(nil), (*Encoder).fastpathEncMapBoolUint64R, (*Decoder).fastpathDecMapBoolUint64R) - fn(map[bool]uintptr(nil), (*Encoder).fastpathEncMapBoolUintptrR, (*Decoder).fastpathDecMapBoolUintptrR) - fn(map[bool]int(nil), (*Encoder).fastpathEncMapBoolIntR, (*Decoder).fastpathDecMapBoolIntR) - fn(map[bool]int8(nil), (*Encoder).fastpathEncMapBoolInt8R, (*Decoder).fastpathDecMapBoolInt8R) - fn(map[bool]int16(nil), (*Encoder).fastpathEncMapBoolInt16R, (*Decoder).fastpathDecMapBoolInt16R) - fn(map[bool]int32(nil), (*Encoder).fastpathEncMapBoolInt32R, (*Decoder).fastpathDecMapBoolInt32R) - fn(map[bool]int64(nil), (*Encoder).fastpathEncMapBoolInt64R, (*Decoder).fastpathDecMapBoolInt64R) - fn(map[bool]float32(nil), (*Encoder).fastpathEncMapBoolFloat32R, (*Decoder).fastpathDecMapBoolFloat32R) - fn(map[bool]float64(nil), (*Encoder).fastpathEncMapBoolFloat64R, (*Decoder).fastpathDecMapBoolFloat64R) - fn(map[bool]bool(nil), (*Encoder).fastpathEncMapBoolBoolR, (*Decoder).fastpathDecMapBoolBoolR) + fn([]interface{}(nil), (*encFnInfo).fastpathEncSliceIntfR, (*decFnInfo).fastpathDecSliceIntfR) + fn([]string(nil), (*encFnInfo).fastpathEncSliceStringR, (*decFnInfo).fastpathDecSliceStringR) + fn([]float32(nil), (*encFnInfo).fastpathEncSliceFloat32R, (*decFnInfo).fastpathDecSliceFloat32R) + fn([]float64(nil), (*encFnInfo).fastpathEncSliceFloat64R, (*decFnInfo).fastpathDecSliceFloat64R) + fn([]uint(nil), (*encFnInfo).fastpathEncSliceUintR, (*decFnInfo).fastpathDecSliceUintR) + fn([]uint16(nil), (*encFnInfo).fastpathEncSliceUint16R, (*decFnInfo).fastpathDecSliceUint16R) + fn([]uint32(nil), (*encFnInfo).fastpathEncSliceUint32R, (*decFnInfo).fastpathDecSliceUint32R) + fn([]uint64(nil), (*encFnInfo).fastpathEncSliceUint64R, (*decFnInfo).fastpathDecSliceUint64R) + fn([]uintptr(nil), (*encFnInfo).fastpathEncSliceUintptrR, (*decFnInfo).fastpathDecSliceUintptrR) + fn([]int(nil), (*encFnInfo).fastpathEncSliceIntR, (*decFnInfo).fastpathDecSliceIntR) + fn([]int8(nil), (*encFnInfo).fastpathEncSliceInt8R, (*decFnInfo).fastpathDecSliceInt8R) + fn([]int16(nil), (*encFnInfo).fastpathEncSliceInt16R, (*decFnInfo).fastpathDecSliceInt16R) + fn([]int32(nil), (*encFnInfo).fastpathEncSliceInt32R, (*decFnInfo).fastpathDecSliceInt32R) + fn([]int64(nil), (*encFnInfo).fastpathEncSliceInt64R, (*decFnInfo).fastpathDecSliceInt64R) + fn([]bool(nil), (*encFnInfo).fastpathEncSliceBoolR, (*decFnInfo).fastpathDecSliceBoolR) + + fn(map[interface{}]interface{}(nil), (*encFnInfo).fastpathEncMapIntfIntfR, (*decFnInfo).fastpathDecMapIntfIntfR) + fn(map[interface{}]string(nil), (*encFnInfo).fastpathEncMapIntfStringR, (*decFnInfo).fastpathDecMapIntfStringR) + fn(map[interface{}]uint(nil), (*encFnInfo).fastpathEncMapIntfUintR, (*decFnInfo).fastpathDecMapIntfUintR) + fn(map[interface{}]uint8(nil), (*encFnInfo).fastpathEncMapIntfUint8R, (*decFnInfo).fastpathDecMapIntfUint8R) + fn(map[interface{}]uint16(nil), (*encFnInfo).fastpathEncMapIntfUint16R, (*decFnInfo).fastpathDecMapIntfUint16R) + fn(map[interface{}]uint32(nil), (*encFnInfo).fastpathEncMapIntfUint32R, (*decFnInfo).fastpathDecMapIntfUint32R) + fn(map[interface{}]uint64(nil), (*encFnInfo).fastpathEncMapIntfUint64R, (*decFnInfo).fastpathDecMapIntfUint64R) + fn(map[interface{}]uintptr(nil), (*encFnInfo).fastpathEncMapIntfUintptrR, (*decFnInfo).fastpathDecMapIntfUintptrR) + fn(map[interface{}]int(nil), (*encFnInfo).fastpathEncMapIntfIntR, (*decFnInfo).fastpathDecMapIntfIntR) + fn(map[interface{}]int8(nil), (*encFnInfo).fastpathEncMapIntfInt8R, (*decFnInfo).fastpathDecMapIntfInt8R) + fn(map[interface{}]int16(nil), (*encFnInfo).fastpathEncMapIntfInt16R, (*decFnInfo).fastpathDecMapIntfInt16R) + fn(map[interface{}]int32(nil), (*encFnInfo).fastpathEncMapIntfInt32R, (*decFnInfo).fastpathDecMapIntfInt32R) + fn(map[interface{}]int64(nil), (*encFnInfo).fastpathEncMapIntfInt64R, (*decFnInfo).fastpathDecMapIntfInt64R) + fn(map[interface{}]float32(nil), (*encFnInfo).fastpathEncMapIntfFloat32R, (*decFnInfo).fastpathDecMapIntfFloat32R) + fn(map[interface{}]float64(nil), (*encFnInfo).fastpathEncMapIntfFloat64R, (*decFnInfo).fastpathDecMapIntfFloat64R) + fn(map[interface{}]bool(nil), (*encFnInfo).fastpathEncMapIntfBoolR, (*decFnInfo).fastpathDecMapIntfBoolR) + fn(map[string]interface{}(nil), (*encFnInfo).fastpathEncMapStringIntfR, (*decFnInfo).fastpathDecMapStringIntfR) + fn(map[string]string(nil), (*encFnInfo).fastpathEncMapStringStringR, (*decFnInfo).fastpathDecMapStringStringR) + fn(map[string]uint(nil), (*encFnInfo).fastpathEncMapStringUintR, (*decFnInfo).fastpathDecMapStringUintR) + fn(map[string]uint8(nil), (*encFnInfo).fastpathEncMapStringUint8R, (*decFnInfo).fastpathDecMapStringUint8R) + fn(map[string]uint16(nil), (*encFnInfo).fastpathEncMapStringUint16R, (*decFnInfo).fastpathDecMapStringUint16R) + fn(map[string]uint32(nil), (*encFnInfo).fastpathEncMapStringUint32R, (*decFnInfo).fastpathDecMapStringUint32R) + fn(map[string]uint64(nil), (*encFnInfo).fastpathEncMapStringUint64R, (*decFnInfo).fastpathDecMapStringUint64R) + fn(map[string]uintptr(nil), (*encFnInfo).fastpathEncMapStringUintptrR, (*decFnInfo).fastpathDecMapStringUintptrR) + fn(map[string]int(nil), (*encFnInfo).fastpathEncMapStringIntR, (*decFnInfo).fastpathDecMapStringIntR) + fn(map[string]int8(nil), (*encFnInfo).fastpathEncMapStringInt8R, (*decFnInfo).fastpathDecMapStringInt8R) + fn(map[string]int16(nil), (*encFnInfo).fastpathEncMapStringInt16R, (*decFnInfo).fastpathDecMapStringInt16R) + fn(map[string]int32(nil), (*encFnInfo).fastpathEncMapStringInt32R, (*decFnInfo).fastpathDecMapStringInt32R) + fn(map[string]int64(nil), (*encFnInfo).fastpathEncMapStringInt64R, (*decFnInfo).fastpathDecMapStringInt64R) + fn(map[string]float32(nil), (*encFnInfo).fastpathEncMapStringFloat32R, (*decFnInfo).fastpathDecMapStringFloat32R) + fn(map[string]float64(nil), (*encFnInfo).fastpathEncMapStringFloat64R, (*decFnInfo).fastpathDecMapStringFloat64R) + fn(map[string]bool(nil), (*encFnInfo).fastpathEncMapStringBoolR, (*decFnInfo).fastpathDecMapStringBoolR) + fn(map[float32]interface{}(nil), (*encFnInfo).fastpathEncMapFloat32IntfR, (*decFnInfo).fastpathDecMapFloat32IntfR) + fn(map[float32]string(nil), (*encFnInfo).fastpathEncMapFloat32StringR, (*decFnInfo).fastpathDecMapFloat32StringR) + fn(map[float32]uint(nil), (*encFnInfo).fastpathEncMapFloat32UintR, (*decFnInfo).fastpathDecMapFloat32UintR) + fn(map[float32]uint8(nil), (*encFnInfo).fastpathEncMapFloat32Uint8R, (*decFnInfo).fastpathDecMapFloat32Uint8R) + fn(map[float32]uint16(nil), (*encFnInfo).fastpathEncMapFloat32Uint16R, (*decFnInfo).fastpathDecMapFloat32Uint16R) + fn(map[float32]uint32(nil), (*encFnInfo).fastpathEncMapFloat32Uint32R, (*decFnInfo).fastpathDecMapFloat32Uint32R) + fn(map[float32]uint64(nil), (*encFnInfo).fastpathEncMapFloat32Uint64R, (*decFnInfo).fastpathDecMapFloat32Uint64R) + fn(map[float32]uintptr(nil), (*encFnInfo).fastpathEncMapFloat32UintptrR, (*decFnInfo).fastpathDecMapFloat32UintptrR) + fn(map[float32]int(nil), (*encFnInfo).fastpathEncMapFloat32IntR, (*decFnInfo).fastpathDecMapFloat32IntR) + fn(map[float32]int8(nil), (*encFnInfo).fastpathEncMapFloat32Int8R, (*decFnInfo).fastpathDecMapFloat32Int8R) + fn(map[float32]int16(nil), (*encFnInfo).fastpathEncMapFloat32Int16R, (*decFnInfo).fastpathDecMapFloat32Int16R) + fn(map[float32]int32(nil), (*encFnInfo).fastpathEncMapFloat32Int32R, (*decFnInfo).fastpathDecMapFloat32Int32R) + fn(map[float32]int64(nil), (*encFnInfo).fastpathEncMapFloat32Int64R, (*decFnInfo).fastpathDecMapFloat32Int64R) + fn(map[float32]float32(nil), (*encFnInfo).fastpathEncMapFloat32Float32R, (*decFnInfo).fastpathDecMapFloat32Float32R) + fn(map[float32]float64(nil), (*encFnInfo).fastpathEncMapFloat32Float64R, (*decFnInfo).fastpathDecMapFloat32Float64R) + fn(map[float32]bool(nil), (*encFnInfo).fastpathEncMapFloat32BoolR, (*decFnInfo).fastpathDecMapFloat32BoolR) + fn(map[float64]interface{}(nil), (*encFnInfo).fastpathEncMapFloat64IntfR, (*decFnInfo).fastpathDecMapFloat64IntfR) + fn(map[float64]string(nil), (*encFnInfo).fastpathEncMapFloat64StringR, (*decFnInfo).fastpathDecMapFloat64StringR) + fn(map[float64]uint(nil), (*encFnInfo).fastpathEncMapFloat64UintR, (*decFnInfo).fastpathDecMapFloat64UintR) + fn(map[float64]uint8(nil), (*encFnInfo).fastpathEncMapFloat64Uint8R, (*decFnInfo).fastpathDecMapFloat64Uint8R) + fn(map[float64]uint16(nil), (*encFnInfo).fastpathEncMapFloat64Uint16R, (*decFnInfo).fastpathDecMapFloat64Uint16R) + fn(map[float64]uint32(nil), (*encFnInfo).fastpathEncMapFloat64Uint32R, (*decFnInfo).fastpathDecMapFloat64Uint32R) + fn(map[float64]uint64(nil), (*encFnInfo).fastpathEncMapFloat64Uint64R, (*decFnInfo).fastpathDecMapFloat64Uint64R) + fn(map[float64]uintptr(nil), (*encFnInfo).fastpathEncMapFloat64UintptrR, (*decFnInfo).fastpathDecMapFloat64UintptrR) + fn(map[float64]int(nil), (*encFnInfo).fastpathEncMapFloat64IntR, (*decFnInfo).fastpathDecMapFloat64IntR) + fn(map[float64]int8(nil), (*encFnInfo).fastpathEncMapFloat64Int8R, (*decFnInfo).fastpathDecMapFloat64Int8R) + fn(map[float64]int16(nil), (*encFnInfo).fastpathEncMapFloat64Int16R, (*decFnInfo).fastpathDecMapFloat64Int16R) + fn(map[float64]int32(nil), (*encFnInfo).fastpathEncMapFloat64Int32R, (*decFnInfo).fastpathDecMapFloat64Int32R) + fn(map[float64]int64(nil), (*encFnInfo).fastpathEncMapFloat64Int64R, (*decFnInfo).fastpathDecMapFloat64Int64R) + fn(map[float64]float32(nil), (*encFnInfo).fastpathEncMapFloat64Float32R, (*decFnInfo).fastpathDecMapFloat64Float32R) + fn(map[float64]float64(nil), (*encFnInfo).fastpathEncMapFloat64Float64R, (*decFnInfo).fastpathDecMapFloat64Float64R) + fn(map[float64]bool(nil), (*encFnInfo).fastpathEncMapFloat64BoolR, (*decFnInfo).fastpathDecMapFloat64BoolR) + fn(map[uint]interface{}(nil), (*encFnInfo).fastpathEncMapUintIntfR, (*decFnInfo).fastpathDecMapUintIntfR) + fn(map[uint]string(nil), (*encFnInfo).fastpathEncMapUintStringR, (*decFnInfo).fastpathDecMapUintStringR) + fn(map[uint]uint(nil), (*encFnInfo).fastpathEncMapUintUintR, (*decFnInfo).fastpathDecMapUintUintR) + fn(map[uint]uint8(nil), (*encFnInfo).fastpathEncMapUintUint8R, (*decFnInfo).fastpathDecMapUintUint8R) + fn(map[uint]uint16(nil), (*encFnInfo).fastpathEncMapUintUint16R, (*decFnInfo).fastpathDecMapUintUint16R) + fn(map[uint]uint32(nil), (*encFnInfo).fastpathEncMapUintUint32R, (*decFnInfo).fastpathDecMapUintUint32R) + fn(map[uint]uint64(nil), (*encFnInfo).fastpathEncMapUintUint64R, (*decFnInfo).fastpathDecMapUintUint64R) + fn(map[uint]uintptr(nil), (*encFnInfo).fastpathEncMapUintUintptrR, (*decFnInfo).fastpathDecMapUintUintptrR) + fn(map[uint]int(nil), (*encFnInfo).fastpathEncMapUintIntR, (*decFnInfo).fastpathDecMapUintIntR) + fn(map[uint]int8(nil), (*encFnInfo).fastpathEncMapUintInt8R, (*decFnInfo).fastpathDecMapUintInt8R) + fn(map[uint]int16(nil), (*encFnInfo).fastpathEncMapUintInt16R, (*decFnInfo).fastpathDecMapUintInt16R) + fn(map[uint]int32(nil), (*encFnInfo).fastpathEncMapUintInt32R, (*decFnInfo).fastpathDecMapUintInt32R) + fn(map[uint]int64(nil), (*encFnInfo).fastpathEncMapUintInt64R, (*decFnInfo).fastpathDecMapUintInt64R) + fn(map[uint]float32(nil), (*encFnInfo).fastpathEncMapUintFloat32R, (*decFnInfo).fastpathDecMapUintFloat32R) + fn(map[uint]float64(nil), (*encFnInfo).fastpathEncMapUintFloat64R, (*decFnInfo).fastpathDecMapUintFloat64R) + fn(map[uint]bool(nil), (*encFnInfo).fastpathEncMapUintBoolR, (*decFnInfo).fastpathDecMapUintBoolR) + fn(map[uint8]interface{}(nil), (*encFnInfo).fastpathEncMapUint8IntfR, (*decFnInfo).fastpathDecMapUint8IntfR) + fn(map[uint8]string(nil), (*encFnInfo).fastpathEncMapUint8StringR, (*decFnInfo).fastpathDecMapUint8StringR) + fn(map[uint8]uint(nil), (*encFnInfo).fastpathEncMapUint8UintR, (*decFnInfo).fastpathDecMapUint8UintR) + fn(map[uint8]uint8(nil), (*encFnInfo).fastpathEncMapUint8Uint8R, (*decFnInfo).fastpathDecMapUint8Uint8R) + fn(map[uint8]uint16(nil), (*encFnInfo).fastpathEncMapUint8Uint16R, (*decFnInfo).fastpathDecMapUint8Uint16R) + fn(map[uint8]uint32(nil), (*encFnInfo).fastpathEncMapUint8Uint32R, (*decFnInfo).fastpathDecMapUint8Uint32R) + fn(map[uint8]uint64(nil), (*encFnInfo).fastpathEncMapUint8Uint64R, (*decFnInfo).fastpathDecMapUint8Uint64R) + fn(map[uint8]uintptr(nil), (*encFnInfo).fastpathEncMapUint8UintptrR, (*decFnInfo).fastpathDecMapUint8UintptrR) + fn(map[uint8]int(nil), (*encFnInfo).fastpathEncMapUint8IntR, (*decFnInfo).fastpathDecMapUint8IntR) + fn(map[uint8]int8(nil), (*encFnInfo).fastpathEncMapUint8Int8R, (*decFnInfo).fastpathDecMapUint8Int8R) + fn(map[uint8]int16(nil), (*encFnInfo).fastpathEncMapUint8Int16R, (*decFnInfo).fastpathDecMapUint8Int16R) + fn(map[uint8]int32(nil), (*encFnInfo).fastpathEncMapUint8Int32R, (*decFnInfo).fastpathDecMapUint8Int32R) + fn(map[uint8]int64(nil), (*encFnInfo).fastpathEncMapUint8Int64R, (*decFnInfo).fastpathDecMapUint8Int64R) + fn(map[uint8]float32(nil), (*encFnInfo).fastpathEncMapUint8Float32R, (*decFnInfo).fastpathDecMapUint8Float32R) + fn(map[uint8]float64(nil), (*encFnInfo).fastpathEncMapUint8Float64R, (*decFnInfo).fastpathDecMapUint8Float64R) + fn(map[uint8]bool(nil), (*encFnInfo).fastpathEncMapUint8BoolR, (*decFnInfo).fastpathDecMapUint8BoolR) + fn(map[uint16]interface{}(nil), (*encFnInfo).fastpathEncMapUint16IntfR, (*decFnInfo).fastpathDecMapUint16IntfR) + fn(map[uint16]string(nil), (*encFnInfo).fastpathEncMapUint16StringR, (*decFnInfo).fastpathDecMapUint16StringR) + fn(map[uint16]uint(nil), (*encFnInfo).fastpathEncMapUint16UintR, (*decFnInfo).fastpathDecMapUint16UintR) + fn(map[uint16]uint8(nil), (*encFnInfo).fastpathEncMapUint16Uint8R, (*decFnInfo).fastpathDecMapUint16Uint8R) + fn(map[uint16]uint16(nil), (*encFnInfo).fastpathEncMapUint16Uint16R, (*decFnInfo).fastpathDecMapUint16Uint16R) + fn(map[uint16]uint32(nil), (*encFnInfo).fastpathEncMapUint16Uint32R, (*decFnInfo).fastpathDecMapUint16Uint32R) + fn(map[uint16]uint64(nil), (*encFnInfo).fastpathEncMapUint16Uint64R, (*decFnInfo).fastpathDecMapUint16Uint64R) + fn(map[uint16]uintptr(nil), (*encFnInfo).fastpathEncMapUint16UintptrR, (*decFnInfo).fastpathDecMapUint16UintptrR) + fn(map[uint16]int(nil), (*encFnInfo).fastpathEncMapUint16IntR, (*decFnInfo).fastpathDecMapUint16IntR) + fn(map[uint16]int8(nil), (*encFnInfo).fastpathEncMapUint16Int8R, (*decFnInfo).fastpathDecMapUint16Int8R) + fn(map[uint16]int16(nil), (*encFnInfo).fastpathEncMapUint16Int16R, (*decFnInfo).fastpathDecMapUint16Int16R) + fn(map[uint16]int32(nil), (*encFnInfo).fastpathEncMapUint16Int32R, (*decFnInfo).fastpathDecMapUint16Int32R) + fn(map[uint16]int64(nil), (*encFnInfo).fastpathEncMapUint16Int64R, (*decFnInfo).fastpathDecMapUint16Int64R) + fn(map[uint16]float32(nil), (*encFnInfo).fastpathEncMapUint16Float32R, (*decFnInfo).fastpathDecMapUint16Float32R) + fn(map[uint16]float64(nil), (*encFnInfo).fastpathEncMapUint16Float64R, (*decFnInfo).fastpathDecMapUint16Float64R) + fn(map[uint16]bool(nil), (*encFnInfo).fastpathEncMapUint16BoolR, (*decFnInfo).fastpathDecMapUint16BoolR) + fn(map[uint32]interface{}(nil), (*encFnInfo).fastpathEncMapUint32IntfR, (*decFnInfo).fastpathDecMapUint32IntfR) + fn(map[uint32]string(nil), (*encFnInfo).fastpathEncMapUint32StringR, (*decFnInfo).fastpathDecMapUint32StringR) + fn(map[uint32]uint(nil), (*encFnInfo).fastpathEncMapUint32UintR, (*decFnInfo).fastpathDecMapUint32UintR) + fn(map[uint32]uint8(nil), (*encFnInfo).fastpathEncMapUint32Uint8R, (*decFnInfo).fastpathDecMapUint32Uint8R) + fn(map[uint32]uint16(nil), (*encFnInfo).fastpathEncMapUint32Uint16R, (*decFnInfo).fastpathDecMapUint32Uint16R) + fn(map[uint32]uint32(nil), (*encFnInfo).fastpathEncMapUint32Uint32R, (*decFnInfo).fastpathDecMapUint32Uint32R) + fn(map[uint32]uint64(nil), (*encFnInfo).fastpathEncMapUint32Uint64R, (*decFnInfo).fastpathDecMapUint32Uint64R) + fn(map[uint32]uintptr(nil), (*encFnInfo).fastpathEncMapUint32UintptrR, (*decFnInfo).fastpathDecMapUint32UintptrR) + fn(map[uint32]int(nil), (*encFnInfo).fastpathEncMapUint32IntR, (*decFnInfo).fastpathDecMapUint32IntR) + fn(map[uint32]int8(nil), (*encFnInfo).fastpathEncMapUint32Int8R, (*decFnInfo).fastpathDecMapUint32Int8R) + fn(map[uint32]int16(nil), (*encFnInfo).fastpathEncMapUint32Int16R, (*decFnInfo).fastpathDecMapUint32Int16R) + fn(map[uint32]int32(nil), (*encFnInfo).fastpathEncMapUint32Int32R, (*decFnInfo).fastpathDecMapUint32Int32R) + fn(map[uint32]int64(nil), (*encFnInfo).fastpathEncMapUint32Int64R, (*decFnInfo).fastpathDecMapUint32Int64R) + fn(map[uint32]float32(nil), (*encFnInfo).fastpathEncMapUint32Float32R, (*decFnInfo).fastpathDecMapUint32Float32R) + fn(map[uint32]float64(nil), (*encFnInfo).fastpathEncMapUint32Float64R, (*decFnInfo).fastpathDecMapUint32Float64R) + fn(map[uint32]bool(nil), (*encFnInfo).fastpathEncMapUint32BoolR, (*decFnInfo).fastpathDecMapUint32BoolR) + fn(map[uint64]interface{}(nil), (*encFnInfo).fastpathEncMapUint64IntfR, (*decFnInfo).fastpathDecMapUint64IntfR) + fn(map[uint64]string(nil), (*encFnInfo).fastpathEncMapUint64StringR, (*decFnInfo).fastpathDecMapUint64StringR) + fn(map[uint64]uint(nil), (*encFnInfo).fastpathEncMapUint64UintR, (*decFnInfo).fastpathDecMapUint64UintR) + fn(map[uint64]uint8(nil), (*encFnInfo).fastpathEncMapUint64Uint8R, (*decFnInfo).fastpathDecMapUint64Uint8R) + fn(map[uint64]uint16(nil), (*encFnInfo).fastpathEncMapUint64Uint16R, (*decFnInfo).fastpathDecMapUint64Uint16R) + fn(map[uint64]uint32(nil), (*encFnInfo).fastpathEncMapUint64Uint32R, (*decFnInfo).fastpathDecMapUint64Uint32R) + fn(map[uint64]uint64(nil), (*encFnInfo).fastpathEncMapUint64Uint64R, (*decFnInfo).fastpathDecMapUint64Uint64R) + fn(map[uint64]uintptr(nil), (*encFnInfo).fastpathEncMapUint64UintptrR, (*decFnInfo).fastpathDecMapUint64UintptrR) + fn(map[uint64]int(nil), (*encFnInfo).fastpathEncMapUint64IntR, (*decFnInfo).fastpathDecMapUint64IntR) + fn(map[uint64]int8(nil), (*encFnInfo).fastpathEncMapUint64Int8R, (*decFnInfo).fastpathDecMapUint64Int8R) + fn(map[uint64]int16(nil), (*encFnInfo).fastpathEncMapUint64Int16R, (*decFnInfo).fastpathDecMapUint64Int16R) + fn(map[uint64]int32(nil), (*encFnInfo).fastpathEncMapUint64Int32R, (*decFnInfo).fastpathDecMapUint64Int32R) + fn(map[uint64]int64(nil), (*encFnInfo).fastpathEncMapUint64Int64R, (*decFnInfo).fastpathDecMapUint64Int64R) + fn(map[uint64]float32(nil), (*encFnInfo).fastpathEncMapUint64Float32R, (*decFnInfo).fastpathDecMapUint64Float32R) + fn(map[uint64]float64(nil), (*encFnInfo).fastpathEncMapUint64Float64R, (*decFnInfo).fastpathDecMapUint64Float64R) + fn(map[uint64]bool(nil), (*encFnInfo).fastpathEncMapUint64BoolR, (*decFnInfo).fastpathDecMapUint64BoolR) + fn(map[uintptr]interface{}(nil), (*encFnInfo).fastpathEncMapUintptrIntfR, (*decFnInfo).fastpathDecMapUintptrIntfR) + fn(map[uintptr]string(nil), (*encFnInfo).fastpathEncMapUintptrStringR, (*decFnInfo).fastpathDecMapUintptrStringR) + fn(map[uintptr]uint(nil), (*encFnInfo).fastpathEncMapUintptrUintR, (*decFnInfo).fastpathDecMapUintptrUintR) + fn(map[uintptr]uint8(nil), (*encFnInfo).fastpathEncMapUintptrUint8R, (*decFnInfo).fastpathDecMapUintptrUint8R) + fn(map[uintptr]uint16(nil), (*encFnInfo).fastpathEncMapUintptrUint16R, (*decFnInfo).fastpathDecMapUintptrUint16R) + fn(map[uintptr]uint32(nil), (*encFnInfo).fastpathEncMapUintptrUint32R, (*decFnInfo).fastpathDecMapUintptrUint32R) + fn(map[uintptr]uint64(nil), (*encFnInfo).fastpathEncMapUintptrUint64R, (*decFnInfo).fastpathDecMapUintptrUint64R) + fn(map[uintptr]uintptr(nil), (*encFnInfo).fastpathEncMapUintptrUintptrR, (*decFnInfo).fastpathDecMapUintptrUintptrR) + fn(map[uintptr]int(nil), (*encFnInfo).fastpathEncMapUintptrIntR, (*decFnInfo).fastpathDecMapUintptrIntR) + fn(map[uintptr]int8(nil), (*encFnInfo).fastpathEncMapUintptrInt8R, (*decFnInfo).fastpathDecMapUintptrInt8R) + fn(map[uintptr]int16(nil), (*encFnInfo).fastpathEncMapUintptrInt16R, (*decFnInfo).fastpathDecMapUintptrInt16R) + fn(map[uintptr]int32(nil), (*encFnInfo).fastpathEncMapUintptrInt32R, (*decFnInfo).fastpathDecMapUintptrInt32R) + fn(map[uintptr]int64(nil), (*encFnInfo).fastpathEncMapUintptrInt64R, (*decFnInfo).fastpathDecMapUintptrInt64R) + fn(map[uintptr]float32(nil), (*encFnInfo).fastpathEncMapUintptrFloat32R, (*decFnInfo).fastpathDecMapUintptrFloat32R) + fn(map[uintptr]float64(nil), (*encFnInfo).fastpathEncMapUintptrFloat64R, (*decFnInfo).fastpathDecMapUintptrFloat64R) + fn(map[uintptr]bool(nil), (*encFnInfo).fastpathEncMapUintptrBoolR, (*decFnInfo).fastpathDecMapUintptrBoolR) + fn(map[int]interface{}(nil), (*encFnInfo).fastpathEncMapIntIntfR, (*decFnInfo).fastpathDecMapIntIntfR) + fn(map[int]string(nil), (*encFnInfo).fastpathEncMapIntStringR, (*decFnInfo).fastpathDecMapIntStringR) + fn(map[int]uint(nil), (*encFnInfo).fastpathEncMapIntUintR, (*decFnInfo).fastpathDecMapIntUintR) + fn(map[int]uint8(nil), (*encFnInfo).fastpathEncMapIntUint8R, (*decFnInfo).fastpathDecMapIntUint8R) + fn(map[int]uint16(nil), (*encFnInfo).fastpathEncMapIntUint16R, (*decFnInfo).fastpathDecMapIntUint16R) + fn(map[int]uint32(nil), (*encFnInfo).fastpathEncMapIntUint32R, (*decFnInfo).fastpathDecMapIntUint32R) + fn(map[int]uint64(nil), (*encFnInfo).fastpathEncMapIntUint64R, (*decFnInfo).fastpathDecMapIntUint64R) + fn(map[int]uintptr(nil), (*encFnInfo).fastpathEncMapIntUintptrR, (*decFnInfo).fastpathDecMapIntUintptrR) + fn(map[int]int(nil), (*encFnInfo).fastpathEncMapIntIntR, (*decFnInfo).fastpathDecMapIntIntR) + fn(map[int]int8(nil), (*encFnInfo).fastpathEncMapIntInt8R, (*decFnInfo).fastpathDecMapIntInt8R) + fn(map[int]int16(nil), (*encFnInfo).fastpathEncMapIntInt16R, (*decFnInfo).fastpathDecMapIntInt16R) + fn(map[int]int32(nil), (*encFnInfo).fastpathEncMapIntInt32R, (*decFnInfo).fastpathDecMapIntInt32R) + fn(map[int]int64(nil), (*encFnInfo).fastpathEncMapIntInt64R, (*decFnInfo).fastpathDecMapIntInt64R) + fn(map[int]float32(nil), (*encFnInfo).fastpathEncMapIntFloat32R, (*decFnInfo).fastpathDecMapIntFloat32R) + fn(map[int]float64(nil), (*encFnInfo).fastpathEncMapIntFloat64R, (*decFnInfo).fastpathDecMapIntFloat64R) + fn(map[int]bool(nil), (*encFnInfo).fastpathEncMapIntBoolR, (*decFnInfo).fastpathDecMapIntBoolR) + fn(map[int8]interface{}(nil), (*encFnInfo).fastpathEncMapInt8IntfR, (*decFnInfo).fastpathDecMapInt8IntfR) + fn(map[int8]string(nil), (*encFnInfo).fastpathEncMapInt8StringR, (*decFnInfo).fastpathDecMapInt8StringR) + fn(map[int8]uint(nil), (*encFnInfo).fastpathEncMapInt8UintR, (*decFnInfo).fastpathDecMapInt8UintR) + fn(map[int8]uint8(nil), (*encFnInfo).fastpathEncMapInt8Uint8R, (*decFnInfo).fastpathDecMapInt8Uint8R) + fn(map[int8]uint16(nil), (*encFnInfo).fastpathEncMapInt8Uint16R, (*decFnInfo).fastpathDecMapInt8Uint16R) + fn(map[int8]uint32(nil), (*encFnInfo).fastpathEncMapInt8Uint32R, (*decFnInfo).fastpathDecMapInt8Uint32R) + fn(map[int8]uint64(nil), (*encFnInfo).fastpathEncMapInt8Uint64R, (*decFnInfo).fastpathDecMapInt8Uint64R) + fn(map[int8]uintptr(nil), (*encFnInfo).fastpathEncMapInt8UintptrR, (*decFnInfo).fastpathDecMapInt8UintptrR) + fn(map[int8]int(nil), (*encFnInfo).fastpathEncMapInt8IntR, (*decFnInfo).fastpathDecMapInt8IntR) + fn(map[int8]int8(nil), (*encFnInfo).fastpathEncMapInt8Int8R, (*decFnInfo).fastpathDecMapInt8Int8R) + fn(map[int8]int16(nil), (*encFnInfo).fastpathEncMapInt8Int16R, (*decFnInfo).fastpathDecMapInt8Int16R) + fn(map[int8]int32(nil), (*encFnInfo).fastpathEncMapInt8Int32R, (*decFnInfo).fastpathDecMapInt8Int32R) + fn(map[int8]int64(nil), (*encFnInfo).fastpathEncMapInt8Int64R, (*decFnInfo).fastpathDecMapInt8Int64R) + fn(map[int8]float32(nil), (*encFnInfo).fastpathEncMapInt8Float32R, (*decFnInfo).fastpathDecMapInt8Float32R) + fn(map[int8]float64(nil), (*encFnInfo).fastpathEncMapInt8Float64R, (*decFnInfo).fastpathDecMapInt8Float64R) + fn(map[int8]bool(nil), (*encFnInfo).fastpathEncMapInt8BoolR, (*decFnInfo).fastpathDecMapInt8BoolR) + fn(map[int16]interface{}(nil), (*encFnInfo).fastpathEncMapInt16IntfR, (*decFnInfo).fastpathDecMapInt16IntfR) + fn(map[int16]string(nil), (*encFnInfo).fastpathEncMapInt16StringR, (*decFnInfo).fastpathDecMapInt16StringR) + fn(map[int16]uint(nil), (*encFnInfo).fastpathEncMapInt16UintR, (*decFnInfo).fastpathDecMapInt16UintR) + fn(map[int16]uint8(nil), (*encFnInfo).fastpathEncMapInt16Uint8R, (*decFnInfo).fastpathDecMapInt16Uint8R) + fn(map[int16]uint16(nil), (*encFnInfo).fastpathEncMapInt16Uint16R, (*decFnInfo).fastpathDecMapInt16Uint16R) + fn(map[int16]uint32(nil), (*encFnInfo).fastpathEncMapInt16Uint32R, (*decFnInfo).fastpathDecMapInt16Uint32R) + fn(map[int16]uint64(nil), (*encFnInfo).fastpathEncMapInt16Uint64R, (*decFnInfo).fastpathDecMapInt16Uint64R) + fn(map[int16]uintptr(nil), (*encFnInfo).fastpathEncMapInt16UintptrR, (*decFnInfo).fastpathDecMapInt16UintptrR) + fn(map[int16]int(nil), (*encFnInfo).fastpathEncMapInt16IntR, (*decFnInfo).fastpathDecMapInt16IntR) + fn(map[int16]int8(nil), (*encFnInfo).fastpathEncMapInt16Int8R, (*decFnInfo).fastpathDecMapInt16Int8R) + fn(map[int16]int16(nil), (*encFnInfo).fastpathEncMapInt16Int16R, (*decFnInfo).fastpathDecMapInt16Int16R) + fn(map[int16]int32(nil), (*encFnInfo).fastpathEncMapInt16Int32R, (*decFnInfo).fastpathDecMapInt16Int32R) + fn(map[int16]int64(nil), (*encFnInfo).fastpathEncMapInt16Int64R, (*decFnInfo).fastpathDecMapInt16Int64R) + fn(map[int16]float32(nil), (*encFnInfo).fastpathEncMapInt16Float32R, (*decFnInfo).fastpathDecMapInt16Float32R) + fn(map[int16]float64(nil), (*encFnInfo).fastpathEncMapInt16Float64R, (*decFnInfo).fastpathDecMapInt16Float64R) + fn(map[int16]bool(nil), (*encFnInfo).fastpathEncMapInt16BoolR, (*decFnInfo).fastpathDecMapInt16BoolR) + fn(map[int32]interface{}(nil), (*encFnInfo).fastpathEncMapInt32IntfR, (*decFnInfo).fastpathDecMapInt32IntfR) + fn(map[int32]string(nil), (*encFnInfo).fastpathEncMapInt32StringR, (*decFnInfo).fastpathDecMapInt32StringR) + fn(map[int32]uint(nil), (*encFnInfo).fastpathEncMapInt32UintR, (*decFnInfo).fastpathDecMapInt32UintR) + fn(map[int32]uint8(nil), (*encFnInfo).fastpathEncMapInt32Uint8R, (*decFnInfo).fastpathDecMapInt32Uint8R) + fn(map[int32]uint16(nil), (*encFnInfo).fastpathEncMapInt32Uint16R, (*decFnInfo).fastpathDecMapInt32Uint16R) + fn(map[int32]uint32(nil), (*encFnInfo).fastpathEncMapInt32Uint32R, (*decFnInfo).fastpathDecMapInt32Uint32R) + fn(map[int32]uint64(nil), (*encFnInfo).fastpathEncMapInt32Uint64R, (*decFnInfo).fastpathDecMapInt32Uint64R) + fn(map[int32]uintptr(nil), (*encFnInfo).fastpathEncMapInt32UintptrR, (*decFnInfo).fastpathDecMapInt32UintptrR) + fn(map[int32]int(nil), (*encFnInfo).fastpathEncMapInt32IntR, (*decFnInfo).fastpathDecMapInt32IntR) + fn(map[int32]int8(nil), (*encFnInfo).fastpathEncMapInt32Int8R, (*decFnInfo).fastpathDecMapInt32Int8R) + fn(map[int32]int16(nil), (*encFnInfo).fastpathEncMapInt32Int16R, (*decFnInfo).fastpathDecMapInt32Int16R) + fn(map[int32]int32(nil), (*encFnInfo).fastpathEncMapInt32Int32R, (*decFnInfo).fastpathDecMapInt32Int32R) + fn(map[int32]int64(nil), (*encFnInfo).fastpathEncMapInt32Int64R, (*decFnInfo).fastpathDecMapInt32Int64R) + fn(map[int32]float32(nil), (*encFnInfo).fastpathEncMapInt32Float32R, (*decFnInfo).fastpathDecMapInt32Float32R) + fn(map[int32]float64(nil), (*encFnInfo).fastpathEncMapInt32Float64R, (*decFnInfo).fastpathDecMapInt32Float64R) + fn(map[int32]bool(nil), (*encFnInfo).fastpathEncMapInt32BoolR, (*decFnInfo).fastpathDecMapInt32BoolR) + fn(map[int64]interface{}(nil), (*encFnInfo).fastpathEncMapInt64IntfR, (*decFnInfo).fastpathDecMapInt64IntfR) + fn(map[int64]string(nil), (*encFnInfo).fastpathEncMapInt64StringR, (*decFnInfo).fastpathDecMapInt64StringR) + fn(map[int64]uint(nil), (*encFnInfo).fastpathEncMapInt64UintR, (*decFnInfo).fastpathDecMapInt64UintR) + fn(map[int64]uint8(nil), (*encFnInfo).fastpathEncMapInt64Uint8R, (*decFnInfo).fastpathDecMapInt64Uint8R) + fn(map[int64]uint16(nil), (*encFnInfo).fastpathEncMapInt64Uint16R, (*decFnInfo).fastpathDecMapInt64Uint16R) + fn(map[int64]uint32(nil), (*encFnInfo).fastpathEncMapInt64Uint32R, (*decFnInfo).fastpathDecMapInt64Uint32R) + fn(map[int64]uint64(nil), (*encFnInfo).fastpathEncMapInt64Uint64R, (*decFnInfo).fastpathDecMapInt64Uint64R) + fn(map[int64]uintptr(nil), (*encFnInfo).fastpathEncMapInt64UintptrR, (*decFnInfo).fastpathDecMapInt64UintptrR) + fn(map[int64]int(nil), (*encFnInfo).fastpathEncMapInt64IntR, (*decFnInfo).fastpathDecMapInt64IntR) + fn(map[int64]int8(nil), (*encFnInfo).fastpathEncMapInt64Int8R, (*decFnInfo).fastpathDecMapInt64Int8R) + fn(map[int64]int16(nil), (*encFnInfo).fastpathEncMapInt64Int16R, (*decFnInfo).fastpathDecMapInt64Int16R) + fn(map[int64]int32(nil), (*encFnInfo).fastpathEncMapInt64Int32R, (*decFnInfo).fastpathDecMapInt64Int32R) + fn(map[int64]int64(nil), (*encFnInfo).fastpathEncMapInt64Int64R, (*decFnInfo).fastpathDecMapInt64Int64R) + fn(map[int64]float32(nil), (*encFnInfo).fastpathEncMapInt64Float32R, (*decFnInfo).fastpathDecMapInt64Float32R) + fn(map[int64]float64(nil), (*encFnInfo).fastpathEncMapInt64Float64R, (*decFnInfo).fastpathDecMapInt64Float64R) + fn(map[int64]bool(nil), (*encFnInfo).fastpathEncMapInt64BoolR, (*decFnInfo).fastpathDecMapInt64BoolR) + fn(map[bool]interface{}(nil), (*encFnInfo).fastpathEncMapBoolIntfR, (*decFnInfo).fastpathDecMapBoolIntfR) + fn(map[bool]string(nil), (*encFnInfo).fastpathEncMapBoolStringR, (*decFnInfo).fastpathDecMapBoolStringR) + fn(map[bool]uint(nil), (*encFnInfo).fastpathEncMapBoolUintR, (*decFnInfo).fastpathDecMapBoolUintR) + fn(map[bool]uint8(nil), (*encFnInfo).fastpathEncMapBoolUint8R, (*decFnInfo).fastpathDecMapBoolUint8R) + fn(map[bool]uint16(nil), (*encFnInfo).fastpathEncMapBoolUint16R, (*decFnInfo).fastpathDecMapBoolUint16R) + fn(map[bool]uint32(nil), (*encFnInfo).fastpathEncMapBoolUint32R, (*decFnInfo).fastpathDecMapBoolUint32R) + fn(map[bool]uint64(nil), (*encFnInfo).fastpathEncMapBoolUint64R, (*decFnInfo).fastpathDecMapBoolUint64R) + fn(map[bool]uintptr(nil), (*encFnInfo).fastpathEncMapBoolUintptrR, (*decFnInfo).fastpathDecMapBoolUintptrR) + fn(map[bool]int(nil), (*encFnInfo).fastpathEncMapBoolIntR, (*decFnInfo).fastpathDecMapBoolIntR) + fn(map[bool]int8(nil), (*encFnInfo).fastpathEncMapBoolInt8R, (*decFnInfo).fastpathDecMapBoolInt8R) + fn(map[bool]int16(nil), (*encFnInfo).fastpathEncMapBoolInt16R, (*decFnInfo).fastpathDecMapBoolInt16R) + fn(map[bool]int32(nil), (*encFnInfo).fastpathEncMapBoolInt32R, (*decFnInfo).fastpathDecMapBoolInt32R) + fn(map[bool]int64(nil), (*encFnInfo).fastpathEncMapBoolInt64R, (*decFnInfo).fastpathDecMapBoolInt64R) + fn(map[bool]float32(nil), (*encFnInfo).fastpathEncMapBoolFloat32R, (*decFnInfo).fastpathDecMapBoolFloat32R) + fn(map[bool]float64(nil), (*encFnInfo).fastpathEncMapBoolFloat64R, (*decFnInfo).fastpathDecMapBoolFloat64R) + fn(map[bool]bool(nil), (*encFnInfo).fastpathEncMapBoolBoolR, (*decFnInfo).fastpathDecMapBoolBoolR) sort.Sort(fastpathAslice(fastpathAV[:])) } @@ -371,8098 +375,6750 @@ func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { switch v := iv.(type) { case []interface{}: - fastpathTV.EncSliceIntfV(v, e) + fastpathTV.EncSliceIntfV(v, fastpathCheckNilTrue, e) case *[]interface{}: - fastpathTV.EncSliceIntfV(*v, e) - case []string: - fastpathTV.EncSliceStringV(v, e) - case *[]string: - fastpathTV.EncSliceStringV(*v, e) - case []float32: - fastpathTV.EncSliceFloat32V(v, e) - case *[]float32: - fastpathTV.EncSliceFloat32V(*v, e) - case []float64: - fastpathTV.EncSliceFloat64V(v, e) - case *[]float64: - fastpathTV.EncSliceFloat64V(*v, e) - case []uint: - fastpathTV.EncSliceUintV(v, e) - case *[]uint: - fastpathTV.EncSliceUintV(*v, e) - case []uint16: - fastpathTV.EncSliceUint16V(v, e) - case *[]uint16: - fastpathTV.EncSliceUint16V(*v, e) - case []uint32: - fastpathTV.EncSliceUint32V(v, e) - case *[]uint32: - fastpathTV.EncSliceUint32V(*v, e) - case []uint64: - fastpathTV.EncSliceUint64V(v, e) - case *[]uint64: - fastpathTV.EncSliceUint64V(*v, e) - case []uintptr: - fastpathTV.EncSliceUintptrV(v, e) - case *[]uintptr: - fastpathTV.EncSliceUintptrV(*v, e) - case []int: - fastpathTV.EncSliceIntV(v, e) - case *[]int: - fastpathTV.EncSliceIntV(*v, e) - case []int8: - fastpathTV.EncSliceInt8V(v, e) - case *[]int8: - fastpathTV.EncSliceInt8V(*v, e) - case []int16: - fastpathTV.EncSliceInt16V(v, e) - case *[]int16: - fastpathTV.EncSliceInt16V(*v, e) - case []int32: - fastpathTV.EncSliceInt32V(v, e) - case *[]int32: - fastpathTV.EncSliceInt32V(*v, e) - case []int64: - fastpathTV.EncSliceInt64V(v, e) - case *[]int64: - fastpathTV.EncSliceInt64V(*v, e) - case []bool: - fastpathTV.EncSliceBoolV(v, e) - case *[]bool: - fastpathTV.EncSliceBoolV(*v, e) + fastpathTV.EncSliceIntfV(*v, fastpathCheckNilTrue, e) case map[interface{}]interface{}: - fastpathTV.EncMapIntfIntfV(v, e) + fastpathTV.EncMapIntfIntfV(v, fastpathCheckNilTrue, e) case *map[interface{}]interface{}: - fastpathTV.EncMapIntfIntfV(*v, e) + fastpathTV.EncMapIntfIntfV(*v, fastpathCheckNilTrue, e) + case map[interface{}]string: - fastpathTV.EncMapIntfStringV(v, e) + fastpathTV.EncMapIntfStringV(v, fastpathCheckNilTrue, e) case *map[interface{}]string: - fastpathTV.EncMapIntfStringV(*v, e) + fastpathTV.EncMapIntfStringV(*v, fastpathCheckNilTrue, e) + case map[interface{}]uint: - fastpathTV.EncMapIntfUintV(v, e) + fastpathTV.EncMapIntfUintV(v, fastpathCheckNilTrue, e) case *map[interface{}]uint: - fastpathTV.EncMapIntfUintV(*v, e) + fastpathTV.EncMapIntfUintV(*v, fastpathCheckNilTrue, e) + case map[interface{}]uint8: - fastpathTV.EncMapIntfUint8V(v, e) + fastpathTV.EncMapIntfUint8V(v, fastpathCheckNilTrue, e) case *map[interface{}]uint8: - fastpathTV.EncMapIntfUint8V(*v, e) + fastpathTV.EncMapIntfUint8V(*v, fastpathCheckNilTrue, e) + case map[interface{}]uint16: - fastpathTV.EncMapIntfUint16V(v, e) + fastpathTV.EncMapIntfUint16V(v, fastpathCheckNilTrue, e) case *map[interface{}]uint16: - fastpathTV.EncMapIntfUint16V(*v, e) + fastpathTV.EncMapIntfUint16V(*v, fastpathCheckNilTrue, e) + case map[interface{}]uint32: - fastpathTV.EncMapIntfUint32V(v, e) + fastpathTV.EncMapIntfUint32V(v, fastpathCheckNilTrue, e) case *map[interface{}]uint32: - fastpathTV.EncMapIntfUint32V(*v, e) + fastpathTV.EncMapIntfUint32V(*v, fastpathCheckNilTrue, e) + case map[interface{}]uint64: - fastpathTV.EncMapIntfUint64V(v, e) + fastpathTV.EncMapIntfUint64V(v, fastpathCheckNilTrue, e) case *map[interface{}]uint64: - fastpathTV.EncMapIntfUint64V(*v, e) + fastpathTV.EncMapIntfUint64V(*v, fastpathCheckNilTrue, e) + case map[interface{}]uintptr: - fastpathTV.EncMapIntfUintptrV(v, e) + fastpathTV.EncMapIntfUintptrV(v, fastpathCheckNilTrue, e) case *map[interface{}]uintptr: - fastpathTV.EncMapIntfUintptrV(*v, e) + fastpathTV.EncMapIntfUintptrV(*v, fastpathCheckNilTrue, e) + case map[interface{}]int: - fastpathTV.EncMapIntfIntV(v, e) + fastpathTV.EncMapIntfIntV(v, fastpathCheckNilTrue, e) case *map[interface{}]int: - fastpathTV.EncMapIntfIntV(*v, e) + fastpathTV.EncMapIntfIntV(*v, fastpathCheckNilTrue, e) + case map[interface{}]int8: - fastpathTV.EncMapIntfInt8V(v, e) + fastpathTV.EncMapIntfInt8V(v, fastpathCheckNilTrue, e) case *map[interface{}]int8: - fastpathTV.EncMapIntfInt8V(*v, e) + fastpathTV.EncMapIntfInt8V(*v, fastpathCheckNilTrue, e) + case map[interface{}]int16: - fastpathTV.EncMapIntfInt16V(v, e) + fastpathTV.EncMapIntfInt16V(v, fastpathCheckNilTrue, e) case *map[interface{}]int16: - fastpathTV.EncMapIntfInt16V(*v, e) + fastpathTV.EncMapIntfInt16V(*v, fastpathCheckNilTrue, e) + case map[interface{}]int32: - fastpathTV.EncMapIntfInt32V(v, e) + fastpathTV.EncMapIntfInt32V(v, fastpathCheckNilTrue, e) case *map[interface{}]int32: - fastpathTV.EncMapIntfInt32V(*v, e) + fastpathTV.EncMapIntfInt32V(*v, fastpathCheckNilTrue, e) + case map[interface{}]int64: - fastpathTV.EncMapIntfInt64V(v, e) + fastpathTV.EncMapIntfInt64V(v, fastpathCheckNilTrue, e) case *map[interface{}]int64: - fastpathTV.EncMapIntfInt64V(*v, e) + fastpathTV.EncMapIntfInt64V(*v, fastpathCheckNilTrue, e) + case map[interface{}]float32: - fastpathTV.EncMapIntfFloat32V(v, e) + fastpathTV.EncMapIntfFloat32V(v, fastpathCheckNilTrue, e) case *map[interface{}]float32: - fastpathTV.EncMapIntfFloat32V(*v, e) + fastpathTV.EncMapIntfFloat32V(*v, fastpathCheckNilTrue, e) + case map[interface{}]float64: - fastpathTV.EncMapIntfFloat64V(v, e) + fastpathTV.EncMapIntfFloat64V(v, fastpathCheckNilTrue, e) case *map[interface{}]float64: - fastpathTV.EncMapIntfFloat64V(*v, e) + fastpathTV.EncMapIntfFloat64V(*v, fastpathCheckNilTrue, e) + case map[interface{}]bool: - fastpathTV.EncMapIntfBoolV(v, e) + fastpathTV.EncMapIntfBoolV(v, fastpathCheckNilTrue, e) case *map[interface{}]bool: - fastpathTV.EncMapIntfBoolV(*v, e) + fastpathTV.EncMapIntfBoolV(*v, fastpathCheckNilTrue, e) + + case []string: + fastpathTV.EncSliceStringV(v, fastpathCheckNilTrue, e) + case *[]string: + fastpathTV.EncSliceStringV(*v, fastpathCheckNilTrue, e) + case map[string]interface{}: - fastpathTV.EncMapStringIntfV(v, e) + fastpathTV.EncMapStringIntfV(v, fastpathCheckNilTrue, e) case *map[string]interface{}: - fastpathTV.EncMapStringIntfV(*v, e) + fastpathTV.EncMapStringIntfV(*v, fastpathCheckNilTrue, e) + case map[string]string: - fastpathTV.EncMapStringStringV(v, e) + fastpathTV.EncMapStringStringV(v, fastpathCheckNilTrue, e) case *map[string]string: - fastpathTV.EncMapStringStringV(*v, e) + fastpathTV.EncMapStringStringV(*v, fastpathCheckNilTrue, e) + case map[string]uint: - fastpathTV.EncMapStringUintV(v, e) + fastpathTV.EncMapStringUintV(v, fastpathCheckNilTrue, e) case *map[string]uint: - fastpathTV.EncMapStringUintV(*v, e) + fastpathTV.EncMapStringUintV(*v, fastpathCheckNilTrue, e) + case map[string]uint8: - fastpathTV.EncMapStringUint8V(v, e) + fastpathTV.EncMapStringUint8V(v, fastpathCheckNilTrue, e) case *map[string]uint8: - fastpathTV.EncMapStringUint8V(*v, e) + fastpathTV.EncMapStringUint8V(*v, fastpathCheckNilTrue, e) + case map[string]uint16: - fastpathTV.EncMapStringUint16V(v, e) + fastpathTV.EncMapStringUint16V(v, fastpathCheckNilTrue, e) case *map[string]uint16: - fastpathTV.EncMapStringUint16V(*v, e) + fastpathTV.EncMapStringUint16V(*v, fastpathCheckNilTrue, e) + case map[string]uint32: - fastpathTV.EncMapStringUint32V(v, e) + fastpathTV.EncMapStringUint32V(v, fastpathCheckNilTrue, e) case *map[string]uint32: - fastpathTV.EncMapStringUint32V(*v, e) + fastpathTV.EncMapStringUint32V(*v, fastpathCheckNilTrue, e) + case map[string]uint64: - fastpathTV.EncMapStringUint64V(v, e) + fastpathTV.EncMapStringUint64V(v, fastpathCheckNilTrue, e) case *map[string]uint64: - fastpathTV.EncMapStringUint64V(*v, e) + fastpathTV.EncMapStringUint64V(*v, fastpathCheckNilTrue, e) + case map[string]uintptr: - fastpathTV.EncMapStringUintptrV(v, e) + fastpathTV.EncMapStringUintptrV(v, fastpathCheckNilTrue, e) case *map[string]uintptr: - fastpathTV.EncMapStringUintptrV(*v, e) + fastpathTV.EncMapStringUintptrV(*v, fastpathCheckNilTrue, e) + case map[string]int: - fastpathTV.EncMapStringIntV(v, e) + fastpathTV.EncMapStringIntV(v, fastpathCheckNilTrue, e) case *map[string]int: - fastpathTV.EncMapStringIntV(*v, e) + fastpathTV.EncMapStringIntV(*v, fastpathCheckNilTrue, e) + case map[string]int8: - fastpathTV.EncMapStringInt8V(v, e) + fastpathTV.EncMapStringInt8V(v, fastpathCheckNilTrue, e) case *map[string]int8: - fastpathTV.EncMapStringInt8V(*v, e) + fastpathTV.EncMapStringInt8V(*v, fastpathCheckNilTrue, e) + case map[string]int16: - fastpathTV.EncMapStringInt16V(v, e) + fastpathTV.EncMapStringInt16V(v, fastpathCheckNilTrue, e) case *map[string]int16: - fastpathTV.EncMapStringInt16V(*v, e) + fastpathTV.EncMapStringInt16V(*v, fastpathCheckNilTrue, e) + case map[string]int32: - fastpathTV.EncMapStringInt32V(v, e) + fastpathTV.EncMapStringInt32V(v, fastpathCheckNilTrue, e) case *map[string]int32: - fastpathTV.EncMapStringInt32V(*v, e) + fastpathTV.EncMapStringInt32V(*v, fastpathCheckNilTrue, e) + case map[string]int64: - fastpathTV.EncMapStringInt64V(v, e) + fastpathTV.EncMapStringInt64V(v, fastpathCheckNilTrue, e) case *map[string]int64: - fastpathTV.EncMapStringInt64V(*v, e) + fastpathTV.EncMapStringInt64V(*v, fastpathCheckNilTrue, e) + case map[string]float32: - fastpathTV.EncMapStringFloat32V(v, e) + fastpathTV.EncMapStringFloat32V(v, fastpathCheckNilTrue, e) case *map[string]float32: - fastpathTV.EncMapStringFloat32V(*v, e) + fastpathTV.EncMapStringFloat32V(*v, fastpathCheckNilTrue, e) + case map[string]float64: - fastpathTV.EncMapStringFloat64V(v, e) + fastpathTV.EncMapStringFloat64V(v, fastpathCheckNilTrue, e) case *map[string]float64: - fastpathTV.EncMapStringFloat64V(*v, e) + fastpathTV.EncMapStringFloat64V(*v, fastpathCheckNilTrue, e) + case map[string]bool: - fastpathTV.EncMapStringBoolV(v, e) + fastpathTV.EncMapStringBoolV(v, fastpathCheckNilTrue, e) case *map[string]bool: - fastpathTV.EncMapStringBoolV(*v, e) + fastpathTV.EncMapStringBoolV(*v, fastpathCheckNilTrue, e) + + case []float32: + fastpathTV.EncSliceFloat32V(v, fastpathCheckNilTrue, e) + case *[]float32: + fastpathTV.EncSliceFloat32V(*v, fastpathCheckNilTrue, e) + case map[float32]interface{}: - fastpathTV.EncMapFloat32IntfV(v, e) + fastpathTV.EncMapFloat32IntfV(v, fastpathCheckNilTrue, e) case *map[float32]interface{}: - fastpathTV.EncMapFloat32IntfV(*v, e) + fastpathTV.EncMapFloat32IntfV(*v, fastpathCheckNilTrue, e) + case map[float32]string: - fastpathTV.EncMapFloat32StringV(v, e) + fastpathTV.EncMapFloat32StringV(v, fastpathCheckNilTrue, e) case *map[float32]string: - fastpathTV.EncMapFloat32StringV(*v, e) + fastpathTV.EncMapFloat32StringV(*v, fastpathCheckNilTrue, e) + case map[float32]uint: - fastpathTV.EncMapFloat32UintV(v, e) + fastpathTV.EncMapFloat32UintV(v, fastpathCheckNilTrue, e) case *map[float32]uint: - fastpathTV.EncMapFloat32UintV(*v, e) + fastpathTV.EncMapFloat32UintV(*v, fastpathCheckNilTrue, e) + case map[float32]uint8: - fastpathTV.EncMapFloat32Uint8V(v, e) + fastpathTV.EncMapFloat32Uint8V(v, fastpathCheckNilTrue, e) case *map[float32]uint8: - fastpathTV.EncMapFloat32Uint8V(*v, e) + fastpathTV.EncMapFloat32Uint8V(*v, fastpathCheckNilTrue, e) + case map[float32]uint16: - fastpathTV.EncMapFloat32Uint16V(v, e) + fastpathTV.EncMapFloat32Uint16V(v, fastpathCheckNilTrue, e) case *map[float32]uint16: - fastpathTV.EncMapFloat32Uint16V(*v, e) + fastpathTV.EncMapFloat32Uint16V(*v, fastpathCheckNilTrue, e) + case map[float32]uint32: - fastpathTV.EncMapFloat32Uint32V(v, e) + fastpathTV.EncMapFloat32Uint32V(v, fastpathCheckNilTrue, e) case *map[float32]uint32: - fastpathTV.EncMapFloat32Uint32V(*v, e) + fastpathTV.EncMapFloat32Uint32V(*v, fastpathCheckNilTrue, e) + case map[float32]uint64: - fastpathTV.EncMapFloat32Uint64V(v, e) + fastpathTV.EncMapFloat32Uint64V(v, fastpathCheckNilTrue, e) case *map[float32]uint64: - fastpathTV.EncMapFloat32Uint64V(*v, e) + fastpathTV.EncMapFloat32Uint64V(*v, fastpathCheckNilTrue, e) + case map[float32]uintptr: - fastpathTV.EncMapFloat32UintptrV(v, e) + fastpathTV.EncMapFloat32UintptrV(v, fastpathCheckNilTrue, e) case *map[float32]uintptr: - fastpathTV.EncMapFloat32UintptrV(*v, e) + fastpathTV.EncMapFloat32UintptrV(*v, fastpathCheckNilTrue, e) + case map[float32]int: - fastpathTV.EncMapFloat32IntV(v, e) + fastpathTV.EncMapFloat32IntV(v, fastpathCheckNilTrue, e) case *map[float32]int: - fastpathTV.EncMapFloat32IntV(*v, e) + fastpathTV.EncMapFloat32IntV(*v, fastpathCheckNilTrue, e) + case map[float32]int8: - fastpathTV.EncMapFloat32Int8V(v, e) + fastpathTV.EncMapFloat32Int8V(v, fastpathCheckNilTrue, e) case *map[float32]int8: - fastpathTV.EncMapFloat32Int8V(*v, e) + fastpathTV.EncMapFloat32Int8V(*v, fastpathCheckNilTrue, e) + case map[float32]int16: - fastpathTV.EncMapFloat32Int16V(v, e) + fastpathTV.EncMapFloat32Int16V(v, fastpathCheckNilTrue, e) case *map[float32]int16: - fastpathTV.EncMapFloat32Int16V(*v, e) + fastpathTV.EncMapFloat32Int16V(*v, fastpathCheckNilTrue, e) + case map[float32]int32: - fastpathTV.EncMapFloat32Int32V(v, e) + fastpathTV.EncMapFloat32Int32V(v, fastpathCheckNilTrue, e) case *map[float32]int32: - fastpathTV.EncMapFloat32Int32V(*v, e) + fastpathTV.EncMapFloat32Int32V(*v, fastpathCheckNilTrue, e) + case map[float32]int64: - fastpathTV.EncMapFloat32Int64V(v, e) + fastpathTV.EncMapFloat32Int64V(v, fastpathCheckNilTrue, e) case *map[float32]int64: - fastpathTV.EncMapFloat32Int64V(*v, e) + fastpathTV.EncMapFloat32Int64V(*v, fastpathCheckNilTrue, e) + case map[float32]float32: - fastpathTV.EncMapFloat32Float32V(v, e) + fastpathTV.EncMapFloat32Float32V(v, fastpathCheckNilTrue, e) case *map[float32]float32: - fastpathTV.EncMapFloat32Float32V(*v, e) + fastpathTV.EncMapFloat32Float32V(*v, fastpathCheckNilTrue, e) + case map[float32]float64: - fastpathTV.EncMapFloat32Float64V(v, e) + fastpathTV.EncMapFloat32Float64V(v, fastpathCheckNilTrue, e) case *map[float32]float64: - fastpathTV.EncMapFloat32Float64V(*v, e) + fastpathTV.EncMapFloat32Float64V(*v, fastpathCheckNilTrue, e) + case map[float32]bool: - fastpathTV.EncMapFloat32BoolV(v, e) + fastpathTV.EncMapFloat32BoolV(v, fastpathCheckNilTrue, e) case *map[float32]bool: - fastpathTV.EncMapFloat32BoolV(*v, e) + fastpathTV.EncMapFloat32BoolV(*v, fastpathCheckNilTrue, e) + + case []float64: + fastpathTV.EncSliceFloat64V(v, fastpathCheckNilTrue, e) + case *[]float64: + fastpathTV.EncSliceFloat64V(*v, fastpathCheckNilTrue, e) + case map[float64]interface{}: - fastpathTV.EncMapFloat64IntfV(v, e) + fastpathTV.EncMapFloat64IntfV(v, fastpathCheckNilTrue, e) case *map[float64]interface{}: - fastpathTV.EncMapFloat64IntfV(*v, e) + fastpathTV.EncMapFloat64IntfV(*v, fastpathCheckNilTrue, e) + case map[float64]string: - fastpathTV.EncMapFloat64StringV(v, e) + fastpathTV.EncMapFloat64StringV(v, fastpathCheckNilTrue, e) case *map[float64]string: - fastpathTV.EncMapFloat64StringV(*v, e) + fastpathTV.EncMapFloat64StringV(*v, fastpathCheckNilTrue, e) + case map[float64]uint: - fastpathTV.EncMapFloat64UintV(v, e) + fastpathTV.EncMapFloat64UintV(v, fastpathCheckNilTrue, e) case *map[float64]uint: - fastpathTV.EncMapFloat64UintV(*v, e) + fastpathTV.EncMapFloat64UintV(*v, fastpathCheckNilTrue, e) + case map[float64]uint8: - fastpathTV.EncMapFloat64Uint8V(v, e) + fastpathTV.EncMapFloat64Uint8V(v, fastpathCheckNilTrue, e) case *map[float64]uint8: - fastpathTV.EncMapFloat64Uint8V(*v, e) + fastpathTV.EncMapFloat64Uint8V(*v, fastpathCheckNilTrue, e) + case map[float64]uint16: - fastpathTV.EncMapFloat64Uint16V(v, e) + fastpathTV.EncMapFloat64Uint16V(v, fastpathCheckNilTrue, e) case *map[float64]uint16: - fastpathTV.EncMapFloat64Uint16V(*v, e) + fastpathTV.EncMapFloat64Uint16V(*v, fastpathCheckNilTrue, e) + case map[float64]uint32: - fastpathTV.EncMapFloat64Uint32V(v, e) + fastpathTV.EncMapFloat64Uint32V(v, fastpathCheckNilTrue, e) case *map[float64]uint32: - fastpathTV.EncMapFloat64Uint32V(*v, e) + fastpathTV.EncMapFloat64Uint32V(*v, fastpathCheckNilTrue, e) + case map[float64]uint64: - fastpathTV.EncMapFloat64Uint64V(v, e) + fastpathTV.EncMapFloat64Uint64V(v, fastpathCheckNilTrue, e) case *map[float64]uint64: - fastpathTV.EncMapFloat64Uint64V(*v, e) + fastpathTV.EncMapFloat64Uint64V(*v, fastpathCheckNilTrue, e) + case map[float64]uintptr: - fastpathTV.EncMapFloat64UintptrV(v, e) + fastpathTV.EncMapFloat64UintptrV(v, fastpathCheckNilTrue, e) case *map[float64]uintptr: - fastpathTV.EncMapFloat64UintptrV(*v, e) + fastpathTV.EncMapFloat64UintptrV(*v, fastpathCheckNilTrue, e) + case map[float64]int: - fastpathTV.EncMapFloat64IntV(v, e) + fastpathTV.EncMapFloat64IntV(v, fastpathCheckNilTrue, e) case *map[float64]int: - fastpathTV.EncMapFloat64IntV(*v, e) + fastpathTV.EncMapFloat64IntV(*v, fastpathCheckNilTrue, e) + case map[float64]int8: - fastpathTV.EncMapFloat64Int8V(v, e) + fastpathTV.EncMapFloat64Int8V(v, fastpathCheckNilTrue, e) case *map[float64]int8: - fastpathTV.EncMapFloat64Int8V(*v, e) + fastpathTV.EncMapFloat64Int8V(*v, fastpathCheckNilTrue, e) + case map[float64]int16: - fastpathTV.EncMapFloat64Int16V(v, e) + fastpathTV.EncMapFloat64Int16V(v, fastpathCheckNilTrue, e) case *map[float64]int16: - fastpathTV.EncMapFloat64Int16V(*v, e) + fastpathTV.EncMapFloat64Int16V(*v, fastpathCheckNilTrue, e) + case map[float64]int32: - fastpathTV.EncMapFloat64Int32V(v, e) + fastpathTV.EncMapFloat64Int32V(v, fastpathCheckNilTrue, e) case *map[float64]int32: - fastpathTV.EncMapFloat64Int32V(*v, e) + fastpathTV.EncMapFloat64Int32V(*v, fastpathCheckNilTrue, e) + case map[float64]int64: - fastpathTV.EncMapFloat64Int64V(v, e) + fastpathTV.EncMapFloat64Int64V(v, fastpathCheckNilTrue, e) case *map[float64]int64: - fastpathTV.EncMapFloat64Int64V(*v, e) + fastpathTV.EncMapFloat64Int64V(*v, fastpathCheckNilTrue, e) + case map[float64]float32: - fastpathTV.EncMapFloat64Float32V(v, e) + fastpathTV.EncMapFloat64Float32V(v, fastpathCheckNilTrue, e) case *map[float64]float32: - fastpathTV.EncMapFloat64Float32V(*v, e) + fastpathTV.EncMapFloat64Float32V(*v, fastpathCheckNilTrue, e) + case map[float64]float64: - fastpathTV.EncMapFloat64Float64V(v, e) + fastpathTV.EncMapFloat64Float64V(v, fastpathCheckNilTrue, e) case *map[float64]float64: - fastpathTV.EncMapFloat64Float64V(*v, e) + fastpathTV.EncMapFloat64Float64V(*v, fastpathCheckNilTrue, e) + case map[float64]bool: - fastpathTV.EncMapFloat64BoolV(v, e) + fastpathTV.EncMapFloat64BoolV(v, fastpathCheckNilTrue, e) case *map[float64]bool: - fastpathTV.EncMapFloat64BoolV(*v, e) + fastpathTV.EncMapFloat64BoolV(*v, fastpathCheckNilTrue, e) + + case []uint: + fastpathTV.EncSliceUintV(v, fastpathCheckNilTrue, e) + case *[]uint: + fastpathTV.EncSliceUintV(*v, fastpathCheckNilTrue, e) + case map[uint]interface{}: - fastpathTV.EncMapUintIntfV(v, e) + fastpathTV.EncMapUintIntfV(v, fastpathCheckNilTrue, e) case *map[uint]interface{}: - fastpathTV.EncMapUintIntfV(*v, e) + fastpathTV.EncMapUintIntfV(*v, fastpathCheckNilTrue, e) + case map[uint]string: - fastpathTV.EncMapUintStringV(v, e) + fastpathTV.EncMapUintStringV(v, fastpathCheckNilTrue, e) case *map[uint]string: - fastpathTV.EncMapUintStringV(*v, e) + fastpathTV.EncMapUintStringV(*v, fastpathCheckNilTrue, e) + case map[uint]uint: - fastpathTV.EncMapUintUintV(v, e) + fastpathTV.EncMapUintUintV(v, fastpathCheckNilTrue, e) case *map[uint]uint: - fastpathTV.EncMapUintUintV(*v, e) + fastpathTV.EncMapUintUintV(*v, fastpathCheckNilTrue, e) + case map[uint]uint8: - fastpathTV.EncMapUintUint8V(v, e) + fastpathTV.EncMapUintUint8V(v, fastpathCheckNilTrue, e) case *map[uint]uint8: - fastpathTV.EncMapUintUint8V(*v, e) + fastpathTV.EncMapUintUint8V(*v, fastpathCheckNilTrue, e) + case map[uint]uint16: - fastpathTV.EncMapUintUint16V(v, e) + fastpathTV.EncMapUintUint16V(v, fastpathCheckNilTrue, e) case *map[uint]uint16: - fastpathTV.EncMapUintUint16V(*v, e) + fastpathTV.EncMapUintUint16V(*v, fastpathCheckNilTrue, e) + case map[uint]uint32: - fastpathTV.EncMapUintUint32V(v, e) + fastpathTV.EncMapUintUint32V(v, fastpathCheckNilTrue, e) case *map[uint]uint32: - fastpathTV.EncMapUintUint32V(*v, e) + fastpathTV.EncMapUintUint32V(*v, fastpathCheckNilTrue, e) + case map[uint]uint64: - fastpathTV.EncMapUintUint64V(v, e) + fastpathTV.EncMapUintUint64V(v, fastpathCheckNilTrue, e) case *map[uint]uint64: - fastpathTV.EncMapUintUint64V(*v, e) + fastpathTV.EncMapUintUint64V(*v, fastpathCheckNilTrue, e) + case map[uint]uintptr: - fastpathTV.EncMapUintUintptrV(v, e) + fastpathTV.EncMapUintUintptrV(v, fastpathCheckNilTrue, e) case *map[uint]uintptr: - fastpathTV.EncMapUintUintptrV(*v, e) + fastpathTV.EncMapUintUintptrV(*v, fastpathCheckNilTrue, e) + case map[uint]int: - fastpathTV.EncMapUintIntV(v, e) + fastpathTV.EncMapUintIntV(v, fastpathCheckNilTrue, e) case *map[uint]int: - fastpathTV.EncMapUintIntV(*v, e) + fastpathTV.EncMapUintIntV(*v, fastpathCheckNilTrue, e) + case map[uint]int8: - fastpathTV.EncMapUintInt8V(v, e) + fastpathTV.EncMapUintInt8V(v, fastpathCheckNilTrue, e) case *map[uint]int8: - fastpathTV.EncMapUintInt8V(*v, e) + fastpathTV.EncMapUintInt8V(*v, fastpathCheckNilTrue, e) + case map[uint]int16: - fastpathTV.EncMapUintInt16V(v, e) + fastpathTV.EncMapUintInt16V(v, fastpathCheckNilTrue, e) case *map[uint]int16: - fastpathTV.EncMapUintInt16V(*v, e) + fastpathTV.EncMapUintInt16V(*v, fastpathCheckNilTrue, e) + case map[uint]int32: - fastpathTV.EncMapUintInt32V(v, e) + fastpathTV.EncMapUintInt32V(v, fastpathCheckNilTrue, e) case *map[uint]int32: - fastpathTV.EncMapUintInt32V(*v, e) + fastpathTV.EncMapUintInt32V(*v, fastpathCheckNilTrue, e) + case map[uint]int64: - fastpathTV.EncMapUintInt64V(v, e) + fastpathTV.EncMapUintInt64V(v, fastpathCheckNilTrue, e) case *map[uint]int64: - fastpathTV.EncMapUintInt64V(*v, e) + fastpathTV.EncMapUintInt64V(*v, fastpathCheckNilTrue, e) + case map[uint]float32: - fastpathTV.EncMapUintFloat32V(v, e) + fastpathTV.EncMapUintFloat32V(v, fastpathCheckNilTrue, e) case *map[uint]float32: - fastpathTV.EncMapUintFloat32V(*v, e) + fastpathTV.EncMapUintFloat32V(*v, fastpathCheckNilTrue, e) + case map[uint]float64: - fastpathTV.EncMapUintFloat64V(v, e) + fastpathTV.EncMapUintFloat64V(v, fastpathCheckNilTrue, e) case *map[uint]float64: - fastpathTV.EncMapUintFloat64V(*v, e) + fastpathTV.EncMapUintFloat64V(*v, fastpathCheckNilTrue, e) + case map[uint]bool: - fastpathTV.EncMapUintBoolV(v, e) + fastpathTV.EncMapUintBoolV(v, fastpathCheckNilTrue, e) case *map[uint]bool: - fastpathTV.EncMapUintBoolV(*v, e) + fastpathTV.EncMapUintBoolV(*v, fastpathCheckNilTrue, e) + case map[uint8]interface{}: - fastpathTV.EncMapUint8IntfV(v, e) + fastpathTV.EncMapUint8IntfV(v, fastpathCheckNilTrue, e) case *map[uint8]interface{}: - fastpathTV.EncMapUint8IntfV(*v, e) + fastpathTV.EncMapUint8IntfV(*v, fastpathCheckNilTrue, e) + case map[uint8]string: - fastpathTV.EncMapUint8StringV(v, e) + fastpathTV.EncMapUint8StringV(v, fastpathCheckNilTrue, e) case *map[uint8]string: - fastpathTV.EncMapUint8StringV(*v, e) + fastpathTV.EncMapUint8StringV(*v, fastpathCheckNilTrue, e) + case map[uint8]uint: - fastpathTV.EncMapUint8UintV(v, e) + fastpathTV.EncMapUint8UintV(v, fastpathCheckNilTrue, e) case *map[uint8]uint: - fastpathTV.EncMapUint8UintV(*v, e) + fastpathTV.EncMapUint8UintV(*v, fastpathCheckNilTrue, e) + case map[uint8]uint8: - fastpathTV.EncMapUint8Uint8V(v, e) + fastpathTV.EncMapUint8Uint8V(v, fastpathCheckNilTrue, e) case *map[uint8]uint8: - fastpathTV.EncMapUint8Uint8V(*v, e) + fastpathTV.EncMapUint8Uint8V(*v, fastpathCheckNilTrue, e) + case map[uint8]uint16: - fastpathTV.EncMapUint8Uint16V(v, e) + fastpathTV.EncMapUint8Uint16V(v, fastpathCheckNilTrue, e) case *map[uint8]uint16: - fastpathTV.EncMapUint8Uint16V(*v, e) + fastpathTV.EncMapUint8Uint16V(*v, fastpathCheckNilTrue, e) + case map[uint8]uint32: - fastpathTV.EncMapUint8Uint32V(v, e) + fastpathTV.EncMapUint8Uint32V(v, fastpathCheckNilTrue, e) case *map[uint8]uint32: - fastpathTV.EncMapUint8Uint32V(*v, e) + fastpathTV.EncMapUint8Uint32V(*v, fastpathCheckNilTrue, e) + case map[uint8]uint64: - fastpathTV.EncMapUint8Uint64V(v, e) + fastpathTV.EncMapUint8Uint64V(v, fastpathCheckNilTrue, e) case *map[uint8]uint64: - fastpathTV.EncMapUint8Uint64V(*v, e) + fastpathTV.EncMapUint8Uint64V(*v, fastpathCheckNilTrue, e) + case map[uint8]uintptr: - fastpathTV.EncMapUint8UintptrV(v, e) + fastpathTV.EncMapUint8UintptrV(v, fastpathCheckNilTrue, e) case *map[uint8]uintptr: - fastpathTV.EncMapUint8UintptrV(*v, e) + fastpathTV.EncMapUint8UintptrV(*v, fastpathCheckNilTrue, e) + case map[uint8]int: - fastpathTV.EncMapUint8IntV(v, e) + fastpathTV.EncMapUint8IntV(v, fastpathCheckNilTrue, e) case *map[uint8]int: - fastpathTV.EncMapUint8IntV(*v, e) + fastpathTV.EncMapUint8IntV(*v, fastpathCheckNilTrue, e) + case map[uint8]int8: - fastpathTV.EncMapUint8Int8V(v, e) + fastpathTV.EncMapUint8Int8V(v, fastpathCheckNilTrue, e) case *map[uint8]int8: - fastpathTV.EncMapUint8Int8V(*v, e) + fastpathTV.EncMapUint8Int8V(*v, fastpathCheckNilTrue, e) + case map[uint8]int16: - fastpathTV.EncMapUint8Int16V(v, e) + fastpathTV.EncMapUint8Int16V(v, fastpathCheckNilTrue, e) case *map[uint8]int16: - fastpathTV.EncMapUint8Int16V(*v, e) + fastpathTV.EncMapUint8Int16V(*v, fastpathCheckNilTrue, e) + case map[uint8]int32: - fastpathTV.EncMapUint8Int32V(v, e) + fastpathTV.EncMapUint8Int32V(v, fastpathCheckNilTrue, e) case *map[uint8]int32: - fastpathTV.EncMapUint8Int32V(*v, e) + fastpathTV.EncMapUint8Int32V(*v, fastpathCheckNilTrue, e) + case map[uint8]int64: - fastpathTV.EncMapUint8Int64V(v, e) + fastpathTV.EncMapUint8Int64V(v, fastpathCheckNilTrue, e) case *map[uint8]int64: - fastpathTV.EncMapUint8Int64V(*v, e) + fastpathTV.EncMapUint8Int64V(*v, fastpathCheckNilTrue, e) + case map[uint8]float32: - fastpathTV.EncMapUint8Float32V(v, e) + fastpathTV.EncMapUint8Float32V(v, fastpathCheckNilTrue, e) case *map[uint8]float32: - fastpathTV.EncMapUint8Float32V(*v, e) + fastpathTV.EncMapUint8Float32V(*v, fastpathCheckNilTrue, e) + case map[uint8]float64: - fastpathTV.EncMapUint8Float64V(v, e) + fastpathTV.EncMapUint8Float64V(v, fastpathCheckNilTrue, e) case *map[uint8]float64: - fastpathTV.EncMapUint8Float64V(*v, e) + fastpathTV.EncMapUint8Float64V(*v, fastpathCheckNilTrue, e) + case map[uint8]bool: - fastpathTV.EncMapUint8BoolV(v, e) + fastpathTV.EncMapUint8BoolV(v, fastpathCheckNilTrue, e) case *map[uint8]bool: - fastpathTV.EncMapUint8BoolV(*v, e) + fastpathTV.EncMapUint8BoolV(*v, fastpathCheckNilTrue, e) + + case []uint16: + fastpathTV.EncSliceUint16V(v, fastpathCheckNilTrue, e) + case *[]uint16: + fastpathTV.EncSliceUint16V(*v, fastpathCheckNilTrue, e) + case map[uint16]interface{}: - fastpathTV.EncMapUint16IntfV(v, e) + fastpathTV.EncMapUint16IntfV(v, fastpathCheckNilTrue, e) case *map[uint16]interface{}: - fastpathTV.EncMapUint16IntfV(*v, e) + fastpathTV.EncMapUint16IntfV(*v, fastpathCheckNilTrue, e) + case map[uint16]string: - fastpathTV.EncMapUint16StringV(v, e) + fastpathTV.EncMapUint16StringV(v, fastpathCheckNilTrue, e) case *map[uint16]string: - fastpathTV.EncMapUint16StringV(*v, e) + fastpathTV.EncMapUint16StringV(*v, fastpathCheckNilTrue, e) + case map[uint16]uint: - fastpathTV.EncMapUint16UintV(v, e) + fastpathTV.EncMapUint16UintV(v, fastpathCheckNilTrue, e) case *map[uint16]uint: - fastpathTV.EncMapUint16UintV(*v, e) + fastpathTV.EncMapUint16UintV(*v, fastpathCheckNilTrue, e) + case map[uint16]uint8: - fastpathTV.EncMapUint16Uint8V(v, e) + fastpathTV.EncMapUint16Uint8V(v, fastpathCheckNilTrue, e) case *map[uint16]uint8: - fastpathTV.EncMapUint16Uint8V(*v, e) + fastpathTV.EncMapUint16Uint8V(*v, fastpathCheckNilTrue, e) + case map[uint16]uint16: - fastpathTV.EncMapUint16Uint16V(v, e) + fastpathTV.EncMapUint16Uint16V(v, fastpathCheckNilTrue, e) case *map[uint16]uint16: - fastpathTV.EncMapUint16Uint16V(*v, e) + fastpathTV.EncMapUint16Uint16V(*v, fastpathCheckNilTrue, e) + case map[uint16]uint32: - fastpathTV.EncMapUint16Uint32V(v, e) + fastpathTV.EncMapUint16Uint32V(v, fastpathCheckNilTrue, e) case *map[uint16]uint32: - fastpathTV.EncMapUint16Uint32V(*v, e) + fastpathTV.EncMapUint16Uint32V(*v, fastpathCheckNilTrue, e) + case map[uint16]uint64: - fastpathTV.EncMapUint16Uint64V(v, e) + fastpathTV.EncMapUint16Uint64V(v, fastpathCheckNilTrue, e) case *map[uint16]uint64: - fastpathTV.EncMapUint16Uint64V(*v, e) + fastpathTV.EncMapUint16Uint64V(*v, fastpathCheckNilTrue, e) + case map[uint16]uintptr: - fastpathTV.EncMapUint16UintptrV(v, e) + fastpathTV.EncMapUint16UintptrV(v, fastpathCheckNilTrue, e) case *map[uint16]uintptr: - fastpathTV.EncMapUint16UintptrV(*v, e) + fastpathTV.EncMapUint16UintptrV(*v, fastpathCheckNilTrue, e) + case map[uint16]int: - fastpathTV.EncMapUint16IntV(v, e) + fastpathTV.EncMapUint16IntV(v, fastpathCheckNilTrue, e) case *map[uint16]int: - fastpathTV.EncMapUint16IntV(*v, e) + fastpathTV.EncMapUint16IntV(*v, fastpathCheckNilTrue, e) + case map[uint16]int8: - fastpathTV.EncMapUint16Int8V(v, e) + fastpathTV.EncMapUint16Int8V(v, fastpathCheckNilTrue, e) case *map[uint16]int8: - fastpathTV.EncMapUint16Int8V(*v, e) + fastpathTV.EncMapUint16Int8V(*v, fastpathCheckNilTrue, e) + case map[uint16]int16: - fastpathTV.EncMapUint16Int16V(v, e) + fastpathTV.EncMapUint16Int16V(v, fastpathCheckNilTrue, e) case *map[uint16]int16: - fastpathTV.EncMapUint16Int16V(*v, e) + fastpathTV.EncMapUint16Int16V(*v, fastpathCheckNilTrue, e) + case map[uint16]int32: - fastpathTV.EncMapUint16Int32V(v, e) + fastpathTV.EncMapUint16Int32V(v, fastpathCheckNilTrue, e) case *map[uint16]int32: - fastpathTV.EncMapUint16Int32V(*v, e) + fastpathTV.EncMapUint16Int32V(*v, fastpathCheckNilTrue, e) + case map[uint16]int64: - fastpathTV.EncMapUint16Int64V(v, e) + fastpathTV.EncMapUint16Int64V(v, fastpathCheckNilTrue, e) case *map[uint16]int64: - fastpathTV.EncMapUint16Int64V(*v, e) + fastpathTV.EncMapUint16Int64V(*v, fastpathCheckNilTrue, e) + case map[uint16]float32: - fastpathTV.EncMapUint16Float32V(v, e) + fastpathTV.EncMapUint16Float32V(v, fastpathCheckNilTrue, e) case *map[uint16]float32: - fastpathTV.EncMapUint16Float32V(*v, e) + fastpathTV.EncMapUint16Float32V(*v, fastpathCheckNilTrue, e) + case map[uint16]float64: - fastpathTV.EncMapUint16Float64V(v, e) + fastpathTV.EncMapUint16Float64V(v, fastpathCheckNilTrue, e) case *map[uint16]float64: - fastpathTV.EncMapUint16Float64V(*v, e) + fastpathTV.EncMapUint16Float64V(*v, fastpathCheckNilTrue, e) + case map[uint16]bool: - fastpathTV.EncMapUint16BoolV(v, e) + fastpathTV.EncMapUint16BoolV(v, fastpathCheckNilTrue, e) case *map[uint16]bool: - fastpathTV.EncMapUint16BoolV(*v, e) + fastpathTV.EncMapUint16BoolV(*v, fastpathCheckNilTrue, e) + + case []uint32: + fastpathTV.EncSliceUint32V(v, fastpathCheckNilTrue, e) + case *[]uint32: + fastpathTV.EncSliceUint32V(*v, fastpathCheckNilTrue, e) + case map[uint32]interface{}: - fastpathTV.EncMapUint32IntfV(v, e) + fastpathTV.EncMapUint32IntfV(v, fastpathCheckNilTrue, e) case *map[uint32]interface{}: - fastpathTV.EncMapUint32IntfV(*v, e) + fastpathTV.EncMapUint32IntfV(*v, fastpathCheckNilTrue, e) + case map[uint32]string: - fastpathTV.EncMapUint32StringV(v, e) + fastpathTV.EncMapUint32StringV(v, fastpathCheckNilTrue, e) case *map[uint32]string: - fastpathTV.EncMapUint32StringV(*v, e) + fastpathTV.EncMapUint32StringV(*v, fastpathCheckNilTrue, e) + case map[uint32]uint: - fastpathTV.EncMapUint32UintV(v, e) + fastpathTV.EncMapUint32UintV(v, fastpathCheckNilTrue, e) case *map[uint32]uint: - fastpathTV.EncMapUint32UintV(*v, e) + fastpathTV.EncMapUint32UintV(*v, fastpathCheckNilTrue, e) + case map[uint32]uint8: - fastpathTV.EncMapUint32Uint8V(v, e) + fastpathTV.EncMapUint32Uint8V(v, fastpathCheckNilTrue, e) case *map[uint32]uint8: - fastpathTV.EncMapUint32Uint8V(*v, e) + fastpathTV.EncMapUint32Uint8V(*v, fastpathCheckNilTrue, e) + case map[uint32]uint16: - fastpathTV.EncMapUint32Uint16V(v, e) + fastpathTV.EncMapUint32Uint16V(v, fastpathCheckNilTrue, e) case *map[uint32]uint16: - fastpathTV.EncMapUint32Uint16V(*v, e) + fastpathTV.EncMapUint32Uint16V(*v, fastpathCheckNilTrue, e) + case map[uint32]uint32: - fastpathTV.EncMapUint32Uint32V(v, e) + fastpathTV.EncMapUint32Uint32V(v, fastpathCheckNilTrue, e) case *map[uint32]uint32: - fastpathTV.EncMapUint32Uint32V(*v, e) + fastpathTV.EncMapUint32Uint32V(*v, fastpathCheckNilTrue, e) + case map[uint32]uint64: - fastpathTV.EncMapUint32Uint64V(v, e) + fastpathTV.EncMapUint32Uint64V(v, fastpathCheckNilTrue, e) case *map[uint32]uint64: - fastpathTV.EncMapUint32Uint64V(*v, e) + fastpathTV.EncMapUint32Uint64V(*v, fastpathCheckNilTrue, e) + case map[uint32]uintptr: - fastpathTV.EncMapUint32UintptrV(v, e) + fastpathTV.EncMapUint32UintptrV(v, fastpathCheckNilTrue, e) case *map[uint32]uintptr: - fastpathTV.EncMapUint32UintptrV(*v, e) + fastpathTV.EncMapUint32UintptrV(*v, fastpathCheckNilTrue, e) + case map[uint32]int: - fastpathTV.EncMapUint32IntV(v, e) + fastpathTV.EncMapUint32IntV(v, fastpathCheckNilTrue, e) case *map[uint32]int: - fastpathTV.EncMapUint32IntV(*v, e) + fastpathTV.EncMapUint32IntV(*v, fastpathCheckNilTrue, e) + case map[uint32]int8: - fastpathTV.EncMapUint32Int8V(v, e) + fastpathTV.EncMapUint32Int8V(v, fastpathCheckNilTrue, e) case *map[uint32]int8: - fastpathTV.EncMapUint32Int8V(*v, e) + fastpathTV.EncMapUint32Int8V(*v, fastpathCheckNilTrue, e) + case map[uint32]int16: - fastpathTV.EncMapUint32Int16V(v, e) + fastpathTV.EncMapUint32Int16V(v, fastpathCheckNilTrue, e) case *map[uint32]int16: - fastpathTV.EncMapUint32Int16V(*v, e) + fastpathTV.EncMapUint32Int16V(*v, fastpathCheckNilTrue, e) + case map[uint32]int32: - fastpathTV.EncMapUint32Int32V(v, e) + fastpathTV.EncMapUint32Int32V(v, fastpathCheckNilTrue, e) case *map[uint32]int32: - fastpathTV.EncMapUint32Int32V(*v, e) + fastpathTV.EncMapUint32Int32V(*v, fastpathCheckNilTrue, e) + case map[uint32]int64: - fastpathTV.EncMapUint32Int64V(v, e) + fastpathTV.EncMapUint32Int64V(v, fastpathCheckNilTrue, e) case *map[uint32]int64: - fastpathTV.EncMapUint32Int64V(*v, e) + fastpathTV.EncMapUint32Int64V(*v, fastpathCheckNilTrue, e) + case map[uint32]float32: - fastpathTV.EncMapUint32Float32V(v, e) + fastpathTV.EncMapUint32Float32V(v, fastpathCheckNilTrue, e) case *map[uint32]float32: - fastpathTV.EncMapUint32Float32V(*v, e) + fastpathTV.EncMapUint32Float32V(*v, fastpathCheckNilTrue, e) + case map[uint32]float64: - fastpathTV.EncMapUint32Float64V(v, e) + fastpathTV.EncMapUint32Float64V(v, fastpathCheckNilTrue, e) case *map[uint32]float64: - fastpathTV.EncMapUint32Float64V(*v, e) + fastpathTV.EncMapUint32Float64V(*v, fastpathCheckNilTrue, e) + case map[uint32]bool: - fastpathTV.EncMapUint32BoolV(v, e) + fastpathTV.EncMapUint32BoolV(v, fastpathCheckNilTrue, e) case *map[uint32]bool: - fastpathTV.EncMapUint32BoolV(*v, e) + fastpathTV.EncMapUint32BoolV(*v, fastpathCheckNilTrue, e) + + case []uint64: + fastpathTV.EncSliceUint64V(v, fastpathCheckNilTrue, e) + case *[]uint64: + fastpathTV.EncSliceUint64V(*v, fastpathCheckNilTrue, e) + case map[uint64]interface{}: - fastpathTV.EncMapUint64IntfV(v, e) + fastpathTV.EncMapUint64IntfV(v, fastpathCheckNilTrue, e) case *map[uint64]interface{}: - fastpathTV.EncMapUint64IntfV(*v, e) + fastpathTV.EncMapUint64IntfV(*v, fastpathCheckNilTrue, e) + case map[uint64]string: - fastpathTV.EncMapUint64StringV(v, e) + fastpathTV.EncMapUint64StringV(v, fastpathCheckNilTrue, e) case *map[uint64]string: - fastpathTV.EncMapUint64StringV(*v, e) + fastpathTV.EncMapUint64StringV(*v, fastpathCheckNilTrue, e) + case map[uint64]uint: - fastpathTV.EncMapUint64UintV(v, e) + fastpathTV.EncMapUint64UintV(v, fastpathCheckNilTrue, e) case *map[uint64]uint: - fastpathTV.EncMapUint64UintV(*v, e) + fastpathTV.EncMapUint64UintV(*v, fastpathCheckNilTrue, e) + case map[uint64]uint8: - fastpathTV.EncMapUint64Uint8V(v, e) + fastpathTV.EncMapUint64Uint8V(v, fastpathCheckNilTrue, e) case *map[uint64]uint8: - fastpathTV.EncMapUint64Uint8V(*v, e) + fastpathTV.EncMapUint64Uint8V(*v, fastpathCheckNilTrue, e) + case map[uint64]uint16: - fastpathTV.EncMapUint64Uint16V(v, e) + fastpathTV.EncMapUint64Uint16V(v, fastpathCheckNilTrue, e) case *map[uint64]uint16: - fastpathTV.EncMapUint64Uint16V(*v, e) + fastpathTV.EncMapUint64Uint16V(*v, fastpathCheckNilTrue, e) + case map[uint64]uint32: - fastpathTV.EncMapUint64Uint32V(v, e) + fastpathTV.EncMapUint64Uint32V(v, fastpathCheckNilTrue, e) case *map[uint64]uint32: - fastpathTV.EncMapUint64Uint32V(*v, e) + fastpathTV.EncMapUint64Uint32V(*v, fastpathCheckNilTrue, e) + case map[uint64]uint64: - fastpathTV.EncMapUint64Uint64V(v, e) + fastpathTV.EncMapUint64Uint64V(v, fastpathCheckNilTrue, e) case *map[uint64]uint64: - fastpathTV.EncMapUint64Uint64V(*v, e) + fastpathTV.EncMapUint64Uint64V(*v, fastpathCheckNilTrue, e) + case map[uint64]uintptr: - fastpathTV.EncMapUint64UintptrV(v, e) + fastpathTV.EncMapUint64UintptrV(v, fastpathCheckNilTrue, e) case *map[uint64]uintptr: - fastpathTV.EncMapUint64UintptrV(*v, e) + fastpathTV.EncMapUint64UintptrV(*v, fastpathCheckNilTrue, e) + case map[uint64]int: - fastpathTV.EncMapUint64IntV(v, e) + fastpathTV.EncMapUint64IntV(v, fastpathCheckNilTrue, e) case *map[uint64]int: - fastpathTV.EncMapUint64IntV(*v, e) + fastpathTV.EncMapUint64IntV(*v, fastpathCheckNilTrue, e) + case map[uint64]int8: - fastpathTV.EncMapUint64Int8V(v, e) + fastpathTV.EncMapUint64Int8V(v, fastpathCheckNilTrue, e) case *map[uint64]int8: - fastpathTV.EncMapUint64Int8V(*v, e) + fastpathTV.EncMapUint64Int8V(*v, fastpathCheckNilTrue, e) + case map[uint64]int16: - fastpathTV.EncMapUint64Int16V(v, e) + fastpathTV.EncMapUint64Int16V(v, fastpathCheckNilTrue, e) case *map[uint64]int16: - fastpathTV.EncMapUint64Int16V(*v, e) + fastpathTV.EncMapUint64Int16V(*v, fastpathCheckNilTrue, e) + case map[uint64]int32: - fastpathTV.EncMapUint64Int32V(v, e) + fastpathTV.EncMapUint64Int32V(v, fastpathCheckNilTrue, e) case *map[uint64]int32: - fastpathTV.EncMapUint64Int32V(*v, e) + fastpathTV.EncMapUint64Int32V(*v, fastpathCheckNilTrue, e) + case map[uint64]int64: - fastpathTV.EncMapUint64Int64V(v, e) + fastpathTV.EncMapUint64Int64V(v, fastpathCheckNilTrue, e) case *map[uint64]int64: - fastpathTV.EncMapUint64Int64V(*v, e) + fastpathTV.EncMapUint64Int64V(*v, fastpathCheckNilTrue, e) + case map[uint64]float32: - fastpathTV.EncMapUint64Float32V(v, e) + fastpathTV.EncMapUint64Float32V(v, fastpathCheckNilTrue, e) case *map[uint64]float32: - fastpathTV.EncMapUint64Float32V(*v, e) + fastpathTV.EncMapUint64Float32V(*v, fastpathCheckNilTrue, e) + case map[uint64]float64: - fastpathTV.EncMapUint64Float64V(v, e) + fastpathTV.EncMapUint64Float64V(v, fastpathCheckNilTrue, e) case *map[uint64]float64: - fastpathTV.EncMapUint64Float64V(*v, e) + fastpathTV.EncMapUint64Float64V(*v, fastpathCheckNilTrue, e) + case map[uint64]bool: - fastpathTV.EncMapUint64BoolV(v, e) + fastpathTV.EncMapUint64BoolV(v, fastpathCheckNilTrue, e) case *map[uint64]bool: - fastpathTV.EncMapUint64BoolV(*v, e) + fastpathTV.EncMapUint64BoolV(*v, fastpathCheckNilTrue, e) + + case []uintptr: + fastpathTV.EncSliceUintptrV(v, fastpathCheckNilTrue, e) + case *[]uintptr: + fastpathTV.EncSliceUintptrV(*v, fastpathCheckNilTrue, e) + case map[uintptr]interface{}: - fastpathTV.EncMapUintptrIntfV(v, e) + fastpathTV.EncMapUintptrIntfV(v, fastpathCheckNilTrue, e) case *map[uintptr]interface{}: - fastpathTV.EncMapUintptrIntfV(*v, e) + fastpathTV.EncMapUintptrIntfV(*v, fastpathCheckNilTrue, e) + case map[uintptr]string: - fastpathTV.EncMapUintptrStringV(v, e) + fastpathTV.EncMapUintptrStringV(v, fastpathCheckNilTrue, e) case *map[uintptr]string: - fastpathTV.EncMapUintptrStringV(*v, e) + fastpathTV.EncMapUintptrStringV(*v, fastpathCheckNilTrue, e) + case map[uintptr]uint: - fastpathTV.EncMapUintptrUintV(v, e) + fastpathTV.EncMapUintptrUintV(v, fastpathCheckNilTrue, e) case *map[uintptr]uint: - fastpathTV.EncMapUintptrUintV(*v, e) + fastpathTV.EncMapUintptrUintV(*v, fastpathCheckNilTrue, e) + case map[uintptr]uint8: - fastpathTV.EncMapUintptrUint8V(v, e) + fastpathTV.EncMapUintptrUint8V(v, fastpathCheckNilTrue, e) case *map[uintptr]uint8: - fastpathTV.EncMapUintptrUint8V(*v, e) + fastpathTV.EncMapUintptrUint8V(*v, fastpathCheckNilTrue, e) + case map[uintptr]uint16: - fastpathTV.EncMapUintptrUint16V(v, e) + fastpathTV.EncMapUintptrUint16V(v, fastpathCheckNilTrue, e) case *map[uintptr]uint16: - fastpathTV.EncMapUintptrUint16V(*v, e) + fastpathTV.EncMapUintptrUint16V(*v, fastpathCheckNilTrue, e) + case map[uintptr]uint32: - fastpathTV.EncMapUintptrUint32V(v, e) + fastpathTV.EncMapUintptrUint32V(v, fastpathCheckNilTrue, e) case *map[uintptr]uint32: - fastpathTV.EncMapUintptrUint32V(*v, e) + fastpathTV.EncMapUintptrUint32V(*v, fastpathCheckNilTrue, e) + case map[uintptr]uint64: - fastpathTV.EncMapUintptrUint64V(v, e) + fastpathTV.EncMapUintptrUint64V(v, fastpathCheckNilTrue, e) case *map[uintptr]uint64: - fastpathTV.EncMapUintptrUint64V(*v, e) + fastpathTV.EncMapUintptrUint64V(*v, fastpathCheckNilTrue, e) + case map[uintptr]uintptr: - fastpathTV.EncMapUintptrUintptrV(v, e) + fastpathTV.EncMapUintptrUintptrV(v, fastpathCheckNilTrue, e) case *map[uintptr]uintptr: - fastpathTV.EncMapUintptrUintptrV(*v, e) + fastpathTV.EncMapUintptrUintptrV(*v, fastpathCheckNilTrue, e) + case map[uintptr]int: - fastpathTV.EncMapUintptrIntV(v, e) + fastpathTV.EncMapUintptrIntV(v, fastpathCheckNilTrue, e) case *map[uintptr]int: - fastpathTV.EncMapUintptrIntV(*v, e) + fastpathTV.EncMapUintptrIntV(*v, fastpathCheckNilTrue, e) + case map[uintptr]int8: - fastpathTV.EncMapUintptrInt8V(v, e) + fastpathTV.EncMapUintptrInt8V(v, fastpathCheckNilTrue, e) case *map[uintptr]int8: - fastpathTV.EncMapUintptrInt8V(*v, e) + fastpathTV.EncMapUintptrInt8V(*v, fastpathCheckNilTrue, e) + case map[uintptr]int16: - fastpathTV.EncMapUintptrInt16V(v, e) + fastpathTV.EncMapUintptrInt16V(v, fastpathCheckNilTrue, e) case *map[uintptr]int16: - fastpathTV.EncMapUintptrInt16V(*v, e) + fastpathTV.EncMapUintptrInt16V(*v, fastpathCheckNilTrue, e) + case map[uintptr]int32: - fastpathTV.EncMapUintptrInt32V(v, e) + fastpathTV.EncMapUintptrInt32V(v, fastpathCheckNilTrue, e) case *map[uintptr]int32: - fastpathTV.EncMapUintptrInt32V(*v, e) + fastpathTV.EncMapUintptrInt32V(*v, fastpathCheckNilTrue, e) + case map[uintptr]int64: - fastpathTV.EncMapUintptrInt64V(v, e) + fastpathTV.EncMapUintptrInt64V(v, fastpathCheckNilTrue, e) case *map[uintptr]int64: - fastpathTV.EncMapUintptrInt64V(*v, e) + fastpathTV.EncMapUintptrInt64V(*v, fastpathCheckNilTrue, e) + case map[uintptr]float32: - fastpathTV.EncMapUintptrFloat32V(v, e) + fastpathTV.EncMapUintptrFloat32V(v, fastpathCheckNilTrue, e) case *map[uintptr]float32: - fastpathTV.EncMapUintptrFloat32V(*v, e) + fastpathTV.EncMapUintptrFloat32V(*v, fastpathCheckNilTrue, e) + case map[uintptr]float64: - fastpathTV.EncMapUintptrFloat64V(v, e) + fastpathTV.EncMapUintptrFloat64V(v, fastpathCheckNilTrue, e) case *map[uintptr]float64: - fastpathTV.EncMapUintptrFloat64V(*v, e) + fastpathTV.EncMapUintptrFloat64V(*v, fastpathCheckNilTrue, e) + case map[uintptr]bool: - fastpathTV.EncMapUintptrBoolV(v, e) + fastpathTV.EncMapUintptrBoolV(v, fastpathCheckNilTrue, e) case *map[uintptr]bool: - fastpathTV.EncMapUintptrBoolV(*v, e) + fastpathTV.EncMapUintptrBoolV(*v, fastpathCheckNilTrue, e) + + case []int: + fastpathTV.EncSliceIntV(v, fastpathCheckNilTrue, e) + case *[]int: + fastpathTV.EncSliceIntV(*v, fastpathCheckNilTrue, e) + case map[int]interface{}: - fastpathTV.EncMapIntIntfV(v, e) + fastpathTV.EncMapIntIntfV(v, fastpathCheckNilTrue, e) case *map[int]interface{}: - fastpathTV.EncMapIntIntfV(*v, e) + fastpathTV.EncMapIntIntfV(*v, fastpathCheckNilTrue, e) + case map[int]string: - fastpathTV.EncMapIntStringV(v, e) + fastpathTV.EncMapIntStringV(v, fastpathCheckNilTrue, e) case *map[int]string: - fastpathTV.EncMapIntStringV(*v, e) + fastpathTV.EncMapIntStringV(*v, fastpathCheckNilTrue, e) + case map[int]uint: - fastpathTV.EncMapIntUintV(v, e) + fastpathTV.EncMapIntUintV(v, fastpathCheckNilTrue, e) case *map[int]uint: - fastpathTV.EncMapIntUintV(*v, e) + fastpathTV.EncMapIntUintV(*v, fastpathCheckNilTrue, e) + case map[int]uint8: - fastpathTV.EncMapIntUint8V(v, e) + fastpathTV.EncMapIntUint8V(v, fastpathCheckNilTrue, e) case *map[int]uint8: - fastpathTV.EncMapIntUint8V(*v, e) + fastpathTV.EncMapIntUint8V(*v, fastpathCheckNilTrue, e) + case map[int]uint16: - fastpathTV.EncMapIntUint16V(v, e) + fastpathTV.EncMapIntUint16V(v, fastpathCheckNilTrue, e) case *map[int]uint16: - fastpathTV.EncMapIntUint16V(*v, e) + fastpathTV.EncMapIntUint16V(*v, fastpathCheckNilTrue, e) + case map[int]uint32: - fastpathTV.EncMapIntUint32V(v, e) + fastpathTV.EncMapIntUint32V(v, fastpathCheckNilTrue, e) case *map[int]uint32: - fastpathTV.EncMapIntUint32V(*v, e) + fastpathTV.EncMapIntUint32V(*v, fastpathCheckNilTrue, e) + case map[int]uint64: - fastpathTV.EncMapIntUint64V(v, e) + fastpathTV.EncMapIntUint64V(v, fastpathCheckNilTrue, e) case *map[int]uint64: - fastpathTV.EncMapIntUint64V(*v, e) + fastpathTV.EncMapIntUint64V(*v, fastpathCheckNilTrue, e) + case map[int]uintptr: - fastpathTV.EncMapIntUintptrV(v, e) + fastpathTV.EncMapIntUintptrV(v, fastpathCheckNilTrue, e) case *map[int]uintptr: - fastpathTV.EncMapIntUintptrV(*v, e) + fastpathTV.EncMapIntUintptrV(*v, fastpathCheckNilTrue, e) + case map[int]int: - fastpathTV.EncMapIntIntV(v, e) + fastpathTV.EncMapIntIntV(v, fastpathCheckNilTrue, e) case *map[int]int: - fastpathTV.EncMapIntIntV(*v, e) + fastpathTV.EncMapIntIntV(*v, fastpathCheckNilTrue, e) + case map[int]int8: - fastpathTV.EncMapIntInt8V(v, e) + fastpathTV.EncMapIntInt8V(v, fastpathCheckNilTrue, e) case *map[int]int8: - fastpathTV.EncMapIntInt8V(*v, e) + fastpathTV.EncMapIntInt8V(*v, fastpathCheckNilTrue, e) + case map[int]int16: - fastpathTV.EncMapIntInt16V(v, e) + fastpathTV.EncMapIntInt16V(v, fastpathCheckNilTrue, e) case *map[int]int16: - fastpathTV.EncMapIntInt16V(*v, e) + fastpathTV.EncMapIntInt16V(*v, fastpathCheckNilTrue, e) + case map[int]int32: - fastpathTV.EncMapIntInt32V(v, e) + fastpathTV.EncMapIntInt32V(v, fastpathCheckNilTrue, e) case *map[int]int32: - fastpathTV.EncMapIntInt32V(*v, e) + fastpathTV.EncMapIntInt32V(*v, fastpathCheckNilTrue, e) + case map[int]int64: - fastpathTV.EncMapIntInt64V(v, e) + fastpathTV.EncMapIntInt64V(v, fastpathCheckNilTrue, e) case *map[int]int64: - fastpathTV.EncMapIntInt64V(*v, e) + fastpathTV.EncMapIntInt64V(*v, fastpathCheckNilTrue, e) + case map[int]float32: - fastpathTV.EncMapIntFloat32V(v, e) + fastpathTV.EncMapIntFloat32V(v, fastpathCheckNilTrue, e) case *map[int]float32: - fastpathTV.EncMapIntFloat32V(*v, e) + fastpathTV.EncMapIntFloat32V(*v, fastpathCheckNilTrue, e) + case map[int]float64: - fastpathTV.EncMapIntFloat64V(v, e) + fastpathTV.EncMapIntFloat64V(v, fastpathCheckNilTrue, e) case *map[int]float64: - fastpathTV.EncMapIntFloat64V(*v, e) + fastpathTV.EncMapIntFloat64V(*v, fastpathCheckNilTrue, e) + case map[int]bool: - fastpathTV.EncMapIntBoolV(v, e) + fastpathTV.EncMapIntBoolV(v, fastpathCheckNilTrue, e) case *map[int]bool: - fastpathTV.EncMapIntBoolV(*v, e) + fastpathTV.EncMapIntBoolV(*v, fastpathCheckNilTrue, e) + + case []int8: + fastpathTV.EncSliceInt8V(v, fastpathCheckNilTrue, e) + case *[]int8: + fastpathTV.EncSliceInt8V(*v, fastpathCheckNilTrue, e) + case map[int8]interface{}: - fastpathTV.EncMapInt8IntfV(v, e) + fastpathTV.EncMapInt8IntfV(v, fastpathCheckNilTrue, e) case *map[int8]interface{}: - fastpathTV.EncMapInt8IntfV(*v, e) + fastpathTV.EncMapInt8IntfV(*v, fastpathCheckNilTrue, e) + case map[int8]string: - fastpathTV.EncMapInt8StringV(v, e) + fastpathTV.EncMapInt8StringV(v, fastpathCheckNilTrue, e) case *map[int8]string: - fastpathTV.EncMapInt8StringV(*v, e) + fastpathTV.EncMapInt8StringV(*v, fastpathCheckNilTrue, e) + case map[int8]uint: - fastpathTV.EncMapInt8UintV(v, e) + fastpathTV.EncMapInt8UintV(v, fastpathCheckNilTrue, e) case *map[int8]uint: - fastpathTV.EncMapInt8UintV(*v, e) + fastpathTV.EncMapInt8UintV(*v, fastpathCheckNilTrue, e) + case map[int8]uint8: - fastpathTV.EncMapInt8Uint8V(v, e) + fastpathTV.EncMapInt8Uint8V(v, fastpathCheckNilTrue, e) case *map[int8]uint8: - fastpathTV.EncMapInt8Uint8V(*v, e) + fastpathTV.EncMapInt8Uint8V(*v, fastpathCheckNilTrue, e) + case map[int8]uint16: - fastpathTV.EncMapInt8Uint16V(v, e) + fastpathTV.EncMapInt8Uint16V(v, fastpathCheckNilTrue, e) case *map[int8]uint16: - fastpathTV.EncMapInt8Uint16V(*v, e) + fastpathTV.EncMapInt8Uint16V(*v, fastpathCheckNilTrue, e) + case map[int8]uint32: - fastpathTV.EncMapInt8Uint32V(v, e) + fastpathTV.EncMapInt8Uint32V(v, fastpathCheckNilTrue, e) case *map[int8]uint32: - fastpathTV.EncMapInt8Uint32V(*v, e) + fastpathTV.EncMapInt8Uint32V(*v, fastpathCheckNilTrue, e) + case map[int8]uint64: - fastpathTV.EncMapInt8Uint64V(v, e) + fastpathTV.EncMapInt8Uint64V(v, fastpathCheckNilTrue, e) case *map[int8]uint64: - fastpathTV.EncMapInt8Uint64V(*v, e) + fastpathTV.EncMapInt8Uint64V(*v, fastpathCheckNilTrue, e) + case map[int8]uintptr: - fastpathTV.EncMapInt8UintptrV(v, e) + fastpathTV.EncMapInt8UintptrV(v, fastpathCheckNilTrue, e) case *map[int8]uintptr: - fastpathTV.EncMapInt8UintptrV(*v, e) + fastpathTV.EncMapInt8UintptrV(*v, fastpathCheckNilTrue, e) + case map[int8]int: - fastpathTV.EncMapInt8IntV(v, e) + fastpathTV.EncMapInt8IntV(v, fastpathCheckNilTrue, e) case *map[int8]int: - fastpathTV.EncMapInt8IntV(*v, e) + fastpathTV.EncMapInt8IntV(*v, fastpathCheckNilTrue, e) + case map[int8]int8: - fastpathTV.EncMapInt8Int8V(v, e) + fastpathTV.EncMapInt8Int8V(v, fastpathCheckNilTrue, e) case *map[int8]int8: - fastpathTV.EncMapInt8Int8V(*v, e) + fastpathTV.EncMapInt8Int8V(*v, fastpathCheckNilTrue, e) + case map[int8]int16: - fastpathTV.EncMapInt8Int16V(v, e) + fastpathTV.EncMapInt8Int16V(v, fastpathCheckNilTrue, e) case *map[int8]int16: - fastpathTV.EncMapInt8Int16V(*v, e) + fastpathTV.EncMapInt8Int16V(*v, fastpathCheckNilTrue, e) + case map[int8]int32: - fastpathTV.EncMapInt8Int32V(v, e) + fastpathTV.EncMapInt8Int32V(v, fastpathCheckNilTrue, e) case *map[int8]int32: - fastpathTV.EncMapInt8Int32V(*v, e) + fastpathTV.EncMapInt8Int32V(*v, fastpathCheckNilTrue, e) + case map[int8]int64: - fastpathTV.EncMapInt8Int64V(v, e) + fastpathTV.EncMapInt8Int64V(v, fastpathCheckNilTrue, e) case *map[int8]int64: - fastpathTV.EncMapInt8Int64V(*v, e) + fastpathTV.EncMapInt8Int64V(*v, fastpathCheckNilTrue, e) + case map[int8]float32: - fastpathTV.EncMapInt8Float32V(v, e) + fastpathTV.EncMapInt8Float32V(v, fastpathCheckNilTrue, e) case *map[int8]float32: - fastpathTV.EncMapInt8Float32V(*v, e) + fastpathTV.EncMapInt8Float32V(*v, fastpathCheckNilTrue, e) + case map[int8]float64: - fastpathTV.EncMapInt8Float64V(v, e) + fastpathTV.EncMapInt8Float64V(v, fastpathCheckNilTrue, e) case *map[int8]float64: - fastpathTV.EncMapInt8Float64V(*v, e) + fastpathTV.EncMapInt8Float64V(*v, fastpathCheckNilTrue, e) + case map[int8]bool: - fastpathTV.EncMapInt8BoolV(v, e) + fastpathTV.EncMapInt8BoolV(v, fastpathCheckNilTrue, e) case *map[int8]bool: - fastpathTV.EncMapInt8BoolV(*v, e) + fastpathTV.EncMapInt8BoolV(*v, fastpathCheckNilTrue, e) + + case []int16: + fastpathTV.EncSliceInt16V(v, fastpathCheckNilTrue, e) + case *[]int16: + fastpathTV.EncSliceInt16V(*v, fastpathCheckNilTrue, e) + case map[int16]interface{}: - fastpathTV.EncMapInt16IntfV(v, e) + fastpathTV.EncMapInt16IntfV(v, fastpathCheckNilTrue, e) case *map[int16]interface{}: - fastpathTV.EncMapInt16IntfV(*v, e) + fastpathTV.EncMapInt16IntfV(*v, fastpathCheckNilTrue, e) + case map[int16]string: - fastpathTV.EncMapInt16StringV(v, e) + fastpathTV.EncMapInt16StringV(v, fastpathCheckNilTrue, e) case *map[int16]string: - fastpathTV.EncMapInt16StringV(*v, e) + fastpathTV.EncMapInt16StringV(*v, fastpathCheckNilTrue, e) + case map[int16]uint: - fastpathTV.EncMapInt16UintV(v, e) + fastpathTV.EncMapInt16UintV(v, fastpathCheckNilTrue, e) case *map[int16]uint: - fastpathTV.EncMapInt16UintV(*v, e) + fastpathTV.EncMapInt16UintV(*v, fastpathCheckNilTrue, e) + case map[int16]uint8: - fastpathTV.EncMapInt16Uint8V(v, e) + fastpathTV.EncMapInt16Uint8V(v, fastpathCheckNilTrue, e) case *map[int16]uint8: - fastpathTV.EncMapInt16Uint8V(*v, e) + fastpathTV.EncMapInt16Uint8V(*v, fastpathCheckNilTrue, e) + case map[int16]uint16: - fastpathTV.EncMapInt16Uint16V(v, e) + fastpathTV.EncMapInt16Uint16V(v, fastpathCheckNilTrue, e) case *map[int16]uint16: - fastpathTV.EncMapInt16Uint16V(*v, e) + fastpathTV.EncMapInt16Uint16V(*v, fastpathCheckNilTrue, e) + case map[int16]uint32: - fastpathTV.EncMapInt16Uint32V(v, e) + fastpathTV.EncMapInt16Uint32V(v, fastpathCheckNilTrue, e) case *map[int16]uint32: - fastpathTV.EncMapInt16Uint32V(*v, e) + fastpathTV.EncMapInt16Uint32V(*v, fastpathCheckNilTrue, e) + case map[int16]uint64: - fastpathTV.EncMapInt16Uint64V(v, e) + fastpathTV.EncMapInt16Uint64V(v, fastpathCheckNilTrue, e) case *map[int16]uint64: - fastpathTV.EncMapInt16Uint64V(*v, e) + fastpathTV.EncMapInt16Uint64V(*v, fastpathCheckNilTrue, e) + case map[int16]uintptr: - fastpathTV.EncMapInt16UintptrV(v, e) + fastpathTV.EncMapInt16UintptrV(v, fastpathCheckNilTrue, e) case *map[int16]uintptr: - fastpathTV.EncMapInt16UintptrV(*v, e) + fastpathTV.EncMapInt16UintptrV(*v, fastpathCheckNilTrue, e) + case map[int16]int: - fastpathTV.EncMapInt16IntV(v, e) + fastpathTV.EncMapInt16IntV(v, fastpathCheckNilTrue, e) case *map[int16]int: - fastpathTV.EncMapInt16IntV(*v, e) + fastpathTV.EncMapInt16IntV(*v, fastpathCheckNilTrue, e) + case map[int16]int8: - fastpathTV.EncMapInt16Int8V(v, e) + fastpathTV.EncMapInt16Int8V(v, fastpathCheckNilTrue, e) case *map[int16]int8: - fastpathTV.EncMapInt16Int8V(*v, e) + fastpathTV.EncMapInt16Int8V(*v, fastpathCheckNilTrue, e) + case map[int16]int16: - fastpathTV.EncMapInt16Int16V(v, e) + fastpathTV.EncMapInt16Int16V(v, fastpathCheckNilTrue, e) case *map[int16]int16: - fastpathTV.EncMapInt16Int16V(*v, e) + fastpathTV.EncMapInt16Int16V(*v, fastpathCheckNilTrue, e) + case map[int16]int32: - fastpathTV.EncMapInt16Int32V(v, e) + fastpathTV.EncMapInt16Int32V(v, fastpathCheckNilTrue, e) case *map[int16]int32: - fastpathTV.EncMapInt16Int32V(*v, e) + fastpathTV.EncMapInt16Int32V(*v, fastpathCheckNilTrue, e) + case map[int16]int64: - fastpathTV.EncMapInt16Int64V(v, e) + fastpathTV.EncMapInt16Int64V(v, fastpathCheckNilTrue, e) case *map[int16]int64: - fastpathTV.EncMapInt16Int64V(*v, e) + fastpathTV.EncMapInt16Int64V(*v, fastpathCheckNilTrue, e) + case map[int16]float32: - fastpathTV.EncMapInt16Float32V(v, e) + fastpathTV.EncMapInt16Float32V(v, fastpathCheckNilTrue, e) case *map[int16]float32: - fastpathTV.EncMapInt16Float32V(*v, e) + fastpathTV.EncMapInt16Float32V(*v, fastpathCheckNilTrue, e) + case map[int16]float64: - fastpathTV.EncMapInt16Float64V(v, e) + fastpathTV.EncMapInt16Float64V(v, fastpathCheckNilTrue, e) case *map[int16]float64: - fastpathTV.EncMapInt16Float64V(*v, e) + fastpathTV.EncMapInt16Float64V(*v, fastpathCheckNilTrue, e) + case map[int16]bool: - fastpathTV.EncMapInt16BoolV(v, e) + fastpathTV.EncMapInt16BoolV(v, fastpathCheckNilTrue, e) case *map[int16]bool: - fastpathTV.EncMapInt16BoolV(*v, e) + fastpathTV.EncMapInt16BoolV(*v, fastpathCheckNilTrue, e) + + case []int32: + fastpathTV.EncSliceInt32V(v, fastpathCheckNilTrue, e) + case *[]int32: + fastpathTV.EncSliceInt32V(*v, fastpathCheckNilTrue, e) + case map[int32]interface{}: - fastpathTV.EncMapInt32IntfV(v, e) + fastpathTV.EncMapInt32IntfV(v, fastpathCheckNilTrue, e) case *map[int32]interface{}: - fastpathTV.EncMapInt32IntfV(*v, e) + fastpathTV.EncMapInt32IntfV(*v, fastpathCheckNilTrue, e) + case map[int32]string: - fastpathTV.EncMapInt32StringV(v, e) + fastpathTV.EncMapInt32StringV(v, fastpathCheckNilTrue, e) case *map[int32]string: - fastpathTV.EncMapInt32StringV(*v, e) + fastpathTV.EncMapInt32StringV(*v, fastpathCheckNilTrue, e) + case map[int32]uint: - fastpathTV.EncMapInt32UintV(v, e) + fastpathTV.EncMapInt32UintV(v, fastpathCheckNilTrue, e) case *map[int32]uint: - fastpathTV.EncMapInt32UintV(*v, e) + fastpathTV.EncMapInt32UintV(*v, fastpathCheckNilTrue, e) + case map[int32]uint8: - fastpathTV.EncMapInt32Uint8V(v, e) + fastpathTV.EncMapInt32Uint8V(v, fastpathCheckNilTrue, e) case *map[int32]uint8: - fastpathTV.EncMapInt32Uint8V(*v, e) + fastpathTV.EncMapInt32Uint8V(*v, fastpathCheckNilTrue, e) + case map[int32]uint16: - fastpathTV.EncMapInt32Uint16V(v, e) + fastpathTV.EncMapInt32Uint16V(v, fastpathCheckNilTrue, e) case *map[int32]uint16: - fastpathTV.EncMapInt32Uint16V(*v, e) + fastpathTV.EncMapInt32Uint16V(*v, fastpathCheckNilTrue, e) + case map[int32]uint32: - fastpathTV.EncMapInt32Uint32V(v, e) + fastpathTV.EncMapInt32Uint32V(v, fastpathCheckNilTrue, e) case *map[int32]uint32: - fastpathTV.EncMapInt32Uint32V(*v, e) + fastpathTV.EncMapInt32Uint32V(*v, fastpathCheckNilTrue, e) + case map[int32]uint64: - fastpathTV.EncMapInt32Uint64V(v, e) + fastpathTV.EncMapInt32Uint64V(v, fastpathCheckNilTrue, e) case *map[int32]uint64: - fastpathTV.EncMapInt32Uint64V(*v, e) + fastpathTV.EncMapInt32Uint64V(*v, fastpathCheckNilTrue, e) + case map[int32]uintptr: - fastpathTV.EncMapInt32UintptrV(v, e) + fastpathTV.EncMapInt32UintptrV(v, fastpathCheckNilTrue, e) case *map[int32]uintptr: - fastpathTV.EncMapInt32UintptrV(*v, e) + fastpathTV.EncMapInt32UintptrV(*v, fastpathCheckNilTrue, e) + case map[int32]int: - fastpathTV.EncMapInt32IntV(v, e) + fastpathTV.EncMapInt32IntV(v, fastpathCheckNilTrue, e) case *map[int32]int: - fastpathTV.EncMapInt32IntV(*v, e) + fastpathTV.EncMapInt32IntV(*v, fastpathCheckNilTrue, e) + case map[int32]int8: - fastpathTV.EncMapInt32Int8V(v, e) + fastpathTV.EncMapInt32Int8V(v, fastpathCheckNilTrue, e) case *map[int32]int8: - fastpathTV.EncMapInt32Int8V(*v, e) + fastpathTV.EncMapInt32Int8V(*v, fastpathCheckNilTrue, e) + case map[int32]int16: - fastpathTV.EncMapInt32Int16V(v, e) + fastpathTV.EncMapInt32Int16V(v, fastpathCheckNilTrue, e) case *map[int32]int16: - fastpathTV.EncMapInt32Int16V(*v, e) + fastpathTV.EncMapInt32Int16V(*v, fastpathCheckNilTrue, e) + case map[int32]int32: - fastpathTV.EncMapInt32Int32V(v, e) + fastpathTV.EncMapInt32Int32V(v, fastpathCheckNilTrue, e) case *map[int32]int32: - fastpathTV.EncMapInt32Int32V(*v, e) + fastpathTV.EncMapInt32Int32V(*v, fastpathCheckNilTrue, e) + case map[int32]int64: - fastpathTV.EncMapInt32Int64V(v, e) + fastpathTV.EncMapInt32Int64V(v, fastpathCheckNilTrue, e) case *map[int32]int64: - fastpathTV.EncMapInt32Int64V(*v, e) + fastpathTV.EncMapInt32Int64V(*v, fastpathCheckNilTrue, e) + case map[int32]float32: - fastpathTV.EncMapInt32Float32V(v, e) + fastpathTV.EncMapInt32Float32V(v, fastpathCheckNilTrue, e) case *map[int32]float32: - fastpathTV.EncMapInt32Float32V(*v, e) + fastpathTV.EncMapInt32Float32V(*v, fastpathCheckNilTrue, e) + case map[int32]float64: - fastpathTV.EncMapInt32Float64V(v, e) + fastpathTV.EncMapInt32Float64V(v, fastpathCheckNilTrue, e) case *map[int32]float64: - fastpathTV.EncMapInt32Float64V(*v, e) + fastpathTV.EncMapInt32Float64V(*v, fastpathCheckNilTrue, e) + case map[int32]bool: - fastpathTV.EncMapInt32BoolV(v, e) + fastpathTV.EncMapInt32BoolV(v, fastpathCheckNilTrue, e) case *map[int32]bool: - fastpathTV.EncMapInt32BoolV(*v, e) + fastpathTV.EncMapInt32BoolV(*v, fastpathCheckNilTrue, e) + + case []int64: + fastpathTV.EncSliceInt64V(v, fastpathCheckNilTrue, e) + case *[]int64: + fastpathTV.EncSliceInt64V(*v, fastpathCheckNilTrue, e) + case map[int64]interface{}: - fastpathTV.EncMapInt64IntfV(v, e) + fastpathTV.EncMapInt64IntfV(v, fastpathCheckNilTrue, e) case *map[int64]interface{}: - fastpathTV.EncMapInt64IntfV(*v, e) + fastpathTV.EncMapInt64IntfV(*v, fastpathCheckNilTrue, e) + case map[int64]string: - fastpathTV.EncMapInt64StringV(v, e) + fastpathTV.EncMapInt64StringV(v, fastpathCheckNilTrue, e) case *map[int64]string: - fastpathTV.EncMapInt64StringV(*v, e) + fastpathTV.EncMapInt64StringV(*v, fastpathCheckNilTrue, e) + case map[int64]uint: - fastpathTV.EncMapInt64UintV(v, e) + fastpathTV.EncMapInt64UintV(v, fastpathCheckNilTrue, e) case *map[int64]uint: - fastpathTV.EncMapInt64UintV(*v, e) + fastpathTV.EncMapInt64UintV(*v, fastpathCheckNilTrue, e) + case map[int64]uint8: - fastpathTV.EncMapInt64Uint8V(v, e) + fastpathTV.EncMapInt64Uint8V(v, fastpathCheckNilTrue, e) case *map[int64]uint8: - fastpathTV.EncMapInt64Uint8V(*v, e) + fastpathTV.EncMapInt64Uint8V(*v, fastpathCheckNilTrue, e) + case map[int64]uint16: - fastpathTV.EncMapInt64Uint16V(v, e) + fastpathTV.EncMapInt64Uint16V(v, fastpathCheckNilTrue, e) case *map[int64]uint16: - fastpathTV.EncMapInt64Uint16V(*v, e) + fastpathTV.EncMapInt64Uint16V(*v, fastpathCheckNilTrue, e) + case map[int64]uint32: - fastpathTV.EncMapInt64Uint32V(v, e) + fastpathTV.EncMapInt64Uint32V(v, fastpathCheckNilTrue, e) case *map[int64]uint32: - fastpathTV.EncMapInt64Uint32V(*v, e) + fastpathTV.EncMapInt64Uint32V(*v, fastpathCheckNilTrue, e) + case map[int64]uint64: - fastpathTV.EncMapInt64Uint64V(v, e) + fastpathTV.EncMapInt64Uint64V(v, fastpathCheckNilTrue, e) case *map[int64]uint64: - fastpathTV.EncMapInt64Uint64V(*v, e) + fastpathTV.EncMapInt64Uint64V(*v, fastpathCheckNilTrue, e) + case map[int64]uintptr: - fastpathTV.EncMapInt64UintptrV(v, e) + fastpathTV.EncMapInt64UintptrV(v, fastpathCheckNilTrue, e) case *map[int64]uintptr: - fastpathTV.EncMapInt64UintptrV(*v, e) + fastpathTV.EncMapInt64UintptrV(*v, fastpathCheckNilTrue, e) + case map[int64]int: - fastpathTV.EncMapInt64IntV(v, e) + fastpathTV.EncMapInt64IntV(v, fastpathCheckNilTrue, e) case *map[int64]int: - fastpathTV.EncMapInt64IntV(*v, e) + fastpathTV.EncMapInt64IntV(*v, fastpathCheckNilTrue, e) + case map[int64]int8: - fastpathTV.EncMapInt64Int8V(v, e) + fastpathTV.EncMapInt64Int8V(v, fastpathCheckNilTrue, e) case *map[int64]int8: - fastpathTV.EncMapInt64Int8V(*v, e) + fastpathTV.EncMapInt64Int8V(*v, fastpathCheckNilTrue, e) + case map[int64]int16: - fastpathTV.EncMapInt64Int16V(v, e) + fastpathTV.EncMapInt64Int16V(v, fastpathCheckNilTrue, e) case *map[int64]int16: - fastpathTV.EncMapInt64Int16V(*v, e) + fastpathTV.EncMapInt64Int16V(*v, fastpathCheckNilTrue, e) + case map[int64]int32: - fastpathTV.EncMapInt64Int32V(v, e) + fastpathTV.EncMapInt64Int32V(v, fastpathCheckNilTrue, e) case *map[int64]int32: - fastpathTV.EncMapInt64Int32V(*v, e) + fastpathTV.EncMapInt64Int32V(*v, fastpathCheckNilTrue, e) + case map[int64]int64: - fastpathTV.EncMapInt64Int64V(v, e) + fastpathTV.EncMapInt64Int64V(v, fastpathCheckNilTrue, e) case *map[int64]int64: - fastpathTV.EncMapInt64Int64V(*v, e) + fastpathTV.EncMapInt64Int64V(*v, fastpathCheckNilTrue, e) + case map[int64]float32: - fastpathTV.EncMapInt64Float32V(v, e) + fastpathTV.EncMapInt64Float32V(v, fastpathCheckNilTrue, e) case *map[int64]float32: - fastpathTV.EncMapInt64Float32V(*v, e) + fastpathTV.EncMapInt64Float32V(*v, fastpathCheckNilTrue, e) + case map[int64]float64: - fastpathTV.EncMapInt64Float64V(v, e) + fastpathTV.EncMapInt64Float64V(v, fastpathCheckNilTrue, e) case *map[int64]float64: - fastpathTV.EncMapInt64Float64V(*v, e) + fastpathTV.EncMapInt64Float64V(*v, fastpathCheckNilTrue, e) + case map[int64]bool: - fastpathTV.EncMapInt64BoolV(v, e) + fastpathTV.EncMapInt64BoolV(v, fastpathCheckNilTrue, e) case *map[int64]bool: - fastpathTV.EncMapInt64BoolV(*v, e) + fastpathTV.EncMapInt64BoolV(*v, fastpathCheckNilTrue, e) + + case []bool: + fastpathTV.EncSliceBoolV(v, fastpathCheckNilTrue, e) + case *[]bool: + fastpathTV.EncSliceBoolV(*v, fastpathCheckNilTrue, e) + case map[bool]interface{}: - fastpathTV.EncMapBoolIntfV(v, e) + fastpathTV.EncMapBoolIntfV(v, fastpathCheckNilTrue, e) case *map[bool]interface{}: - fastpathTV.EncMapBoolIntfV(*v, e) + fastpathTV.EncMapBoolIntfV(*v, fastpathCheckNilTrue, e) + case map[bool]string: - fastpathTV.EncMapBoolStringV(v, e) + fastpathTV.EncMapBoolStringV(v, fastpathCheckNilTrue, e) case *map[bool]string: - fastpathTV.EncMapBoolStringV(*v, e) + fastpathTV.EncMapBoolStringV(*v, fastpathCheckNilTrue, e) + case map[bool]uint: - fastpathTV.EncMapBoolUintV(v, e) + fastpathTV.EncMapBoolUintV(v, fastpathCheckNilTrue, e) case *map[bool]uint: - fastpathTV.EncMapBoolUintV(*v, e) + fastpathTV.EncMapBoolUintV(*v, fastpathCheckNilTrue, e) + case map[bool]uint8: - fastpathTV.EncMapBoolUint8V(v, e) + fastpathTV.EncMapBoolUint8V(v, fastpathCheckNilTrue, e) case *map[bool]uint8: - fastpathTV.EncMapBoolUint8V(*v, e) + fastpathTV.EncMapBoolUint8V(*v, fastpathCheckNilTrue, e) + case map[bool]uint16: - fastpathTV.EncMapBoolUint16V(v, e) + fastpathTV.EncMapBoolUint16V(v, fastpathCheckNilTrue, e) case *map[bool]uint16: - fastpathTV.EncMapBoolUint16V(*v, e) + fastpathTV.EncMapBoolUint16V(*v, fastpathCheckNilTrue, e) + case map[bool]uint32: - fastpathTV.EncMapBoolUint32V(v, e) + fastpathTV.EncMapBoolUint32V(v, fastpathCheckNilTrue, e) case *map[bool]uint32: - fastpathTV.EncMapBoolUint32V(*v, e) + fastpathTV.EncMapBoolUint32V(*v, fastpathCheckNilTrue, e) + case map[bool]uint64: - fastpathTV.EncMapBoolUint64V(v, e) + fastpathTV.EncMapBoolUint64V(v, fastpathCheckNilTrue, e) case *map[bool]uint64: - fastpathTV.EncMapBoolUint64V(*v, e) + fastpathTV.EncMapBoolUint64V(*v, fastpathCheckNilTrue, e) + case map[bool]uintptr: - fastpathTV.EncMapBoolUintptrV(v, e) + fastpathTV.EncMapBoolUintptrV(v, fastpathCheckNilTrue, e) case *map[bool]uintptr: - fastpathTV.EncMapBoolUintptrV(*v, e) + fastpathTV.EncMapBoolUintptrV(*v, fastpathCheckNilTrue, e) + case map[bool]int: - fastpathTV.EncMapBoolIntV(v, e) + fastpathTV.EncMapBoolIntV(v, fastpathCheckNilTrue, e) case *map[bool]int: - fastpathTV.EncMapBoolIntV(*v, e) + fastpathTV.EncMapBoolIntV(*v, fastpathCheckNilTrue, e) + case map[bool]int8: - fastpathTV.EncMapBoolInt8V(v, e) + fastpathTV.EncMapBoolInt8V(v, fastpathCheckNilTrue, e) case *map[bool]int8: - fastpathTV.EncMapBoolInt8V(*v, e) + fastpathTV.EncMapBoolInt8V(*v, fastpathCheckNilTrue, e) + case map[bool]int16: - fastpathTV.EncMapBoolInt16V(v, e) + fastpathTV.EncMapBoolInt16V(v, fastpathCheckNilTrue, e) case *map[bool]int16: - fastpathTV.EncMapBoolInt16V(*v, e) + fastpathTV.EncMapBoolInt16V(*v, fastpathCheckNilTrue, e) + case map[bool]int32: - fastpathTV.EncMapBoolInt32V(v, e) + fastpathTV.EncMapBoolInt32V(v, fastpathCheckNilTrue, e) case *map[bool]int32: - fastpathTV.EncMapBoolInt32V(*v, e) + fastpathTV.EncMapBoolInt32V(*v, fastpathCheckNilTrue, e) + case map[bool]int64: - fastpathTV.EncMapBoolInt64V(v, e) + fastpathTV.EncMapBoolInt64V(v, fastpathCheckNilTrue, e) case *map[bool]int64: - fastpathTV.EncMapBoolInt64V(*v, e) + fastpathTV.EncMapBoolInt64V(*v, fastpathCheckNilTrue, e) + case map[bool]float32: - fastpathTV.EncMapBoolFloat32V(v, e) + fastpathTV.EncMapBoolFloat32V(v, fastpathCheckNilTrue, e) case *map[bool]float32: - fastpathTV.EncMapBoolFloat32V(*v, e) + fastpathTV.EncMapBoolFloat32V(*v, fastpathCheckNilTrue, e) + case map[bool]float64: - fastpathTV.EncMapBoolFloat64V(v, e) + fastpathTV.EncMapBoolFloat64V(v, fastpathCheckNilTrue, e) case *map[bool]float64: - fastpathTV.EncMapBoolFloat64V(*v, e) + fastpathTV.EncMapBoolFloat64V(*v, fastpathCheckNilTrue, e) + case map[bool]bool: - fastpathTV.EncMapBoolBoolV(v, e) + fastpathTV.EncMapBoolBoolV(v, fastpathCheckNilTrue, e) case *map[bool]bool: - fastpathTV.EncMapBoolBoolV(*v, e) + fastpathTV.EncMapBoolBoolV(*v, fastpathCheckNilTrue, e) default: - _ = v // workaround https://github.com/golang/go/issues/12927 seen in go1.4 + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) return false } return true } -// -- -- fast path functions +func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { + switch v := iv.(type) { -func (e *Encoder) fastpathEncSliceIntfR(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceIntfV(rv2i(rv).([]interface{}), e) - } else { - fastpathTV.EncSliceIntfV(rv2i(rv).([]interface{}), e) - } -} -func (_ fastpathT) EncSliceIntfV(v []interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - e.encode(v2) - } - } else { - for _, v2 := range v { - e.encode(v2) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceIntfV(v []interface{}, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - e.encode(v2) - } - } else { - for _, v2 := range v { - e.encode(v2) - } - } - ee.WriteMapEnd() -} + case []interface{}: + fastpathTV.EncSliceIntfV(v, fastpathCheckNilTrue, e) + case *[]interface{}: + fastpathTV.EncSliceIntfV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceStringR(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceStringV(rv2i(rv).([]string), e) - } else { - fastpathTV.EncSliceStringV(rv2i(rv).([]string), e) - } -} -func (_ fastpathT) EncSliceStringV(v []string, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeString(cUTF8, v2) - } - } else { - for _, v2 := range v { - ee.EncodeString(cUTF8, v2) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceStringV(v []string, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeString(cUTF8, v2) - } - } else { - for _, v2 := range v { - ee.EncodeString(cUTF8, v2) - } - } - ee.WriteMapEnd() -} + case []string: + fastpathTV.EncSliceStringV(v, fastpathCheckNilTrue, e) + case *[]string: + fastpathTV.EncSliceStringV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceFloat32R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceFloat32V(rv2i(rv).([]float32), e) - } else { - fastpathTV.EncSliceFloat32V(rv2i(rv).([]float32), e) - } -} -func (_ fastpathT) EncSliceFloat32V(v []float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeFloat32(v2) - } - } else { - for _, v2 := range v { - ee.EncodeFloat32(v2) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceFloat32V(v []float32, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeFloat32(v2) - } - } else { - for _, v2 := range v { - ee.EncodeFloat32(v2) - } - } - ee.WriteMapEnd() -} + case []float32: + fastpathTV.EncSliceFloat32V(v, fastpathCheckNilTrue, e) + case *[]float32: + fastpathTV.EncSliceFloat32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceFloat64R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceFloat64V(rv2i(rv).([]float64), e) - } else { - fastpathTV.EncSliceFloat64V(rv2i(rv).([]float64), e) - } -} -func (_ fastpathT) EncSliceFloat64V(v []float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeFloat64(v2) - } - } else { - for _, v2 := range v { - ee.EncodeFloat64(v2) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceFloat64V(v []float64, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeFloat64(v2) - } - } else { - for _, v2 := range v { - ee.EncodeFloat64(v2) - } - } - ee.WriteMapEnd() -} + case []float64: + fastpathTV.EncSliceFloat64V(v, fastpathCheckNilTrue, e) + case *[]float64: + fastpathTV.EncSliceFloat64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceUintR(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUintV(rv2i(rv).([]uint), e) - } else { - fastpathTV.EncSliceUintV(rv2i(rv).([]uint), e) - } -} -func (_ fastpathT) EncSliceUintV(v []uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceUintV(v []uint, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteMapEnd() -} + case []uint: + fastpathTV.EncSliceUintV(v, fastpathCheckNilTrue, e) + case *[]uint: + fastpathTV.EncSliceUintV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceUint8R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint8V(rv2i(rv).([]uint8), e) - } else { - fastpathTV.EncSliceUint8V(rv2i(rv).([]uint8), e) + case []uint16: + fastpathTV.EncSliceUint16V(v, fastpathCheckNilTrue, e) + case *[]uint16: + fastpathTV.EncSliceUint16V(*v, fastpathCheckNilTrue, e) + + case []uint32: + fastpathTV.EncSliceUint32V(v, fastpathCheckNilTrue, e) + case *[]uint32: + fastpathTV.EncSliceUint32V(*v, fastpathCheckNilTrue, e) + + case []uint64: + fastpathTV.EncSliceUint64V(v, fastpathCheckNilTrue, e) + case *[]uint64: + fastpathTV.EncSliceUint64V(*v, fastpathCheckNilTrue, e) + + case []uintptr: + fastpathTV.EncSliceUintptrV(v, fastpathCheckNilTrue, e) + case *[]uintptr: + fastpathTV.EncSliceUintptrV(*v, fastpathCheckNilTrue, e) + + case []int: + fastpathTV.EncSliceIntV(v, fastpathCheckNilTrue, e) + case *[]int: + fastpathTV.EncSliceIntV(*v, fastpathCheckNilTrue, e) + + case []int8: + fastpathTV.EncSliceInt8V(v, fastpathCheckNilTrue, e) + case *[]int8: + fastpathTV.EncSliceInt8V(*v, fastpathCheckNilTrue, e) + + case []int16: + fastpathTV.EncSliceInt16V(v, fastpathCheckNilTrue, e) + case *[]int16: + fastpathTV.EncSliceInt16V(*v, fastpathCheckNilTrue, e) + + case []int32: + fastpathTV.EncSliceInt32V(v, fastpathCheckNilTrue, e) + case *[]int32: + fastpathTV.EncSliceInt32V(*v, fastpathCheckNilTrue, e) + + case []int64: + fastpathTV.EncSliceInt64V(v, fastpathCheckNilTrue, e) + case *[]int64: + fastpathTV.EncSliceInt64V(*v, fastpathCheckNilTrue, e) + + case []bool: + fastpathTV.EncSliceBoolV(v, fastpathCheckNilTrue, e) + case *[]bool: + fastpathTV.EncSliceBoolV(*v, fastpathCheckNilTrue, e) + + default: + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) + return false } -} -func (_ fastpathT) EncSliceUint8V(v []uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceUint8V(v []uint8, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteMapEnd() + return true } -func (e *Encoder) fastpathEncSliceUint16R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint16V(rv2i(rv).([]uint16), e) - } else { - fastpathTV.EncSliceUint16V(rv2i(rv).([]uint16), e) - } -} -func (_ fastpathT) EncSliceUint16V(v []uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceUint16V(v []uint16, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteMapEnd() -} +func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { + switch v := iv.(type) { -func (e *Encoder) fastpathEncSliceUint32R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint32V(rv2i(rv).([]uint32), e) - } else { - fastpathTV.EncSliceUint32V(rv2i(rv).([]uint32), e) - } -} -func (_ fastpathT) EncSliceUint32V(v []uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceUint32V(v []uint32, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]interface{}: + fastpathTV.EncMapIntfIntfV(v, fastpathCheckNilTrue, e) + case *map[interface{}]interface{}: + fastpathTV.EncMapIntfIntfV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceUint64R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint64V(rv2i(rv).([]uint64), e) - } else { - fastpathTV.EncSliceUint64V(rv2i(rv).([]uint64), e) - } -} -func (_ fastpathT) EncSliceUint64V(v []uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceUint64V(v []uint64, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeUint(uint64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeUint(uint64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]string: + fastpathTV.EncMapIntfStringV(v, fastpathCheckNilTrue, e) + case *map[interface{}]string: + fastpathTV.EncMapIntfStringV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceUintptrR(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUintptrV(rv2i(rv).([]uintptr), e) - } else { - fastpathTV.EncSliceUintptrV(rv2i(rv).([]uintptr), e) - } -} -func (_ fastpathT) EncSliceUintptrV(v []uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - e.encode(v2) - } - } else { - for _, v2 := range v { - e.encode(v2) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceUintptrV(v []uintptr, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - e.encode(v2) - } - } else { - for _, v2 := range v { - e.encode(v2) - } - } - ee.WriteMapEnd() -} + case map[interface{}]uint: + fastpathTV.EncMapIntfUintV(v, fastpathCheckNilTrue, e) + case *map[interface{}]uint: + fastpathTV.EncMapIntfUintV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceIntR(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceIntV(rv2i(rv).([]int), e) - } else { - fastpathTV.EncSliceIntV(rv2i(rv).([]int), e) - } -} -func (_ fastpathT) EncSliceIntV(v []int, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceIntV(v []int, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]uint8: + fastpathTV.EncMapIntfUint8V(v, fastpathCheckNilTrue, e) + case *map[interface{}]uint8: + fastpathTV.EncMapIntfUint8V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceInt8R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt8V(rv2i(rv).([]int8), e) - } else { - fastpathTV.EncSliceInt8V(rv2i(rv).([]int8), e) - } -} -func (_ fastpathT) EncSliceInt8V(v []int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceInt8V(v []int8, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]uint16: + fastpathTV.EncMapIntfUint16V(v, fastpathCheckNilTrue, e) + case *map[interface{}]uint16: + fastpathTV.EncMapIntfUint16V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceInt16R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt16V(rv2i(rv).([]int16), e) - } else { - fastpathTV.EncSliceInt16V(rv2i(rv).([]int16), e) - } -} -func (_ fastpathT) EncSliceInt16V(v []int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceInt16V(v []int16, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]uint32: + fastpathTV.EncMapIntfUint32V(v, fastpathCheckNilTrue, e) + case *map[interface{}]uint32: + fastpathTV.EncMapIntfUint32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceInt32R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt32V(rv2i(rv).([]int32), e) - } else { - fastpathTV.EncSliceInt32V(rv2i(rv).([]int32), e) - } -} -func (_ fastpathT) EncSliceInt32V(v []int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceInt32V(v []int32, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]uint64: + fastpathTV.EncMapIntfUint64V(v, fastpathCheckNilTrue, e) + case *map[interface{}]uint64: + fastpathTV.EncMapIntfUint64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceInt64R(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt64V(rv2i(rv).([]int64), e) - } else { - fastpathTV.EncSliceInt64V(rv2i(rv).([]int64), e) - } -} -func (_ fastpathT) EncSliceInt64V(v []int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceInt64V(v []int64, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeInt(int64(v2)) - } - } else { - for _, v2 := range v { - ee.EncodeInt(int64(v2)) - } - } - ee.WriteMapEnd() -} + case map[interface{}]uintptr: + fastpathTV.EncMapIntfUintptrV(v, fastpathCheckNilTrue, e) + case *map[interface{}]uintptr: + fastpathTV.EncMapIntfUintptrV(*v, fastpathCheckNilTrue, e) + + case map[interface{}]int: + fastpathTV.EncMapIntfIntV(v, fastpathCheckNilTrue, e) + case *map[interface{}]int: + fastpathTV.EncMapIntfIntV(*v, fastpathCheckNilTrue, e) + + case map[interface{}]int8: + fastpathTV.EncMapIntfInt8V(v, fastpathCheckNilTrue, e) + case *map[interface{}]int8: + fastpathTV.EncMapIntfInt8V(*v, fastpathCheckNilTrue, e) + + case map[interface{}]int16: + fastpathTV.EncMapIntfInt16V(v, fastpathCheckNilTrue, e) + case *map[interface{}]int16: + fastpathTV.EncMapIntfInt16V(*v, fastpathCheckNilTrue, e) + + case map[interface{}]int32: + fastpathTV.EncMapIntfInt32V(v, fastpathCheckNilTrue, e) + case *map[interface{}]int32: + fastpathTV.EncMapIntfInt32V(*v, fastpathCheckNilTrue, e) + + case map[interface{}]int64: + fastpathTV.EncMapIntfInt64V(v, fastpathCheckNilTrue, e) + case *map[interface{}]int64: + fastpathTV.EncMapIntfInt64V(*v, fastpathCheckNilTrue, e) + + case map[interface{}]float32: + fastpathTV.EncMapIntfFloat32V(v, fastpathCheckNilTrue, e) + case *map[interface{}]float32: + fastpathTV.EncMapIntfFloat32V(*v, fastpathCheckNilTrue, e) + + case map[interface{}]float64: + fastpathTV.EncMapIntfFloat64V(v, fastpathCheckNilTrue, e) + case *map[interface{}]float64: + fastpathTV.EncMapIntfFloat64V(*v, fastpathCheckNilTrue, e) + + case map[interface{}]bool: + fastpathTV.EncMapIntfBoolV(v, fastpathCheckNilTrue, e) + case *map[interface{}]bool: + fastpathTV.EncMapIntfBoolV(*v, fastpathCheckNilTrue, e) + + case map[string]interface{}: + fastpathTV.EncMapStringIntfV(v, fastpathCheckNilTrue, e) + case *map[string]interface{}: + fastpathTV.EncMapStringIntfV(*v, fastpathCheckNilTrue, e) + + case map[string]string: + fastpathTV.EncMapStringStringV(v, fastpathCheckNilTrue, e) + case *map[string]string: + fastpathTV.EncMapStringStringV(*v, fastpathCheckNilTrue, e) + + case map[string]uint: + fastpathTV.EncMapStringUintV(v, fastpathCheckNilTrue, e) + case *map[string]uint: + fastpathTV.EncMapStringUintV(*v, fastpathCheckNilTrue, e) + + case map[string]uint8: + fastpathTV.EncMapStringUint8V(v, fastpathCheckNilTrue, e) + case *map[string]uint8: + fastpathTV.EncMapStringUint8V(*v, fastpathCheckNilTrue, e) + + case map[string]uint16: + fastpathTV.EncMapStringUint16V(v, fastpathCheckNilTrue, e) + case *map[string]uint16: + fastpathTV.EncMapStringUint16V(*v, fastpathCheckNilTrue, e) + + case map[string]uint32: + fastpathTV.EncMapStringUint32V(v, fastpathCheckNilTrue, e) + case *map[string]uint32: + fastpathTV.EncMapStringUint32V(*v, fastpathCheckNilTrue, e) + + case map[string]uint64: + fastpathTV.EncMapStringUint64V(v, fastpathCheckNilTrue, e) + case *map[string]uint64: + fastpathTV.EncMapStringUint64V(*v, fastpathCheckNilTrue, e) + + case map[string]uintptr: + fastpathTV.EncMapStringUintptrV(v, fastpathCheckNilTrue, e) + case *map[string]uintptr: + fastpathTV.EncMapStringUintptrV(*v, fastpathCheckNilTrue, e) + + case map[string]int: + fastpathTV.EncMapStringIntV(v, fastpathCheckNilTrue, e) + case *map[string]int: + fastpathTV.EncMapStringIntV(*v, fastpathCheckNilTrue, e) + + case map[string]int8: + fastpathTV.EncMapStringInt8V(v, fastpathCheckNilTrue, e) + case *map[string]int8: + fastpathTV.EncMapStringInt8V(*v, fastpathCheckNilTrue, e) + + case map[string]int16: + fastpathTV.EncMapStringInt16V(v, fastpathCheckNilTrue, e) + case *map[string]int16: + fastpathTV.EncMapStringInt16V(*v, fastpathCheckNilTrue, e) + + case map[string]int32: + fastpathTV.EncMapStringInt32V(v, fastpathCheckNilTrue, e) + case *map[string]int32: + fastpathTV.EncMapStringInt32V(*v, fastpathCheckNilTrue, e) + + case map[string]int64: + fastpathTV.EncMapStringInt64V(v, fastpathCheckNilTrue, e) + case *map[string]int64: + fastpathTV.EncMapStringInt64V(*v, fastpathCheckNilTrue, e) + + case map[string]float32: + fastpathTV.EncMapStringFloat32V(v, fastpathCheckNilTrue, e) + case *map[string]float32: + fastpathTV.EncMapStringFloat32V(*v, fastpathCheckNilTrue, e) + + case map[string]float64: + fastpathTV.EncMapStringFloat64V(v, fastpathCheckNilTrue, e) + case *map[string]float64: + fastpathTV.EncMapStringFloat64V(*v, fastpathCheckNilTrue, e) + + case map[string]bool: + fastpathTV.EncMapStringBoolV(v, fastpathCheckNilTrue, e) + case *map[string]bool: + fastpathTV.EncMapStringBoolV(*v, fastpathCheckNilTrue, e) + + case map[float32]interface{}: + fastpathTV.EncMapFloat32IntfV(v, fastpathCheckNilTrue, e) + case *map[float32]interface{}: + fastpathTV.EncMapFloat32IntfV(*v, fastpathCheckNilTrue, e) + + case map[float32]string: + fastpathTV.EncMapFloat32StringV(v, fastpathCheckNilTrue, e) + case *map[float32]string: + fastpathTV.EncMapFloat32StringV(*v, fastpathCheckNilTrue, e) + + case map[float32]uint: + fastpathTV.EncMapFloat32UintV(v, fastpathCheckNilTrue, e) + case *map[float32]uint: + fastpathTV.EncMapFloat32UintV(*v, fastpathCheckNilTrue, e) + + case map[float32]uint8: + fastpathTV.EncMapFloat32Uint8V(v, fastpathCheckNilTrue, e) + case *map[float32]uint8: + fastpathTV.EncMapFloat32Uint8V(*v, fastpathCheckNilTrue, e) + + case map[float32]uint16: + fastpathTV.EncMapFloat32Uint16V(v, fastpathCheckNilTrue, e) + case *map[float32]uint16: + fastpathTV.EncMapFloat32Uint16V(*v, fastpathCheckNilTrue, e) + + case map[float32]uint32: + fastpathTV.EncMapFloat32Uint32V(v, fastpathCheckNilTrue, e) + case *map[float32]uint32: + fastpathTV.EncMapFloat32Uint32V(*v, fastpathCheckNilTrue, e) + + case map[float32]uint64: + fastpathTV.EncMapFloat32Uint64V(v, fastpathCheckNilTrue, e) + case *map[float32]uint64: + fastpathTV.EncMapFloat32Uint64V(*v, fastpathCheckNilTrue, e) + + case map[float32]uintptr: + fastpathTV.EncMapFloat32UintptrV(v, fastpathCheckNilTrue, e) + case *map[float32]uintptr: + fastpathTV.EncMapFloat32UintptrV(*v, fastpathCheckNilTrue, e) + + case map[float32]int: + fastpathTV.EncMapFloat32IntV(v, fastpathCheckNilTrue, e) + case *map[float32]int: + fastpathTV.EncMapFloat32IntV(*v, fastpathCheckNilTrue, e) + + case map[float32]int8: + fastpathTV.EncMapFloat32Int8V(v, fastpathCheckNilTrue, e) + case *map[float32]int8: + fastpathTV.EncMapFloat32Int8V(*v, fastpathCheckNilTrue, e) + + case map[float32]int16: + fastpathTV.EncMapFloat32Int16V(v, fastpathCheckNilTrue, e) + case *map[float32]int16: + fastpathTV.EncMapFloat32Int16V(*v, fastpathCheckNilTrue, e) + + case map[float32]int32: + fastpathTV.EncMapFloat32Int32V(v, fastpathCheckNilTrue, e) + case *map[float32]int32: + fastpathTV.EncMapFloat32Int32V(*v, fastpathCheckNilTrue, e) + + case map[float32]int64: + fastpathTV.EncMapFloat32Int64V(v, fastpathCheckNilTrue, e) + case *map[float32]int64: + fastpathTV.EncMapFloat32Int64V(*v, fastpathCheckNilTrue, e) + + case map[float32]float32: + fastpathTV.EncMapFloat32Float32V(v, fastpathCheckNilTrue, e) + case *map[float32]float32: + fastpathTV.EncMapFloat32Float32V(*v, fastpathCheckNilTrue, e) + + case map[float32]float64: + fastpathTV.EncMapFloat32Float64V(v, fastpathCheckNilTrue, e) + case *map[float32]float64: + fastpathTV.EncMapFloat32Float64V(*v, fastpathCheckNilTrue, e) + + case map[float32]bool: + fastpathTV.EncMapFloat32BoolV(v, fastpathCheckNilTrue, e) + case *map[float32]bool: + fastpathTV.EncMapFloat32BoolV(*v, fastpathCheckNilTrue, e) + + case map[float64]interface{}: + fastpathTV.EncMapFloat64IntfV(v, fastpathCheckNilTrue, e) + case *map[float64]interface{}: + fastpathTV.EncMapFloat64IntfV(*v, fastpathCheckNilTrue, e) + + case map[float64]string: + fastpathTV.EncMapFloat64StringV(v, fastpathCheckNilTrue, e) + case *map[float64]string: + fastpathTV.EncMapFloat64StringV(*v, fastpathCheckNilTrue, e) + + case map[float64]uint: + fastpathTV.EncMapFloat64UintV(v, fastpathCheckNilTrue, e) + case *map[float64]uint: + fastpathTV.EncMapFloat64UintV(*v, fastpathCheckNilTrue, e) + + case map[float64]uint8: + fastpathTV.EncMapFloat64Uint8V(v, fastpathCheckNilTrue, e) + case *map[float64]uint8: + fastpathTV.EncMapFloat64Uint8V(*v, fastpathCheckNilTrue, e) + + case map[float64]uint16: + fastpathTV.EncMapFloat64Uint16V(v, fastpathCheckNilTrue, e) + case *map[float64]uint16: + fastpathTV.EncMapFloat64Uint16V(*v, fastpathCheckNilTrue, e) + + case map[float64]uint32: + fastpathTV.EncMapFloat64Uint32V(v, fastpathCheckNilTrue, e) + case *map[float64]uint32: + fastpathTV.EncMapFloat64Uint32V(*v, fastpathCheckNilTrue, e) + + case map[float64]uint64: + fastpathTV.EncMapFloat64Uint64V(v, fastpathCheckNilTrue, e) + case *map[float64]uint64: + fastpathTV.EncMapFloat64Uint64V(*v, fastpathCheckNilTrue, e) + + case map[float64]uintptr: + fastpathTV.EncMapFloat64UintptrV(v, fastpathCheckNilTrue, e) + case *map[float64]uintptr: + fastpathTV.EncMapFloat64UintptrV(*v, fastpathCheckNilTrue, e) + + case map[float64]int: + fastpathTV.EncMapFloat64IntV(v, fastpathCheckNilTrue, e) + case *map[float64]int: + fastpathTV.EncMapFloat64IntV(*v, fastpathCheckNilTrue, e) + + case map[float64]int8: + fastpathTV.EncMapFloat64Int8V(v, fastpathCheckNilTrue, e) + case *map[float64]int8: + fastpathTV.EncMapFloat64Int8V(*v, fastpathCheckNilTrue, e) + + case map[float64]int16: + fastpathTV.EncMapFloat64Int16V(v, fastpathCheckNilTrue, e) + case *map[float64]int16: + fastpathTV.EncMapFloat64Int16V(*v, fastpathCheckNilTrue, e) + + case map[float64]int32: + fastpathTV.EncMapFloat64Int32V(v, fastpathCheckNilTrue, e) + case *map[float64]int32: + fastpathTV.EncMapFloat64Int32V(*v, fastpathCheckNilTrue, e) + + case map[float64]int64: + fastpathTV.EncMapFloat64Int64V(v, fastpathCheckNilTrue, e) + case *map[float64]int64: + fastpathTV.EncMapFloat64Int64V(*v, fastpathCheckNilTrue, e) + + case map[float64]float32: + fastpathTV.EncMapFloat64Float32V(v, fastpathCheckNilTrue, e) + case *map[float64]float32: + fastpathTV.EncMapFloat64Float32V(*v, fastpathCheckNilTrue, e) + + case map[float64]float64: + fastpathTV.EncMapFloat64Float64V(v, fastpathCheckNilTrue, e) + case *map[float64]float64: + fastpathTV.EncMapFloat64Float64V(*v, fastpathCheckNilTrue, e) + + case map[float64]bool: + fastpathTV.EncMapFloat64BoolV(v, fastpathCheckNilTrue, e) + case *map[float64]bool: + fastpathTV.EncMapFloat64BoolV(*v, fastpathCheckNilTrue, e) + + case map[uint]interface{}: + fastpathTV.EncMapUintIntfV(v, fastpathCheckNilTrue, e) + case *map[uint]interface{}: + fastpathTV.EncMapUintIntfV(*v, fastpathCheckNilTrue, e) + + case map[uint]string: + fastpathTV.EncMapUintStringV(v, fastpathCheckNilTrue, e) + case *map[uint]string: + fastpathTV.EncMapUintStringV(*v, fastpathCheckNilTrue, e) + + case map[uint]uint: + fastpathTV.EncMapUintUintV(v, fastpathCheckNilTrue, e) + case *map[uint]uint: + fastpathTV.EncMapUintUintV(*v, fastpathCheckNilTrue, e) + + case map[uint]uint8: + fastpathTV.EncMapUintUint8V(v, fastpathCheckNilTrue, e) + case *map[uint]uint8: + fastpathTV.EncMapUintUint8V(*v, fastpathCheckNilTrue, e) + + case map[uint]uint16: + fastpathTV.EncMapUintUint16V(v, fastpathCheckNilTrue, e) + case *map[uint]uint16: + fastpathTV.EncMapUintUint16V(*v, fastpathCheckNilTrue, e) + + case map[uint]uint32: + fastpathTV.EncMapUintUint32V(v, fastpathCheckNilTrue, e) + case *map[uint]uint32: + fastpathTV.EncMapUintUint32V(*v, fastpathCheckNilTrue, e) + + case map[uint]uint64: + fastpathTV.EncMapUintUint64V(v, fastpathCheckNilTrue, e) + case *map[uint]uint64: + fastpathTV.EncMapUintUint64V(*v, fastpathCheckNilTrue, e) + + case map[uint]uintptr: + fastpathTV.EncMapUintUintptrV(v, fastpathCheckNilTrue, e) + case *map[uint]uintptr: + fastpathTV.EncMapUintUintptrV(*v, fastpathCheckNilTrue, e) + + case map[uint]int: + fastpathTV.EncMapUintIntV(v, fastpathCheckNilTrue, e) + case *map[uint]int: + fastpathTV.EncMapUintIntV(*v, fastpathCheckNilTrue, e) + + case map[uint]int8: + fastpathTV.EncMapUintInt8V(v, fastpathCheckNilTrue, e) + case *map[uint]int8: + fastpathTV.EncMapUintInt8V(*v, fastpathCheckNilTrue, e) + + case map[uint]int16: + fastpathTV.EncMapUintInt16V(v, fastpathCheckNilTrue, e) + case *map[uint]int16: + fastpathTV.EncMapUintInt16V(*v, fastpathCheckNilTrue, e) + + case map[uint]int32: + fastpathTV.EncMapUintInt32V(v, fastpathCheckNilTrue, e) + case *map[uint]int32: + fastpathTV.EncMapUintInt32V(*v, fastpathCheckNilTrue, e) + + case map[uint]int64: + fastpathTV.EncMapUintInt64V(v, fastpathCheckNilTrue, e) + case *map[uint]int64: + fastpathTV.EncMapUintInt64V(*v, fastpathCheckNilTrue, e) + + case map[uint]float32: + fastpathTV.EncMapUintFloat32V(v, fastpathCheckNilTrue, e) + case *map[uint]float32: + fastpathTV.EncMapUintFloat32V(*v, fastpathCheckNilTrue, e) + + case map[uint]float64: + fastpathTV.EncMapUintFloat64V(v, fastpathCheckNilTrue, e) + case *map[uint]float64: + fastpathTV.EncMapUintFloat64V(*v, fastpathCheckNilTrue, e) + + case map[uint]bool: + fastpathTV.EncMapUintBoolV(v, fastpathCheckNilTrue, e) + case *map[uint]bool: + fastpathTV.EncMapUintBoolV(*v, fastpathCheckNilTrue, e) + + case map[uint8]interface{}: + fastpathTV.EncMapUint8IntfV(v, fastpathCheckNilTrue, e) + case *map[uint8]interface{}: + fastpathTV.EncMapUint8IntfV(*v, fastpathCheckNilTrue, e) + + case map[uint8]string: + fastpathTV.EncMapUint8StringV(v, fastpathCheckNilTrue, e) + case *map[uint8]string: + fastpathTV.EncMapUint8StringV(*v, fastpathCheckNilTrue, e) + + case map[uint8]uint: + fastpathTV.EncMapUint8UintV(v, fastpathCheckNilTrue, e) + case *map[uint8]uint: + fastpathTV.EncMapUint8UintV(*v, fastpathCheckNilTrue, e) + + case map[uint8]uint8: + fastpathTV.EncMapUint8Uint8V(v, fastpathCheckNilTrue, e) + case *map[uint8]uint8: + fastpathTV.EncMapUint8Uint8V(*v, fastpathCheckNilTrue, e) + + case map[uint8]uint16: + fastpathTV.EncMapUint8Uint16V(v, fastpathCheckNilTrue, e) + case *map[uint8]uint16: + fastpathTV.EncMapUint8Uint16V(*v, fastpathCheckNilTrue, e) + + case map[uint8]uint32: + fastpathTV.EncMapUint8Uint32V(v, fastpathCheckNilTrue, e) + case *map[uint8]uint32: + fastpathTV.EncMapUint8Uint32V(*v, fastpathCheckNilTrue, e) + + case map[uint8]uint64: + fastpathTV.EncMapUint8Uint64V(v, fastpathCheckNilTrue, e) + case *map[uint8]uint64: + fastpathTV.EncMapUint8Uint64V(*v, fastpathCheckNilTrue, e) + + case map[uint8]uintptr: + fastpathTV.EncMapUint8UintptrV(v, fastpathCheckNilTrue, e) + case *map[uint8]uintptr: + fastpathTV.EncMapUint8UintptrV(*v, fastpathCheckNilTrue, e) + + case map[uint8]int: + fastpathTV.EncMapUint8IntV(v, fastpathCheckNilTrue, e) + case *map[uint8]int: + fastpathTV.EncMapUint8IntV(*v, fastpathCheckNilTrue, e) + + case map[uint8]int8: + fastpathTV.EncMapUint8Int8V(v, fastpathCheckNilTrue, e) + case *map[uint8]int8: + fastpathTV.EncMapUint8Int8V(*v, fastpathCheckNilTrue, e) + + case map[uint8]int16: + fastpathTV.EncMapUint8Int16V(v, fastpathCheckNilTrue, e) + case *map[uint8]int16: + fastpathTV.EncMapUint8Int16V(*v, fastpathCheckNilTrue, e) + + case map[uint8]int32: + fastpathTV.EncMapUint8Int32V(v, fastpathCheckNilTrue, e) + case *map[uint8]int32: + fastpathTV.EncMapUint8Int32V(*v, fastpathCheckNilTrue, e) + + case map[uint8]int64: + fastpathTV.EncMapUint8Int64V(v, fastpathCheckNilTrue, e) + case *map[uint8]int64: + fastpathTV.EncMapUint8Int64V(*v, fastpathCheckNilTrue, e) + + case map[uint8]float32: + fastpathTV.EncMapUint8Float32V(v, fastpathCheckNilTrue, e) + case *map[uint8]float32: + fastpathTV.EncMapUint8Float32V(*v, fastpathCheckNilTrue, e) + + case map[uint8]float64: + fastpathTV.EncMapUint8Float64V(v, fastpathCheckNilTrue, e) + case *map[uint8]float64: + fastpathTV.EncMapUint8Float64V(*v, fastpathCheckNilTrue, e) + + case map[uint8]bool: + fastpathTV.EncMapUint8BoolV(v, fastpathCheckNilTrue, e) + case *map[uint8]bool: + fastpathTV.EncMapUint8BoolV(*v, fastpathCheckNilTrue, e) + + case map[uint16]interface{}: + fastpathTV.EncMapUint16IntfV(v, fastpathCheckNilTrue, e) + case *map[uint16]interface{}: + fastpathTV.EncMapUint16IntfV(*v, fastpathCheckNilTrue, e) + + case map[uint16]string: + fastpathTV.EncMapUint16StringV(v, fastpathCheckNilTrue, e) + case *map[uint16]string: + fastpathTV.EncMapUint16StringV(*v, fastpathCheckNilTrue, e) + + case map[uint16]uint: + fastpathTV.EncMapUint16UintV(v, fastpathCheckNilTrue, e) + case *map[uint16]uint: + fastpathTV.EncMapUint16UintV(*v, fastpathCheckNilTrue, e) + + case map[uint16]uint8: + fastpathTV.EncMapUint16Uint8V(v, fastpathCheckNilTrue, e) + case *map[uint16]uint8: + fastpathTV.EncMapUint16Uint8V(*v, fastpathCheckNilTrue, e) + + case map[uint16]uint16: + fastpathTV.EncMapUint16Uint16V(v, fastpathCheckNilTrue, e) + case *map[uint16]uint16: + fastpathTV.EncMapUint16Uint16V(*v, fastpathCheckNilTrue, e) + + case map[uint16]uint32: + fastpathTV.EncMapUint16Uint32V(v, fastpathCheckNilTrue, e) + case *map[uint16]uint32: + fastpathTV.EncMapUint16Uint32V(*v, fastpathCheckNilTrue, e) + + case map[uint16]uint64: + fastpathTV.EncMapUint16Uint64V(v, fastpathCheckNilTrue, e) + case *map[uint16]uint64: + fastpathTV.EncMapUint16Uint64V(*v, fastpathCheckNilTrue, e) + + case map[uint16]uintptr: + fastpathTV.EncMapUint16UintptrV(v, fastpathCheckNilTrue, e) + case *map[uint16]uintptr: + fastpathTV.EncMapUint16UintptrV(*v, fastpathCheckNilTrue, e) + + case map[uint16]int: + fastpathTV.EncMapUint16IntV(v, fastpathCheckNilTrue, e) + case *map[uint16]int: + fastpathTV.EncMapUint16IntV(*v, fastpathCheckNilTrue, e) + + case map[uint16]int8: + fastpathTV.EncMapUint16Int8V(v, fastpathCheckNilTrue, e) + case *map[uint16]int8: + fastpathTV.EncMapUint16Int8V(*v, fastpathCheckNilTrue, e) + + case map[uint16]int16: + fastpathTV.EncMapUint16Int16V(v, fastpathCheckNilTrue, e) + case *map[uint16]int16: + fastpathTV.EncMapUint16Int16V(*v, fastpathCheckNilTrue, e) + + case map[uint16]int32: + fastpathTV.EncMapUint16Int32V(v, fastpathCheckNilTrue, e) + case *map[uint16]int32: + fastpathTV.EncMapUint16Int32V(*v, fastpathCheckNilTrue, e) + + case map[uint16]int64: + fastpathTV.EncMapUint16Int64V(v, fastpathCheckNilTrue, e) + case *map[uint16]int64: + fastpathTV.EncMapUint16Int64V(*v, fastpathCheckNilTrue, e) + + case map[uint16]float32: + fastpathTV.EncMapUint16Float32V(v, fastpathCheckNilTrue, e) + case *map[uint16]float32: + fastpathTV.EncMapUint16Float32V(*v, fastpathCheckNilTrue, e) + + case map[uint16]float64: + fastpathTV.EncMapUint16Float64V(v, fastpathCheckNilTrue, e) + case *map[uint16]float64: + fastpathTV.EncMapUint16Float64V(*v, fastpathCheckNilTrue, e) + + case map[uint16]bool: + fastpathTV.EncMapUint16BoolV(v, fastpathCheckNilTrue, e) + case *map[uint16]bool: + fastpathTV.EncMapUint16BoolV(*v, fastpathCheckNilTrue, e) + + case map[uint32]interface{}: + fastpathTV.EncMapUint32IntfV(v, fastpathCheckNilTrue, e) + case *map[uint32]interface{}: + fastpathTV.EncMapUint32IntfV(*v, fastpathCheckNilTrue, e) + + case map[uint32]string: + fastpathTV.EncMapUint32StringV(v, fastpathCheckNilTrue, e) + case *map[uint32]string: + fastpathTV.EncMapUint32StringV(*v, fastpathCheckNilTrue, e) + + case map[uint32]uint: + fastpathTV.EncMapUint32UintV(v, fastpathCheckNilTrue, e) + case *map[uint32]uint: + fastpathTV.EncMapUint32UintV(*v, fastpathCheckNilTrue, e) + + case map[uint32]uint8: + fastpathTV.EncMapUint32Uint8V(v, fastpathCheckNilTrue, e) + case *map[uint32]uint8: + fastpathTV.EncMapUint32Uint8V(*v, fastpathCheckNilTrue, e) + + case map[uint32]uint16: + fastpathTV.EncMapUint32Uint16V(v, fastpathCheckNilTrue, e) + case *map[uint32]uint16: + fastpathTV.EncMapUint32Uint16V(*v, fastpathCheckNilTrue, e) + + case map[uint32]uint32: + fastpathTV.EncMapUint32Uint32V(v, fastpathCheckNilTrue, e) + case *map[uint32]uint32: + fastpathTV.EncMapUint32Uint32V(*v, fastpathCheckNilTrue, e) + + case map[uint32]uint64: + fastpathTV.EncMapUint32Uint64V(v, fastpathCheckNilTrue, e) + case *map[uint32]uint64: + fastpathTV.EncMapUint32Uint64V(*v, fastpathCheckNilTrue, e) + + case map[uint32]uintptr: + fastpathTV.EncMapUint32UintptrV(v, fastpathCheckNilTrue, e) + case *map[uint32]uintptr: + fastpathTV.EncMapUint32UintptrV(*v, fastpathCheckNilTrue, e) + + case map[uint32]int: + fastpathTV.EncMapUint32IntV(v, fastpathCheckNilTrue, e) + case *map[uint32]int: + fastpathTV.EncMapUint32IntV(*v, fastpathCheckNilTrue, e) + + case map[uint32]int8: + fastpathTV.EncMapUint32Int8V(v, fastpathCheckNilTrue, e) + case *map[uint32]int8: + fastpathTV.EncMapUint32Int8V(*v, fastpathCheckNilTrue, e) + + case map[uint32]int16: + fastpathTV.EncMapUint32Int16V(v, fastpathCheckNilTrue, e) + case *map[uint32]int16: + fastpathTV.EncMapUint32Int16V(*v, fastpathCheckNilTrue, e) + + case map[uint32]int32: + fastpathTV.EncMapUint32Int32V(v, fastpathCheckNilTrue, e) + case *map[uint32]int32: + fastpathTV.EncMapUint32Int32V(*v, fastpathCheckNilTrue, e) + + case map[uint32]int64: + fastpathTV.EncMapUint32Int64V(v, fastpathCheckNilTrue, e) + case *map[uint32]int64: + fastpathTV.EncMapUint32Int64V(*v, fastpathCheckNilTrue, e) + + case map[uint32]float32: + fastpathTV.EncMapUint32Float32V(v, fastpathCheckNilTrue, e) + case *map[uint32]float32: + fastpathTV.EncMapUint32Float32V(*v, fastpathCheckNilTrue, e) + + case map[uint32]float64: + fastpathTV.EncMapUint32Float64V(v, fastpathCheckNilTrue, e) + case *map[uint32]float64: + fastpathTV.EncMapUint32Float64V(*v, fastpathCheckNilTrue, e) + + case map[uint32]bool: + fastpathTV.EncMapUint32BoolV(v, fastpathCheckNilTrue, e) + case *map[uint32]bool: + fastpathTV.EncMapUint32BoolV(*v, fastpathCheckNilTrue, e) + + case map[uint64]interface{}: + fastpathTV.EncMapUint64IntfV(v, fastpathCheckNilTrue, e) + case *map[uint64]interface{}: + fastpathTV.EncMapUint64IntfV(*v, fastpathCheckNilTrue, e) + + case map[uint64]string: + fastpathTV.EncMapUint64StringV(v, fastpathCheckNilTrue, e) + case *map[uint64]string: + fastpathTV.EncMapUint64StringV(*v, fastpathCheckNilTrue, e) + + case map[uint64]uint: + fastpathTV.EncMapUint64UintV(v, fastpathCheckNilTrue, e) + case *map[uint64]uint: + fastpathTV.EncMapUint64UintV(*v, fastpathCheckNilTrue, e) + + case map[uint64]uint8: + fastpathTV.EncMapUint64Uint8V(v, fastpathCheckNilTrue, e) + case *map[uint64]uint8: + fastpathTV.EncMapUint64Uint8V(*v, fastpathCheckNilTrue, e) + + case map[uint64]uint16: + fastpathTV.EncMapUint64Uint16V(v, fastpathCheckNilTrue, e) + case *map[uint64]uint16: + fastpathTV.EncMapUint64Uint16V(*v, fastpathCheckNilTrue, e) + + case map[uint64]uint32: + fastpathTV.EncMapUint64Uint32V(v, fastpathCheckNilTrue, e) + case *map[uint64]uint32: + fastpathTV.EncMapUint64Uint32V(*v, fastpathCheckNilTrue, e) + + case map[uint64]uint64: + fastpathTV.EncMapUint64Uint64V(v, fastpathCheckNilTrue, e) + case *map[uint64]uint64: + fastpathTV.EncMapUint64Uint64V(*v, fastpathCheckNilTrue, e) + + case map[uint64]uintptr: + fastpathTV.EncMapUint64UintptrV(v, fastpathCheckNilTrue, e) + case *map[uint64]uintptr: + fastpathTV.EncMapUint64UintptrV(*v, fastpathCheckNilTrue, e) + + case map[uint64]int: + fastpathTV.EncMapUint64IntV(v, fastpathCheckNilTrue, e) + case *map[uint64]int: + fastpathTV.EncMapUint64IntV(*v, fastpathCheckNilTrue, e) + + case map[uint64]int8: + fastpathTV.EncMapUint64Int8V(v, fastpathCheckNilTrue, e) + case *map[uint64]int8: + fastpathTV.EncMapUint64Int8V(*v, fastpathCheckNilTrue, e) + + case map[uint64]int16: + fastpathTV.EncMapUint64Int16V(v, fastpathCheckNilTrue, e) + case *map[uint64]int16: + fastpathTV.EncMapUint64Int16V(*v, fastpathCheckNilTrue, e) + + case map[uint64]int32: + fastpathTV.EncMapUint64Int32V(v, fastpathCheckNilTrue, e) + case *map[uint64]int32: + fastpathTV.EncMapUint64Int32V(*v, fastpathCheckNilTrue, e) + + case map[uint64]int64: + fastpathTV.EncMapUint64Int64V(v, fastpathCheckNilTrue, e) + case *map[uint64]int64: + fastpathTV.EncMapUint64Int64V(*v, fastpathCheckNilTrue, e) + + case map[uint64]float32: + fastpathTV.EncMapUint64Float32V(v, fastpathCheckNilTrue, e) + case *map[uint64]float32: + fastpathTV.EncMapUint64Float32V(*v, fastpathCheckNilTrue, e) + + case map[uint64]float64: + fastpathTV.EncMapUint64Float64V(v, fastpathCheckNilTrue, e) + case *map[uint64]float64: + fastpathTV.EncMapUint64Float64V(*v, fastpathCheckNilTrue, e) + + case map[uint64]bool: + fastpathTV.EncMapUint64BoolV(v, fastpathCheckNilTrue, e) + case *map[uint64]bool: + fastpathTV.EncMapUint64BoolV(*v, fastpathCheckNilTrue, e) + + case map[uintptr]interface{}: + fastpathTV.EncMapUintptrIntfV(v, fastpathCheckNilTrue, e) + case *map[uintptr]interface{}: + fastpathTV.EncMapUintptrIntfV(*v, fastpathCheckNilTrue, e) + + case map[uintptr]string: + fastpathTV.EncMapUintptrStringV(v, fastpathCheckNilTrue, e) + case *map[uintptr]string: + fastpathTV.EncMapUintptrStringV(*v, fastpathCheckNilTrue, e) + + case map[uintptr]uint: + fastpathTV.EncMapUintptrUintV(v, fastpathCheckNilTrue, e) + case *map[uintptr]uint: + fastpathTV.EncMapUintptrUintV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncSliceBoolR(f *codecFnInfo, rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceBoolV(rv2i(rv).([]bool), e) - } else { - fastpathTV.EncSliceBoolV(rv2i(rv).([]bool), e) - } -} -func (_ fastpathT) EncSliceBoolV(v []bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteArrayStart(len(v)) - if esep { - for _, v2 := range v { - ee.WriteArrayElem() - ee.EncodeBool(v2) - } - } else { - for _, v2 := range v { - ee.EncodeBool(v2) - } - } - ee.WriteArrayEnd() -} -func (_ fastpathT) EncAsMapSliceBoolV(v []bool, e *Encoder) { - ee, esep := e.e, e.hh.hasElemSeparators() - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.WriteMapStart(len(v) / 2) - if esep { - for j, v2 := range v { - if j%2 == 0 { - ee.WriteMapElemKey() - } else { - ee.WriteMapElemValue() - } - ee.EncodeBool(v2) - } - } else { - for _, v2 := range v { - ee.EncodeBool(v2) - } - } - ee.WriteMapEnd() -} + case map[uintptr]uint8: + fastpathTV.EncMapUintptrUint8V(v, fastpathCheckNilTrue, e) + case *map[uintptr]uint8: + fastpathTV.EncMapUintptrUint8V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfIntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfIntfV(rv2i(rv).(map[interface{}]interface{}), e) -} -func (_ fastpathT) EncMapIntfIntfV(v map[interface{}]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - e.encode(k2) - e.encode(v2) - } - } - } - ee.WriteMapEnd() -} + case map[uintptr]uint16: + fastpathTV.EncMapUintptrUint16V(v, fastpathCheckNilTrue, e) + case *map[uintptr]uint16: + fastpathTV.EncMapUintptrUint16V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]uint32: + fastpathTV.EncMapUintptrUint32V(v, fastpathCheckNilTrue, e) + case *map[uintptr]uint32: + fastpathTV.EncMapUintptrUint32V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]uint64: + fastpathTV.EncMapUintptrUint64V(v, fastpathCheckNilTrue, e) + case *map[uintptr]uint64: + fastpathTV.EncMapUintptrUint64V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]uintptr: + fastpathTV.EncMapUintptrUintptrV(v, fastpathCheckNilTrue, e) + case *map[uintptr]uintptr: + fastpathTV.EncMapUintptrUintptrV(*v, fastpathCheckNilTrue, e) + + case map[uintptr]int: + fastpathTV.EncMapUintptrIntV(v, fastpathCheckNilTrue, e) + case *map[uintptr]int: + fastpathTV.EncMapUintptrIntV(*v, fastpathCheckNilTrue, e) + + case map[uintptr]int8: + fastpathTV.EncMapUintptrInt8V(v, fastpathCheckNilTrue, e) + case *map[uintptr]int8: + fastpathTV.EncMapUintptrInt8V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]int16: + fastpathTV.EncMapUintptrInt16V(v, fastpathCheckNilTrue, e) + case *map[uintptr]int16: + fastpathTV.EncMapUintptrInt16V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]int32: + fastpathTV.EncMapUintptrInt32V(v, fastpathCheckNilTrue, e) + case *map[uintptr]int32: + fastpathTV.EncMapUintptrInt32V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]int64: + fastpathTV.EncMapUintptrInt64V(v, fastpathCheckNilTrue, e) + case *map[uintptr]int64: + fastpathTV.EncMapUintptrInt64V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]float32: + fastpathTV.EncMapUintptrFloat32V(v, fastpathCheckNilTrue, e) + case *map[uintptr]float32: + fastpathTV.EncMapUintptrFloat32V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]float64: + fastpathTV.EncMapUintptrFloat64V(v, fastpathCheckNilTrue, e) + case *map[uintptr]float64: + fastpathTV.EncMapUintptrFloat64V(*v, fastpathCheckNilTrue, e) + + case map[uintptr]bool: + fastpathTV.EncMapUintptrBoolV(v, fastpathCheckNilTrue, e) + case *map[uintptr]bool: + fastpathTV.EncMapUintptrBoolV(*v, fastpathCheckNilTrue, e) + + case map[int]interface{}: + fastpathTV.EncMapIntIntfV(v, fastpathCheckNilTrue, e) + case *map[int]interface{}: + fastpathTV.EncMapIntIntfV(*v, fastpathCheckNilTrue, e) + + case map[int]string: + fastpathTV.EncMapIntStringV(v, fastpathCheckNilTrue, e) + case *map[int]string: + fastpathTV.EncMapIntStringV(*v, fastpathCheckNilTrue, e) + + case map[int]uint: + fastpathTV.EncMapIntUintV(v, fastpathCheckNilTrue, e) + case *map[int]uint: + fastpathTV.EncMapIntUintV(*v, fastpathCheckNilTrue, e) + + case map[int]uint8: + fastpathTV.EncMapIntUint8V(v, fastpathCheckNilTrue, e) + case *map[int]uint8: + fastpathTV.EncMapIntUint8V(*v, fastpathCheckNilTrue, e) + + case map[int]uint16: + fastpathTV.EncMapIntUint16V(v, fastpathCheckNilTrue, e) + case *map[int]uint16: + fastpathTV.EncMapIntUint16V(*v, fastpathCheckNilTrue, e) + + case map[int]uint32: + fastpathTV.EncMapIntUint32V(v, fastpathCheckNilTrue, e) + case *map[int]uint32: + fastpathTV.EncMapIntUint32V(*v, fastpathCheckNilTrue, e) + + case map[int]uint64: + fastpathTV.EncMapIntUint64V(v, fastpathCheckNilTrue, e) + case *map[int]uint64: + fastpathTV.EncMapIntUint64V(*v, fastpathCheckNilTrue, e) + + case map[int]uintptr: + fastpathTV.EncMapIntUintptrV(v, fastpathCheckNilTrue, e) + case *map[int]uintptr: + fastpathTV.EncMapIntUintptrV(*v, fastpathCheckNilTrue, e) + + case map[int]int: + fastpathTV.EncMapIntIntV(v, fastpathCheckNilTrue, e) + case *map[int]int: + fastpathTV.EncMapIntIntV(*v, fastpathCheckNilTrue, e) + + case map[int]int8: + fastpathTV.EncMapIntInt8V(v, fastpathCheckNilTrue, e) + case *map[int]int8: + fastpathTV.EncMapIntInt8V(*v, fastpathCheckNilTrue, e) + + case map[int]int16: + fastpathTV.EncMapIntInt16V(v, fastpathCheckNilTrue, e) + case *map[int]int16: + fastpathTV.EncMapIntInt16V(*v, fastpathCheckNilTrue, e) + + case map[int]int32: + fastpathTV.EncMapIntInt32V(v, fastpathCheckNilTrue, e) + case *map[int]int32: + fastpathTV.EncMapIntInt32V(*v, fastpathCheckNilTrue, e) + + case map[int]int64: + fastpathTV.EncMapIntInt64V(v, fastpathCheckNilTrue, e) + case *map[int]int64: + fastpathTV.EncMapIntInt64V(*v, fastpathCheckNilTrue, e) + + case map[int]float32: + fastpathTV.EncMapIntFloat32V(v, fastpathCheckNilTrue, e) + case *map[int]float32: + fastpathTV.EncMapIntFloat32V(*v, fastpathCheckNilTrue, e) + + case map[int]float64: + fastpathTV.EncMapIntFloat64V(v, fastpathCheckNilTrue, e) + case *map[int]float64: + fastpathTV.EncMapIntFloat64V(*v, fastpathCheckNilTrue, e) + + case map[int]bool: + fastpathTV.EncMapIntBoolV(v, fastpathCheckNilTrue, e) + case *map[int]bool: + fastpathTV.EncMapIntBoolV(*v, fastpathCheckNilTrue, e) + + case map[int8]interface{}: + fastpathTV.EncMapInt8IntfV(v, fastpathCheckNilTrue, e) + case *map[int8]interface{}: + fastpathTV.EncMapInt8IntfV(*v, fastpathCheckNilTrue, e) + + case map[int8]string: + fastpathTV.EncMapInt8StringV(v, fastpathCheckNilTrue, e) + case *map[int8]string: + fastpathTV.EncMapInt8StringV(*v, fastpathCheckNilTrue, e) + + case map[int8]uint: + fastpathTV.EncMapInt8UintV(v, fastpathCheckNilTrue, e) + case *map[int8]uint: + fastpathTV.EncMapInt8UintV(*v, fastpathCheckNilTrue, e) + + case map[int8]uint8: + fastpathTV.EncMapInt8Uint8V(v, fastpathCheckNilTrue, e) + case *map[int8]uint8: + fastpathTV.EncMapInt8Uint8V(*v, fastpathCheckNilTrue, e) + + case map[int8]uint16: + fastpathTV.EncMapInt8Uint16V(v, fastpathCheckNilTrue, e) + case *map[int8]uint16: + fastpathTV.EncMapInt8Uint16V(*v, fastpathCheckNilTrue, e) + + case map[int8]uint32: + fastpathTV.EncMapInt8Uint32V(v, fastpathCheckNilTrue, e) + case *map[int8]uint32: + fastpathTV.EncMapInt8Uint32V(*v, fastpathCheckNilTrue, e) + + case map[int8]uint64: + fastpathTV.EncMapInt8Uint64V(v, fastpathCheckNilTrue, e) + case *map[int8]uint64: + fastpathTV.EncMapInt8Uint64V(*v, fastpathCheckNilTrue, e) + + case map[int8]uintptr: + fastpathTV.EncMapInt8UintptrV(v, fastpathCheckNilTrue, e) + case *map[int8]uintptr: + fastpathTV.EncMapInt8UintptrV(*v, fastpathCheckNilTrue, e) + + case map[int8]int: + fastpathTV.EncMapInt8IntV(v, fastpathCheckNilTrue, e) + case *map[int8]int: + fastpathTV.EncMapInt8IntV(*v, fastpathCheckNilTrue, e) + + case map[int8]int8: + fastpathTV.EncMapInt8Int8V(v, fastpathCheckNilTrue, e) + case *map[int8]int8: + fastpathTV.EncMapInt8Int8V(*v, fastpathCheckNilTrue, e) + + case map[int8]int16: + fastpathTV.EncMapInt8Int16V(v, fastpathCheckNilTrue, e) + case *map[int8]int16: + fastpathTV.EncMapInt8Int16V(*v, fastpathCheckNilTrue, e) + + case map[int8]int32: + fastpathTV.EncMapInt8Int32V(v, fastpathCheckNilTrue, e) + case *map[int8]int32: + fastpathTV.EncMapInt8Int32V(*v, fastpathCheckNilTrue, e) + + case map[int8]int64: + fastpathTV.EncMapInt8Int64V(v, fastpathCheckNilTrue, e) + case *map[int8]int64: + fastpathTV.EncMapInt8Int64V(*v, fastpathCheckNilTrue, e) + + case map[int8]float32: + fastpathTV.EncMapInt8Float32V(v, fastpathCheckNilTrue, e) + case *map[int8]float32: + fastpathTV.EncMapInt8Float32V(*v, fastpathCheckNilTrue, e) + + case map[int8]float64: + fastpathTV.EncMapInt8Float64V(v, fastpathCheckNilTrue, e) + case *map[int8]float64: + fastpathTV.EncMapInt8Float64V(*v, fastpathCheckNilTrue, e) + + case map[int8]bool: + fastpathTV.EncMapInt8BoolV(v, fastpathCheckNilTrue, e) + case *map[int8]bool: + fastpathTV.EncMapInt8BoolV(*v, fastpathCheckNilTrue, e) + + case map[int16]interface{}: + fastpathTV.EncMapInt16IntfV(v, fastpathCheckNilTrue, e) + case *map[int16]interface{}: + fastpathTV.EncMapInt16IntfV(*v, fastpathCheckNilTrue, e) + + case map[int16]string: + fastpathTV.EncMapInt16StringV(v, fastpathCheckNilTrue, e) + case *map[int16]string: + fastpathTV.EncMapInt16StringV(*v, fastpathCheckNilTrue, e) + + case map[int16]uint: + fastpathTV.EncMapInt16UintV(v, fastpathCheckNilTrue, e) + case *map[int16]uint: + fastpathTV.EncMapInt16UintV(*v, fastpathCheckNilTrue, e) + + case map[int16]uint8: + fastpathTV.EncMapInt16Uint8V(v, fastpathCheckNilTrue, e) + case *map[int16]uint8: + fastpathTV.EncMapInt16Uint8V(*v, fastpathCheckNilTrue, e) + + case map[int16]uint16: + fastpathTV.EncMapInt16Uint16V(v, fastpathCheckNilTrue, e) + case *map[int16]uint16: + fastpathTV.EncMapInt16Uint16V(*v, fastpathCheckNilTrue, e) + + case map[int16]uint32: + fastpathTV.EncMapInt16Uint32V(v, fastpathCheckNilTrue, e) + case *map[int16]uint32: + fastpathTV.EncMapInt16Uint32V(*v, fastpathCheckNilTrue, e) + + case map[int16]uint64: + fastpathTV.EncMapInt16Uint64V(v, fastpathCheckNilTrue, e) + case *map[int16]uint64: + fastpathTV.EncMapInt16Uint64V(*v, fastpathCheckNilTrue, e) + + case map[int16]uintptr: + fastpathTV.EncMapInt16UintptrV(v, fastpathCheckNilTrue, e) + case *map[int16]uintptr: + fastpathTV.EncMapInt16UintptrV(*v, fastpathCheckNilTrue, e) + + case map[int16]int: + fastpathTV.EncMapInt16IntV(v, fastpathCheckNilTrue, e) + case *map[int16]int: + fastpathTV.EncMapInt16IntV(*v, fastpathCheckNilTrue, e) + + case map[int16]int8: + fastpathTV.EncMapInt16Int8V(v, fastpathCheckNilTrue, e) + case *map[int16]int8: + fastpathTV.EncMapInt16Int8V(*v, fastpathCheckNilTrue, e) + + case map[int16]int16: + fastpathTV.EncMapInt16Int16V(v, fastpathCheckNilTrue, e) + case *map[int16]int16: + fastpathTV.EncMapInt16Int16V(*v, fastpathCheckNilTrue, e) + + case map[int16]int32: + fastpathTV.EncMapInt16Int32V(v, fastpathCheckNilTrue, e) + case *map[int16]int32: + fastpathTV.EncMapInt16Int32V(*v, fastpathCheckNilTrue, e) + + case map[int16]int64: + fastpathTV.EncMapInt16Int64V(v, fastpathCheckNilTrue, e) + case *map[int16]int64: + fastpathTV.EncMapInt16Int64V(*v, fastpathCheckNilTrue, e) + + case map[int16]float32: + fastpathTV.EncMapInt16Float32V(v, fastpathCheckNilTrue, e) + case *map[int16]float32: + fastpathTV.EncMapInt16Float32V(*v, fastpathCheckNilTrue, e) + + case map[int16]float64: + fastpathTV.EncMapInt16Float64V(v, fastpathCheckNilTrue, e) + case *map[int16]float64: + fastpathTV.EncMapInt16Float64V(*v, fastpathCheckNilTrue, e) + + case map[int16]bool: + fastpathTV.EncMapInt16BoolV(v, fastpathCheckNilTrue, e) + case *map[int16]bool: + fastpathTV.EncMapInt16BoolV(*v, fastpathCheckNilTrue, e) + + case map[int32]interface{}: + fastpathTV.EncMapInt32IntfV(v, fastpathCheckNilTrue, e) + case *map[int32]interface{}: + fastpathTV.EncMapInt32IntfV(*v, fastpathCheckNilTrue, e) + + case map[int32]string: + fastpathTV.EncMapInt32StringV(v, fastpathCheckNilTrue, e) + case *map[int32]string: + fastpathTV.EncMapInt32StringV(*v, fastpathCheckNilTrue, e) + + case map[int32]uint: + fastpathTV.EncMapInt32UintV(v, fastpathCheckNilTrue, e) + case *map[int32]uint: + fastpathTV.EncMapInt32UintV(*v, fastpathCheckNilTrue, e) + + case map[int32]uint8: + fastpathTV.EncMapInt32Uint8V(v, fastpathCheckNilTrue, e) + case *map[int32]uint8: + fastpathTV.EncMapInt32Uint8V(*v, fastpathCheckNilTrue, e) + + case map[int32]uint16: + fastpathTV.EncMapInt32Uint16V(v, fastpathCheckNilTrue, e) + case *map[int32]uint16: + fastpathTV.EncMapInt32Uint16V(*v, fastpathCheckNilTrue, e) + + case map[int32]uint32: + fastpathTV.EncMapInt32Uint32V(v, fastpathCheckNilTrue, e) + case *map[int32]uint32: + fastpathTV.EncMapInt32Uint32V(*v, fastpathCheckNilTrue, e) + + case map[int32]uint64: + fastpathTV.EncMapInt32Uint64V(v, fastpathCheckNilTrue, e) + case *map[int32]uint64: + fastpathTV.EncMapInt32Uint64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfStringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfStringV(rv2i(rv).(map[interface{}]string), e) -} -func (_ fastpathT) EncMapIntfStringV(v map[interface{}]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeString(cUTF8, v2) - } - } - } - ee.WriteMapEnd() -} + case map[int32]uintptr: + fastpathTV.EncMapInt32UintptrV(v, fastpathCheckNilTrue, e) + case *map[int32]uintptr: + fastpathTV.EncMapInt32UintptrV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfUintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfUintV(rv2i(rv).(map[interface{}]uint), e) -} -func (_ fastpathT) EncMapIntfUintV(v map[interface{}]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int32]int: + fastpathTV.EncMapInt32IntV(v, fastpathCheckNilTrue, e) + case *map[int32]int: + fastpathTV.EncMapInt32IntV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfUint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfUint8V(rv2i(rv).(map[interface{}]uint8), e) -} -func (_ fastpathT) EncMapIntfUint8V(v map[interface{}]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int32]int8: + fastpathTV.EncMapInt32Int8V(v, fastpathCheckNilTrue, e) + case *map[int32]int8: + fastpathTV.EncMapInt32Int8V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfUint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfUint16V(rv2i(rv).(map[interface{}]uint16), e) -} -func (_ fastpathT) EncMapIntfUint16V(v map[interface{}]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int32]int16: + fastpathTV.EncMapInt32Int16V(v, fastpathCheckNilTrue, e) + case *map[int32]int16: + fastpathTV.EncMapInt32Int16V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfUint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfUint32V(rv2i(rv).(map[interface{}]uint32), e) -} -func (_ fastpathT) EncMapIntfUint32V(v map[interface{}]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int32]int32: + fastpathTV.EncMapInt32Int32V(v, fastpathCheckNilTrue, e) + case *map[int32]int32: + fastpathTV.EncMapInt32Int32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfUint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfUint64V(rv2i(rv).(map[interface{}]uint64), e) -} -func (_ fastpathT) EncMapIntfUint64V(v map[interface{}]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int32]int64: + fastpathTV.EncMapInt32Int64V(v, fastpathCheckNilTrue, e) + case *map[int32]int64: + fastpathTV.EncMapInt32Int64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfUintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfUintptrV(rv2i(rv).(map[interface{}]uintptr), e) -} -func (_ fastpathT) EncMapIntfUintptrV(v map[interface{}]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - e.encode(k2) - e.encode(v2) - } - } - } - ee.WriteMapEnd() -} + case map[int32]float32: + fastpathTV.EncMapInt32Float32V(v, fastpathCheckNilTrue, e) + case *map[int32]float32: + fastpathTV.EncMapInt32Float32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfIntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfIntV(rv2i(rv).(map[interface{}]int), e) -} -func (_ fastpathT) EncMapIntfIntV(v map[interface{}]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int32]float64: + fastpathTV.EncMapInt32Float64V(v, fastpathCheckNilTrue, e) + case *map[int32]float64: + fastpathTV.EncMapInt32Float64V(*v, fastpathCheckNilTrue, e) + + case map[int32]bool: + fastpathTV.EncMapInt32BoolV(v, fastpathCheckNilTrue, e) + case *map[int32]bool: + fastpathTV.EncMapInt32BoolV(*v, fastpathCheckNilTrue, e) + + case map[int64]interface{}: + fastpathTV.EncMapInt64IntfV(v, fastpathCheckNilTrue, e) + case *map[int64]interface{}: + fastpathTV.EncMapInt64IntfV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfInt8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfInt8V(rv2i(rv).(map[interface{}]int8), e) -} -func (_ fastpathT) EncMapIntfInt8V(v map[interface{}]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int64]string: + fastpathTV.EncMapInt64StringV(v, fastpathCheckNilTrue, e) + case *map[int64]string: + fastpathTV.EncMapInt64StringV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfInt16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfInt16V(rv2i(rv).(map[interface{}]int16), e) -} -func (_ fastpathT) EncMapIntfInt16V(v map[interface{}]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int64]uint: + fastpathTV.EncMapInt64UintV(v, fastpathCheckNilTrue, e) + case *map[int64]uint: + fastpathTV.EncMapInt64UintV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfInt32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfInt32V(rv2i(rv).(map[interface{}]int32), e) -} -func (_ fastpathT) EncMapIntfInt32V(v map[interface{}]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int64]uint8: + fastpathTV.EncMapInt64Uint8V(v, fastpathCheckNilTrue, e) + case *map[int64]uint8: + fastpathTV.EncMapInt64Uint8V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfInt64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfInt64V(rv2i(rv).(map[interface{}]int64), e) -} -func (_ fastpathT) EncMapIntfInt64V(v map[interface{}]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int64]uint16: + fastpathTV.EncMapInt64Uint16V(v, fastpathCheckNilTrue, e) + case *map[int64]uint16: + fastpathTV.EncMapInt64Uint16V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfFloat32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfFloat32V(rv2i(rv).(map[interface{}]float32), e) -} -func (_ fastpathT) EncMapIntfFloat32V(v map[interface{}]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeFloat32(v2) - } - } - } - ee.WriteMapEnd() -} + case map[int64]uint32: + fastpathTV.EncMapInt64Uint32V(v, fastpathCheckNilTrue, e) + case *map[int64]uint32: + fastpathTV.EncMapInt64Uint32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfFloat64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfFloat64V(rv2i(rv).(map[interface{}]float64), e) -} -func (_ fastpathT) EncMapIntfFloat64V(v map[interface{}]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeFloat64(v2) - } - } - } - ee.WriteMapEnd() -} + case map[int64]uint64: + fastpathTV.EncMapInt64Uint64V(v, fastpathCheckNilTrue, e) + case *map[int64]uint64: + fastpathTV.EncMapInt64Uint64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapIntfBoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntfBoolV(rv2i(rv).(map[interface{}]bool), e) -} -func (_ fastpathT) EncMapIntfBoolV(v map[interface{}]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - if esep { - for j := range v2 { - ee.WriteMapElemKey() - e.asis(v2[j].v) - ee.WriteMapElemValue() - e.encode(v[v2[j].i]) - } - } else { - for j := range v2 { - e.asis(v2[j].v) - e.encode(v[v2[j].i]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeBool(v2) - } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeBool(v2) - } - } - } - ee.WriteMapEnd() -} + case map[int64]uintptr: + fastpathTV.EncMapInt64UintptrV(v, fastpathCheckNilTrue, e) + case *map[int64]uintptr: + fastpathTV.EncMapInt64UintptrV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringIntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringIntfV(rv2i(rv).(map[string]interface{}), e) -} -func (_ fastpathT) EncMapStringIntfV(v map[string]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - e.encode(v[string(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - e.encode(v[string(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - e.encode(v2) - } - } - } - ee.WriteMapEnd() -} + case map[int64]int: + fastpathTV.EncMapInt64IntV(v, fastpathCheckNilTrue, e) + case *map[int64]int: + fastpathTV.EncMapInt64IntV(*v, fastpathCheckNilTrue, e) + + case map[int64]int8: + fastpathTV.EncMapInt64Int8V(v, fastpathCheckNilTrue, e) + case *map[int64]int8: + fastpathTV.EncMapInt64Int8V(*v, fastpathCheckNilTrue, e) + + case map[int64]int16: + fastpathTV.EncMapInt64Int16V(v, fastpathCheckNilTrue, e) + case *map[int64]int16: + fastpathTV.EncMapInt64Int16V(*v, fastpathCheckNilTrue, e) + + case map[int64]int32: + fastpathTV.EncMapInt64Int32V(v, fastpathCheckNilTrue, e) + case *map[int64]int32: + fastpathTV.EncMapInt64Int32V(*v, fastpathCheckNilTrue, e) + + case map[int64]int64: + fastpathTV.EncMapInt64Int64V(v, fastpathCheckNilTrue, e) + case *map[int64]int64: + fastpathTV.EncMapInt64Int64V(*v, fastpathCheckNilTrue, e) + + case map[int64]float32: + fastpathTV.EncMapInt64Float32V(v, fastpathCheckNilTrue, e) + case *map[int64]float32: + fastpathTV.EncMapInt64Float32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringStringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringStringV(rv2i(rv).(map[string]string), e) -} -func (_ fastpathT) EncMapStringStringV(v map[string]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[string(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeString(cUTF8, v[string(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeString(cUTF8, v2) - } - } - } - ee.WriteMapEnd() -} + case map[int64]float64: + fastpathTV.EncMapInt64Float64V(v, fastpathCheckNilTrue, e) + case *map[int64]float64: + fastpathTV.EncMapInt64Float64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringUintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringUintV(rv2i(rv).(map[string]uint), e) -} -func (_ fastpathT) EncMapStringUintV(v map[string]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[int64]bool: + fastpathTV.EncMapInt64BoolV(v, fastpathCheckNilTrue, e) + case *map[int64]bool: + fastpathTV.EncMapInt64BoolV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringUint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringUint8V(rv2i(rv).(map[string]uint8), e) -} -func (_ fastpathT) EncMapStringUint8V(v map[string]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[bool]interface{}: + fastpathTV.EncMapBoolIntfV(v, fastpathCheckNilTrue, e) + case *map[bool]interface{}: + fastpathTV.EncMapBoolIntfV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringUint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringUint16V(rv2i(rv).(map[string]uint16), e) -} -func (_ fastpathT) EncMapStringUint16V(v map[string]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[bool]string: + fastpathTV.EncMapBoolStringV(v, fastpathCheckNilTrue, e) + case *map[bool]string: + fastpathTV.EncMapBoolStringV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringUint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringUint32V(rv2i(rv).(map[string]uint32), e) -} -func (_ fastpathT) EncMapStringUint32V(v map[string]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[bool]uint: + fastpathTV.EncMapBoolUintV(v, fastpathCheckNilTrue, e) + case *map[bool]uint: + fastpathTV.EncMapBoolUintV(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringUint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringUint64V(rv2i(rv).(map[string]uint64), e) -} -func (_ fastpathT) EncMapStringUint64V(v map[string]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeUint(uint64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[bool]uint8: + fastpathTV.EncMapBoolUint8V(v, fastpathCheckNilTrue, e) + case *map[bool]uint8: + fastpathTV.EncMapBoolUint8V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringUintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringUintptrV(rv2i(rv).(map[string]uintptr), e) -} -func (_ fastpathT) EncMapStringUintptrV(v map[string]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - e.encode(v[string(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - e.encode(v[string(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - e.encode(v2) - } - } - } - ee.WriteMapEnd() -} + case map[bool]uint16: + fastpathTV.EncMapBoolUint16V(v, fastpathCheckNilTrue, e) + case *map[bool]uint16: + fastpathTV.EncMapBoolUint16V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringIntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringIntV(rv2i(rv).(map[string]int), e) -} -func (_ fastpathT) EncMapStringIntV(v map[string]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[bool]uint32: + fastpathTV.EncMapBoolUint32V(v, fastpathCheckNilTrue, e) + case *map[bool]uint32: + fastpathTV.EncMapBoolUint32V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringInt8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringInt8V(rv2i(rv).(map[string]int8), e) -} -func (_ fastpathT) EncMapStringInt8V(v map[string]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v2)) - } - } - } - ee.WriteMapEnd() -} + case map[bool]uint64: + fastpathTV.EncMapBoolUint64V(v, fastpathCheckNilTrue, e) + case *map[bool]uint64: + fastpathTV.EncMapBoolUint64V(*v, fastpathCheckNilTrue, e) -func (e *Encoder) fastpathEncMapStringInt16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringInt16V(rv2i(rv).(map[string]int16), e) -} -func (_ fastpathT) EncMapStringInt16V(v map[string]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v2)) - } - } + case map[bool]uintptr: + fastpathTV.EncMapBoolUintptrV(v, fastpathCheckNilTrue, e) + case *map[bool]uintptr: + fastpathTV.EncMapBoolUintptrV(*v, fastpathCheckNilTrue, e) + + case map[bool]int: + fastpathTV.EncMapBoolIntV(v, fastpathCheckNilTrue, e) + case *map[bool]int: + fastpathTV.EncMapBoolIntV(*v, fastpathCheckNilTrue, e) + + case map[bool]int8: + fastpathTV.EncMapBoolInt8V(v, fastpathCheckNilTrue, e) + case *map[bool]int8: + fastpathTV.EncMapBoolInt8V(*v, fastpathCheckNilTrue, e) + + case map[bool]int16: + fastpathTV.EncMapBoolInt16V(v, fastpathCheckNilTrue, e) + case *map[bool]int16: + fastpathTV.EncMapBoolInt16V(*v, fastpathCheckNilTrue, e) + + case map[bool]int32: + fastpathTV.EncMapBoolInt32V(v, fastpathCheckNilTrue, e) + case *map[bool]int32: + fastpathTV.EncMapBoolInt32V(*v, fastpathCheckNilTrue, e) + + case map[bool]int64: + fastpathTV.EncMapBoolInt64V(v, fastpathCheckNilTrue, e) + case *map[bool]int64: + fastpathTV.EncMapBoolInt64V(*v, fastpathCheckNilTrue, e) + + case map[bool]float32: + fastpathTV.EncMapBoolFloat32V(v, fastpathCheckNilTrue, e) + case *map[bool]float32: + fastpathTV.EncMapBoolFloat32V(*v, fastpathCheckNilTrue, e) + + case map[bool]float64: + fastpathTV.EncMapBoolFloat64V(v, fastpathCheckNilTrue, e) + case *map[bool]float64: + fastpathTV.EncMapBoolFloat64V(*v, fastpathCheckNilTrue, e) + + case map[bool]bool: + fastpathTV.EncMapBoolBoolV(v, fastpathCheckNilTrue, e) + case *map[bool]bool: + fastpathTV.EncMapBoolBoolV(*v, fastpathCheckNilTrue, e) + + default: + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) + return false } - ee.WriteMapEnd() + return true } -func (e *Encoder) fastpathEncMapStringInt32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringInt32V(rv2i(rv).(map[string]int32), e) -} -func (_ fastpathT) EncMapStringInt32V(v map[string]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v[string(k2)])) - } - } +// -- -- fast path functions + +func (f *encFnInfo) fastpathEncSliceIntfR(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceIntfV(rv.Interface().([]interface{}), fastpathCheckNilFalse, f.e) } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v2)) - } - } + fastpathTV.EncSliceIntfV(rv.Interface().([]interface{}), fastpathCheckNilFalse, f.e) } - ee.WriteMapEnd() } - -func (e *Encoder) fastpathEncMapStringInt64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringInt64V(rv2i(rv).(map[string]int64), e) -} -func (_ fastpathT) EncMapStringInt64V(v map[string]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceIntfV(v []interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v[string(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeInt(int64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + e.encode(v2) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapStringFloat32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringFloat32V(rv2i(rv).(map[string]float32), e) -} -func (_ fastpathT) EncMapStringFloat32V(v map[string]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceIntfV(v []interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[string(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeFloat32(v[string(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeFloat32(v2) - } - } - } - ee.WriteMapEnd() -} - -func (e *Encoder) fastpathEncMapStringFloat64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringFloat64V(rv2i(rv).(map[string]float64), e) -} -func (_ fastpathT) EncMapStringFloat64V(v map[string]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[string(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeFloat64(v[string(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeFloat64(v2) + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + e.encode(v2) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapStringBoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapStringBoolV(rv2i(rv).(map[string]bool), e) -} -func (_ fastpathT) EncMapStringBoolV(v map[string]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeBool(v[string(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeString(cUTF8, k2) - ee.EncodeBool(v[string(k2)]) - } - } +func (f *encFnInfo) fastpathEncSliceStringR(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceStringV(rv.Interface().([]string), fastpathCheckNilFalse, f.e) } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeString(cUTF8, k2) - ee.WriteMapElemValue() - ee.EncodeBool(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeString(cUTF8, k2) - ee.EncodeBool(v2) - } - } + fastpathTV.EncSliceStringV(rv.Interface().([]string), fastpathCheckNilFalse, f.e) } - ee.WriteMapEnd() -} - -func (e *Encoder) fastpathEncMapFloat32IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32IntfV(rv2i(rv).(map[float32]interface{}), e) } -func (_ fastpathT) EncMapFloat32IntfV(v map[float32]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceStringV(v []string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - e.encode(v[float32(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - e.encode(v[float32(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - e.encode(v2) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeString(c_UTF8, v2) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32StringV(rv2i(rv).(map[float32]string), e) -} -func (_ fastpathT) EncMapFloat32StringV(v map[float32]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceStringV(v []string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[float32(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeString(cUTF8, v[float32(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeString(cUTF8, v2) - } - } - } - ee.WriteMapEnd() -} - -func (e *Encoder) fastpathEncMapFloat32UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32UintV(rv2i(rv).(map[float32]uint), e) -} -func (_ fastpathT) EncMapFloat32UintV(v map[float32]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeUint(uint64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeString(c_UTF8, v2) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Uint8V(rv2i(rv).(map[float32]uint8), e) +func (f *encFnInfo) fastpathEncSliceFloat32R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceFloat32V(rv.Interface().([]float32), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceFloat32V(rv.Interface().([]float32), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32Uint8V(v map[float32]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceFloat32V(v []float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeUint(uint64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeUint(uint64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeFloat32(v2) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Uint16V(rv2i(rv).(map[float32]uint16), e) -} -func (_ fastpathT) EncMapFloat32Uint16V(v map[float32]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceFloat32V(v []float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeUint(uint64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeUint(uint64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeFloat32(v2) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Uint32V(rv2i(rv).(map[float32]uint32), e) +func (f *encFnInfo) fastpathEncSliceFloat64R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceFloat64V(rv.Interface().([]float64), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceFloat64V(rv.Interface().([]float64), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32Uint32V(v map[float32]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceFloat64V(v []float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeUint(uint64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeUint(uint64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeFloat64(v2) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Uint64V(rv2i(rv).(map[float32]uint64), e) -} -func (_ fastpathT) EncMapFloat32Uint64V(v map[float32]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceFloat64V(v []float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeUint(uint64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeUint(uint64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeFloat64(v2) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32UintptrV(rv2i(rv).(map[float32]uintptr), e) +func (f *encFnInfo) fastpathEncSliceUintR(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceUintV(rv.Interface().([]uint), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceUintV(rv.Interface().([]uint), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32UintptrV(v map[float32]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceUintV(v []uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - e.encode(v[float32(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - e.encode(v[float32(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - e.encode(v2) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32IntV(rv2i(rv).(map[float32]int), e) -} -func (_ fastpathT) EncMapFloat32IntV(v map[float32]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceUintV(v []uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeInt(int64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeInt(int64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Int8V(rv2i(rv).(map[float32]int8), e) +func (f *encFnInfo) fastpathEncSliceUint16R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceUint16V(rv.Interface().([]uint16), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceUint16V(rv.Interface().([]uint16), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32Int8V(v map[float32]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceUint16V(v []uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeInt(int64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeInt(int64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Int16V(rv2i(rv).(map[float32]int16), e) -} -func (_ fastpathT) EncMapFloat32Int16V(v map[float32]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceUint16V(v []uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeInt(int64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeInt(int64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Int32V(rv2i(rv).(map[float32]int32), e) +func (f *encFnInfo) fastpathEncSliceUint32R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceUint32V(rv.Interface().([]uint32), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceUint32V(rv.Interface().([]uint32), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32Int32V(v map[float32]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceUint32V(v []uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeInt(int64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeInt(int64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Int64V(rv2i(rv).(map[float32]int64), e) -} -func (_ fastpathT) EncMapFloat32Int64V(v map[float32]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceUint32V(v []uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeInt(int64(v[float32(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeInt(int64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Float32V(rv2i(rv).(map[float32]float32), e) +func (f *encFnInfo) fastpathEncSliceUint64R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceUint64V(rv.Interface().([]uint64), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceUint64V(rv.Interface().([]uint64), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32Float32V(v map[float32]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceUint64V(v []uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[float32(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeFloat32(v[float32(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeFloat32(v2) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32Float64V(rv2i(rv).(map[float32]float64), e) -} -func (_ fastpathT) EncMapFloat32Float64V(v map[float32]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceUint64V(v []uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[float32(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeFloat64(v[float32(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeFloat64(v2) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeUint(uint64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat32BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat32BoolV(rv2i(rv).(map[float32]bool), e) +func (f *encFnInfo) fastpathEncSliceUintptrR(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceUintptrV(rv.Interface().([]uintptr), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceUintptrV(rv.Interface().([]uintptr), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat32BoolV(v map[float32]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceUintptrV(v []uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat32(float32(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v[float32(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat32(float32(k2)) - ee.EncodeBool(v[float32(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat32(k2) - ee.WriteMapElemValue() - ee.EncodeBool(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat32(k2) - ee.EncodeBool(v2) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + e.encode(v2) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64IntfV(rv2i(rv).(map[float64]interface{}), e) -} -func (_ fastpathT) EncMapFloat64IntfV(v map[float64]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceUintptrV(v []uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - e.encode(v[float64(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - e.encode(v[float64(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - e.encode(v2) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + e.encode(v2) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64StringV(rv2i(rv).(map[float64]string), e) +func (f *encFnInfo) fastpathEncSliceIntR(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceIntV(rv.Interface().([]int), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceIntV(rv.Interface().([]int), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat64StringV(v map[float64]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceIntV(v []int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[float64(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeString(cUTF8, v[float64(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeString(cUTF8, v2) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64UintV(rv2i(rv).(map[float64]uint), e) -} -func (_ fastpathT) EncMapFloat64UintV(v map[float64]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceIntV(v []int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeUint(uint64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeUint(uint64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Uint8V(rv2i(rv).(map[float64]uint8), e) +func (f *encFnInfo) fastpathEncSliceInt8R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceInt8V(rv.Interface().([]int8), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceInt8V(rv.Interface().([]int8), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat64Uint8V(v map[float64]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceInt8V(v []int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeUint(uint64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeUint(uint64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Uint16V(rv2i(rv).(map[float64]uint16), e) -} -func (_ fastpathT) EncMapFloat64Uint16V(v map[float64]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceInt8V(v []int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeUint(uint64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeUint(uint64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Uint32V(rv2i(rv).(map[float64]uint32), e) +func (f *encFnInfo) fastpathEncSliceInt16R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceInt16V(rv.Interface().([]int16), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceInt16V(rv.Interface().([]int16), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat64Uint32V(v map[float64]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceInt16V(v []int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeUint(uint64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeUint(uint64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Uint64V(rv2i(rv).(map[float64]uint64), e) -} -func (_ fastpathT) EncMapFloat64Uint64V(v map[float64]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceInt16V(v []int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeUint(uint64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeUint(uint64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64UintptrV(rv2i(rv).(map[float64]uintptr), e) +func (f *encFnInfo) fastpathEncSliceInt32R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceInt32V(rv.Interface().([]int32), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceInt32V(rv.Interface().([]int32), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat64UintptrV(v map[float64]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceInt32V(v []int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - e.encode(v[float64(k2)]) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - e.encode(v[float64(k2)]) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - e.encode(v2) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - e.encode(v2) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64IntV(rv2i(rv).(map[float64]int), e) -} -func (_ fastpathT) EncMapFloat64IntV(v map[float64]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceInt32V(v []int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeInt(int64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeInt(int64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Int8V(rv2i(rv).(map[float64]int8), e) +func (f *encFnInfo) fastpathEncSliceInt64R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceInt64V(rv.Interface().([]int64), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceInt64V(rv.Interface().([]int64), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat64Int8V(v map[float64]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceInt64V(v []int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeInt(int64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeInt(int64(v2)) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Int16V(rv2i(rv).(map[float64]int16), e) -} -func (_ fastpathT) EncMapFloat64Int16V(v map[float64]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncAsMapSliceInt64V(v []int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeInt(int64(v[float64(k2)])) - } - } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeInt(int64(v2)) + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeInt(int64(v2)) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Int32V(rv2i(rv).(map[float64]int32), e) +func (f *encFnInfo) fastpathEncSliceBoolR(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.EncAsMapSliceBoolV(rv.Interface().([]bool), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.EncSliceBoolV(rv.Interface().([]bool), fastpathCheckNilFalse, f.e) + } } -func (_ fastpathT) EncMapFloat64Int32V(v map[float64]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncSliceBoolV(v []bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeInt(int64(v[float64(k2)])) - } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { + cr.sendContainerState(containerArrayElem) } - } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) - } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeBool(v2) + } + if cr != nil { + cr.sendContainerState(containerArrayEnd) + } +} + +func (_ fastpathT) EncAsMapSliceBoolV(v []bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) } } + ee.EncodeBool(v2) + } + if cr != nil { + cr.sendContainerState(containerMapEnd) } - ee.WriteMapEnd() } -func (e *Encoder) fastpathEncMapFloat64Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Int64V(rv2i(rv).(map[float64]int64), e) +func (f *encFnInfo) fastpathEncMapIntfIntfR(rv reflect.Value) { + fastpathTV.EncMapIntfIntfV(rv.Interface().(map[interface{}]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapFloat64Int64V(v map[float64]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfIntfV(v map[interface{}]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[float64(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeInt(int64(v[float64(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapFloat64Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Float32V(rv2i(rv).(map[float64]float32), e) +func (f *encFnInfo) fastpathEncMapIntfStringR(rv reflect.Value) { + fastpathTV.EncMapIntfStringV(rv.Interface().(map[interface{}]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapFloat64Float32V(v map[float64]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfStringV(v map[interface{}]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[float64(k2)]) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeFloat32(v[float64(k2)]) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeFloat32(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapFloat64Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64Float64V(rv2i(rv).(map[float64]float64), e) +func (f *encFnInfo) fastpathEncMapIntfUintR(rv reflect.Value) { + fastpathTV.EncMapIntfUintV(rv.Interface().(map[interface{}]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapFloat64Float64V(v map[float64]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() - return - } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) +func (_ fastpathT) EncMapIntfUintV(v map[interface{}]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[float64(k2)]) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeFloat64(v[float64(k2)]) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeFloat64(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapFloat64BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapFloat64BoolV(rv2i(rv).(map[float64]bool), e) +func (f *encFnInfo) fastpathEncMapIntfUint8R(rv reflect.Value) { + fastpathTV.EncMapIntfUint8V(rv.Interface().(map[interface{}]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapFloat64BoolV(v map[float64]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfUint8V(v map[interface{}]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(floatSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeFloat64(float64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v[float64(k2)]) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeFloat64(float64(k2)) - ee.EncodeBool(v[float64(k2)]) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeFloat64(k2) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeFloat64(k2) - ee.EncodeBool(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintIntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintIntfV(rv2i(rv).(map[uint]interface{}), e) +func (f *encFnInfo) fastpathEncMapIntfUint16R(rv reflect.Value) { + fastpathTV.EncMapIntfUint16V(rv.Interface().(map[interface{}]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintIntfV(v map[uint]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfUint16V(v map[interface{}]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - e.encode(v[uint(k2)]) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - e.encode(v[uint(k2)]) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintStringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintStringV(rv2i(rv).(map[uint]string), e) +func (f *encFnInfo) fastpathEncMapIntfUint32R(rv reflect.Value) { + fastpathTV.EncMapIntfUint32V(rv.Interface().(map[interface{}]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintStringV(v map[uint]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfUint32V(v map[interface{}]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[uint(k2)]) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeString(cUTF8, v[uint(k2)]) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeString(cUTF8, v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintUintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintUintV(rv2i(rv).(map[uint]uint), e) +func (f *encFnInfo) fastpathEncMapIntfUint64R(rv reflect.Value) { + fastpathTV.EncMapIntfUint64V(rv.Interface().(map[interface{}]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintUintV(v map[uint]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfUint64V(v map[interface{}]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeUint(uint64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintUint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintUint8V(rv2i(rv).(map[uint]uint8), e) +func (f *encFnInfo) fastpathEncMapIntfUintptrR(rv reflect.Value) { + fastpathTV.EncMapIntfUintptrV(rv.Interface().(map[interface{}]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintUint8V(v map[uint]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfUintptrV(v map[interface{}]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeUint(uint64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintUint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintUint16V(rv2i(rv).(map[uint]uint16), e) +func (f *encFnInfo) fastpathEncMapIntfIntR(rv reflect.Value) { + fastpathTV.EncMapIntfIntV(rv.Interface().(map[interface{}]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintUint16V(v map[uint]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfIntV(v map[interface{}]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeUint(uint64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintUint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintUint32V(rv2i(rv).(map[uint]uint32), e) +func (f *encFnInfo) fastpathEncMapIntfInt8R(rv reflect.Value) { + fastpathTV.EncMapIntfInt8V(rv.Interface().(map[interface{}]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintUint32V(v map[uint]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfInt8V(v map[interface{}]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeUint(uint64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintUint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintUint64V(rv2i(rv).(map[uint]uint64), e) +func (f *encFnInfo) fastpathEncMapIntfInt16R(rv reflect.Value) { + fastpathTV.EncMapIntfInt16V(rv.Interface().(map[interface{}]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintUint64V(v map[uint]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfInt16V(v map[interface{}]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeUint(uint64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintUintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintUintptrV(rv2i(rv).(map[uint]uintptr), e) +func (f *encFnInfo) fastpathEncMapIntfInt32R(rv reflect.Value) { + fastpathTV.EncMapIntfInt32V(rv.Interface().(map[interface{}]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintUintptrV(v map[uint]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfInt32V(v map[interface{}]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - e.encode(v[uint(k2)]) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - e.encode(v[uint(k2)]) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintIntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintIntV(rv2i(rv).(map[uint]int), e) +func (f *encFnInfo) fastpathEncMapIntfInt64R(rv reflect.Value) { + fastpathTV.EncMapIntfInt64V(rv.Interface().(map[interface{}]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintIntV(v map[uint]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfInt64V(v map[interface{}]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeInt(int64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintInt8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintInt8V(rv2i(rv).(map[uint]int8), e) +func (f *encFnInfo) fastpathEncMapIntfFloat32R(rv reflect.Value) { + fastpathTV.EncMapIntfFloat32V(rv.Interface().(map[interface{}]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintInt8V(v map[uint]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfFloat32V(v map[interface{}]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeInt(int64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintInt16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintInt16V(rv2i(rv).(map[uint]int16), e) +func (f *encFnInfo) fastpathEncMapIntfFloat64R(rv reflect.Value) { + fastpathTV.EncMapIntfFloat64V(rv.Interface().(map[interface{}]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintInt16V(v map[uint]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfFloat64V(v map[interface{}]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeInt(int64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintInt32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintInt32V(rv2i(rv).(map[uint]int32), e) +func (f *encFnInfo) fastpathEncMapIntfBoolR(rv reflect.Value) { + fastpathTV.EncMapIntfBoolV(rv.Interface().(map[interface{}]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintInt32V(v map[uint]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntfBoolV(v map[interface{}]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) + var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint(k2)])) + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeInt(int64(v[uint(k2)])) + e.asis(v2[j].v) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintInt64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintInt64V(rv2i(rv).(map[uint]int64), e) +func (f *encFnInfo) fastpathEncMapStringIntfR(rv reflect.Value) { + fastpathTV.EncMapStringIntfV(rv.Interface().(map[string]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintInt64V(v map[uint]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringIntfV(v map[string]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeInt(int64(v[uint(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[string(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintFloat32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintFloat32V(rv2i(rv).(map[uint]float32), e) +func (f *encFnInfo) fastpathEncMapStringStringR(rv reflect.Value) { + fastpathTV.EncMapStringStringV(rv.Interface().(map[string]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintFloat32V(v map[uint]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringStringV(v map[string]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[uint(k2)]) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeFloat32(v[uint(k2)]) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[string(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat32(v2) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintFloat64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintFloat64V(rv2i(rv).(map[uint]float64), e) +func (f *encFnInfo) fastpathEncMapStringUintR(rv reflect.Value) { + fastpathTV.EncMapStringUintV(rv.Interface().(map[string]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintFloat64V(v map[uint]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringUintV(v map[string]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[uint(k2)]) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeFloat64(v[uint(k2)]) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat64(v2) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintBoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintBoolV(rv2i(rv).(map[uint]bool), e) +func (f *encFnInfo) fastpathEncMapStringUint8R(rv reflect.Value) { + fastpathTV.EncMapStringUint8V(rv.Interface().(map[string]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintBoolV(v map[uint]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringUint8V(v map[string]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[uint(k2)]) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint(k2))) - ee.EncodeBool(v[uint(k2)]) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeBool(v2) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8IntfV(rv2i(rv).(map[uint8]interface{}), e) +func (f *encFnInfo) fastpathEncMapStringUint16R(rv reflect.Value) { + fastpathTV.EncMapStringUint16V(rv.Interface().(map[string]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8IntfV(v map[uint8]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringUint16V(v map[string]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - e.encode(v[uint8(k2)]) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - e.encode(v[uint8(k2)]) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8StringV(rv2i(rv).(map[uint8]string), e) +func (f *encFnInfo) fastpathEncMapStringUint32R(rv reflect.Value) { + fastpathTV.EncMapStringUint32V(rv.Interface().(map[string]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8StringV(v map[uint8]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringUint32V(v map[string]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[uint8(k2)]) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeString(cUTF8, v[uint8(k2)]) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeString(cUTF8, v2) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8UintV(rv2i(rv).(map[uint8]uint), e) +func (f *encFnInfo) fastpathEncMapStringUint64R(rv reflect.Value) { + fastpathTV.EncMapStringUint64V(rv.Interface().(map[string]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8UintV(v map[uint8]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringUint64V(v map[string]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeUint(uint64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Uint8V(rv2i(rv).(map[uint8]uint8), e) +func (f *encFnInfo) fastpathEncMapStringUintptrR(rv reflect.Value) { + fastpathTV.EncMapStringUintptrV(rv.Interface().(map[string]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Uint8V(v map[uint8]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringUintptrV(v map[string]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeUint(uint64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[string(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Uint16V(rv2i(rv).(map[uint8]uint16), e) +func (f *encFnInfo) fastpathEncMapStringIntR(rv reflect.Value) { + fastpathTV.EncMapStringIntV(rv.Interface().(map[string]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Uint16V(v map[uint8]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringIntV(v map[string]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeUint(uint64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Uint32V(rv2i(rv).(map[uint8]uint32), e) +func (f *encFnInfo) fastpathEncMapStringInt8R(rv reflect.Value) { + fastpathTV.EncMapStringInt8V(rv.Interface().(map[string]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Uint32V(v map[uint8]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringInt8V(v map[string]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeUint(uint64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Uint64V(rv2i(rv).(map[uint8]uint64), e) +func (f *encFnInfo) fastpathEncMapStringInt16R(rv reflect.Value) { + fastpathTV.EncMapStringInt16V(rv.Interface().(map[string]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Uint64V(v map[uint8]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringInt16V(v map[string]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeUint(uint64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8UintptrV(rv2i(rv).(map[uint8]uintptr), e) +func (f *encFnInfo) fastpathEncMapStringInt32R(rv reflect.Value) { + fastpathTV.EncMapStringInt32V(rv.Interface().(map[string]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8UintptrV(v map[uint8]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringInt32V(v map[string]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - e.encode(v[uint8(k2)]) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - e.encode(v[uint8(k2)]) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8IntV(rv2i(rv).(map[uint8]int), e) +func (f *encFnInfo) fastpathEncMapStringInt64R(rv reflect.Value) { + fastpathTV.EncMapStringInt64V(rv.Interface().(map[string]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8IntV(v map[uint8]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringInt64V(v map[string]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeInt(int64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[string(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Int8V(rv2i(rv).(map[uint8]int8), e) +func (f *encFnInfo) fastpathEncMapStringFloat32R(rv reflect.Value) { + fastpathTV.EncMapStringFloat32V(rv.Interface().(map[string]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Int8V(v map[uint8]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringFloat32V(v map[string]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeInt(int64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v[string(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Int16V(rv2i(rv).(map[uint8]int16), e) +func (f *encFnInfo) fastpathEncMapStringFloat64R(rv reflect.Value) { + fastpathTV.EncMapStringFloat64V(rv.Interface().(map[string]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Int16V(v map[uint8]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringFloat64V(v map[string]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeInt(int64(v[uint8(k2)])) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v[string(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Int32V(rv2i(rv).(map[uint8]int32), e) +func (f *encFnInfo) fastpathEncMapStringBoolR(rv reflect.Value) { + fastpathTV.EncMapStringBoolV(rv.Interface().(map[string]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Int32V(v map[uint8]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapStringBoolV(v map[string]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) + asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]string, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = string(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint8(k2)])) + sort.Sort(stringSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeInt(int64(v[uint8(k2)])) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[string(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + } + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Int64V(rv2i(rv).(map[uint8]int64), e) +func (f *encFnInfo) fastpathEncMapFloat32IntfR(rv reflect.Value) { + fastpathTV.EncMapFloat32IntfV(rv.Interface().(map[float32]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Int64V(v map[uint8]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32IntfV(v map[float32]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint8(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeInt(int64(v[uint8(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[float32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Float32V(rv2i(rv).(map[uint8]float32), e) +func (f *encFnInfo) fastpathEncMapFloat32StringR(rv reflect.Value) { + fastpathTV.EncMapFloat32StringV(rv.Interface().(map[float32]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Float32V(v map[uint8]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32StringV(v map[float32]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[uint8(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeFloat32(v[uint8(k2)]) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[float32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8Float64V(rv2i(rv).(map[uint8]float64), e) +func (f *encFnInfo) fastpathEncMapFloat32UintR(rv reflect.Value) { + fastpathTV.EncMapFloat32UintV(rv.Interface().(map[float32]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8Float64V(v map[uint8]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32UintV(v map[float32]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[uint8(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeFloat64(v[uint8(k2)]) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint8BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint8BoolV(rv2i(rv).(map[uint8]bool), e) +func (f *encFnInfo) fastpathEncMapFloat32Uint8R(rv reflect.Value) { + fastpathTV.EncMapFloat32Uint8V(rv.Interface().(map[float32]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint8BoolV(v map[uint8]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Uint8V(v map[float32]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint8(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[uint8(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint8(k2))) - ee.EncodeBool(v[uint8(k2)]) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeBool(v2) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16IntfV(rv2i(rv).(map[uint16]interface{}), e) +func (f *encFnInfo) fastpathEncMapFloat32Uint16R(rv reflect.Value) { + fastpathTV.EncMapFloat32Uint16V(rv.Interface().(map[float32]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16IntfV(v map[uint16]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Uint16V(v map[float32]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - e.encode(v[uint16(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - e.encode(v[uint16(k2)]) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16StringV(rv2i(rv).(map[uint16]string), e) +func (f *encFnInfo) fastpathEncMapFloat32Uint32R(rv reflect.Value) { + fastpathTV.EncMapFloat32Uint32V(rv.Interface().(map[float32]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16StringV(v map[uint16]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Uint32V(v map[float32]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[uint16(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeString(cUTF8, v[uint16(k2)]) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16UintV(rv2i(rv).(map[uint16]uint), e) +func (f *encFnInfo) fastpathEncMapFloat32Uint64R(rv reflect.Value) { + fastpathTV.EncMapFloat32Uint64V(rv.Interface().(map[float32]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16UintV(v map[uint16]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Uint64V(v map[float32]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeUint(uint64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Uint8V(rv2i(rv).(map[uint16]uint8), e) +func (f *encFnInfo) fastpathEncMapFloat32UintptrR(rv reflect.Value) { + fastpathTV.EncMapFloat32UintptrV(rv.Interface().(map[float32]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Uint8V(v map[uint16]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32UintptrV(v map[float32]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeUint(uint64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[float32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Uint16V(rv2i(rv).(map[uint16]uint16), e) +func (f *encFnInfo) fastpathEncMapFloat32IntR(rv reflect.Value) { + fastpathTV.EncMapFloat32IntV(rv.Interface().(map[float32]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Uint16V(v map[uint16]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32IntV(v map[float32]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeUint(uint64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Uint32V(rv2i(rv).(map[uint16]uint32), e) +func (f *encFnInfo) fastpathEncMapFloat32Int8R(rv reflect.Value) { + fastpathTV.EncMapFloat32Int8V(rv.Interface().(map[float32]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Uint32V(v map[uint16]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Int8V(v map[float32]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeUint(uint64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Uint64V(rv2i(rv).(map[uint16]uint64), e) +func (f *encFnInfo) fastpathEncMapFloat32Int16R(rv reflect.Value) { + fastpathTV.EncMapFloat32Int16V(rv.Interface().(map[float32]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Uint64V(v map[uint16]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Int16V(v map[float32]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeUint(uint64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16UintptrV(rv2i(rv).(map[uint16]uintptr), e) +func (f *encFnInfo) fastpathEncMapFloat32Int32R(rv reflect.Value) { + fastpathTV.EncMapFloat32Int32V(rv.Interface().(map[float32]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16UintptrV(v map[uint16]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Int32V(v map[float32]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - e.encode(v[uint16(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - e.encode(v[uint16(k2)]) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16IntV(rv2i(rv).(map[uint16]int), e) +func (f *encFnInfo) fastpathEncMapFloat32Int64R(rv reflect.Value) { + fastpathTV.EncMapFloat32Int64V(rv.Interface().(map[float32]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16IntV(v map[uint16]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Int64V(v map[float32]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeInt(int64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Int8V(rv2i(rv).(map[uint16]int8), e) +func (f *encFnInfo) fastpathEncMapFloat32Float32R(rv reflect.Value) { + fastpathTV.EncMapFloat32Float32V(rv.Interface().(map[float32]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Int8V(v map[uint16]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Float32V(v map[float32]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeInt(int64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[float32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Int16V(rv2i(rv).(map[uint16]int16), e) +func (f *encFnInfo) fastpathEncMapFloat32Float64R(rv reflect.Value) { + fastpathTV.EncMapFloat32Float64V(rv.Interface().(map[float32]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Int16V(v map[uint16]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32Float64V(v map[float32]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeInt(int64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[float32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Int32V(rv2i(rv).(map[uint16]int32), e) +func (f *encFnInfo) fastpathEncMapFloat32BoolR(rv reflect.Value) { + fastpathTV.EncMapFloat32BoolV(rv.Interface().(map[float32]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Int32V(v map[uint16]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat32BoolV(v map[float32]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeInt(int64(v[uint16(k2)])) + ee.EncodeFloat32(float32(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[float32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat32(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Int64V(rv2i(rv).(map[uint16]int64), e) +func (f *encFnInfo) fastpathEncMapFloat64IntfR(rv reflect.Value) { + fastpathTV.EncMapFloat64IntfV(rv.Interface().(map[float64]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Int64V(v map[uint16]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64IntfV(v map[float64]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint16(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeInt(int64(v[uint16(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[float64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Float32V(rv2i(rv).(map[uint16]float32), e) +func (f *encFnInfo) fastpathEncMapFloat64StringR(rv reflect.Value) { + fastpathTV.EncMapFloat64StringV(rv.Interface().(map[float64]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Float32V(v map[uint16]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64StringV(v map[float64]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[uint16(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeFloat32(v[uint16(k2)]) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[float64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16Float64V(rv2i(rv).(map[uint16]float64), e) +func (f *encFnInfo) fastpathEncMapFloat64UintR(rv reflect.Value) { + fastpathTV.EncMapFloat64UintV(rv.Interface().(map[float64]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16Float64V(v map[uint16]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64UintV(v map[float64]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[uint16(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeFloat64(v[uint16(k2)]) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint16BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint16BoolV(rv2i(rv).(map[uint16]bool), e) +func (f *encFnInfo) fastpathEncMapFloat64Uint8R(rv reflect.Value) { + fastpathTV.EncMapFloat64Uint8V(rv.Interface().(map[float64]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint16BoolV(v map[uint16]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Uint8V(v map[float64]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint16(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[uint16(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint16(k2))) - ee.EncodeBool(v[uint16(k2)]) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeBool(v2) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32IntfV(rv2i(rv).(map[uint32]interface{}), e) +func (f *encFnInfo) fastpathEncMapFloat64Uint16R(rv reflect.Value) { + fastpathTV.EncMapFloat64Uint16V(rv.Interface().(map[float64]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32IntfV(v map[uint32]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Uint16V(v map[float64]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - e.encode(v[uint32(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - e.encode(v[uint32(k2)]) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32StringV(rv2i(rv).(map[uint32]string), e) +func (f *encFnInfo) fastpathEncMapFloat64Uint32R(rv reflect.Value) { + fastpathTV.EncMapFloat64Uint32V(rv.Interface().(map[float64]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32StringV(v map[uint32]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Uint32V(v map[float64]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[uint32(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeString(cUTF8, v[uint32(k2)]) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32UintV(rv2i(rv).(map[uint32]uint), e) +func (f *encFnInfo) fastpathEncMapFloat64Uint64R(rv reflect.Value) { + fastpathTV.EncMapFloat64Uint64V(rv.Interface().(map[float64]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32UintV(v map[uint32]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Uint64V(v map[float64]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeUint(uint64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Uint8V(rv2i(rv).(map[uint32]uint8), e) +func (f *encFnInfo) fastpathEncMapFloat64UintptrR(rv reflect.Value) { + fastpathTV.EncMapFloat64UintptrV(rv.Interface().(map[float64]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Uint8V(v map[uint32]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64UintptrV(v map[float64]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeUint(uint64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[float64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Uint16V(rv2i(rv).(map[uint32]uint16), e) +func (f *encFnInfo) fastpathEncMapFloat64IntR(rv reflect.Value) { + fastpathTV.EncMapFloat64IntV(rv.Interface().(map[float64]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Uint16V(v map[uint32]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64IntV(v map[float64]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeUint(uint64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Uint32V(rv2i(rv).(map[uint32]uint32), e) +func (f *encFnInfo) fastpathEncMapFloat64Int8R(rv reflect.Value) { + fastpathTV.EncMapFloat64Int8V(rv.Interface().(map[float64]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Uint32V(v map[uint32]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Int8V(v map[float64]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeUint(uint64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Uint64V(rv2i(rv).(map[uint32]uint64), e) +func (f *encFnInfo) fastpathEncMapFloat64Int16R(rv reflect.Value) { + fastpathTV.EncMapFloat64Int16V(rv.Interface().(map[float64]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Uint64V(v map[uint32]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Int16V(v map[float64]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeUint(uint64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32UintptrV(rv2i(rv).(map[uint32]uintptr), e) +func (f *encFnInfo) fastpathEncMapFloat64Int32R(rv reflect.Value) { + fastpathTV.EncMapFloat64Int32V(rv.Interface().(map[float64]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32UintptrV(v map[uint32]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Int32V(v map[float64]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - e.encode(v[uint32(k2)]) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - e.encode(v[uint32(k2)]) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32IntV(rv2i(rv).(map[uint32]int), e) +func (f *encFnInfo) fastpathEncMapFloat64Int64R(rv reflect.Value) { + fastpathTV.EncMapFloat64Int64V(rv.Interface().(map[float64]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32IntV(v map[uint32]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Int64V(v map[float64]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeInt(int64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[float64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Int8V(rv2i(rv).(map[uint32]int8), e) +func (f *encFnInfo) fastpathEncMapFloat64Float32R(rv reflect.Value) { + fastpathTV.EncMapFloat64Float32V(rv.Interface().(map[float64]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Int8V(v map[uint32]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Float32V(v map[float64]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeInt(int64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[float64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Int16V(rv2i(rv).(map[uint32]int16), e) +func (f *encFnInfo) fastpathEncMapFloat64Float64R(rv reflect.Value) { + fastpathTV.EncMapFloat64Float64V(rv.Interface().(map[float64]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Int16V(v map[uint32]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64Float64V(v map[float64]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeInt(int64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[float64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Int32V(rv2i(rv).(map[uint32]int32), e) +func (f *encFnInfo) fastpathEncMapFloat64BoolR(rv reflect.Value) { + fastpathTV.EncMapFloat64BoolV(rv.Interface().(map[float64]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Int32V(v map[uint32]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapFloat64BoolV(v map[float64]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]uint64, len(v)) + v2 := make([]float64, len(v)) var i int for k, _ := range v { - v2[i] = uint64(k) + v2[i] = float64(k) i++ } - sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint32(k2)])) + sort.Sort(floatSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeInt(int64(v[uint32(k2)])) + ee.EncodeFloat64(float64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[float64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeFloat64(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Int64V(rv2i(rv).(map[uint32]int64), e) +func (f *encFnInfo) fastpathEncMapUintIntfR(rv reflect.Value) { + fastpathTV.EncMapUintIntfV(rv.Interface().(map[uint]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Int64V(v map[uint32]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintIntfV(v map[uint]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8471,47 +7127,44 @@ func (_ fastpathT) EncMapUint32Int64V(v map[uint32]int64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint32(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeInt(int64(v[uint32(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Float32V(rv2i(rv).(map[uint32]float32), e) +func (f *encFnInfo) fastpathEncMapUintStringR(rv reflect.Value) { + fastpathTV.EncMapUintStringV(rv.Interface().(map[uint]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Float32V(v map[uint32]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintStringV(v map[uint]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8520,47 +7173,44 @@ func (_ fastpathT) EncMapUint32Float32V(v map[uint32]float32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[uint32(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeFloat32(v[uint32(k2)]) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[uint(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32Float64V(rv2i(rv).(map[uint32]float64), e) +func (f *encFnInfo) fastpathEncMapUintUintR(rv reflect.Value) { + fastpathTV.EncMapUintUintV(rv.Interface().(map[uint]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32Float64V(v map[uint32]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintUintV(v map[uint]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8569,47 +7219,44 @@ func (_ fastpathT) EncMapUint32Float64V(v map[uint32]float64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[uint32(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeFloat64(v[uint32(k2)]) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint32BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint32BoolV(rv2i(rv).(map[uint32]bool), e) +func (f *encFnInfo) fastpathEncMapUintUint8R(rv reflect.Value) { + fastpathTV.EncMapUintUint8V(rv.Interface().(map[uint]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint32BoolV(v map[uint32]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintUint8V(v map[uint]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8618,47 +7265,44 @@ func (_ fastpathT) EncMapUint32BoolV(v map[uint32]bool, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint32(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[uint32(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint32(k2))) - ee.EncodeBool(v[uint32(k2)]) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeBool(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64IntfV(rv2i(rv).(map[uint64]interface{}), e) +func (f *encFnInfo) fastpathEncMapUintUint16R(rv reflect.Value) { + fastpathTV.EncMapUintUint16V(rv.Interface().(map[uint]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64IntfV(v map[uint64]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintUint16V(v map[uint]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8667,47 +7311,44 @@ func (_ fastpathT) EncMapUint64IntfV(v map[uint64]interface{}, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - e.encode(v[uint64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - e.encode(v[uint64(k2)]) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64StringV(rv2i(rv).(map[uint64]string), e) +func (f *encFnInfo) fastpathEncMapUintUint32R(rv reflect.Value) { + fastpathTV.EncMapUintUint32V(rv.Interface().(map[uint]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64StringV(v map[uint64]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintUint32V(v map[uint]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8716,47 +7357,44 @@ func (_ fastpathT) EncMapUint64StringV(v map[uint64]string, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[uint64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeString(cUTF8, v[uint64(k2)]) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64UintV(rv2i(rv).(map[uint64]uint), e) +func (f *encFnInfo) fastpathEncMapUintUint64R(rv reflect.Value) { + fastpathTV.EncMapUintUint64V(rv.Interface().(map[uint]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64UintV(v map[uint64]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintUint64V(v map[uint]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8765,47 +7403,44 @@ func (_ fastpathT) EncMapUint64UintV(v map[uint64]uint, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeUint(uint64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Uint8V(rv2i(rv).(map[uint64]uint8), e) +func (f *encFnInfo) fastpathEncMapUintUintptrR(rv reflect.Value) { + fastpathTV.EncMapUintUintptrV(rv.Interface().(map[uint]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Uint8V(v map[uint64]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintUintptrV(v map[uint]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8814,47 +7449,44 @@ func (_ fastpathT) EncMapUint64Uint8V(v map[uint64]uint8, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeUint(uint64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Uint16V(rv2i(rv).(map[uint64]uint16), e) +func (f *encFnInfo) fastpathEncMapUintIntR(rv reflect.Value) { + fastpathTV.EncMapUintIntV(rv.Interface().(map[uint]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Uint16V(v map[uint64]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintIntV(v map[uint]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8863,47 +7495,44 @@ func (_ fastpathT) EncMapUint64Uint16V(v map[uint64]uint16, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeUint(uint64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Uint32V(rv2i(rv).(map[uint64]uint32), e) +func (f *encFnInfo) fastpathEncMapUintInt8R(rv reflect.Value) { + fastpathTV.EncMapUintInt8V(rv.Interface().(map[uint]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Uint32V(v map[uint64]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintInt8V(v map[uint]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8912,47 +7541,44 @@ func (_ fastpathT) EncMapUint64Uint32V(v map[uint64]uint32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeUint(uint64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Uint64V(rv2i(rv).(map[uint64]uint64), e) +func (f *encFnInfo) fastpathEncMapUintInt16R(rv reflect.Value) { + fastpathTV.EncMapUintInt16V(rv.Interface().(map[uint]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Uint64V(v map[uint64]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintInt16V(v map[uint]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -8961,47 +7587,44 @@ func (_ fastpathT) EncMapUint64Uint64V(v map[uint64]uint64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeUint(uint64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64UintptrV(rv2i(rv).(map[uint64]uintptr), e) +func (f *encFnInfo) fastpathEncMapUintInt32R(rv reflect.Value) { + fastpathTV.EncMapUintInt32V(rv.Interface().(map[uint]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64UintptrV(v map[uint64]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintInt32V(v map[uint]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9010,47 +7633,44 @@ func (_ fastpathT) EncMapUint64UintptrV(v map[uint64]uintptr, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - e.encode(v[uint64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - e.encode(v[uint64(k2)]) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64IntV(rv2i(rv).(map[uint64]int), e) +func (f *encFnInfo) fastpathEncMapUintInt64R(rv reflect.Value) { + fastpathTV.EncMapUintInt64V(rv.Interface().(map[uint]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64IntV(v map[uint64]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintInt64V(v map[uint]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9059,47 +7679,44 @@ func (_ fastpathT) EncMapUint64IntV(v map[uint64]int, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeInt(int64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Int8V(rv2i(rv).(map[uint64]int8), e) +func (f *encFnInfo) fastpathEncMapUintFloat32R(rv reflect.Value) { + fastpathTV.EncMapUintFloat32V(rv.Interface().(map[uint]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Int8V(v map[uint64]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintFloat32V(v map[uint]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9108,47 +7725,44 @@ func (_ fastpathT) EncMapUint64Int8V(v map[uint64]int8, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeInt(int64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[uint(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Int16V(rv2i(rv).(map[uint64]int16), e) +func (f *encFnInfo) fastpathEncMapUintFloat64R(rv reflect.Value) { + fastpathTV.EncMapUintFloat64V(rv.Interface().(map[uint]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Int16V(v map[uint64]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintFloat64V(v map[uint]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9157,47 +7771,44 @@ func (_ fastpathT) EncMapUint64Int16V(v map[uint64]int16, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeInt(int64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[uint(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Int32V(rv2i(rv).(map[uint64]int32), e) +func (f *encFnInfo) fastpathEncMapUintBoolR(rv reflect.Value) { + fastpathTV.EncMapUintBoolV(rv.Interface().(map[uint]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Int32V(v map[uint64]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintBoolV(v map[uint]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9206,47 +7817,44 @@ func (_ fastpathT) EncMapUint64Int32V(v map[uint64]int32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeInt(int64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[uint(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Int64V(rv2i(rv).(map[uint64]int64), e) +func (f *encFnInfo) fastpathEncMapUint8IntfR(rv reflect.Value) { + fastpathTV.EncMapUint8IntfV(rv.Interface().(map[uint8]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Int64V(v map[uint64]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8IntfV(v map[uint8]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9255,47 +7863,44 @@ func (_ fastpathT) EncMapUint64Int64V(v map[uint64]int64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uint64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeInt(int64(v[uint64(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Float32V(rv2i(rv).(map[uint64]float32), e) +func (f *encFnInfo) fastpathEncMapUint8StringR(rv reflect.Value) { + fastpathTV.EncMapUint8StringV(rv.Interface().(map[uint8]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Float32V(v map[uint64]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8StringV(v map[uint8]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9304,47 +7909,44 @@ func (_ fastpathT) EncMapUint64Float32V(v map[uint64]float32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[uint64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeFloat32(v[uint64(k2)]) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[uint8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64Float64V(rv2i(rv).(map[uint64]float64), e) +func (f *encFnInfo) fastpathEncMapUint8UintR(rv reflect.Value) { + fastpathTV.EncMapUint8UintV(rv.Interface().(map[uint8]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64Float64V(v map[uint64]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8UintV(v map[uint8]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9353,47 +7955,44 @@ func (_ fastpathT) EncMapUint64Float64V(v map[uint64]float64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[uint64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeFloat64(v[uint64(k2)]) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUint64BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUint64BoolV(rv2i(rv).(map[uint64]bool), e) +func (f *encFnInfo) fastpathEncMapUint8Uint8R(rv reflect.Value) { + fastpathTV.EncMapUint8Uint8V(rv.Interface().(map[uint8]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUint64BoolV(v map[uint64]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Uint8V(v map[uint8]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9402,47 +8001,44 @@ func (_ fastpathT) EncMapUint64BoolV(v map[uint64]bool, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(uint64(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[uint64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeUint(uint64(uint64(k2))) - ee.EncodeBool(v[uint64(k2)]) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeUint(uint64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeUint(uint64(k2)) - ee.EncodeBool(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrIntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrIntfV(rv2i(rv).(map[uintptr]interface{}), e) +func (f *encFnInfo) fastpathEncMapUint8Uint16R(rv reflect.Value) { + fastpathTV.EncMapUint8Uint16V(rv.Interface().(map[uint8]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrIntfV(v map[uintptr]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Uint16V(v map[uint8]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9451,47 +8047,44 @@ func (_ fastpathT) EncMapUintptrIntfV(v map[uintptr]interface{}, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - e.encode(v[uintptr(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - e.encode(v[uintptr(k2)]) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrStringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrStringV(rv2i(rv).(map[uintptr]string), e) +func (f *encFnInfo) fastpathEncMapUint8Uint32R(rv reflect.Value) { + fastpathTV.EncMapUint8Uint32V(rv.Interface().(map[uint8]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrStringV(v map[uintptr]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Uint32V(v map[uint8]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9500,47 +8093,44 @@ func (_ fastpathT) EncMapUintptrStringV(v map[uintptr]string, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[uintptr(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeString(cUTF8, v[uintptr(k2)]) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeString(cUTF8, v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrUintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrUintV(rv2i(rv).(map[uintptr]uint), e) +func (f *encFnInfo) fastpathEncMapUint8Uint64R(rv reflect.Value) { + fastpathTV.EncMapUint8Uint64V(rv.Interface().(map[uint8]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrUintV(v map[uintptr]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Uint64V(v map[uint8]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9549,47 +8139,44 @@ func (_ fastpathT) EncMapUintptrUintV(v map[uintptr]uint, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeUint(uint64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrUint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrUint8V(rv2i(rv).(map[uintptr]uint8), e) +func (f *encFnInfo) fastpathEncMapUint8UintptrR(rv reflect.Value) { + fastpathTV.EncMapUint8UintptrV(rv.Interface().(map[uint8]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrUint8V(v map[uintptr]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8UintptrV(v map[uint8]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9598,47 +8185,44 @@ func (_ fastpathT) EncMapUintptrUint8V(v map[uintptr]uint8, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeUint(uint64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrUint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrUint16V(rv2i(rv).(map[uintptr]uint16), e) +func (f *encFnInfo) fastpathEncMapUint8IntR(rv reflect.Value) { + fastpathTV.EncMapUint8IntV(rv.Interface().(map[uint8]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrUint16V(v map[uintptr]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8IntV(v map[uint8]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9647,47 +8231,44 @@ func (_ fastpathT) EncMapUintptrUint16V(v map[uintptr]uint16, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeUint(uint64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrUint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrUint32V(rv2i(rv).(map[uintptr]uint32), e) +func (f *encFnInfo) fastpathEncMapUint8Int8R(rv reflect.Value) { + fastpathTV.EncMapUint8Int8V(rv.Interface().(map[uint8]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrUint32V(v map[uintptr]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Int8V(v map[uint8]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9696,47 +8277,44 @@ func (_ fastpathT) EncMapUintptrUint32V(v map[uintptr]uint32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeUint(uint64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrUint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrUint64V(rv2i(rv).(map[uintptr]uint64), e) +func (f *encFnInfo) fastpathEncMapUint8Int16R(rv reflect.Value) { + fastpathTV.EncMapUint8Int16V(rv.Interface().(map[uint8]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrUint64V(v map[uintptr]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Int16V(v map[uint8]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9745,47 +8323,44 @@ func (_ fastpathT) EncMapUintptrUint64V(v map[uintptr]uint64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeUint(uint64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrUintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrUintptrV(rv2i(rv).(map[uintptr]uintptr), e) +func (f *encFnInfo) fastpathEncMapUint8Int32R(rv reflect.Value) { + fastpathTV.EncMapUint8Int32V(rv.Interface().(map[uint8]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrUintptrV(v map[uintptr]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Int32V(v map[uint8]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9794,47 +8369,44 @@ func (_ fastpathT) EncMapUintptrUintptrV(v map[uintptr]uintptr, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - e.encode(v[uintptr(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - e.encode(v[uintptr(k2)]) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrIntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrIntV(rv2i(rv).(map[uintptr]int), e) +func (f *encFnInfo) fastpathEncMapUint8Int64R(rv reflect.Value) { + fastpathTV.EncMapUint8Int64V(rv.Interface().(map[uint8]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrIntV(v map[uintptr]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Int64V(v map[uint8]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9843,47 +8415,44 @@ func (_ fastpathT) EncMapUintptrIntV(v map[uintptr]int, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeInt(int64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrInt8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrInt8V(rv2i(rv).(map[uintptr]int8), e) +func (f *encFnInfo) fastpathEncMapUint8Float32R(rv reflect.Value) { + fastpathTV.EncMapUint8Float32V(rv.Interface().(map[uint8]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrInt8V(v map[uintptr]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Float32V(v map[uint8]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9892,47 +8461,44 @@ func (_ fastpathT) EncMapUintptrInt8V(v map[uintptr]int8, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeInt(int64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[uint8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrInt16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrInt16V(rv2i(rv).(map[uintptr]int16), e) +func (f *encFnInfo) fastpathEncMapUint8Float64R(rv reflect.Value) { + fastpathTV.EncMapUint8Float64V(rv.Interface().(map[uint8]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrInt16V(v map[uintptr]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8Float64V(v map[uint8]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9941,47 +8507,44 @@ func (_ fastpathT) EncMapUintptrInt16V(v map[uintptr]int16, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeInt(int64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[uint8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrInt32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrInt32V(rv2i(rv).(map[uintptr]int32), e) +func (f *encFnInfo) fastpathEncMapUint8BoolR(rv reflect.Value) { + fastpathTV.EncMapUint8BoolV(rv.Interface().(map[uint8]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrInt32V(v map[uintptr]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint8BoolV(v map[uint8]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -9990,47 +8553,44 @@ func (_ fastpathT) EncMapUintptrInt32V(v map[uintptr]int32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeInt(int64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[uint8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrInt64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrInt64V(rv2i(rv).(map[uintptr]int64), e) +func (f *encFnInfo) fastpathEncMapUint16IntfR(rv reflect.Value) { + fastpathTV.EncMapUint16IntfV(rv.Interface().(map[uint16]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrInt64V(v map[uintptr]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16IntfV(v map[uint16]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -10039,47 +8599,44 @@ func (_ fastpathT) EncMapUintptrInt64V(v map[uintptr]int64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[uintptr(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeInt(int64(v[uintptr(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrFloat32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrFloat32V(rv2i(rv).(map[uintptr]float32), e) +func (f *encFnInfo) fastpathEncMapUint16StringR(rv reflect.Value) { + fastpathTV.EncMapUint16StringV(rv.Interface().(map[uint16]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrFloat32V(v map[uintptr]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16StringV(v map[uint16]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -10088,47 +8645,44 @@ func (_ fastpathT) EncMapUintptrFloat32V(v map[uintptr]float32, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[uintptr(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeFloat32(v[uintptr(k2)]) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[uint16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeFloat32(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrFloat64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrFloat64V(rv2i(rv).(map[uintptr]float64), e) +func (f *encFnInfo) fastpathEncMapUint16UintR(rv reflect.Value) { + fastpathTV.EncMapUint16UintV(rv.Interface().(map[uint16]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrFloat64V(v map[uintptr]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16UintV(v map[uint16]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -10137,47 +8691,44 @@ func (_ fastpathT) EncMapUintptrFloat64V(v map[uintptr]float64, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[uintptr(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeFloat64(v[uintptr(k2)]) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeFloat64(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapUintptrBoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapUintptrBoolV(rv2i(rv).(map[uintptr]bool), e) +func (f *encFnInfo) fastpathEncMapUint16Uint8R(rv reflect.Value) { + fastpathTV.EncMapUint16Uint8V(rv.Interface().(map[uint16]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapUintptrBoolV(v map[uintptr]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Uint8V(v map[uint16]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]uint64, len(v)) var i int @@ -10186,2987 +8737,2804 @@ func (_ fastpathT) EncMapUintptrBoolV(v map[uintptr]bool, e *Encoder) { i++ } sort.Sort(uintSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - e.encode(uintptr(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v[uintptr(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - e.encode(uintptr(k2)) - ee.EncodeBool(v[uintptr(k2)]) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - e.encode(k2) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - e.encode(k2) - ee.EncodeBool(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntIntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntIntfV(rv2i(rv).(map[int]interface{}), e) +func (f *encFnInfo) fastpathEncMapUint16Uint16R(rv reflect.Value) { + fastpathTV.EncMapUint16Uint16V(rv.Interface().(map[uint16]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntIntfV(v map[int]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Uint16V(v map[uint16]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - e.encode(v[int(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - e.encode(v[int(k2)]) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntStringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntStringV(rv2i(rv).(map[int]string), e) +func (f *encFnInfo) fastpathEncMapUint16Uint32R(rv reflect.Value) { + fastpathTV.EncMapUint16Uint32V(rv.Interface().(map[uint16]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntStringV(v map[int]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Uint32V(v map[uint16]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[int(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeString(cUTF8, v[int(k2)]) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntUintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntUintV(rv2i(rv).(map[int]uint), e) +func (f *encFnInfo) fastpathEncMapUint16Uint64R(rv reflect.Value) { + fastpathTV.EncMapUint16Uint64V(rv.Interface().(map[uint16]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntUintV(v map[int]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Uint64V(v map[uint16]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeUint(uint64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntUint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntUint8V(rv2i(rv).(map[int]uint8), e) +func (f *encFnInfo) fastpathEncMapUint16UintptrR(rv reflect.Value) { + fastpathTV.EncMapUint16UintptrV(rv.Interface().(map[uint16]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntUint8V(v map[int]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16UintptrV(v map[uint16]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeUint(uint64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntUint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntUint16V(rv2i(rv).(map[int]uint16), e) +func (f *encFnInfo) fastpathEncMapUint16IntR(rv reflect.Value) { + fastpathTV.EncMapUint16IntV(rv.Interface().(map[uint16]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntUint16V(v map[int]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16IntV(v map[uint16]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeUint(uint64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntUint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntUint32V(rv2i(rv).(map[int]uint32), e) +func (f *encFnInfo) fastpathEncMapUint16Int8R(rv reflect.Value) { + fastpathTV.EncMapUint16Int8V(rv.Interface().(map[uint16]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntUint32V(v map[int]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Int8V(v map[uint16]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeUint(uint64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntUint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntUint64V(rv2i(rv).(map[int]uint64), e) +func (f *encFnInfo) fastpathEncMapUint16Int16R(rv reflect.Value) { + fastpathTV.EncMapUint16Int16V(rv.Interface().(map[uint16]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntUint64V(v map[int]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Int16V(v map[uint16]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeUint(uint64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntUintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntUintptrV(rv2i(rv).(map[int]uintptr), e) +func (f *encFnInfo) fastpathEncMapUint16Int32R(rv reflect.Value) { + fastpathTV.EncMapUint16Int32V(rv.Interface().(map[uint16]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntUintptrV(v map[int]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Int32V(v map[uint16]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - e.encode(v[int(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - e.encode(v[int(k2)]) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntIntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntIntV(rv2i(rv).(map[int]int), e) +func (f *encFnInfo) fastpathEncMapUint16Int64R(rv reflect.Value) { + fastpathTV.EncMapUint16Int64V(rv.Interface().(map[uint16]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntIntV(v map[int]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Int64V(v map[uint16]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeInt(int64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntInt8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntInt8V(rv2i(rv).(map[int]int8), e) +func (f *encFnInfo) fastpathEncMapUint16Float32R(rv reflect.Value) { + fastpathTV.EncMapUint16Float32V(rv.Interface().(map[uint16]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntInt8V(v map[int]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Float32V(v map[uint16]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeInt(int64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[uint16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntInt16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntInt16V(rv2i(rv).(map[int]int16), e) +func (f *encFnInfo) fastpathEncMapUint16Float64R(rv reflect.Value) { + fastpathTV.EncMapUint16Float64V(rv.Interface().(map[uint16]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntInt16V(v map[int]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16Float64V(v map[uint16]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeInt(int64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[uint16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntInt32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntInt32V(rv2i(rv).(map[int]int32), e) +func (f *encFnInfo) fastpathEncMapUint16BoolR(rv reflect.Value) { + fastpathTV.EncMapUint16BoolV(rv.Interface().(map[uint16]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntInt32V(v map[int]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint16BoolV(v map[uint16]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeInt(int64(v[int(k2)])) + ee.EncodeUint(uint64(uint16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[uint16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntInt64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntInt64V(rv2i(rv).(map[int]int64), e) +func (f *encFnInfo) fastpathEncMapUint32IntfR(rv reflect.Value) { + fastpathTV.EncMapUint32IntfV(rv.Interface().(map[uint32]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntInt64V(v map[int]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32IntfV(v map[uint32]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeInt(int64(v[int(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntFloat32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntFloat32V(rv2i(rv).(map[int]float32), e) +func (f *encFnInfo) fastpathEncMapUint32StringR(rv reflect.Value) { + fastpathTV.EncMapUint32StringV(rv.Interface().(map[uint32]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntFloat32V(v map[int]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32StringV(v map[uint32]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[int(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeFloat32(v[int(k2)]) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[uint32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntFloat64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntFloat64V(rv2i(rv).(map[int]float64), e) +func (f *encFnInfo) fastpathEncMapUint32UintR(rv reflect.Value) { + fastpathTV.EncMapUint32UintV(rv.Interface().(map[uint32]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntFloat64V(v map[int]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32UintV(v map[uint32]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[int(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeFloat64(v[int(k2)]) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapIntBoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapIntBoolV(rv2i(rv).(map[int]bool), e) +func (f *encFnInfo) fastpathEncMapUint32Uint8R(rv reflect.Value) { + fastpathTV.EncMapUint32Uint8V(rv.Interface().(map[uint32]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapIntBoolV(v map[int]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Uint8V(v map[uint32]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[int(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int(k2))) - ee.EncodeBool(v[int(k2)]) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeBool(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8IntfV(rv2i(rv).(map[int8]interface{}), e) +func (f *encFnInfo) fastpathEncMapUint32Uint16R(rv reflect.Value) { + fastpathTV.EncMapUint32Uint16V(rv.Interface().(map[uint32]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8IntfV(v map[int8]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Uint16V(v map[uint32]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - e.encode(v[int8(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - e.encode(v[int8(k2)]) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8StringV(rv2i(rv).(map[int8]string), e) +func (f *encFnInfo) fastpathEncMapUint32Uint32R(rv reflect.Value) { + fastpathTV.EncMapUint32Uint32V(rv.Interface().(map[uint32]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8StringV(v map[int8]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Uint32V(v map[uint32]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[int8(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeString(cUTF8, v[int8(k2)]) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8UintV(rv2i(rv).(map[int8]uint), e) +func (f *encFnInfo) fastpathEncMapUint32Uint64R(rv reflect.Value) { + fastpathTV.EncMapUint32Uint64V(rv.Interface().(map[uint32]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8UintV(v map[int8]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Uint64V(v map[uint32]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeUint(uint64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Uint8V(rv2i(rv).(map[int8]uint8), e) +func (f *encFnInfo) fastpathEncMapUint32UintptrR(rv reflect.Value) { + fastpathTV.EncMapUint32UintptrV(rv.Interface().(map[uint32]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Uint8V(v map[int8]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32UintptrV(v map[uint32]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeUint(uint64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Uint16V(rv2i(rv).(map[int8]uint16), e) +func (f *encFnInfo) fastpathEncMapUint32IntR(rv reflect.Value) { + fastpathTV.EncMapUint32IntV(rv.Interface().(map[uint32]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Uint16V(v map[int8]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32IntV(v map[uint32]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeUint(uint64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Uint32V(rv2i(rv).(map[int8]uint32), e) +func (f *encFnInfo) fastpathEncMapUint32Int8R(rv reflect.Value) { + fastpathTV.EncMapUint32Int8V(rv.Interface().(map[uint32]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Uint32V(v map[int8]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Int8V(v map[uint32]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeUint(uint64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Uint64V(rv2i(rv).(map[int8]uint64), e) +func (f *encFnInfo) fastpathEncMapUint32Int16R(rv reflect.Value) { + fastpathTV.EncMapUint32Int16V(rv.Interface().(map[uint32]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Uint64V(v map[int8]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Int16V(v map[uint32]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeUint(uint64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8UintptrV(rv2i(rv).(map[int8]uintptr), e) +func (f *encFnInfo) fastpathEncMapUint32Int32R(rv reflect.Value) { + fastpathTV.EncMapUint32Int32V(rv.Interface().(map[uint32]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8UintptrV(v map[int8]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Int32V(v map[uint32]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - e.encode(v[int8(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - e.encode(v[int8(k2)]) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8IntV(rv2i(rv).(map[int8]int), e) +func (f *encFnInfo) fastpathEncMapUint32Int64R(rv reflect.Value) { + fastpathTV.EncMapUint32Int64V(rv.Interface().(map[uint32]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8IntV(v map[int8]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Int64V(v map[uint32]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeInt(int64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint32(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Int8V(rv2i(rv).(map[int8]int8), e) +func (f *encFnInfo) fastpathEncMapUint32Float32R(rv reflect.Value) { + fastpathTV.EncMapUint32Float32V(rv.Interface().(map[uint32]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Int8V(v map[int8]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Float32V(v map[uint32]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeInt(int64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[uint32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Int16V(rv2i(rv).(map[int8]int16), e) +func (f *encFnInfo) fastpathEncMapUint32Float64R(rv reflect.Value) { + fastpathTV.EncMapUint32Float64V(rv.Interface().(map[uint32]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Int16V(v map[int8]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32Float64V(v map[uint32]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeInt(int64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[uint32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Int32V(rv2i(rv).(map[int8]int32), e) +func (f *encFnInfo) fastpathEncMapUint32BoolR(rv reflect.Value) { + fastpathTV.EncMapUint32BoolV(rv.Interface().(map[uint32]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Int32V(v map[int8]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint32BoolV(v map[uint32]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeInt(int64(v[int8(k2)])) + ee.EncodeUint(uint64(uint32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[uint32(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Int64V(rv2i(rv).(map[int8]int64), e) +func (f *encFnInfo) fastpathEncMapUint64IntfR(rv reflect.Value) { + fastpathTV.EncMapUint64IntfV(rv.Interface().(map[uint64]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Int64V(v map[int8]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64IntfV(v map[uint64]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int8(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeInt(int64(v[int8(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Float32V(rv2i(rv).(map[int8]float32), e) +func (f *encFnInfo) fastpathEncMapUint64StringR(rv reflect.Value) { + fastpathTV.EncMapUint64StringV(rv.Interface().(map[uint64]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Float32V(v map[int8]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64StringV(v map[uint64]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[int8(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeFloat32(v[int8(k2)]) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[uint64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8Float64V(rv2i(rv).(map[int8]float64), e) +func (f *encFnInfo) fastpathEncMapUint64UintR(rv reflect.Value) { + fastpathTV.EncMapUint64UintV(rv.Interface().(map[uint64]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8Float64V(v map[int8]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64UintV(v map[uint64]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[int8(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeFloat64(v[int8(k2)]) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt8BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt8BoolV(rv2i(rv).(map[int8]bool), e) +func (f *encFnInfo) fastpathEncMapUint64Uint8R(rv reflect.Value) { + fastpathTV.EncMapUint64Uint8V(rv.Interface().(map[uint64]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt8BoolV(v map[int8]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Uint8V(v map[uint64]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int8(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[int8(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int8(k2))) - ee.EncodeBool(v[int8(k2)]) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeBool(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16IntfV(rv2i(rv).(map[int16]interface{}), e) +func (f *encFnInfo) fastpathEncMapUint64Uint16R(rv reflect.Value) { + fastpathTV.EncMapUint64Uint16V(rv.Interface().(map[uint64]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16IntfV(v map[int16]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Uint16V(v map[uint64]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - e.encode(v[int16(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - e.encode(v[int16(k2)]) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16StringV(rv2i(rv).(map[int16]string), e) +func (f *encFnInfo) fastpathEncMapUint64Uint32R(rv reflect.Value) { + fastpathTV.EncMapUint64Uint32V(rv.Interface().(map[uint64]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16StringV(v map[int16]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Uint32V(v map[uint64]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[int16(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeString(cUTF8, v[int16(k2)]) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16UintV(rv2i(rv).(map[int16]uint), e) +func (f *encFnInfo) fastpathEncMapUint64Uint64R(rv reflect.Value) { + fastpathTV.EncMapUint64Uint64V(rv.Interface().(map[uint64]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16UintV(v map[int16]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Uint64V(v map[uint64]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeUint(uint64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Uint8V(rv2i(rv).(map[int16]uint8), e) +func (f *encFnInfo) fastpathEncMapUint64UintptrR(rv reflect.Value) { + fastpathTV.EncMapUint64UintptrV(rv.Interface().(map[uint64]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Uint8V(v map[int16]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64UintptrV(v map[uint64]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeUint(uint64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uint64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Uint16V(rv2i(rv).(map[int16]uint16), e) +func (f *encFnInfo) fastpathEncMapUint64IntR(rv reflect.Value) { + fastpathTV.EncMapUint64IntV(rv.Interface().(map[uint64]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Uint16V(v map[int16]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64IntV(v map[uint64]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeUint(uint64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Uint32V(rv2i(rv).(map[int16]uint32), e) +func (f *encFnInfo) fastpathEncMapUint64Int8R(rv reflect.Value) { + fastpathTV.EncMapUint64Int8V(rv.Interface().(map[uint64]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Uint32V(v map[int16]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Int8V(v map[uint64]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeUint(uint64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Uint64V(rv2i(rv).(map[int16]uint64), e) +func (f *encFnInfo) fastpathEncMapUint64Int16R(rv reflect.Value) { + fastpathTV.EncMapUint64Int16V(rv.Interface().(map[uint64]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Uint64V(v map[int16]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Int16V(v map[uint64]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeUint(uint64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16UintptrV(rv2i(rv).(map[int16]uintptr), e) +func (f *encFnInfo) fastpathEncMapUint64Int32R(rv reflect.Value) { + fastpathTV.EncMapUint64Int32V(rv.Interface().(map[uint64]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16UintptrV(v map[int16]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Int32V(v map[uint64]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - e.encode(v[int16(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - e.encode(v[int16(k2)]) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16IntV(rv2i(rv).(map[int16]int), e) +func (f *encFnInfo) fastpathEncMapUint64Int64R(rv reflect.Value) { + fastpathTV.EncMapUint64Int64V(rv.Interface().(map[uint64]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16IntV(v map[int16]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Int64V(v map[uint64]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeInt(int64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uint64(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Int8V(rv2i(rv).(map[int16]int8), e) +func (f *encFnInfo) fastpathEncMapUint64Float32R(rv reflect.Value) { + fastpathTV.EncMapUint64Float32V(rv.Interface().(map[uint64]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Int8V(v map[int16]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Float32V(v map[uint64]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeInt(int64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[uint64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Int16V(rv2i(rv).(map[int16]int16), e) +func (f *encFnInfo) fastpathEncMapUint64Float64R(rv reflect.Value) { + fastpathTV.EncMapUint64Float64V(rv.Interface().(map[uint64]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Int16V(v map[int16]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64Float64V(v map[uint64]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeInt(int64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[uint64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Int32V(rv2i(rv).(map[int16]int32), e) +func (f *encFnInfo) fastpathEncMapUint64BoolR(rv reflect.Value) { + fastpathTV.EncMapUint64BoolV(rv.Interface().(map[uint64]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Int32V(v map[int16]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUint64BoolV(v map[uint64]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeInt(int64(v[int16(k2)])) + ee.EncodeUint(uint64(uint64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[uint64(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeUint(uint64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Int64V(rv2i(rv).(map[int16]int64), e) +func (f *encFnInfo) fastpathEncMapUintptrIntfR(rv reflect.Value) { + fastpathTV.EncMapUintptrIntfV(rv.Interface().(map[uintptr]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Int64V(v map[int16]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrIntfV(v map[uintptr]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int16(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeInt(int64(v[int16(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uintptr(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Float32V(rv2i(rv).(map[int16]float32), e) +func (f *encFnInfo) fastpathEncMapUintptrStringR(rv reflect.Value) { + fastpathTV.EncMapUintptrStringV(rv.Interface().(map[uintptr]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Float32V(v map[int16]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrStringV(v map[uintptr]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[int16(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeFloat32(v[int16(k2)]) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[uintptr(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat32(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16Float64V(rv2i(rv).(map[int16]float64), e) +func (f *encFnInfo) fastpathEncMapUintptrUintR(rv reflect.Value) { + fastpathTV.EncMapUintptrUintV(rv.Interface().(map[uintptr]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16Float64V(v map[int16]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrUintV(v map[uintptr]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[int16(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeFloat64(v[int16(k2)]) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat64(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt16BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt16BoolV(rv2i(rv).(map[int16]bool), e) +func (f *encFnInfo) fastpathEncMapUintptrUint8R(rv reflect.Value) { + fastpathTV.EncMapUintptrUint8V(rv.Interface().(map[uintptr]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt16BoolV(v map[int16]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrUint8V(v map[uintptr]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int16(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[int16(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int16(k2))) - ee.EncodeBool(v[int16(k2)]) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeBool(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32IntfV(rv2i(rv).(map[int32]interface{}), e) +func (f *encFnInfo) fastpathEncMapUintptrUint16R(rv reflect.Value) { + fastpathTV.EncMapUintptrUint16V(rv.Interface().(map[uintptr]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32IntfV(v map[int32]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrUint16V(v map[uintptr]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - e.encode(v[int32(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - e.encode(v[int32(k2)]) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32StringV(rv2i(rv).(map[int32]string), e) +func (f *encFnInfo) fastpathEncMapUintptrUint32R(rv reflect.Value) { + fastpathTV.EncMapUintptrUint32V(rv.Interface().(map[uintptr]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32StringV(v map[int32]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrUint32V(v map[uintptr]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[int32(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeString(cUTF8, v[int32(k2)]) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeString(cUTF8, v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32UintV(rv2i(rv).(map[int32]uint), e) +func (f *encFnInfo) fastpathEncMapUintptrUint64R(rv reflect.Value) { + fastpathTV.EncMapUintptrUint64V(rv.Interface().(map[uintptr]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32UintV(v map[int32]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrUint64V(v map[uintptr]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeUint(uint64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Uint8V(rv2i(rv).(map[int32]uint8), e) +func (f *encFnInfo) fastpathEncMapUintptrUintptrR(rv reflect.Value) { + fastpathTV.EncMapUintptrUintptrV(rv.Interface().(map[uintptr]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Uint8V(v map[int32]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrUintptrV(v map[uintptr]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeUint(uint64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[uintptr(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Uint16V(rv2i(rv).(map[int32]uint16), e) +func (f *encFnInfo) fastpathEncMapUintptrIntR(rv reflect.Value) { + fastpathTV.EncMapUintptrIntV(rv.Interface().(map[uintptr]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Uint16V(v map[int32]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrIntV(v map[uintptr]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeUint(uint64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Uint32V(rv2i(rv).(map[int32]uint32), e) +func (f *encFnInfo) fastpathEncMapUintptrInt8R(rv reflect.Value) { + fastpathTV.EncMapUintptrInt8V(rv.Interface().(map[uintptr]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Uint32V(v map[int32]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrInt8V(v map[uintptr]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeUint(uint64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Uint64V(rv2i(rv).(map[int32]uint64), e) +func (f *encFnInfo) fastpathEncMapUintptrInt16R(rv reflect.Value) { + fastpathTV.EncMapUintptrInt16V(rv.Interface().(map[uintptr]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Uint64V(v map[int32]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrInt16V(v map[uintptr]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeUint(uint64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32UintptrV(rv2i(rv).(map[int32]uintptr), e) +func (f *encFnInfo) fastpathEncMapUintptrInt32R(rv reflect.Value) { + fastpathTV.EncMapUintptrInt32V(rv.Interface().(map[uintptr]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32UintptrV(v map[int32]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrInt32V(v map[uintptr]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - e.encode(v[int32(k2)]) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - e.encode(v[int32(k2)]) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32IntV(rv2i(rv).(map[int32]int), e) +func (f *encFnInfo) fastpathEncMapUintptrInt64R(rv reflect.Value) { + fastpathTV.EncMapUintptrInt64V(rv.Interface().(map[uintptr]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32IntV(v map[int32]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrInt64V(v map[uintptr]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeInt(int64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[uintptr(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Int8V(rv2i(rv).(map[int32]int8), e) +func (f *encFnInfo) fastpathEncMapUintptrFloat32R(rv reflect.Value) { + fastpathTV.EncMapUintptrFloat32V(rv.Interface().(map[uintptr]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Int8V(v map[int32]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrFloat32V(v map[uintptr]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeInt(int64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[uintptr(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Int16V(rv2i(rv).(map[int32]int16), e) +func (f *encFnInfo) fastpathEncMapUintptrFloat64R(rv reflect.Value) { + fastpathTV.EncMapUintptrFloat64V(rv.Interface().(map[uintptr]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Int16V(v map[int32]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrFloat64V(v map[uintptr]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeInt(int64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[uintptr(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Int32V(rv2i(rv).(map[int32]int32), e) +func (f *encFnInfo) fastpathEncMapUintptrBoolR(rv reflect.Value) { + fastpathTV.EncMapUintptrBoolV(rv.Interface().(map[uintptr]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Int32V(v map[int32]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapUintptrBoolV(v map[uintptr]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]int64, len(v)) + v2 := make([]uint64, len(v)) var i int for k, _ := range v { - v2[i] = int64(k) + v2[i] = uint64(k) i++ } - sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int32(k2)])) + sort.Sort(uintSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeInt(int64(v[int32(k2)])) + e.encode(uintptr(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[uintptr(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + e.encode(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Int64V(rv2i(rv).(map[int32]int64), e) +func (f *encFnInfo) fastpathEncMapIntIntfR(rv reflect.Value) { + fastpathTV.EncMapIntIntfV(rv.Interface().(map[int]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Int64V(v map[int32]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntIntfV(v map[int]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13175,47 +11543,44 @@ func (_ fastpathT) EncMapInt32Int64V(v map[int32]int64, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int32(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeInt(int64(v[int32(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[int(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Float32V(rv2i(rv).(map[int32]float32), e) +func (f *encFnInfo) fastpathEncMapIntStringR(rv reflect.Value) { + fastpathTV.EncMapIntStringV(rv.Interface().(map[int]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Float32V(v map[int32]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntStringV(v map[int]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13224,47 +11589,44 @@ func (_ fastpathT) EncMapInt32Float32V(v map[int32]float32, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[int32(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeFloat32(v[int32(k2)]) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[int(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32Float64V(rv2i(rv).(map[int32]float64), e) +func (f *encFnInfo) fastpathEncMapIntUintR(rv reflect.Value) { + fastpathTV.EncMapIntUintV(rv.Interface().(map[int]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32Float64V(v map[int32]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntUintV(v map[int]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13273,47 +11635,44 @@ func (_ fastpathT) EncMapInt32Float64V(v map[int32]float64, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[int32(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeFloat64(v[int32(k2)]) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt32BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt32BoolV(rv2i(rv).(map[int32]bool), e) +func (f *encFnInfo) fastpathEncMapIntUint8R(rv reflect.Value) { + fastpathTV.EncMapIntUint8V(rv.Interface().(map[int]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt32BoolV(v map[int32]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntUint8V(v map[int]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13322,47 +11681,44 @@ func (_ fastpathT) EncMapInt32BoolV(v map[int32]bool, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int32(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[int32(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int32(k2))) - ee.EncodeBool(v[int32(k2)]) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeBool(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64IntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64IntfV(rv2i(rv).(map[int64]interface{}), e) +func (f *encFnInfo) fastpathEncMapIntUint16R(rv reflect.Value) { + fastpathTV.EncMapIntUint16V(rv.Interface().(map[int]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64IntfV(v map[int64]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntUint16V(v map[int]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13371,47 +11727,44 @@ func (_ fastpathT) EncMapInt64IntfV(v map[int64]interface{}, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - e.encode(v[int64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - e.encode(v[int64(k2)]) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64StringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64StringV(rv2i(rv).(map[int64]string), e) +func (f *encFnInfo) fastpathEncMapIntUint32R(rv reflect.Value) { + fastpathTV.EncMapIntUint32V(rv.Interface().(map[int]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64StringV(v map[int64]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntUint32V(v map[int]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13420,47 +11773,44 @@ func (_ fastpathT) EncMapInt64StringV(v map[int64]string, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[int64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeString(cUTF8, v[int64(k2)]) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeString(cUTF8, v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64UintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64UintV(rv2i(rv).(map[int64]uint), e) +func (f *encFnInfo) fastpathEncMapIntUint64R(rv reflect.Value) { + fastpathTV.EncMapIntUint64V(rv.Interface().(map[int]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64UintV(v map[int64]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntUint64V(v map[int]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13469,47 +11819,44 @@ func (_ fastpathT) EncMapInt64UintV(v map[int64]uint, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeUint(uint64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Uint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Uint8V(rv2i(rv).(map[int64]uint8), e) +func (f *encFnInfo) fastpathEncMapIntUintptrR(rv reflect.Value) { + fastpathTV.EncMapIntUintptrV(rv.Interface().(map[int]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Uint8V(v map[int64]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntUintptrV(v map[int]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13518,47 +11865,44 @@ func (_ fastpathT) EncMapInt64Uint8V(v map[int64]uint8, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeUint(uint64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[int(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Uint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Uint16V(rv2i(rv).(map[int64]uint16), e) +func (f *encFnInfo) fastpathEncMapIntIntR(rv reflect.Value) { + fastpathTV.EncMapIntIntV(rv.Interface().(map[int]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Uint16V(v map[int64]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntIntV(v map[int]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13567,47 +11911,44 @@ func (_ fastpathT) EncMapInt64Uint16V(v map[int64]uint16, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeUint(uint64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Uint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Uint32V(rv2i(rv).(map[int64]uint32), e) +func (f *encFnInfo) fastpathEncMapIntInt8R(rv reflect.Value) { + fastpathTV.EncMapIntInt8V(rv.Interface().(map[int]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Uint32V(v map[int64]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntInt8V(v map[int]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13616,47 +11957,44 @@ func (_ fastpathT) EncMapInt64Uint32V(v map[int64]uint32, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeUint(uint64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Uint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Uint64V(rv2i(rv).(map[int64]uint64), e) +func (f *encFnInfo) fastpathEncMapIntInt16R(rv reflect.Value) { + fastpathTV.EncMapIntInt16V(rv.Interface().(map[int]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Uint64V(v map[int64]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntInt16V(v map[int]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13665,47 +12003,44 @@ func (_ fastpathT) EncMapInt64Uint64V(v map[int64]uint64, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeUint(uint64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64UintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64UintptrV(rv2i(rv).(map[int64]uintptr), e) +func (f *encFnInfo) fastpathEncMapIntInt32R(rv reflect.Value) { + fastpathTV.EncMapIntInt32V(rv.Interface().(map[int]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64UintptrV(v map[int64]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntInt32V(v map[int]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13714,47 +12049,44 @@ func (_ fastpathT) EncMapInt64UintptrV(v map[int64]uintptr, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - e.encode(v[int64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - e.encode(v[int64(k2)]) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - e.encode(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64IntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64IntV(rv2i(rv).(map[int64]int), e) +func (f *encFnInfo) fastpathEncMapIntInt64R(rv reflect.Value) { + fastpathTV.EncMapIntInt64V(rv.Interface().(map[int]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64IntV(v map[int64]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntInt64V(v map[int]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13763,47 +12095,44 @@ func (_ fastpathT) EncMapInt64IntV(v map[int64]int, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeInt(int64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Int8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Int8V(rv2i(rv).(map[int64]int8), e) +func (f *encFnInfo) fastpathEncMapIntFloat32R(rv reflect.Value) { + fastpathTV.EncMapIntFloat32V(rv.Interface().(map[int]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Int8V(v map[int64]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntFloat32V(v map[int]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13812,47 +12141,44 @@ func (_ fastpathT) EncMapInt64Int8V(v map[int64]int8, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeInt(int64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[int(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Int16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Int16V(rv2i(rv).(map[int64]int16), e) +func (f *encFnInfo) fastpathEncMapIntFloat64R(rv reflect.Value) { + fastpathTV.EncMapIntFloat64V(rv.Interface().(map[int]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Int16V(v map[int64]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntFloat64V(v map[int]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13861,47 +12187,44 @@ func (_ fastpathT) EncMapInt64Int16V(v map[int64]int16, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeInt(int64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[int(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Int32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Int32V(rv2i(rv).(map[int64]int32), e) +func (f *encFnInfo) fastpathEncMapIntBoolR(rv reflect.Value) { + fastpathTV.EncMapIntBoolV(rv.Interface().(map[int]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Int32V(v map[int64]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapIntBoolV(v map[int]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13910,47 +12233,44 @@ func (_ fastpathT) EncMapInt64Int32V(v map[int64]int32, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeInt(int64(v[int64(k2)])) + ee.EncodeInt(int64(int(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[int(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Int64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Int64V(rv2i(rv).(map[int64]int64), e) +func (f *encFnInfo) fastpathEncMapInt8IntfR(rv reflect.Value) { + fastpathTV.EncMapInt8IntfV(rv.Interface().(map[int8]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Int64V(v map[int64]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8IntfV(v map[int8]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -13959,47 +12279,44 @@ func (_ fastpathT) EncMapInt64Int64V(v map[int64]int64, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[int64(k2)])) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeInt(int64(v[int64(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[int8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Float32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Float32V(rv2i(rv).(map[int64]float32), e) +func (f *encFnInfo) fastpathEncMapInt8StringR(rv reflect.Value) { + fastpathTV.EncMapInt8StringV(rv.Interface().(map[int8]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Float32V(v map[int64]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8StringV(v map[int8]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -14008,47 +12325,44 @@ func (_ fastpathT) EncMapInt64Float32V(v map[int64]float32, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[int64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeFloat32(v[int64(k2)]) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[int8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat32(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64Float64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64Float64V(rv2i(rv).(map[int64]float64), e) +func (f *encFnInfo) fastpathEncMapInt8UintR(rv reflect.Value) { + fastpathTV.EncMapInt8UintV(rv.Interface().(map[int8]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64Float64V(v map[int64]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8UintV(v map[int8]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -14057,47 +12371,44 @@ func (_ fastpathT) EncMapInt64Float64V(v map[int64]float64, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[int64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeFloat64(v[int64(k2)]) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeFloat64(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapInt64BoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapInt64BoolV(rv2i(rv).(map[int64]bool), e) +func (f *encFnInfo) fastpathEncMapInt8Uint8R(rv reflect.Value) { + fastpathTV.EncMapInt8Uint8V(rv.Interface().(map[int8]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapInt64BoolV(v map[int64]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Uint8V(v map[int8]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { v2 := make([]int64, len(v)) var i int @@ -14106,3614 +12417,5705 @@ func (_ fastpathT) EncMapInt64BoolV(v map[int64]bool, e *Encoder) { i++ } sort.Sort(intSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeInt(int64(int64(k2))) - ee.WriteMapElemValue() - ee.EncodeBool(v[int64(k2)]) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeInt(int64(int64(k2))) - ee.EncodeBool(v[int64(k2)]) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeInt(int64(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeInt(int64(k2)) - ee.EncodeBool(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolIntfR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolIntfV(rv2i(rv).(map[bool]interface{}), e) +func (f *encFnInfo) fastpathEncMapInt8Uint16R(rv reflect.Value) { + fastpathTV.EncMapInt8Uint16V(rv.Interface().(map[int8]uint16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolIntfV(v map[bool]interface{}, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Uint16V(v map[int8]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - e.encode(v[bool(k2)]) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - e.encode(v[bool(k2)]) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - e.encode(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolStringR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolStringV(rv2i(rv).(map[bool]string), e) +func (f *encFnInfo) fastpathEncMapInt8Uint32R(rv reflect.Value) { + fastpathTV.EncMapInt8Uint32V(rv.Interface().(map[int8]uint32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolStringV(v map[bool]string, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Uint32V(v map[int8]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v[bool(k2)]) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeString(cUTF8, v[bool(k2)]) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeString(cUTF8, v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeString(cUTF8, v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolUintR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolUintV(rv2i(rv).(map[bool]uint), e) +func (f *encFnInfo) fastpathEncMapInt8Uint64R(rv reflect.Value) { + fastpathTV.EncMapInt8Uint64V(rv.Interface().(map[int8]uint64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolUintV(v map[bool]uint, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Uint64V(v map[int8]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeUint(uint64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolUint8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolUint8V(rv2i(rv).(map[bool]uint8), e) +func (f *encFnInfo) fastpathEncMapInt8UintptrR(rv reflect.Value) { + fastpathTV.EncMapInt8UintptrV(rv.Interface().(map[int8]uintptr), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolUint8V(v map[bool]uint8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8UintptrV(v map[int8]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeUint(uint64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[int8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolUint16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolUint16V(rv2i(rv).(map[bool]uint16), e) +func (f *encFnInfo) fastpathEncMapInt8IntR(rv reflect.Value) { + fastpathTV.EncMapInt8IntV(rv.Interface().(map[int8]int), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolUint16V(v map[bool]uint16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8IntV(v map[int8]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeUint(uint64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolUint32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolUint32V(rv2i(rv).(map[bool]uint32), e) +func (f *encFnInfo) fastpathEncMapInt8Int8R(rv reflect.Value) { + fastpathTV.EncMapInt8Int8V(rv.Interface().(map[int8]int8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolUint32V(v map[bool]uint32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Int8V(v map[int8]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeUint(uint64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolUint64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolUint64V(rv2i(rv).(map[bool]uint64), e) +func (f *encFnInfo) fastpathEncMapInt8Int16R(rv reflect.Value) { + fastpathTV.EncMapInt8Int16V(rv.Interface().(map[int8]int16), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolUint64V(v map[bool]uint64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Int16V(v map[int8]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeUint(uint64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeUint(uint64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeUint(uint64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolUintptrR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolUintptrV(rv2i(rv).(map[bool]uintptr), e) +func (f *encFnInfo) fastpathEncMapInt8Int32R(rv reflect.Value) { + fastpathTV.EncMapInt8Int32V(rv.Interface().(map[int8]int32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolUintptrV(v map[bool]uintptr, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Int32V(v map[int8]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - e.encode(v[bool(k2)]) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - e.encode(v[bool(k2)]) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - e.encode(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - e.encode(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolIntR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolIntV(rv2i(rv).(map[bool]int), e) +func (f *encFnInfo) fastpathEncMapInt8Int64R(rv reflect.Value) { + fastpathTV.EncMapInt8Int64V(rv.Interface().(map[int8]int64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolIntV(v map[bool]int, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Int64V(v map[int8]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeInt(int64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v[int8(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeInt(int64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolInt8R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolInt8V(rv2i(rv).(map[bool]int8), e) +func (f *encFnInfo) fastpathEncMapInt8Float32R(rv reflect.Value) { + fastpathTV.EncMapInt8Float32V(rv.Interface().(map[int8]float32), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolInt8V(v map[bool]int8, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Float32V(v map[int8]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeInt(int64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v[int8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat32(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolInt16R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolInt16V(rv2i(rv).(map[bool]int16), e) +func (f *encFnInfo) fastpathEncMapInt8Float64R(rv reflect.Value) { + fastpathTV.EncMapInt8Float64V(rv.Interface().(map[int8]float64), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolInt16V(v map[bool]int16, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8Float64V(v map[int8]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeInt(int64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v[int8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeFloat64(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolInt32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolInt32V(rv2i(rv).(map[bool]int32), e) +func (f *encFnInfo) fastpathEncMapInt8BoolR(rv reflect.Value) { + fastpathTV.EncMapInt8BoolV(rv.Interface().(map[int8]bool), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolInt32V(v map[bool]int32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt8BoolV(v map[int8]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeInt(int64(v[bool(k2)])) + ee.EncodeInt(int64(int8(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v[int8(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeBool(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolInt64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolInt64V(rv2i(rv).(map[bool]int64), e) +func (f *encFnInfo) fastpathEncMapInt16IntfR(rv reflect.Value) { + fastpathTV.EncMapInt16IntfV(rv.Interface().(map[int16]interface{}), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolInt64V(v map[bool]int64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt16IntfV(v map[int16]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v[bool(k2)])) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeInt(int64(v[bool(k2)])) + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v[int16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeInt(int64(v2)) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeInt(int64(v2)) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + e.encode(v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolFloat32R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolFloat32V(rv2i(rv).(map[bool]float32), e) +func (f *encFnInfo) fastpathEncMapInt16StringR(rv reflect.Value) { + fastpathTV.EncMapInt16StringV(rv.Interface().(map[int16]string), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolFloat32V(v map[bool]float32, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt16StringV(v map[int16]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat32(v[bool(k2)]) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeFloat32(v[bool(k2)]) + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v[int16(k2)]) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeFloat32(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeFloat32(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeString(c_UTF8, v2) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolFloat64R(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolFloat64V(rv2i(rv).(map[bool]float64), e) +func (f *encFnInfo) fastpathEncMapInt16UintR(rv reflect.Value) { + fastpathTV.EncMapInt16UintV(rv.Interface().(map[int16]uint), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolFloat64V(v map[bool]float64, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt16UintV(v map[int16]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeFloat64(v[bool(k2)]) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeFloat64(v[bool(k2)]) + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeFloat64(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeFloat64(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -func (e *Encoder) fastpathEncMapBoolBoolR(f *codecFnInfo, rv reflect.Value) { - fastpathTV.EncMapBoolBoolV(rv2i(rv).(map[bool]bool), e) +func (f *encFnInfo) fastpathEncMapInt16Uint8R(rv reflect.Value) { + fastpathTV.EncMapInt16Uint8V(rv.Interface().(map[int16]uint8), fastpathCheckNilFalse, f.e) } -func (_ fastpathT) EncMapBoolBoolV(v map[bool]bool, e *Encoder) { - if v == nil { - e.e.EncodeNil() +func (_ fastpathT) EncMapInt16Uint8V(v map[int16]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() return } - ee, esep := e.e, e.hh.hasElemSeparators() - ee.WriteMapStart(len(v)) + ee.EncodeMapStart(len(v)) if e.h.Canonical { - v2 := make([]bool, len(v)) + v2 := make([]int64, len(v)) var i int for k, _ := range v { - v2[i] = bool(k) + v2[i] = int64(k) i++ } - sort.Sort(boolSlice(v2)) - if esep { - for _, k2 := range v2 { - ee.WriteMapElemKey() - ee.EncodeBool(bool(k2)) - ee.WriteMapElemValue() - ee.EncodeBool(v[bool(k2)]) + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for _, k2 := range v2 { - ee.EncodeBool(bool(k2)) - ee.EncodeBool(v[bool(k2)]) + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v[int16(k2)])) } } else { - if esep { - for k2, v2 := range v { - ee.WriteMapElemKey() - ee.EncodeBool(k2) - ee.WriteMapElemValue() - ee.EncodeBool(v2) + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) } - } else { - for k2, v2 := range v { - ee.EncodeBool(k2) - ee.EncodeBool(v2) + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) } + ee.EncodeUint(uint64(v2)) } } - ee.WriteMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } } -// -- decode - -// -- -- fast path type switch -func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { - var changed bool - switch v := iv.(type) { - - case []interface{}: - var v2 []interface{} - v2, changed = fastpathTV.DecSliceIntfV(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]interface{}: - var v2 []interface{} - v2, changed = fastpathTV.DecSliceIntfV(*v, true, d) - if changed { - *v = v2 - } - case []string: - var v2 []string - v2, changed = fastpathTV.DecSliceStringV(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]string: - var v2 []string - v2, changed = fastpathTV.DecSliceStringV(*v, true, d) - if changed { - *v = v2 - } - case []float32: - var v2 []float32 - v2, changed = fastpathTV.DecSliceFloat32V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]float32: - var v2 []float32 - v2, changed = fastpathTV.DecSliceFloat32V(*v, true, d) - if changed { - *v = v2 - } - case []float64: - var v2 []float64 - v2, changed = fastpathTV.DecSliceFloat64V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]float64: - var v2 []float64 - v2, changed = fastpathTV.DecSliceFloat64V(*v, true, d) - if changed { - *v = v2 - } - case []uint: - var v2 []uint - v2, changed = fastpathTV.DecSliceUintV(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]uint: - var v2 []uint - v2, changed = fastpathTV.DecSliceUintV(*v, true, d) - if changed { - *v = v2 - } - case []uint16: - var v2 []uint16 - v2, changed = fastpathTV.DecSliceUint16V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]uint16: - var v2 []uint16 - v2, changed = fastpathTV.DecSliceUint16V(*v, true, d) - if changed { - *v = v2 - } - case []uint32: - var v2 []uint32 - v2, changed = fastpathTV.DecSliceUint32V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]uint32: - var v2 []uint32 - v2, changed = fastpathTV.DecSliceUint32V(*v, true, d) - if changed { - *v = v2 - } - case []uint64: - var v2 []uint64 - v2, changed = fastpathTV.DecSliceUint64V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]uint64: - var v2 []uint64 - v2, changed = fastpathTV.DecSliceUint64V(*v, true, d) - if changed { - *v = v2 - } - case []uintptr: - var v2 []uintptr - v2, changed = fastpathTV.DecSliceUintptrV(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]uintptr: - var v2 []uintptr - v2, changed = fastpathTV.DecSliceUintptrV(*v, true, d) - if changed { - *v = v2 - } - case []int: - var v2 []int - v2, changed = fastpathTV.DecSliceIntV(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]int: - var v2 []int - v2, changed = fastpathTV.DecSliceIntV(*v, true, d) - if changed { - *v = v2 - } - case []int8: - var v2 []int8 - v2, changed = fastpathTV.DecSliceInt8V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]int8: - var v2 []int8 - v2, changed = fastpathTV.DecSliceInt8V(*v, true, d) - if changed { - *v = v2 - } - case []int16: - var v2 []int16 - v2, changed = fastpathTV.DecSliceInt16V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]int16: - var v2 []int16 - v2, changed = fastpathTV.DecSliceInt16V(*v, true, d) - if changed { - *v = v2 - } - case []int32: - var v2 []int32 - v2, changed = fastpathTV.DecSliceInt32V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]int32: - var v2 []int32 - v2, changed = fastpathTV.DecSliceInt32V(*v, true, d) - if changed { - *v = v2 - } - case []int64: - var v2 []int64 - v2, changed = fastpathTV.DecSliceInt64V(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]int64: - var v2 []int64 - v2, changed = fastpathTV.DecSliceInt64V(*v, true, d) - if changed { - *v = v2 - } - case []bool: - var v2 []bool - v2, changed = fastpathTV.DecSliceBoolV(v, false, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - case *[]bool: - var v2 []bool - v2, changed = fastpathTV.DecSliceBoolV(*v, true, d) - if changed { - *v = v2 - } - - case map[interface{}]interface{}: - fastpathTV.DecMapIntfIntfV(v, false, d) - case *map[interface{}]interface{}: - var v2 map[interface{}]interface{} - v2, changed = fastpathTV.DecMapIntfIntfV(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]string: - fastpathTV.DecMapIntfStringV(v, false, d) - case *map[interface{}]string: - var v2 map[interface{}]string - v2, changed = fastpathTV.DecMapIntfStringV(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]uint: - fastpathTV.DecMapIntfUintV(v, false, d) - case *map[interface{}]uint: - var v2 map[interface{}]uint - v2, changed = fastpathTV.DecMapIntfUintV(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]uint8: - fastpathTV.DecMapIntfUint8V(v, false, d) - case *map[interface{}]uint8: - var v2 map[interface{}]uint8 - v2, changed = fastpathTV.DecMapIntfUint8V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]uint16: - fastpathTV.DecMapIntfUint16V(v, false, d) - case *map[interface{}]uint16: - var v2 map[interface{}]uint16 - v2, changed = fastpathTV.DecMapIntfUint16V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]uint32: - fastpathTV.DecMapIntfUint32V(v, false, d) - case *map[interface{}]uint32: - var v2 map[interface{}]uint32 - v2, changed = fastpathTV.DecMapIntfUint32V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]uint64: - fastpathTV.DecMapIntfUint64V(v, false, d) - case *map[interface{}]uint64: - var v2 map[interface{}]uint64 - v2, changed = fastpathTV.DecMapIntfUint64V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]uintptr: - fastpathTV.DecMapIntfUintptrV(v, false, d) - case *map[interface{}]uintptr: - var v2 map[interface{}]uintptr - v2, changed = fastpathTV.DecMapIntfUintptrV(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]int: - fastpathTV.DecMapIntfIntV(v, false, d) - case *map[interface{}]int: - var v2 map[interface{}]int - v2, changed = fastpathTV.DecMapIntfIntV(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]int8: - fastpathTV.DecMapIntfInt8V(v, false, d) - case *map[interface{}]int8: - var v2 map[interface{}]int8 - v2, changed = fastpathTV.DecMapIntfInt8V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]int16: - fastpathTV.DecMapIntfInt16V(v, false, d) - case *map[interface{}]int16: - var v2 map[interface{}]int16 - v2, changed = fastpathTV.DecMapIntfInt16V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]int32: - fastpathTV.DecMapIntfInt32V(v, false, d) - case *map[interface{}]int32: - var v2 map[interface{}]int32 - v2, changed = fastpathTV.DecMapIntfInt32V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]int64: - fastpathTV.DecMapIntfInt64V(v, false, d) - case *map[interface{}]int64: - var v2 map[interface{}]int64 - v2, changed = fastpathTV.DecMapIntfInt64V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]float32: - fastpathTV.DecMapIntfFloat32V(v, false, d) - case *map[interface{}]float32: - var v2 map[interface{}]float32 - v2, changed = fastpathTV.DecMapIntfFloat32V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]float64: - fastpathTV.DecMapIntfFloat64V(v, false, d) - case *map[interface{}]float64: - var v2 map[interface{}]float64 - v2, changed = fastpathTV.DecMapIntfFloat64V(*v, true, d) - if changed { - *v = v2 - } - case map[interface{}]bool: - fastpathTV.DecMapIntfBoolV(v, false, d) - case *map[interface{}]bool: - var v2 map[interface{}]bool - v2, changed = fastpathTV.DecMapIntfBoolV(*v, true, d) - if changed { - *v = v2 - } - case map[string]interface{}: - fastpathTV.DecMapStringIntfV(v, false, d) - case *map[string]interface{}: - var v2 map[string]interface{} - v2, changed = fastpathTV.DecMapStringIntfV(*v, true, d) - if changed { - *v = v2 - } - case map[string]string: - fastpathTV.DecMapStringStringV(v, false, d) - case *map[string]string: - var v2 map[string]string - v2, changed = fastpathTV.DecMapStringStringV(*v, true, d) - if changed { - *v = v2 - } - case map[string]uint: - fastpathTV.DecMapStringUintV(v, false, d) - case *map[string]uint: - var v2 map[string]uint - v2, changed = fastpathTV.DecMapStringUintV(*v, true, d) - if changed { - *v = v2 - } - case map[string]uint8: - fastpathTV.DecMapStringUint8V(v, false, d) - case *map[string]uint8: - var v2 map[string]uint8 - v2, changed = fastpathTV.DecMapStringUint8V(*v, true, d) - if changed { - *v = v2 - } - case map[string]uint16: - fastpathTV.DecMapStringUint16V(v, false, d) - case *map[string]uint16: - var v2 map[string]uint16 - v2, changed = fastpathTV.DecMapStringUint16V(*v, true, d) - if changed { - *v = v2 - } - case map[string]uint32: - fastpathTV.DecMapStringUint32V(v, false, d) - case *map[string]uint32: - var v2 map[string]uint32 - v2, changed = fastpathTV.DecMapStringUint32V(*v, true, d) - if changed { - *v = v2 - } - case map[string]uint64: - fastpathTV.DecMapStringUint64V(v, false, d) - case *map[string]uint64: - var v2 map[string]uint64 - v2, changed = fastpathTV.DecMapStringUint64V(*v, true, d) - if changed { - *v = v2 - } - case map[string]uintptr: - fastpathTV.DecMapStringUintptrV(v, false, d) - case *map[string]uintptr: - var v2 map[string]uintptr - v2, changed = fastpathTV.DecMapStringUintptrV(*v, true, d) - if changed { - *v = v2 - } - case map[string]int: - fastpathTV.DecMapStringIntV(v, false, d) - case *map[string]int: - var v2 map[string]int - v2, changed = fastpathTV.DecMapStringIntV(*v, true, d) - if changed { - *v = v2 - } - case map[string]int8: - fastpathTV.DecMapStringInt8V(v, false, d) - case *map[string]int8: - var v2 map[string]int8 - v2, changed = fastpathTV.DecMapStringInt8V(*v, true, d) - if changed { - *v = v2 - } - case map[string]int16: - fastpathTV.DecMapStringInt16V(v, false, d) - case *map[string]int16: - var v2 map[string]int16 - v2, changed = fastpathTV.DecMapStringInt16V(*v, true, d) - if changed { - *v = v2 +func (f *encFnInfo) fastpathEncMapInt16Uint16R(rv reflect.Value) { + fastpathTV.EncMapInt16Uint16V(rv.Interface().(map[int16]uint16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Uint16V(v map[int16]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[string]int32: - fastpathTV.DecMapStringInt32V(v, false, d) - case *map[string]int32: - var v2 map[string]int32 - v2, changed = fastpathTV.DecMapStringInt32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int16(k2)])) } - case map[string]int64: - fastpathTV.DecMapStringInt64V(v, false, d) - case *map[string]int64: - var v2 map[string]int64 - v2, changed = fastpathTV.DecMapStringInt64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[string]float32: - fastpathTV.DecMapStringFloat32V(v, false, d) - case *map[string]float32: - var v2 map[string]float32 - v2, changed = fastpathTV.DecMapStringFloat32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Uint32R(rv reflect.Value) { + fastpathTV.EncMapInt16Uint32V(rv.Interface().(map[int16]uint32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Uint32V(v map[int16]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[string]float64: - fastpathTV.DecMapStringFloat64V(v, false, d) - case *map[string]float64: - var v2 map[string]float64 - v2, changed = fastpathTV.DecMapStringFloat64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int16(k2)])) } - case map[string]bool: - fastpathTV.DecMapStringBoolV(v, false, d) - case *map[string]bool: - var v2 map[string]bool - v2, changed = fastpathTV.DecMapStringBoolV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[float32]interface{}: - fastpathTV.DecMapFloat32IntfV(v, false, d) - case *map[float32]interface{}: - var v2 map[float32]interface{} - v2, changed = fastpathTV.DecMapFloat32IntfV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Uint64R(rv reflect.Value) { + fastpathTV.EncMapInt16Uint64V(rv.Interface().(map[int16]uint64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Uint64V(v map[int16]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float32]string: - fastpathTV.DecMapFloat32StringV(v, false, d) - case *map[float32]string: - var v2 map[float32]string - v2, changed = fastpathTV.DecMapFloat32StringV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int16(k2)])) } - case map[float32]uint: - fastpathTV.DecMapFloat32UintV(v, false, d) - case *map[float32]uint: - var v2 map[float32]uint - v2, changed = fastpathTV.DecMapFloat32UintV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[float32]uint8: - fastpathTV.DecMapFloat32Uint8V(v, false, d) - case *map[float32]uint8: - var v2 map[float32]uint8 - v2, changed = fastpathTV.DecMapFloat32Uint8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16UintptrR(rv reflect.Value) { + fastpathTV.EncMapInt16UintptrV(rv.Interface().(map[int16]uintptr), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16UintptrV(v map[int16]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float32]uint16: - fastpathTV.DecMapFloat32Uint16V(v, false, d) - case *map[float32]uint16: - var v2 map[float32]uint16 - v2, changed = fastpathTV.DecMapFloat32Uint16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[int16(k2)]) } - case map[float32]uint32: - fastpathTV.DecMapFloat32Uint32V(v, false, d) - case *map[float32]uint32: - var v2 map[float32]uint32 - v2, changed = fastpathTV.DecMapFloat32Uint32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[float32]uint64: - fastpathTV.DecMapFloat32Uint64V(v, false, d) - case *map[float32]uint64: - var v2 map[float32]uint64 - v2, changed = fastpathTV.DecMapFloat32Uint64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16IntR(rv reflect.Value) { + fastpathTV.EncMapInt16IntV(rv.Interface().(map[int16]int), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16IntV(v map[int16]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float32]uintptr: - fastpathTV.DecMapFloat32UintptrV(v, false, d) - case *map[float32]uintptr: - var v2 map[float32]uintptr - v2, changed = fastpathTV.DecMapFloat32UintptrV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int16(k2)])) } - case map[float32]int: - fastpathTV.DecMapFloat32IntV(v, false, d) - case *map[float32]int: - var v2 map[float32]int - v2, changed = fastpathTV.DecMapFloat32IntV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[float32]int8: - fastpathTV.DecMapFloat32Int8V(v, false, d) - case *map[float32]int8: - var v2 map[float32]int8 - v2, changed = fastpathTV.DecMapFloat32Int8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Int8R(rv reflect.Value) { + fastpathTV.EncMapInt16Int8V(rv.Interface().(map[int16]int8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Int8V(v map[int16]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float32]int16: - fastpathTV.DecMapFloat32Int16V(v, false, d) - case *map[float32]int16: - var v2 map[float32]int16 - v2, changed = fastpathTV.DecMapFloat32Int16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int16(k2)])) } - case map[float32]int32: - fastpathTV.DecMapFloat32Int32V(v, false, d) - case *map[float32]int32: - var v2 map[float32]int32 - v2, changed = fastpathTV.DecMapFloat32Int32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[float32]int64: - fastpathTV.DecMapFloat32Int64V(v, false, d) - case *map[float32]int64: - var v2 map[float32]int64 - v2, changed = fastpathTV.DecMapFloat32Int64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Int16R(rv reflect.Value) { + fastpathTV.EncMapInt16Int16V(rv.Interface().(map[int16]int16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Int16V(v map[int16]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float32]float32: - fastpathTV.DecMapFloat32Float32V(v, false, d) - case *map[float32]float32: - var v2 map[float32]float32 - v2, changed = fastpathTV.DecMapFloat32Float32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int16(k2)])) } - case map[float32]float64: - fastpathTV.DecMapFloat32Float64V(v, false, d) - case *map[float32]float64: - var v2 map[float32]float64 - v2, changed = fastpathTV.DecMapFloat32Float64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[float32]bool: - fastpathTV.DecMapFloat32BoolV(v, false, d) - case *map[float32]bool: - var v2 map[float32]bool - v2, changed = fastpathTV.DecMapFloat32BoolV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Int32R(rv reflect.Value) { + fastpathTV.EncMapInt16Int32V(rv.Interface().(map[int16]int32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Int32V(v map[int16]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float64]interface{}: - fastpathTV.DecMapFloat64IntfV(v, false, d) - case *map[float64]interface{}: - var v2 map[float64]interface{} - v2, changed = fastpathTV.DecMapFloat64IntfV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int16(k2)])) } - case map[float64]string: - fastpathTV.DecMapFloat64StringV(v, false, d) - case *map[float64]string: - var v2 map[float64]string - v2, changed = fastpathTV.DecMapFloat64StringV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[float64]uint: - fastpathTV.DecMapFloat64UintV(v, false, d) - case *map[float64]uint: - var v2 map[float64]uint - v2, changed = fastpathTV.DecMapFloat64UintV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Int64R(rv reflect.Value) { + fastpathTV.EncMapInt16Int64V(rv.Interface().(map[int16]int64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Int64V(v map[int16]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float64]uint8: - fastpathTV.DecMapFloat64Uint8V(v, false, d) - case *map[float64]uint8: - var v2 map[float64]uint8 - v2, changed = fastpathTV.DecMapFloat64Uint8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int16(k2)])) } - case map[float64]uint16: - fastpathTV.DecMapFloat64Uint16V(v, false, d) - case *map[float64]uint16: - var v2 map[float64]uint16 - v2, changed = fastpathTV.DecMapFloat64Uint16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[float64]uint32: - fastpathTV.DecMapFloat64Uint32V(v, false, d) - case *map[float64]uint32: - var v2 map[float64]uint32 - v2, changed = fastpathTV.DecMapFloat64Uint32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Float32R(rv reflect.Value) { + fastpathTV.EncMapInt16Float32V(rv.Interface().(map[int16]float32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Float32V(v map[int16]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float64]uint64: - fastpathTV.DecMapFloat64Uint64V(v, false, d) - case *map[float64]uint64: - var v2 map[float64]uint64 - v2, changed = fastpathTV.DecMapFloat64Uint64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v[int16(k2)]) } - case map[float64]uintptr: - fastpathTV.DecMapFloat64UintptrV(v, false, d) - case *map[float64]uintptr: - var v2 map[float64]uintptr - v2, changed = fastpathTV.DecMapFloat64UintptrV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v2) } - case map[float64]int: - fastpathTV.DecMapFloat64IntV(v, false, d) - case *map[float64]int: - var v2 map[float64]int - v2, changed = fastpathTV.DecMapFloat64IntV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16Float64R(rv reflect.Value) { + fastpathTV.EncMapInt16Float64V(rv.Interface().(map[int16]float64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16Float64V(v map[int16]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float64]int8: - fastpathTV.DecMapFloat64Int8V(v, false, d) - case *map[float64]int8: - var v2 map[float64]int8 - v2, changed = fastpathTV.DecMapFloat64Int8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v[int16(k2)]) } - case map[float64]int16: - fastpathTV.DecMapFloat64Int16V(v, false, d) - case *map[float64]int16: - var v2 map[float64]int16 - v2, changed = fastpathTV.DecMapFloat64Int16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v2) } - case map[float64]int32: - fastpathTV.DecMapFloat64Int32V(v, false, d) - case *map[float64]int32: - var v2 map[float64]int32 - v2, changed = fastpathTV.DecMapFloat64Int32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt16BoolR(rv reflect.Value) { + fastpathTV.EncMapInt16BoolV(rv.Interface().(map[int16]bool), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt16BoolV(v map[int16]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float64]int64: - fastpathTV.DecMapFloat64Int64V(v, false, d) - case *map[float64]int64: - var v2 map[float64]int64 - v2, changed = fastpathTV.DecMapFloat64Int64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int16(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v[int16(k2)]) } - case map[float64]float32: - fastpathTV.DecMapFloat64Float32V(v, false, d) - case *map[float64]float32: - var v2 map[float64]float32 - v2, changed = fastpathTV.DecMapFloat64Float32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v2) } - case map[float64]float64: - fastpathTV.DecMapFloat64Float64V(v, false, d) - case *map[float64]float64: - var v2 map[float64]float64 - v2, changed = fastpathTV.DecMapFloat64Float64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32IntfR(rv reflect.Value) { + fastpathTV.EncMapInt32IntfV(rv.Interface().(map[int32]interface{}), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32IntfV(v map[int32]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[float64]bool: - fastpathTV.DecMapFloat64BoolV(v, false, d) - case *map[float64]bool: - var v2 map[float64]bool - v2, changed = fastpathTV.DecMapFloat64BoolV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[int32(k2)]) } - case map[uint]interface{}: - fastpathTV.DecMapUintIntfV(v, false, d) - case *map[uint]interface{}: - var v2 map[uint]interface{} - v2, changed = fastpathTV.DecMapUintIntfV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[uint]string: - fastpathTV.DecMapUintStringV(v, false, d) - case *map[uint]string: - var v2 map[uint]string - v2, changed = fastpathTV.DecMapUintStringV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32StringR(rv reflect.Value) { + fastpathTV.EncMapInt32StringV(rv.Interface().(map[int32]string), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32StringV(v map[int32]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint]uint: - fastpathTV.DecMapUintUintV(v, false, d) - case *map[uint]uint: - var v2 map[uint]uint - v2, changed = fastpathTV.DecMapUintUintV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v[int32(k2)]) } - case map[uint]uint8: - fastpathTV.DecMapUintUint8V(v, false, d) - case *map[uint]uint8: - var v2 map[uint]uint8 - v2, changed = fastpathTV.DecMapUintUint8V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v2) } - case map[uint]uint16: - fastpathTV.DecMapUintUint16V(v, false, d) - case *map[uint]uint16: - var v2 map[uint]uint16 - v2, changed = fastpathTV.DecMapUintUint16V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32UintR(rv reflect.Value) { + fastpathTV.EncMapInt32UintV(rv.Interface().(map[int32]uint), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32UintV(v map[int32]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint]uint32: - fastpathTV.DecMapUintUint32V(v, false, d) - case *map[uint]uint32: - var v2 map[uint]uint32 - v2, changed = fastpathTV.DecMapUintUint32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int32(k2)])) } - case map[uint]uint64: - fastpathTV.DecMapUintUint64V(v, false, d) - case *map[uint]uint64: - var v2 map[uint]uint64 - v2, changed = fastpathTV.DecMapUintUint64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint]uintptr: - fastpathTV.DecMapUintUintptrV(v, false, d) - case *map[uint]uintptr: - var v2 map[uint]uintptr - v2, changed = fastpathTV.DecMapUintUintptrV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Uint8R(rv reflect.Value) { + fastpathTV.EncMapInt32Uint8V(rv.Interface().(map[int32]uint8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Uint8V(v map[int32]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint]int: - fastpathTV.DecMapUintIntV(v, false, d) - case *map[uint]int: - var v2 map[uint]int - v2, changed = fastpathTV.DecMapUintIntV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int32(k2)])) } - case map[uint]int8: - fastpathTV.DecMapUintInt8V(v, false, d) - case *map[uint]int8: - var v2 map[uint]int8 - v2, changed = fastpathTV.DecMapUintInt8V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint]int16: - fastpathTV.DecMapUintInt16V(v, false, d) - case *map[uint]int16: - var v2 map[uint]int16 - v2, changed = fastpathTV.DecMapUintInt16V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Uint16R(rv reflect.Value) { + fastpathTV.EncMapInt32Uint16V(rv.Interface().(map[int32]uint16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Uint16V(v map[int32]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint]int32: - fastpathTV.DecMapUintInt32V(v, false, d) - case *map[uint]int32: - var v2 map[uint]int32 - v2, changed = fastpathTV.DecMapUintInt32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int32(k2)])) } - case map[uint]int64: - fastpathTV.DecMapUintInt64V(v, false, d) - case *map[uint]int64: - var v2 map[uint]int64 - v2, changed = fastpathTV.DecMapUintInt64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint]float32: - fastpathTV.DecMapUintFloat32V(v, false, d) - case *map[uint]float32: - var v2 map[uint]float32 - v2, changed = fastpathTV.DecMapUintFloat32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Uint32R(rv reflect.Value) { + fastpathTV.EncMapInt32Uint32V(rv.Interface().(map[int32]uint32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Uint32V(v map[int32]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint]float64: - fastpathTV.DecMapUintFloat64V(v, false, d) - case *map[uint]float64: - var v2 map[uint]float64 - v2, changed = fastpathTV.DecMapUintFloat64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int32(k2)])) } - case map[uint]bool: - fastpathTV.DecMapUintBoolV(v, false, d) - case *map[uint]bool: - var v2 map[uint]bool - v2, changed = fastpathTV.DecMapUintBoolV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint8]interface{}: - fastpathTV.DecMapUint8IntfV(v, false, d) - case *map[uint8]interface{}: - var v2 map[uint8]interface{} - v2, changed = fastpathTV.DecMapUint8IntfV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Uint64R(rv reflect.Value) { + fastpathTV.EncMapInt32Uint64V(rv.Interface().(map[int32]uint64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Uint64V(v map[int32]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint8]string: - fastpathTV.DecMapUint8StringV(v, false, d) - case *map[uint8]string: - var v2 map[uint8]string - v2, changed = fastpathTV.DecMapUint8StringV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int32(k2)])) } - case map[uint8]uint: - fastpathTV.DecMapUint8UintV(v, false, d) - case *map[uint8]uint: - var v2 map[uint8]uint - v2, changed = fastpathTV.DecMapUint8UintV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint8]uint8: - fastpathTV.DecMapUint8Uint8V(v, false, d) - case *map[uint8]uint8: - var v2 map[uint8]uint8 - v2, changed = fastpathTV.DecMapUint8Uint8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32UintptrR(rv reflect.Value) { + fastpathTV.EncMapInt32UintptrV(rv.Interface().(map[int32]uintptr), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32UintptrV(v map[int32]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint8]uint16: - fastpathTV.DecMapUint8Uint16V(v, false, d) - case *map[uint8]uint16: - var v2 map[uint8]uint16 - v2, changed = fastpathTV.DecMapUint8Uint16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[int32(k2)]) } - case map[uint8]uint32: - fastpathTV.DecMapUint8Uint32V(v, false, d) - case *map[uint8]uint32: - var v2 map[uint8]uint32 - v2, changed = fastpathTV.DecMapUint8Uint32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[uint8]uint64: - fastpathTV.DecMapUint8Uint64V(v, false, d) - case *map[uint8]uint64: - var v2 map[uint8]uint64 - v2, changed = fastpathTV.DecMapUint8Uint64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32IntR(rv reflect.Value) { + fastpathTV.EncMapInt32IntV(rv.Interface().(map[int32]int), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32IntV(v map[int32]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint8]uintptr: - fastpathTV.DecMapUint8UintptrV(v, false, d) - case *map[uint8]uintptr: - var v2 map[uint8]uintptr - v2, changed = fastpathTV.DecMapUint8UintptrV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int32(k2)])) } - case map[uint8]int: - fastpathTV.DecMapUint8IntV(v, false, d) - case *map[uint8]int: - var v2 map[uint8]int - v2, changed = fastpathTV.DecMapUint8IntV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint8]int8: - fastpathTV.DecMapUint8Int8V(v, false, d) - case *map[uint8]int8: - var v2 map[uint8]int8 - v2, changed = fastpathTV.DecMapUint8Int8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Int8R(rv reflect.Value) { + fastpathTV.EncMapInt32Int8V(rv.Interface().(map[int32]int8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Int8V(v map[int32]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint8]int16: - fastpathTV.DecMapUint8Int16V(v, false, d) - case *map[uint8]int16: - var v2 map[uint8]int16 - v2, changed = fastpathTV.DecMapUint8Int16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int32(k2)])) } - case map[uint8]int32: - fastpathTV.DecMapUint8Int32V(v, false, d) - case *map[uint8]int32: - var v2 map[uint8]int32 - v2, changed = fastpathTV.DecMapUint8Int32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint8]int64: - fastpathTV.DecMapUint8Int64V(v, false, d) - case *map[uint8]int64: - var v2 map[uint8]int64 - v2, changed = fastpathTV.DecMapUint8Int64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Int16R(rv reflect.Value) { + fastpathTV.EncMapInt32Int16V(rv.Interface().(map[int32]int16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Int16V(v map[int32]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint8]float32: - fastpathTV.DecMapUint8Float32V(v, false, d) - case *map[uint8]float32: - var v2 map[uint8]float32 - v2, changed = fastpathTV.DecMapUint8Float32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int32(k2)])) } - case map[uint8]float64: - fastpathTV.DecMapUint8Float64V(v, false, d) - case *map[uint8]float64: - var v2 map[uint8]float64 - v2, changed = fastpathTV.DecMapUint8Float64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint8]bool: - fastpathTV.DecMapUint8BoolV(v, false, d) - case *map[uint8]bool: - var v2 map[uint8]bool - v2, changed = fastpathTV.DecMapUint8BoolV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Int32R(rv reflect.Value) { + fastpathTV.EncMapInt32Int32V(rv.Interface().(map[int32]int32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Int32V(v map[int32]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint16]interface{}: - fastpathTV.DecMapUint16IntfV(v, false, d) - case *map[uint16]interface{}: - var v2 map[uint16]interface{} - v2, changed = fastpathTV.DecMapUint16IntfV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int32(k2)])) } - case map[uint16]string: - fastpathTV.DecMapUint16StringV(v, false, d) - case *map[uint16]string: - var v2 map[uint16]string - v2, changed = fastpathTV.DecMapUint16StringV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint16]uint: - fastpathTV.DecMapUint16UintV(v, false, d) - case *map[uint16]uint: - var v2 map[uint16]uint - v2, changed = fastpathTV.DecMapUint16UintV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Int64R(rv reflect.Value) { + fastpathTV.EncMapInt32Int64V(rv.Interface().(map[int32]int64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Int64V(v map[int32]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint16]uint8: - fastpathTV.DecMapUint16Uint8V(v, false, d) - case *map[uint16]uint8: - var v2 map[uint16]uint8 - v2, changed = fastpathTV.DecMapUint16Uint8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int32(k2)])) } - case map[uint16]uint16: - fastpathTV.DecMapUint16Uint16V(v, false, d) - case *map[uint16]uint16: - var v2 map[uint16]uint16 - v2, changed = fastpathTV.DecMapUint16Uint16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint16]uint32: - fastpathTV.DecMapUint16Uint32V(v, false, d) - case *map[uint16]uint32: - var v2 map[uint16]uint32 - v2, changed = fastpathTV.DecMapUint16Uint32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Float32R(rv reflect.Value) { + fastpathTV.EncMapInt32Float32V(rv.Interface().(map[int32]float32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Float32V(v map[int32]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint16]uint64: - fastpathTV.DecMapUint16Uint64V(v, false, d) - case *map[uint16]uint64: - var v2 map[uint16]uint64 - v2, changed = fastpathTV.DecMapUint16Uint64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v[int32(k2)]) } - case map[uint16]uintptr: - fastpathTV.DecMapUint16UintptrV(v, false, d) - case *map[uint16]uintptr: - var v2 map[uint16]uintptr - v2, changed = fastpathTV.DecMapUint16UintptrV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v2) } - case map[uint16]int: - fastpathTV.DecMapUint16IntV(v, false, d) - case *map[uint16]int: - var v2 map[uint16]int - v2, changed = fastpathTV.DecMapUint16IntV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32Float64R(rv reflect.Value) { + fastpathTV.EncMapInt32Float64V(rv.Interface().(map[int32]float64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32Float64V(v map[int32]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint16]int8: - fastpathTV.DecMapUint16Int8V(v, false, d) - case *map[uint16]int8: - var v2 map[uint16]int8 - v2, changed = fastpathTV.DecMapUint16Int8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v[int32(k2)]) } - case map[uint16]int16: - fastpathTV.DecMapUint16Int16V(v, false, d) - case *map[uint16]int16: - var v2 map[uint16]int16 - v2, changed = fastpathTV.DecMapUint16Int16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v2) } - case map[uint16]int32: - fastpathTV.DecMapUint16Int32V(v, false, d) - case *map[uint16]int32: - var v2 map[uint16]int32 - v2, changed = fastpathTV.DecMapUint16Int32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt32BoolR(rv reflect.Value) { + fastpathTV.EncMapInt32BoolV(rv.Interface().(map[int32]bool), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt32BoolV(v map[int32]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint16]int64: - fastpathTV.DecMapUint16Int64V(v, false, d) - case *map[uint16]int64: - var v2 map[uint16]int64 - v2, changed = fastpathTV.DecMapUint16Int64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int32(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v[int32(k2)]) } - case map[uint16]float32: - fastpathTV.DecMapUint16Float32V(v, false, d) - case *map[uint16]float32: - var v2 map[uint16]float32 - v2, changed = fastpathTV.DecMapUint16Float32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v2) } - case map[uint16]float64: - fastpathTV.DecMapUint16Float64V(v, false, d) - case *map[uint16]float64: - var v2 map[uint16]float64 - v2, changed = fastpathTV.DecMapUint16Float64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64IntfR(rv reflect.Value) { + fastpathTV.EncMapInt64IntfV(rv.Interface().(map[int64]interface{}), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64IntfV(v map[int64]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint16]bool: - fastpathTV.DecMapUint16BoolV(v, false, d) - case *map[uint16]bool: - var v2 map[uint16]bool - v2, changed = fastpathTV.DecMapUint16BoolV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[int64(k2)]) } - case map[uint32]interface{}: - fastpathTV.DecMapUint32IntfV(v, false, d) - case *map[uint32]interface{}: - var v2 map[uint32]interface{} - v2, changed = fastpathTV.DecMapUint32IntfV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[uint32]string: - fastpathTV.DecMapUint32StringV(v, false, d) - case *map[uint32]string: - var v2 map[uint32]string - v2, changed = fastpathTV.DecMapUint32StringV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64StringR(rv reflect.Value) { + fastpathTV.EncMapInt64StringV(rv.Interface().(map[int64]string), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64StringV(v map[int64]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint32]uint: - fastpathTV.DecMapUint32UintV(v, false, d) - case *map[uint32]uint: - var v2 map[uint32]uint - v2, changed = fastpathTV.DecMapUint32UintV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v[int64(k2)]) } - case map[uint32]uint8: - fastpathTV.DecMapUint32Uint8V(v, false, d) - case *map[uint32]uint8: - var v2 map[uint32]uint8 - v2, changed = fastpathTV.DecMapUint32Uint8V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v2) } - case map[uint32]uint16: - fastpathTV.DecMapUint32Uint16V(v, false, d) - case *map[uint32]uint16: - var v2 map[uint32]uint16 - v2, changed = fastpathTV.DecMapUint32Uint16V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64UintR(rv reflect.Value) { + fastpathTV.EncMapInt64UintV(rv.Interface().(map[int64]uint), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64UintV(v map[int64]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint32]uint32: - fastpathTV.DecMapUint32Uint32V(v, false, d) - case *map[uint32]uint32: - var v2 map[uint32]uint32 - v2, changed = fastpathTV.DecMapUint32Uint32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int64(k2)])) } - case map[uint32]uint64: - fastpathTV.DecMapUint32Uint64V(v, false, d) - case *map[uint32]uint64: - var v2 map[uint32]uint64 - v2, changed = fastpathTV.DecMapUint32Uint64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint32]uintptr: - fastpathTV.DecMapUint32UintptrV(v, false, d) - case *map[uint32]uintptr: - var v2 map[uint32]uintptr - v2, changed = fastpathTV.DecMapUint32UintptrV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Uint8R(rv reflect.Value) { + fastpathTV.EncMapInt64Uint8V(rv.Interface().(map[int64]uint8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Uint8V(v map[int64]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint32]int: - fastpathTV.DecMapUint32IntV(v, false, d) - case *map[uint32]int: - var v2 map[uint32]int - v2, changed = fastpathTV.DecMapUint32IntV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int64(k2)])) } - case map[uint32]int8: - fastpathTV.DecMapUint32Int8V(v, false, d) - case *map[uint32]int8: - var v2 map[uint32]int8 - v2, changed = fastpathTV.DecMapUint32Int8V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint32]int16: - fastpathTV.DecMapUint32Int16V(v, false, d) - case *map[uint32]int16: - var v2 map[uint32]int16 - v2, changed = fastpathTV.DecMapUint32Int16V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Uint16R(rv reflect.Value) { + fastpathTV.EncMapInt64Uint16V(rv.Interface().(map[int64]uint16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Uint16V(v map[int64]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint32]int32: - fastpathTV.DecMapUint32Int32V(v, false, d) - case *map[uint32]int32: - var v2 map[uint32]int32 - v2, changed = fastpathTV.DecMapUint32Int32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int64(k2)])) } - case map[uint32]int64: - fastpathTV.DecMapUint32Int64V(v, false, d) - case *map[uint32]int64: - var v2 map[uint32]int64 - v2, changed = fastpathTV.DecMapUint32Int64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint32]float32: - fastpathTV.DecMapUint32Float32V(v, false, d) - case *map[uint32]float32: - var v2 map[uint32]float32 - v2, changed = fastpathTV.DecMapUint32Float32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Uint32R(rv reflect.Value) { + fastpathTV.EncMapInt64Uint32V(rv.Interface().(map[int64]uint32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Uint32V(v map[int64]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint32]float64: - fastpathTV.DecMapUint32Float64V(v, false, d) - case *map[uint32]float64: - var v2 map[uint32]float64 - v2, changed = fastpathTV.DecMapUint32Float64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int64(k2)])) } - case map[uint32]bool: - fastpathTV.DecMapUint32BoolV(v, false, d) - case *map[uint32]bool: - var v2 map[uint32]bool - v2, changed = fastpathTV.DecMapUint32BoolV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint64]interface{}: - fastpathTV.DecMapUint64IntfV(v, false, d) - case *map[uint64]interface{}: - var v2 map[uint64]interface{} - v2, changed = fastpathTV.DecMapUint64IntfV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Uint64R(rv reflect.Value) { + fastpathTV.EncMapInt64Uint64V(rv.Interface().(map[int64]uint64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Uint64V(v map[int64]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint64]string: - fastpathTV.DecMapUint64StringV(v, false, d) - case *map[uint64]string: - var v2 map[uint64]string - v2, changed = fastpathTV.DecMapUint64StringV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[int64(k2)])) } - case map[uint64]uint: - fastpathTV.DecMapUint64UintV(v, false, d) - case *map[uint64]uint: - var v2 map[uint64]uint - v2, changed = fastpathTV.DecMapUint64UintV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[uint64]uint8: - fastpathTV.DecMapUint64Uint8V(v, false, d) - case *map[uint64]uint8: - var v2 map[uint64]uint8 - v2, changed = fastpathTV.DecMapUint64Uint8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64UintptrR(rv reflect.Value) { + fastpathTV.EncMapInt64UintptrV(rv.Interface().(map[int64]uintptr), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64UintptrV(v map[int64]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint64]uint16: - fastpathTV.DecMapUint64Uint16V(v, false, d) - case *map[uint64]uint16: - var v2 map[uint64]uint16 - v2, changed = fastpathTV.DecMapUint64Uint16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[int64(k2)]) } - case map[uint64]uint32: - fastpathTV.DecMapUint64Uint32V(v, false, d) - case *map[uint64]uint32: - var v2 map[uint64]uint32 - v2, changed = fastpathTV.DecMapUint64Uint32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[uint64]uint64: - fastpathTV.DecMapUint64Uint64V(v, false, d) - case *map[uint64]uint64: - var v2 map[uint64]uint64 - v2, changed = fastpathTV.DecMapUint64Uint64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64IntR(rv reflect.Value) { + fastpathTV.EncMapInt64IntV(rv.Interface().(map[int64]int), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64IntV(v map[int64]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint64]uintptr: - fastpathTV.DecMapUint64UintptrV(v, false, d) - case *map[uint64]uintptr: - var v2 map[uint64]uintptr - v2, changed = fastpathTV.DecMapUint64UintptrV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int64(k2)])) } - case map[uint64]int: - fastpathTV.DecMapUint64IntV(v, false, d) - case *map[uint64]int: - var v2 map[uint64]int - v2, changed = fastpathTV.DecMapUint64IntV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint64]int8: - fastpathTV.DecMapUint64Int8V(v, false, d) - case *map[uint64]int8: - var v2 map[uint64]int8 - v2, changed = fastpathTV.DecMapUint64Int8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Int8R(rv reflect.Value) { + fastpathTV.EncMapInt64Int8V(rv.Interface().(map[int64]int8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Int8V(v map[int64]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint64]int16: - fastpathTV.DecMapUint64Int16V(v, false, d) - case *map[uint64]int16: - var v2 map[uint64]int16 - v2, changed = fastpathTV.DecMapUint64Int16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int64(k2)])) } - case map[uint64]int32: - fastpathTV.DecMapUint64Int32V(v, false, d) - case *map[uint64]int32: - var v2 map[uint64]int32 - v2, changed = fastpathTV.DecMapUint64Int32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint64]int64: - fastpathTV.DecMapUint64Int64V(v, false, d) - case *map[uint64]int64: - var v2 map[uint64]int64 - v2, changed = fastpathTV.DecMapUint64Int64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Int16R(rv reflect.Value) { + fastpathTV.EncMapInt64Int16V(rv.Interface().(map[int64]int16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Int16V(v map[int64]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uint64]float32: - fastpathTV.DecMapUint64Float32V(v, false, d) - case *map[uint64]float32: - var v2 map[uint64]float32 - v2, changed = fastpathTV.DecMapUint64Float32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int64(k2)])) } - case map[uint64]float64: - fastpathTV.DecMapUint64Float64V(v, false, d) - case *map[uint64]float64: - var v2 map[uint64]float64 - v2, changed = fastpathTV.DecMapUint64Float64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uint64]bool: - fastpathTV.DecMapUint64BoolV(v, false, d) - case *map[uint64]bool: - var v2 map[uint64]bool - v2, changed = fastpathTV.DecMapUint64BoolV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Int32R(rv reflect.Value) { + fastpathTV.EncMapInt64Int32V(rv.Interface().(map[int64]int32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Int32V(v map[int64]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uintptr]interface{}: - fastpathTV.DecMapUintptrIntfV(v, false, d) - case *map[uintptr]interface{}: - var v2 map[uintptr]interface{} - v2, changed = fastpathTV.DecMapUintptrIntfV(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int64(k2)])) } - case map[uintptr]string: - fastpathTV.DecMapUintptrStringV(v, false, d) - case *map[uintptr]string: - var v2 map[uintptr]string - v2, changed = fastpathTV.DecMapUintptrStringV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uintptr]uint: - fastpathTV.DecMapUintptrUintV(v, false, d) - case *map[uintptr]uint: - var v2 map[uintptr]uint - v2, changed = fastpathTV.DecMapUintptrUintV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Int64R(rv reflect.Value) { + fastpathTV.EncMapInt64Int64V(rv.Interface().(map[int64]int64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Int64V(v map[int64]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uintptr]uint8: - fastpathTV.DecMapUintptrUint8V(v, false, d) - case *map[uintptr]uint8: - var v2 map[uintptr]uint8 - v2, changed = fastpathTV.DecMapUintptrUint8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[int64(k2)])) } - case map[uintptr]uint16: - fastpathTV.DecMapUintptrUint16V(v, false, d) - case *map[uintptr]uint16: - var v2 map[uintptr]uint16 - v2, changed = fastpathTV.DecMapUintptrUint16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[uintptr]uint32: - fastpathTV.DecMapUintptrUint32V(v, false, d) - case *map[uintptr]uint32: - var v2 map[uintptr]uint32 - v2, changed = fastpathTV.DecMapUintptrUint32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Float32R(rv reflect.Value) { + fastpathTV.EncMapInt64Float32V(rv.Interface().(map[int64]float32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Float32V(v map[int64]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uintptr]uint64: - fastpathTV.DecMapUintptrUint64V(v, false, d) - case *map[uintptr]uint64: - var v2 map[uintptr]uint64 - v2, changed = fastpathTV.DecMapUintptrUint64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v[int64(k2)]) } - case map[uintptr]uintptr: - fastpathTV.DecMapUintptrUintptrV(v, false, d) - case *map[uintptr]uintptr: - var v2 map[uintptr]uintptr - v2, changed = fastpathTV.DecMapUintptrUintptrV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v2) } - case map[uintptr]int: - fastpathTV.DecMapUintptrIntV(v, false, d) - case *map[uintptr]int: - var v2 map[uintptr]int - v2, changed = fastpathTV.DecMapUintptrIntV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64Float64R(rv reflect.Value) { + fastpathTV.EncMapInt64Float64V(rv.Interface().(map[int64]float64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64Float64V(v map[int64]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uintptr]int8: - fastpathTV.DecMapUintptrInt8V(v, false, d) - case *map[uintptr]int8: - var v2 map[uintptr]int8 - v2, changed = fastpathTV.DecMapUintptrInt8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v[int64(k2)]) } - case map[uintptr]int16: - fastpathTV.DecMapUintptrInt16V(v, false, d) - case *map[uintptr]int16: - var v2 map[uintptr]int16 - v2, changed = fastpathTV.DecMapUintptrInt16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v2) } - case map[uintptr]int32: - fastpathTV.DecMapUintptrInt32V(v, false, d) - case *map[uintptr]int32: - var v2 map[uintptr]int32 - v2, changed = fastpathTV.DecMapUintptrInt32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapInt64BoolR(rv reflect.Value) { + fastpathTV.EncMapInt64BoolV(rv.Interface().(map[int64]bool), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapInt64BoolV(v map[int64]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]int64, len(v)) + var i int + for k, _ := range v { + v2[i] = int64(k) + i++ } - case map[uintptr]int64: - fastpathTV.DecMapUintptrInt64V(v, false, d) - case *map[uintptr]int64: - var v2 map[uintptr]int64 - v2, changed = fastpathTV.DecMapUintptrInt64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(intSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(int64(k2))) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v[int64(k2)]) } - case map[uintptr]float32: - fastpathTV.DecMapUintptrFloat32V(v, false, d) - case *map[uintptr]float32: - var v2 map[uintptr]float32 - v2, changed = fastpathTV.DecMapUintptrFloat32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeInt(int64(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v2) } - case map[uintptr]float64: - fastpathTV.DecMapUintptrFloat64V(v, false, d) - case *map[uintptr]float64: - var v2 map[uintptr]float64 - v2, changed = fastpathTV.DecMapUintptrFloat64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolIntfR(rv reflect.Value) { + fastpathTV.EncMapBoolIntfV(rv.Interface().(map[bool]interface{}), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolIntfV(v map[bool]interface{}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[uintptr]bool: - fastpathTV.DecMapUintptrBoolV(v, false, d) - case *map[uintptr]bool: - var v2 map[uintptr]bool - v2, changed = fastpathTV.DecMapUintptrBoolV(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[bool(k2)]) } - case map[int]interface{}: - fastpathTV.DecMapIntIntfV(v, false, d) - case *map[int]interface{}: - var v2 map[int]interface{} - v2, changed = fastpathTV.DecMapIntIntfV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[int]string: - fastpathTV.DecMapIntStringV(v, false, d) - case *map[int]string: - var v2 map[int]string - v2, changed = fastpathTV.DecMapIntStringV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolStringR(rv reflect.Value) { + fastpathTV.EncMapBoolStringV(rv.Interface().(map[bool]string), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolStringV(v map[bool]string, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int]uint: - fastpathTV.DecMapIntUintV(v, false, d) - case *map[int]uint: - var v2 map[int]uint - v2, changed = fastpathTV.DecMapIntUintV(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v[bool(k2)]) } - case map[int]uint8: - fastpathTV.DecMapIntUint8V(v, false, d) - case *map[int]uint8: - var v2 map[int]uint8 - v2, changed = fastpathTV.DecMapIntUint8V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeString(c_UTF8, v2) } - case map[int]uint16: - fastpathTV.DecMapIntUint16V(v, false, d) - case *map[int]uint16: - var v2 map[int]uint16 - v2, changed = fastpathTV.DecMapIntUint16V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolUintR(rv reflect.Value) { + fastpathTV.EncMapBoolUintV(rv.Interface().(map[bool]uint), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolUintV(v map[bool]uint, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int]uint32: - fastpathTV.DecMapIntUint32V(v, false, d) - case *map[int]uint32: - var v2 map[int]uint32 - v2, changed = fastpathTV.DecMapIntUint32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[bool(k2)])) } - case map[int]uint64: - fastpathTV.DecMapIntUint64V(v, false, d) - case *map[int]uint64: - var v2 map[int]uint64 - v2, changed = fastpathTV.DecMapIntUint64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[int]uintptr: - fastpathTV.DecMapIntUintptrV(v, false, d) - case *map[int]uintptr: - var v2 map[int]uintptr - v2, changed = fastpathTV.DecMapIntUintptrV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolUint8R(rv reflect.Value) { + fastpathTV.EncMapBoolUint8V(rv.Interface().(map[bool]uint8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolUint8V(v map[bool]uint8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int]int: - fastpathTV.DecMapIntIntV(v, false, d) - case *map[int]int: - var v2 map[int]int - v2, changed = fastpathTV.DecMapIntIntV(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[bool(k2)])) } - case map[int]int8: - fastpathTV.DecMapIntInt8V(v, false, d) - case *map[int]int8: - var v2 map[int]int8 - v2, changed = fastpathTV.DecMapIntInt8V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[int]int16: - fastpathTV.DecMapIntInt16V(v, false, d) - case *map[int]int16: - var v2 map[int]int16 - v2, changed = fastpathTV.DecMapIntInt16V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolUint16R(rv reflect.Value) { + fastpathTV.EncMapBoolUint16V(rv.Interface().(map[bool]uint16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolUint16V(v map[bool]uint16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int]int32: - fastpathTV.DecMapIntInt32V(v, false, d) - case *map[int]int32: - var v2 map[int]int32 - v2, changed = fastpathTV.DecMapIntInt32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[bool(k2)])) } - case map[int]int64: - fastpathTV.DecMapIntInt64V(v, false, d) - case *map[int]int64: - var v2 map[int]int64 - v2, changed = fastpathTV.DecMapIntInt64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[int]float32: - fastpathTV.DecMapIntFloat32V(v, false, d) - case *map[int]float32: - var v2 map[int]float32 - v2, changed = fastpathTV.DecMapIntFloat32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolUint32R(rv reflect.Value) { + fastpathTV.EncMapBoolUint32V(rv.Interface().(map[bool]uint32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolUint32V(v map[bool]uint32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int]float64: - fastpathTV.DecMapIntFloat64V(v, false, d) - case *map[int]float64: - var v2 map[int]float64 - v2, changed = fastpathTV.DecMapIntFloat64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[bool(k2)])) } - case map[int]bool: - fastpathTV.DecMapIntBoolV(v, false, d) - case *map[int]bool: - var v2 map[int]bool - v2, changed = fastpathTV.DecMapIntBoolV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[int8]interface{}: - fastpathTV.DecMapInt8IntfV(v, false, d) - case *map[int8]interface{}: - var v2 map[int8]interface{} - v2, changed = fastpathTV.DecMapInt8IntfV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolUint64R(rv reflect.Value) { + fastpathTV.EncMapBoolUint64V(rv.Interface().(map[bool]uint64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolUint64V(v map[bool]uint64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int8]string: - fastpathTV.DecMapInt8StringV(v, false, d) - case *map[int8]string: - var v2 map[int8]string - v2, changed = fastpathTV.DecMapInt8StringV(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v[bool(k2)])) } - case map[int8]uint: - fastpathTV.DecMapInt8UintV(v, false, d) - case *map[int8]uint: - var v2 map[int8]uint - v2, changed = fastpathTV.DecMapInt8UintV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeUint(uint64(v2)) } - case map[int8]uint8: - fastpathTV.DecMapInt8Uint8V(v, false, d) - case *map[int8]uint8: - var v2 map[int8]uint8 - v2, changed = fastpathTV.DecMapInt8Uint8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolUintptrR(rv reflect.Value) { + fastpathTV.EncMapBoolUintptrV(rv.Interface().(map[bool]uintptr), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolUintptrV(v map[bool]uintptr, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int8]uint16: - fastpathTV.DecMapInt8Uint16V(v, false, d) - case *map[int8]uint16: - var v2 map[int8]uint16 - v2, changed = fastpathTV.DecMapInt8Uint16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v[bool(k2)]) } - case map[int8]uint32: - fastpathTV.DecMapInt8Uint32V(v, false, d) - case *map[int8]uint32: - var v2 map[int8]uint32 - v2, changed = fastpathTV.DecMapInt8Uint32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + e.encode(v2) } - case map[int8]uint64: - fastpathTV.DecMapInt8Uint64V(v, false, d) - case *map[int8]uint64: - var v2 map[int8]uint64 - v2, changed = fastpathTV.DecMapInt8Uint64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolIntR(rv reflect.Value) { + fastpathTV.EncMapBoolIntV(rv.Interface().(map[bool]int), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolIntV(v map[bool]int, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int8]uintptr: - fastpathTV.DecMapInt8UintptrV(v, false, d) - case *map[int8]uintptr: - var v2 map[int8]uintptr - v2, changed = fastpathTV.DecMapInt8UintptrV(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[bool(k2)])) } - case map[int8]int: - fastpathTV.DecMapInt8IntV(v, false, d) - case *map[int8]int: - var v2 map[int8]int - v2, changed = fastpathTV.DecMapInt8IntV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[int8]int8: - fastpathTV.DecMapInt8Int8V(v, false, d) - case *map[int8]int8: - var v2 map[int8]int8 - v2, changed = fastpathTV.DecMapInt8Int8V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolInt8R(rv reflect.Value) { + fastpathTV.EncMapBoolInt8V(rv.Interface().(map[bool]int8), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolInt8V(v map[bool]int8, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int8]int16: - fastpathTV.DecMapInt8Int16V(v, false, d) - case *map[int8]int16: - var v2 map[int8]int16 - v2, changed = fastpathTV.DecMapInt8Int16V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[bool(k2)])) } - case map[int8]int32: - fastpathTV.DecMapInt8Int32V(v, false, d) - case *map[int8]int32: - var v2 map[int8]int32 - v2, changed = fastpathTV.DecMapInt8Int32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[int8]int64: - fastpathTV.DecMapInt8Int64V(v, false, d) - case *map[int8]int64: - var v2 map[int8]int64 - v2, changed = fastpathTV.DecMapInt8Int64V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolInt16R(rv reflect.Value) { + fastpathTV.EncMapBoolInt16V(rv.Interface().(map[bool]int16), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolInt16V(v map[bool]int16, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int8]float32: - fastpathTV.DecMapInt8Float32V(v, false, d) - case *map[int8]float32: - var v2 map[int8]float32 - v2, changed = fastpathTV.DecMapInt8Float32V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[bool(k2)])) } - case map[int8]float64: - fastpathTV.DecMapInt8Float64V(v, false, d) - case *map[int8]float64: - var v2 map[int8]float64 - v2, changed = fastpathTV.DecMapInt8Float64V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[int8]bool: - fastpathTV.DecMapInt8BoolV(v, false, d) - case *map[int8]bool: - var v2 map[int8]bool - v2, changed = fastpathTV.DecMapInt8BoolV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolInt32R(rv reflect.Value) { + fastpathTV.EncMapBoolInt32V(rv.Interface().(map[bool]int32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolInt32V(v map[bool]int32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int16]interface{}: - fastpathTV.DecMapInt16IntfV(v, false, d) - case *map[int16]interface{}: - var v2 map[int16]interface{} - v2, changed = fastpathTV.DecMapInt16IntfV(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[bool(k2)])) } - case map[int16]string: - fastpathTV.DecMapInt16StringV(v, false, d) - case *map[int16]string: - var v2 map[int16]string - v2, changed = fastpathTV.DecMapInt16StringV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[int16]uint: - fastpathTV.DecMapInt16UintV(v, false, d) - case *map[int16]uint: - var v2 map[int16]uint - v2, changed = fastpathTV.DecMapInt16UintV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolInt64R(rv reflect.Value) { + fastpathTV.EncMapBoolInt64V(rv.Interface().(map[bool]int64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolInt64V(v map[bool]int64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int16]uint8: - fastpathTV.DecMapInt16Uint8V(v, false, d) - case *map[int16]uint8: - var v2 map[int16]uint8 - v2, changed = fastpathTV.DecMapInt16Uint8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v[bool(k2)])) } - case map[int16]uint16: - fastpathTV.DecMapInt16Uint16V(v, false, d) - case *map[int16]uint16: - var v2 map[int16]uint16 - v2, changed = fastpathTV.DecMapInt16Uint16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeInt(int64(v2)) } - case map[int16]uint32: - fastpathTV.DecMapInt16Uint32V(v, false, d) - case *map[int16]uint32: - var v2 map[int16]uint32 - v2, changed = fastpathTV.DecMapInt16Uint32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolFloat32R(rv reflect.Value) { + fastpathTV.EncMapBoolFloat32V(rv.Interface().(map[bool]float32), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolFloat32V(v map[bool]float32, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int16]uint64: - fastpathTV.DecMapInt16Uint64V(v, false, d) - case *map[int16]uint64: - var v2 map[int16]uint64 - v2, changed = fastpathTV.DecMapInt16Uint64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v[bool(k2)]) } - case map[int16]uintptr: - fastpathTV.DecMapInt16UintptrV(v, false, d) - case *map[int16]uintptr: - var v2 map[int16]uintptr - v2, changed = fastpathTV.DecMapInt16UintptrV(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat32(v2) } - case map[int16]int: - fastpathTV.DecMapInt16IntV(v, false, d) - case *map[int16]int: - var v2 map[int16]int - v2, changed = fastpathTV.DecMapInt16IntV(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolFloat64R(rv reflect.Value) { + fastpathTV.EncMapBoolFloat64V(rv.Interface().(map[bool]float64), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolFloat64V(v map[bool]float64, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int16]int8: - fastpathTV.DecMapInt16Int8V(v, false, d) - case *map[int16]int8: - var v2 map[int16]int8 - v2, changed = fastpathTV.DecMapInt16Int8V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v[bool(k2)]) } - case map[int16]int16: - fastpathTV.DecMapInt16Int16V(v, false, d) - case *map[int16]int16: - var v2 map[int16]int16 - v2, changed = fastpathTV.DecMapInt16Int16V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeFloat64(v2) } - case map[int16]int32: - fastpathTV.DecMapInt16Int32V(v, false, d) - case *map[int16]int32: - var v2 map[int16]int32 - v2, changed = fastpathTV.DecMapInt16Int32V(*v, true, d) - if changed { - *v = v2 + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +func (f *encFnInfo) fastpathEncMapBoolBoolR(rv reflect.Value) { + fastpathTV.EncMapBoolBoolV(rv.Interface().(map[bool]bool), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) EncMapBoolBoolV(v map[bool]bool, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + if e.h.Canonical { + v2 := make([]bool, len(v)) + var i int + for k, _ := range v { + v2[i] = bool(k) + i++ } - case map[int16]int64: - fastpathTV.DecMapInt16Int64V(v, false, d) - case *map[int16]int64: - var v2 map[int16]int64 - v2, changed = fastpathTV.DecMapInt16Int64V(*v, true, d) - if changed { - *v = v2 + sort.Sort(boolSlice(v2)) + for _, k2 := range v2 { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(bool(k2)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v[bool(k2)]) } - case map[int16]float32: - fastpathTV.DecMapInt16Float32V(v, false, d) - case *map[int16]float32: - var v2 map[int16]float32 - v2, changed = fastpathTV.DecMapInt16Float32V(*v, true, d) - if changed { - *v = v2 + } else { + for k2, v2 := range v { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + ee.EncodeBool(k2) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + ee.EncodeBool(v2) } - case map[int16]float64: - fastpathTV.DecMapInt16Float64V(v, false, d) - case *map[int16]float64: - var v2 map[int16]float64 - v2, changed = fastpathTV.DecMapInt16Float64V(*v, true, d) - if changed { + } + if cr != nil { + cr.sendContainerState(containerMapEnd) + } +} + +// -- decode + +// -- -- fast path type switch +func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { + switch v := iv.(type) { + + case []interface{}: + fastpathTV.DecSliceIntfV(v, fastpathCheckNilFalse, false, d) + case *[]interface{}: + v2, changed2 := fastpathTV.DecSliceIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int16]bool: - fastpathTV.DecMapInt16BoolV(v, false, d) - case *map[int16]bool: - var v2 map[int16]bool - v2, changed = fastpathTV.DecMapInt16BoolV(*v, true, d) - if changed { + + case map[interface{}]interface{}: + fastpathTV.DecMapIntfIntfV(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]interface{}: + v2, changed2 := fastpathTV.DecMapIntfIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]interface{}: - fastpathTV.DecMapInt32IntfV(v, false, d) - case *map[int32]interface{}: - var v2 map[int32]interface{} - v2, changed = fastpathTV.DecMapInt32IntfV(*v, true, d) - if changed { + + case map[interface{}]string: + fastpathTV.DecMapIntfStringV(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]string: + v2, changed2 := fastpathTV.DecMapIntfStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]string: - fastpathTV.DecMapInt32StringV(v, false, d) - case *map[int32]string: - var v2 map[int32]string - v2, changed = fastpathTV.DecMapInt32StringV(*v, true, d) - if changed { + + case map[interface{}]uint: + fastpathTV.DecMapIntfUintV(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]uint: + v2, changed2 := fastpathTV.DecMapIntfUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]uint: - fastpathTV.DecMapInt32UintV(v, false, d) - case *map[int32]uint: - var v2 map[int32]uint - v2, changed = fastpathTV.DecMapInt32UintV(*v, true, d) - if changed { + + case map[interface{}]uint8: + fastpathTV.DecMapIntfUint8V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]uint8: + v2, changed2 := fastpathTV.DecMapIntfUint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]uint8: - fastpathTV.DecMapInt32Uint8V(v, false, d) - case *map[int32]uint8: - var v2 map[int32]uint8 - v2, changed = fastpathTV.DecMapInt32Uint8V(*v, true, d) - if changed { + + case map[interface{}]uint16: + fastpathTV.DecMapIntfUint16V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]uint16: + v2, changed2 := fastpathTV.DecMapIntfUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]uint16: - fastpathTV.DecMapInt32Uint16V(v, false, d) - case *map[int32]uint16: - var v2 map[int32]uint16 - v2, changed = fastpathTV.DecMapInt32Uint16V(*v, true, d) - if changed { + + case map[interface{}]uint32: + fastpathTV.DecMapIntfUint32V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]uint32: + v2, changed2 := fastpathTV.DecMapIntfUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]uint32: - fastpathTV.DecMapInt32Uint32V(v, false, d) - case *map[int32]uint32: - var v2 map[int32]uint32 - v2, changed = fastpathTV.DecMapInt32Uint32V(*v, true, d) - if changed { + + case map[interface{}]uint64: + fastpathTV.DecMapIntfUint64V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]uint64: + v2, changed2 := fastpathTV.DecMapIntfUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]uint64: - fastpathTV.DecMapInt32Uint64V(v, false, d) - case *map[int32]uint64: - var v2 map[int32]uint64 - v2, changed = fastpathTV.DecMapInt32Uint64V(*v, true, d) - if changed { + + case map[interface{}]uintptr: + fastpathTV.DecMapIntfUintptrV(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]uintptr: + v2, changed2 := fastpathTV.DecMapIntfUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]uintptr: - fastpathTV.DecMapInt32UintptrV(v, false, d) - case *map[int32]uintptr: - var v2 map[int32]uintptr - v2, changed = fastpathTV.DecMapInt32UintptrV(*v, true, d) - if changed { + + case map[interface{}]int: + fastpathTV.DecMapIntfIntV(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]int: + v2, changed2 := fastpathTV.DecMapIntfIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]int: - fastpathTV.DecMapInt32IntV(v, false, d) - case *map[int32]int: - var v2 map[int32]int - v2, changed = fastpathTV.DecMapInt32IntV(*v, true, d) - if changed { + + case map[interface{}]int8: + fastpathTV.DecMapIntfInt8V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]int8: + v2, changed2 := fastpathTV.DecMapIntfInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]int8: - fastpathTV.DecMapInt32Int8V(v, false, d) - case *map[int32]int8: - var v2 map[int32]int8 - v2, changed = fastpathTV.DecMapInt32Int8V(*v, true, d) - if changed { + + case map[interface{}]int16: + fastpathTV.DecMapIntfInt16V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]int16: + v2, changed2 := fastpathTV.DecMapIntfInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]int16: - fastpathTV.DecMapInt32Int16V(v, false, d) - case *map[int32]int16: - var v2 map[int32]int16 - v2, changed = fastpathTV.DecMapInt32Int16V(*v, true, d) - if changed { + + case map[interface{}]int32: + fastpathTV.DecMapIntfInt32V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]int32: + v2, changed2 := fastpathTV.DecMapIntfInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]int32: - fastpathTV.DecMapInt32Int32V(v, false, d) - case *map[int32]int32: - var v2 map[int32]int32 - v2, changed = fastpathTV.DecMapInt32Int32V(*v, true, d) - if changed { + + case map[interface{}]int64: + fastpathTV.DecMapIntfInt64V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]int64: + v2, changed2 := fastpathTV.DecMapIntfInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]int64: - fastpathTV.DecMapInt32Int64V(v, false, d) - case *map[int32]int64: - var v2 map[int32]int64 - v2, changed = fastpathTV.DecMapInt32Int64V(*v, true, d) - if changed { + + case map[interface{}]float32: + fastpathTV.DecMapIntfFloat32V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]float32: + v2, changed2 := fastpathTV.DecMapIntfFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]float32: - fastpathTV.DecMapInt32Float32V(v, false, d) - case *map[int32]float32: - var v2 map[int32]float32 - v2, changed = fastpathTV.DecMapInt32Float32V(*v, true, d) - if changed { + + case map[interface{}]float64: + fastpathTV.DecMapIntfFloat64V(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]float64: + v2, changed2 := fastpathTV.DecMapIntfFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]float64: - fastpathTV.DecMapInt32Float64V(v, false, d) - case *map[int32]float64: - var v2 map[int32]float64 - v2, changed = fastpathTV.DecMapInt32Float64V(*v, true, d) - if changed { + + case map[interface{}]bool: + fastpathTV.DecMapIntfBoolV(v, fastpathCheckNilFalse, false, d) + case *map[interface{}]bool: + v2, changed2 := fastpathTV.DecMapIntfBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int32]bool: - fastpathTV.DecMapInt32BoolV(v, false, d) - case *map[int32]bool: - var v2 map[int32]bool - v2, changed = fastpathTV.DecMapInt32BoolV(*v, true, d) - if changed { + + case []string: + fastpathTV.DecSliceStringV(v, fastpathCheckNilFalse, false, d) + case *[]string: + v2, changed2 := fastpathTV.DecSliceStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]interface{}: - fastpathTV.DecMapInt64IntfV(v, false, d) - case *map[int64]interface{}: - var v2 map[int64]interface{} - v2, changed = fastpathTV.DecMapInt64IntfV(*v, true, d) - if changed { + + case map[string]interface{}: + fastpathTV.DecMapStringIntfV(v, fastpathCheckNilFalse, false, d) + case *map[string]interface{}: + v2, changed2 := fastpathTV.DecMapStringIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]string: - fastpathTV.DecMapInt64StringV(v, false, d) - case *map[int64]string: - var v2 map[int64]string - v2, changed = fastpathTV.DecMapInt64StringV(*v, true, d) - if changed { + + case map[string]string: + fastpathTV.DecMapStringStringV(v, fastpathCheckNilFalse, false, d) + case *map[string]string: + v2, changed2 := fastpathTV.DecMapStringStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]uint: - fastpathTV.DecMapInt64UintV(v, false, d) - case *map[int64]uint: - var v2 map[int64]uint - v2, changed = fastpathTV.DecMapInt64UintV(*v, true, d) - if changed { + + case map[string]uint: + fastpathTV.DecMapStringUintV(v, fastpathCheckNilFalse, false, d) + case *map[string]uint: + v2, changed2 := fastpathTV.DecMapStringUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]uint8: - fastpathTV.DecMapInt64Uint8V(v, false, d) - case *map[int64]uint8: - var v2 map[int64]uint8 - v2, changed = fastpathTV.DecMapInt64Uint8V(*v, true, d) - if changed { + + case map[string]uint8: + fastpathTV.DecMapStringUint8V(v, fastpathCheckNilFalse, false, d) + case *map[string]uint8: + v2, changed2 := fastpathTV.DecMapStringUint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]uint16: - fastpathTV.DecMapInt64Uint16V(v, false, d) - case *map[int64]uint16: - var v2 map[int64]uint16 - v2, changed = fastpathTV.DecMapInt64Uint16V(*v, true, d) - if changed { + + case map[string]uint16: + fastpathTV.DecMapStringUint16V(v, fastpathCheckNilFalse, false, d) + case *map[string]uint16: + v2, changed2 := fastpathTV.DecMapStringUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]uint32: - fastpathTV.DecMapInt64Uint32V(v, false, d) - case *map[int64]uint32: - var v2 map[int64]uint32 - v2, changed = fastpathTV.DecMapInt64Uint32V(*v, true, d) - if changed { + + case map[string]uint32: + fastpathTV.DecMapStringUint32V(v, fastpathCheckNilFalse, false, d) + case *map[string]uint32: + v2, changed2 := fastpathTV.DecMapStringUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]uint64: - fastpathTV.DecMapInt64Uint64V(v, false, d) - case *map[int64]uint64: - var v2 map[int64]uint64 - v2, changed = fastpathTV.DecMapInt64Uint64V(*v, true, d) - if changed { + + case map[string]uint64: + fastpathTV.DecMapStringUint64V(v, fastpathCheckNilFalse, false, d) + case *map[string]uint64: + v2, changed2 := fastpathTV.DecMapStringUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]uintptr: - fastpathTV.DecMapInt64UintptrV(v, false, d) - case *map[int64]uintptr: - var v2 map[int64]uintptr - v2, changed = fastpathTV.DecMapInt64UintptrV(*v, true, d) - if changed { + + case map[string]uintptr: + fastpathTV.DecMapStringUintptrV(v, fastpathCheckNilFalse, false, d) + case *map[string]uintptr: + v2, changed2 := fastpathTV.DecMapStringUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]int: - fastpathTV.DecMapInt64IntV(v, false, d) - case *map[int64]int: - var v2 map[int64]int - v2, changed = fastpathTV.DecMapInt64IntV(*v, true, d) - if changed { + + case map[string]int: + fastpathTV.DecMapStringIntV(v, fastpathCheckNilFalse, false, d) + case *map[string]int: + v2, changed2 := fastpathTV.DecMapStringIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]int8: - fastpathTV.DecMapInt64Int8V(v, false, d) - case *map[int64]int8: - var v2 map[int64]int8 - v2, changed = fastpathTV.DecMapInt64Int8V(*v, true, d) - if changed { + + case map[string]int8: + fastpathTV.DecMapStringInt8V(v, fastpathCheckNilFalse, false, d) + case *map[string]int8: + v2, changed2 := fastpathTV.DecMapStringInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]int16: - fastpathTV.DecMapInt64Int16V(v, false, d) - case *map[int64]int16: - var v2 map[int64]int16 - v2, changed = fastpathTV.DecMapInt64Int16V(*v, true, d) - if changed { + + case map[string]int16: + fastpathTV.DecMapStringInt16V(v, fastpathCheckNilFalse, false, d) + case *map[string]int16: + v2, changed2 := fastpathTV.DecMapStringInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]int32: - fastpathTV.DecMapInt64Int32V(v, false, d) - case *map[int64]int32: - var v2 map[int64]int32 - v2, changed = fastpathTV.DecMapInt64Int32V(*v, true, d) - if changed { + + case map[string]int32: + fastpathTV.DecMapStringInt32V(v, fastpathCheckNilFalse, false, d) + case *map[string]int32: + v2, changed2 := fastpathTV.DecMapStringInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]int64: - fastpathTV.DecMapInt64Int64V(v, false, d) - case *map[int64]int64: - var v2 map[int64]int64 - v2, changed = fastpathTV.DecMapInt64Int64V(*v, true, d) - if changed { + + case map[string]int64: + fastpathTV.DecMapStringInt64V(v, fastpathCheckNilFalse, false, d) + case *map[string]int64: + v2, changed2 := fastpathTV.DecMapStringInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]float32: - fastpathTV.DecMapInt64Float32V(v, false, d) - case *map[int64]float32: - var v2 map[int64]float32 - v2, changed = fastpathTV.DecMapInt64Float32V(*v, true, d) - if changed { + + case map[string]float32: + fastpathTV.DecMapStringFloat32V(v, fastpathCheckNilFalse, false, d) + case *map[string]float32: + v2, changed2 := fastpathTV.DecMapStringFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]float64: - fastpathTV.DecMapInt64Float64V(v, false, d) - case *map[int64]float64: - var v2 map[int64]float64 - v2, changed = fastpathTV.DecMapInt64Float64V(*v, true, d) - if changed { + + case map[string]float64: + fastpathTV.DecMapStringFloat64V(v, fastpathCheckNilFalse, false, d) + case *map[string]float64: + v2, changed2 := fastpathTV.DecMapStringFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[int64]bool: - fastpathTV.DecMapInt64BoolV(v, false, d) - case *map[int64]bool: - var v2 map[int64]bool - v2, changed = fastpathTV.DecMapInt64BoolV(*v, true, d) - if changed { + + case map[string]bool: + fastpathTV.DecMapStringBoolV(v, fastpathCheckNilFalse, false, d) + case *map[string]bool: + v2, changed2 := fastpathTV.DecMapStringBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]interface{}: - fastpathTV.DecMapBoolIntfV(v, false, d) - case *map[bool]interface{}: - var v2 map[bool]interface{} - v2, changed = fastpathTV.DecMapBoolIntfV(*v, true, d) - if changed { + + case []float32: + fastpathTV.DecSliceFloat32V(v, fastpathCheckNilFalse, false, d) + case *[]float32: + v2, changed2 := fastpathTV.DecSliceFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]string: - fastpathTV.DecMapBoolStringV(v, false, d) - case *map[bool]string: - var v2 map[bool]string - v2, changed = fastpathTV.DecMapBoolStringV(*v, true, d) - if changed { + + case map[float32]interface{}: + fastpathTV.DecMapFloat32IntfV(v, fastpathCheckNilFalse, false, d) + case *map[float32]interface{}: + v2, changed2 := fastpathTV.DecMapFloat32IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]uint: - fastpathTV.DecMapBoolUintV(v, false, d) - case *map[bool]uint: - var v2 map[bool]uint - v2, changed = fastpathTV.DecMapBoolUintV(*v, true, d) - if changed { + + case map[float32]string: + fastpathTV.DecMapFloat32StringV(v, fastpathCheckNilFalse, false, d) + case *map[float32]string: + v2, changed2 := fastpathTV.DecMapFloat32StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]uint8: - fastpathTV.DecMapBoolUint8V(v, false, d) - case *map[bool]uint8: - var v2 map[bool]uint8 - v2, changed = fastpathTV.DecMapBoolUint8V(*v, true, d) - if changed { + + case map[float32]uint: + fastpathTV.DecMapFloat32UintV(v, fastpathCheckNilFalse, false, d) + case *map[float32]uint: + v2, changed2 := fastpathTV.DecMapFloat32UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]uint16: - fastpathTV.DecMapBoolUint16V(v, false, d) - case *map[bool]uint16: - var v2 map[bool]uint16 - v2, changed = fastpathTV.DecMapBoolUint16V(*v, true, d) - if changed { + + case map[float32]uint8: + fastpathTV.DecMapFloat32Uint8V(v, fastpathCheckNilFalse, false, d) + case *map[float32]uint8: + v2, changed2 := fastpathTV.DecMapFloat32Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]uint32: - fastpathTV.DecMapBoolUint32V(v, false, d) - case *map[bool]uint32: - var v2 map[bool]uint32 - v2, changed = fastpathTV.DecMapBoolUint32V(*v, true, d) - if changed { + + case map[float32]uint16: + fastpathTV.DecMapFloat32Uint16V(v, fastpathCheckNilFalse, false, d) + case *map[float32]uint16: + v2, changed2 := fastpathTV.DecMapFloat32Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]uint64: - fastpathTV.DecMapBoolUint64V(v, false, d) - case *map[bool]uint64: - var v2 map[bool]uint64 - v2, changed = fastpathTV.DecMapBoolUint64V(*v, true, d) - if changed { + + case map[float32]uint32: + fastpathTV.DecMapFloat32Uint32V(v, fastpathCheckNilFalse, false, d) + case *map[float32]uint32: + v2, changed2 := fastpathTV.DecMapFloat32Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]uintptr: - fastpathTV.DecMapBoolUintptrV(v, false, d) - case *map[bool]uintptr: - var v2 map[bool]uintptr - v2, changed = fastpathTV.DecMapBoolUintptrV(*v, true, d) - if changed { + + case map[float32]uint64: + fastpathTV.DecMapFloat32Uint64V(v, fastpathCheckNilFalse, false, d) + case *map[float32]uint64: + v2, changed2 := fastpathTV.DecMapFloat32Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]int: - fastpathTV.DecMapBoolIntV(v, false, d) - case *map[bool]int: - var v2 map[bool]int - v2, changed = fastpathTV.DecMapBoolIntV(*v, true, d) - if changed { + + case map[float32]uintptr: + fastpathTV.DecMapFloat32UintptrV(v, fastpathCheckNilFalse, false, d) + case *map[float32]uintptr: + v2, changed2 := fastpathTV.DecMapFloat32UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]int8: - fastpathTV.DecMapBoolInt8V(v, false, d) - case *map[bool]int8: - var v2 map[bool]int8 - v2, changed = fastpathTV.DecMapBoolInt8V(*v, true, d) - if changed { + + case map[float32]int: + fastpathTV.DecMapFloat32IntV(v, fastpathCheckNilFalse, false, d) + case *map[float32]int: + v2, changed2 := fastpathTV.DecMapFloat32IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]int16: - fastpathTV.DecMapBoolInt16V(v, false, d) - case *map[bool]int16: - var v2 map[bool]int16 - v2, changed = fastpathTV.DecMapBoolInt16V(*v, true, d) - if changed { + + case map[float32]int8: + fastpathTV.DecMapFloat32Int8V(v, fastpathCheckNilFalse, false, d) + case *map[float32]int8: + v2, changed2 := fastpathTV.DecMapFloat32Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]int32: - fastpathTV.DecMapBoolInt32V(v, false, d) - case *map[bool]int32: - var v2 map[bool]int32 - v2, changed = fastpathTV.DecMapBoolInt32V(*v, true, d) - if changed { + + case map[float32]int16: + fastpathTV.DecMapFloat32Int16V(v, fastpathCheckNilFalse, false, d) + case *map[float32]int16: + v2, changed2 := fastpathTV.DecMapFloat32Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]int64: - fastpathTV.DecMapBoolInt64V(v, false, d) - case *map[bool]int64: - var v2 map[bool]int64 - v2, changed = fastpathTV.DecMapBoolInt64V(*v, true, d) - if changed { + + case map[float32]int32: + fastpathTV.DecMapFloat32Int32V(v, fastpathCheckNilFalse, false, d) + case *map[float32]int32: + v2, changed2 := fastpathTV.DecMapFloat32Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]float32: - fastpathTV.DecMapBoolFloat32V(v, false, d) - case *map[bool]float32: - var v2 map[bool]float32 - v2, changed = fastpathTV.DecMapBoolFloat32V(*v, true, d) - if changed { + + case map[float32]int64: + fastpathTV.DecMapFloat32Int64V(v, fastpathCheckNilFalse, false, d) + case *map[float32]int64: + v2, changed2 := fastpathTV.DecMapFloat32Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]float64: - fastpathTV.DecMapBoolFloat64V(v, false, d) - case *map[bool]float64: - var v2 map[bool]float64 - v2, changed = fastpathTV.DecMapBoolFloat64V(*v, true, d) - if changed { + + case map[float32]float32: + fastpathTV.DecMapFloat32Float32V(v, fastpathCheckNilFalse, false, d) + case *map[float32]float32: + v2, changed2 := fastpathTV.DecMapFloat32Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - case map[bool]bool: - fastpathTV.DecMapBoolBoolV(v, false, d) - case *map[bool]bool: - var v2 map[bool]bool - v2, changed = fastpathTV.DecMapBoolBoolV(*v, true, d) - if changed { + + case map[float32]float64: + fastpathTV.DecMapFloat32Float64V(v, fastpathCheckNilFalse, false, d) + case *map[float32]float64: + v2, changed2 := fastpathTV.DecMapFloat32Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { *v = v2 } - default: - _ = v // workaround https://github.com/golang/go/issues/12927 seen in go1.4 - return false - } - return true -} -func fastpathDecodeSetZeroTypeSwitch(iv interface{}) bool { - switch v := iv.(type) { + case map[float32]bool: + fastpathTV.DecMapFloat32BoolV(v, fastpathCheckNilFalse, false, d) + case *map[float32]bool: + v2, changed2 := fastpathTV.DecMapFloat32BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } - case *[]interface{}: - *v = nil - case *[]string: - *v = nil - case *[]float32: - *v = nil + case []float64: + fastpathTV.DecSliceFloat64V(v, fastpathCheckNilFalse, false, d) case *[]float64: - *v = nil - case *[]uint: - *v = nil - case *[]uint8: - *v = nil - case *[]uint16: - *v = nil - case *[]uint32: - *v = nil - case *[]uint64: - *v = nil - case *[]uintptr: - *v = nil - case *[]int: - *v = nil - case *[]int8: - *v = nil - case *[]int16: - *v = nil - case *[]int32: - *v = nil - case *[]int64: - *v = nil - case *[]bool: - *v = nil + v2, changed2 := fastpathTV.DecSliceFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } - case *map[interface{}]interface{}: - *v = nil - case *map[interface{}]string: - *v = nil - case *map[interface{}]uint: - *v = nil - case *map[interface{}]uint8: - *v = nil - case *map[interface{}]uint16: - *v = nil - case *map[interface{}]uint32: - *v = nil - case *map[interface{}]uint64: - *v = nil - case *map[interface{}]uintptr: - *v = nil - case *map[interface{}]int: - *v = nil - case *map[interface{}]int8: - *v = nil - case *map[interface{}]int16: - *v = nil - case *map[interface{}]int32: - *v = nil - case *map[interface{}]int64: - *v = nil - case *map[interface{}]float32: - *v = nil - case *map[interface{}]float64: - *v = nil - case *map[interface{}]bool: - *v = nil - case *map[string]interface{}: - *v = nil - case *map[string]string: - *v = nil - case *map[string]uint: - *v = nil - case *map[string]uint8: - *v = nil - case *map[string]uint16: - *v = nil - case *map[string]uint32: - *v = nil - case *map[string]uint64: - *v = nil - case *map[string]uintptr: - *v = nil - case *map[string]int: - *v = nil - case *map[string]int8: - *v = nil - case *map[string]int16: - *v = nil - case *map[string]int32: - *v = nil - case *map[string]int64: - *v = nil - case *map[string]float32: - *v = nil - case *map[string]float64: - *v = nil - case *map[string]bool: - *v = nil - case *map[float32]interface{}: - *v = nil - case *map[float32]string: - *v = nil - case *map[float32]uint: - *v = nil - case *map[float32]uint8: - *v = nil - case *map[float32]uint16: - *v = nil - case *map[float32]uint32: - *v = nil - case *map[float32]uint64: - *v = nil - case *map[float32]uintptr: - *v = nil - case *map[float32]int: - *v = nil - case *map[float32]int8: - *v = nil - case *map[float32]int16: - *v = nil - case *map[float32]int32: - *v = nil - case *map[float32]int64: - *v = nil - case *map[float32]float32: - *v = nil - case *map[float32]float64: - *v = nil - case *map[float32]bool: - *v = nil + case map[float64]interface{}: + fastpathTV.DecMapFloat64IntfV(v, fastpathCheckNilFalse, false, d) case *map[float64]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]string: + fastpathTV.DecMapFloat64StringV(v, fastpathCheckNilFalse, false, d) case *map[float64]string: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]uint: + fastpathTV.DecMapFloat64UintV(v, fastpathCheckNilFalse, false, d) case *map[float64]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]uint8: + fastpathTV.DecMapFloat64Uint8V(v, fastpathCheckNilFalse, false, d) case *map[float64]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]uint16: + fastpathTV.DecMapFloat64Uint16V(v, fastpathCheckNilFalse, false, d) case *map[float64]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]uint32: + fastpathTV.DecMapFloat64Uint32V(v, fastpathCheckNilFalse, false, d) case *map[float64]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]uint64: + fastpathTV.DecMapFloat64Uint64V(v, fastpathCheckNilFalse, false, d) case *map[float64]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]uintptr: + fastpathTV.DecMapFloat64UintptrV(v, fastpathCheckNilFalse, false, d) case *map[float64]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]int: + fastpathTV.DecMapFloat64IntV(v, fastpathCheckNilFalse, false, d) case *map[float64]int: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]int8: + fastpathTV.DecMapFloat64Int8V(v, fastpathCheckNilFalse, false, d) case *map[float64]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]int16: + fastpathTV.DecMapFloat64Int16V(v, fastpathCheckNilFalse, false, d) case *map[float64]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]int32: + fastpathTV.DecMapFloat64Int32V(v, fastpathCheckNilFalse, false, d) case *map[float64]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]int64: + fastpathTV.DecMapFloat64Int64V(v, fastpathCheckNilFalse, false, d) case *map[float64]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]float32: + fastpathTV.DecMapFloat64Float32V(v, fastpathCheckNilFalse, false, d) case *map[float64]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]float64: + fastpathTV.DecMapFloat64Float64V(v, fastpathCheckNilFalse, false, d) case *map[float64]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[float64]bool: + fastpathTV.DecMapFloat64BoolV(v, fastpathCheckNilFalse, false, d) case *map[float64]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapFloat64BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []uint: + fastpathTV.DecSliceUintV(v, fastpathCheckNilFalse, false, d) + case *[]uint: + v2, changed2 := fastpathTV.DecSliceUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]interface{}: + fastpathTV.DecMapUintIntfV(v, fastpathCheckNilFalse, false, d) case *map[uint]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapUintIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]string: + fastpathTV.DecMapUintStringV(v, fastpathCheckNilFalse, false, d) case *map[uint]string: - *v = nil + v2, changed2 := fastpathTV.DecMapUintStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]uint: + fastpathTV.DecMapUintUintV(v, fastpathCheckNilFalse, false, d) case *map[uint]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapUintUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]uint8: + fastpathTV.DecMapUintUint8V(v, fastpathCheckNilFalse, false, d) case *map[uint]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapUintUint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]uint16: + fastpathTV.DecMapUintUint16V(v, fastpathCheckNilFalse, false, d) case *map[uint]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapUintUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]uint32: + fastpathTV.DecMapUintUint32V(v, fastpathCheckNilFalse, false, d) case *map[uint]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapUintUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]uint64: + fastpathTV.DecMapUintUint64V(v, fastpathCheckNilFalse, false, d) case *map[uint]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapUintUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]uintptr: + fastpathTV.DecMapUintUintptrV(v, fastpathCheckNilFalse, false, d) case *map[uint]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapUintUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]int: + fastpathTV.DecMapUintIntV(v, fastpathCheckNilFalse, false, d) case *map[uint]int: - *v = nil + v2, changed2 := fastpathTV.DecMapUintIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]int8: + fastpathTV.DecMapUintInt8V(v, fastpathCheckNilFalse, false, d) case *map[uint]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapUintInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]int16: + fastpathTV.DecMapUintInt16V(v, fastpathCheckNilFalse, false, d) case *map[uint]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapUintInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]int32: + fastpathTV.DecMapUintInt32V(v, fastpathCheckNilFalse, false, d) case *map[uint]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapUintInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]int64: + fastpathTV.DecMapUintInt64V(v, fastpathCheckNilFalse, false, d) case *map[uint]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapUintInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]float32: + fastpathTV.DecMapUintFloat32V(v, fastpathCheckNilFalse, false, d) case *map[uint]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapUintFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]float64: + fastpathTV.DecMapUintFloat64V(v, fastpathCheckNilFalse, false, d) case *map[uint]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapUintFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint]bool: + fastpathTV.DecMapUintBoolV(v, fastpathCheckNilFalse, false, d) case *map[uint]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapUintBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]interface{}: + fastpathTV.DecMapUint8IntfV(v, fastpathCheckNilFalse, false, d) case *map[uint8]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]string: + fastpathTV.DecMapUint8StringV(v, fastpathCheckNilFalse, false, d) case *map[uint8]string: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]uint: + fastpathTV.DecMapUint8UintV(v, fastpathCheckNilFalse, false, d) case *map[uint8]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]uint8: + fastpathTV.DecMapUint8Uint8V(v, fastpathCheckNilFalse, false, d) case *map[uint8]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]uint16: + fastpathTV.DecMapUint8Uint16V(v, fastpathCheckNilFalse, false, d) case *map[uint8]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]uint32: + fastpathTV.DecMapUint8Uint32V(v, fastpathCheckNilFalse, false, d) case *map[uint8]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]uint64: + fastpathTV.DecMapUint8Uint64V(v, fastpathCheckNilFalse, false, d) case *map[uint8]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]uintptr: + fastpathTV.DecMapUint8UintptrV(v, fastpathCheckNilFalse, false, d) case *map[uint8]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]int: + fastpathTV.DecMapUint8IntV(v, fastpathCheckNilFalse, false, d) case *map[uint8]int: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]int8: + fastpathTV.DecMapUint8Int8V(v, fastpathCheckNilFalse, false, d) case *map[uint8]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]int16: + fastpathTV.DecMapUint8Int16V(v, fastpathCheckNilFalse, false, d) case *map[uint8]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]int32: + fastpathTV.DecMapUint8Int32V(v, fastpathCheckNilFalse, false, d) case *map[uint8]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]int64: + fastpathTV.DecMapUint8Int64V(v, fastpathCheckNilFalse, false, d) case *map[uint8]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]float32: + fastpathTV.DecMapUint8Float32V(v, fastpathCheckNilFalse, false, d) case *map[uint8]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]float64: + fastpathTV.DecMapUint8Float64V(v, fastpathCheckNilFalse, false, d) case *map[uint8]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint8]bool: + fastpathTV.DecMapUint8BoolV(v, fastpathCheckNilFalse, false, d) case *map[uint8]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapUint8BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []uint16: + fastpathTV.DecSliceUint16V(v, fastpathCheckNilFalse, false, d) + case *[]uint16: + v2, changed2 := fastpathTV.DecSliceUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]interface{}: + fastpathTV.DecMapUint16IntfV(v, fastpathCheckNilFalse, false, d) case *map[uint16]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]string: + fastpathTV.DecMapUint16StringV(v, fastpathCheckNilFalse, false, d) case *map[uint16]string: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]uint: + fastpathTV.DecMapUint16UintV(v, fastpathCheckNilFalse, false, d) case *map[uint16]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]uint8: + fastpathTV.DecMapUint16Uint8V(v, fastpathCheckNilFalse, false, d) case *map[uint16]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]uint16: + fastpathTV.DecMapUint16Uint16V(v, fastpathCheckNilFalse, false, d) case *map[uint16]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]uint32: + fastpathTV.DecMapUint16Uint32V(v, fastpathCheckNilFalse, false, d) case *map[uint16]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]uint64: + fastpathTV.DecMapUint16Uint64V(v, fastpathCheckNilFalse, false, d) case *map[uint16]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]uintptr: + fastpathTV.DecMapUint16UintptrV(v, fastpathCheckNilFalse, false, d) case *map[uint16]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]int: + fastpathTV.DecMapUint16IntV(v, fastpathCheckNilFalse, false, d) case *map[uint16]int: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]int8: + fastpathTV.DecMapUint16Int8V(v, fastpathCheckNilFalse, false, d) case *map[uint16]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]int16: + fastpathTV.DecMapUint16Int16V(v, fastpathCheckNilFalse, false, d) case *map[uint16]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]int32: + fastpathTV.DecMapUint16Int32V(v, fastpathCheckNilFalse, false, d) case *map[uint16]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]int64: + fastpathTV.DecMapUint16Int64V(v, fastpathCheckNilFalse, false, d) case *map[uint16]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]float32: + fastpathTV.DecMapUint16Float32V(v, fastpathCheckNilFalse, false, d) case *map[uint16]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]float64: + fastpathTV.DecMapUint16Float64V(v, fastpathCheckNilFalse, false, d) case *map[uint16]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint16]bool: + fastpathTV.DecMapUint16BoolV(v, fastpathCheckNilFalse, false, d) case *map[uint16]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapUint16BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []uint32: + fastpathTV.DecSliceUint32V(v, fastpathCheckNilFalse, false, d) + case *[]uint32: + v2, changed2 := fastpathTV.DecSliceUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]interface{}: + fastpathTV.DecMapUint32IntfV(v, fastpathCheckNilFalse, false, d) case *map[uint32]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]string: + fastpathTV.DecMapUint32StringV(v, fastpathCheckNilFalse, false, d) case *map[uint32]string: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]uint: + fastpathTV.DecMapUint32UintV(v, fastpathCheckNilFalse, false, d) case *map[uint32]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]uint8: + fastpathTV.DecMapUint32Uint8V(v, fastpathCheckNilFalse, false, d) case *map[uint32]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]uint16: + fastpathTV.DecMapUint32Uint16V(v, fastpathCheckNilFalse, false, d) case *map[uint32]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]uint32: + fastpathTV.DecMapUint32Uint32V(v, fastpathCheckNilFalse, false, d) case *map[uint32]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]uint64: + fastpathTV.DecMapUint32Uint64V(v, fastpathCheckNilFalse, false, d) case *map[uint32]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]uintptr: + fastpathTV.DecMapUint32UintptrV(v, fastpathCheckNilFalse, false, d) case *map[uint32]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]int: + fastpathTV.DecMapUint32IntV(v, fastpathCheckNilFalse, false, d) case *map[uint32]int: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]int8: + fastpathTV.DecMapUint32Int8V(v, fastpathCheckNilFalse, false, d) case *map[uint32]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]int16: + fastpathTV.DecMapUint32Int16V(v, fastpathCheckNilFalse, false, d) case *map[uint32]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]int32: + fastpathTV.DecMapUint32Int32V(v, fastpathCheckNilFalse, false, d) case *map[uint32]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]int64: + fastpathTV.DecMapUint32Int64V(v, fastpathCheckNilFalse, false, d) case *map[uint32]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]float32: + fastpathTV.DecMapUint32Float32V(v, fastpathCheckNilFalse, false, d) case *map[uint32]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]float64: + fastpathTV.DecMapUint32Float64V(v, fastpathCheckNilFalse, false, d) case *map[uint32]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint32]bool: + fastpathTV.DecMapUint32BoolV(v, fastpathCheckNilFalse, false, d) case *map[uint32]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapUint32BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []uint64: + fastpathTV.DecSliceUint64V(v, fastpathCheckNilFalse, false, d) + case *[]uint64: + v2, changed2 := fastpathTV.DecSliceUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]interface{}: + fastpathTV.DecMapUint64IntfV(v, fastpathCheckNilFalse, false, d) case *map[uint64]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]string: + fastpathTV.DecMapUint64StringV(v, fastpathCheckNilFalse, false, d) case *map[uint64]string: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]uint: + fastpathTV.DecMapUint64UintV(v, fastpathCheckNilFalse, false, d) case *map[uint64]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]uint8: + fastpathTV.DecMapUint64Uint8V(v, fastpathCheckNilFalse, false, d) case *map[uint64]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]uint16: + fastpathTV.DecMapUint64Uint16V(v, fastpathCheckNilFalse, false, d) case *map[uint64]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]uint32: + fastpathTV.DecMapUint64Uint32V(v, fastpathCheckNilFalse, false, d) case *map[uint64]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]uint64: + fastpathTV.DecMapUint64Uint64V(v, fastpathCheckNilFalse, false, d) case *map[uint64]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]uintptr: + fastpathTV.DecMapUint64UintptrV(v, fastpathCheckNilFalse, false, d) case *map[uint64]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]int: + fastpathTV.DecMapUint64IntV(v, fastpathCheckNilFalse, false, d) case *map[uint64]int: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]int8: + fastpathTV.DecMapUint64Int8V(v, fastpathCheckNilFalse, false, d) case *map[uint64]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]int16: + fastpathTV.DecMapUint64Int16V(v, fastpathCheckNilFalse, false, d) case *map[uint64]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]int32: + fastpathTV.DecMapUint64Int32V(v, fastpathCheckNilFalse, false, d) case *map[uint64]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]int64: + fastpathTV.DecMapUint64Int64V(v, fastpathCheckNilFalse, false, d) case *map[uint64]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]float32: + fastpathTV.DecMapUint64Float32V(v, fastpathCheckNilFalse, false, d) case *map[uint64]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]float64: + fastpathTV.DecMapUint64Float64V(v, fastpathCheckNilFalse, false, d) case *map[uint64]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uint64]bool: + fastpathTV.DecMapUint64BoolV(v, fastpathCheckNilFalse, false, d) case *map[uint64]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapUint64BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []uintptr: + fastpathTV.DecSliceUintptrV(v, fastpathCheckNilFalse, false, d) + case *[]uintptr: + v2, changed2 := fastpathTV.DecSliceUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]interface{}: + fastpathTV.DecMapUintptrIntfV(v, fastpathCheckNilFalse, false, d) case *map[uintptr]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]string: + fastpathTV.DecMapUintptrStringV(v, fastpathCheckNilFalse, false, d) case *map[uintptr]string: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]uint: + fastpathTV.DecMapUintptrUintV(v, fastpathCheckNilFalse, false, d) case *map[uintptr]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]uint8: + fastpathTV.DecMapUintptrUint8V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrUint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]uint16: + fastpathTV.DecMapUintptrUint16V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]uint32: + fastpathTV.DecMapUintptrUint32V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]uint64: + fastpathTV.DecMapUintptrUint64V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]uintptr: + fastpathTV.DecMapUintptrUintptrV(v, fastpathCheckNilFalse, false, d) case *map[uintptr]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]int: + fastpathTV.DecMapUintptrIntV(v, fastpathCheckNilFalse, false, d) case *map[uintptr]int: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]int8: + fastpathTV.DecMapUintptrInt8V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]int16: + fastpathTV.DecMapUintptrInt16V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]int32: + fastpathTV.DecMapUintptrInt32V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]int64: + fastpathTV.DecMapUintptrInt64V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]float32: + fastpathTV.DecMapUintptrFloat32V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]float64: + fastpathTV.DecMapUintptrFloat64V(v, fastpathCheckNilFalse, false, d) case *map[uintptr]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[uintptr]bool: + fastpathTV.DecMapUintptrBoolV(v, fastpathCheckNilFalse, false, d) case *map[uintptr]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapUintptrBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []int: + fastpathTV.DecSliceIntV(v, fastpathCheckNilFalse, false, d) + case *[]int: + v2, changed2 := fastpathTV.DecSliceIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]interface{}: + fastpathTV.DecMapIntIntfV(v, fastpathCheckNilFalse, false, d) case *map[int]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapIntIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]string: + fastpathTV.DecMapIntStringV(v, fastpathCheckNilFalse, false, d) case *map[int]string: - *v = nil + v2, changed2 := fastpathTV.DecMapIntStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]uint: + fastpathTV.DecMapIntUintV(v, fastpathCheckNilFalse, false, d) case *map[int]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapIntUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]uint8: + fastpathTV.DecMapIntUint8V(v, fastpathCheckNilFalse, false, d) case *map[int]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapIntUint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]uint16: + fastpathTV.DecMapIntUint16V(v, fastpathCheckNilFalse, false, d) case *map[int]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapIntUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]uint32: + fastpathTV.DecMapIntUint32V(v, fastpathCheckNilFalse, false, d) case *map[int]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapIntUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]uint64: + fastpathTV.DecMapIntUint64V(v, fastpathCheckNilFalse, false, d) case *map[int]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapIntUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]uintptr: + fastpathTV.DecMapIntUintptrV(v, fastpathCheckNilFalse, false, d) case *map[int]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapIntUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]int: + fastpathTV.DecMapIntIntV(v, fastpathCheckNilFalse, false, d) case *map[int]int: - *v = nil + v2, changed2 := fastpathTV.DecMapIntIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]int8: + fastpathTV.DecMapIntInt8V(v, fastpathCheckNilFalse, false, d) case *map[int]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapIntInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]int16: + fastpathTV.DecMapIntInt16V(v, fastpathCheckNilFalse, false, d) case *map[int]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapIntInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]int32: + fastpathTV.DecMapIntInt32V(v, fastpathCheckNilFalse, false, d) case *map[int]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapIntInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]int64: + fastpathTV.DecMapIntInt64V(v, fastpathCheckNilFalse, false, d) case *map[int]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapIntInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]float32: + fastpathTV.DecMapIntFloat32V(v, fastpathCheckNilFalse, false, d) case *map[int]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapIntFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]float64: + fastpathTV.DecMapIntFloat64V(v, fastpathCheckNilFalse, false, d) case *map[int]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapIntFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int]bool: + fastpathTV.DecMapIntBoolV(v, fastpathCheckNilFalse, false, d) case *map[int]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapIntBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []int8: + fastpathTV.DecSliceInt8V(v, fastpathCheckNilFalse, false, d) + case *[]int8: + v2, changed2 := fastpathTV.DecSliceInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]interface{}: + fastpathTV.DecMapInt8IntfV(v, fastpathCheckNilFalse, false, d) case *map[int8]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]string: + fastpathTV.DecMapInt8StringV(v, fastpathCheckNilFalse, false, d) case *map[int8]string: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]uint: + fastpathTV.DecMapInt8UintV(v, fastpathCheckNilFalse, false, d) case *map[int8]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]uint8: + fastpathTV.DecMapInt8Uint8V(v, fastpathCheckNilFalse, false, d) case *map[int8]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]uint16: + fastpathTV.DecMapInt8Uint16V(v, fastpathCheckNilFalse, false, d) case *map[int8]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]uint32: + fastpathTV.DecMapInt8Uint32V(v, fastpathCheckNilFalse, false, d) case *map[int8]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]uint64: + fastpathTV.DecMapInt8Uint64V(v, fastpathCheckNilFalse, false, d) case *map[int8]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]uintptr: + fastpathTV.DecMapInt8UintptrV(v, fastpathCheckNilFalse, false, d) case *map[int8]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]int: + fastpathTV.DecMapInt8IntV(v, fastpathCheckNilFalse, false, d) case *map[int8]int: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]int8: + fastpathTV.DecMapInt8Int8V(v, fastpathCheckNilFalse, false, d) case *map[int8]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]int16: + fastpathTV.DecMapInt8Int16V(v, fastpathCheckNilFalse, false, d) case *map[int8]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]int32: + fastpathTV.DecMapInt8Int32V(v, fastpathCheckNilFalse, false, d) case *map[int8]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]int64: + fastpathTV.DecMapInt8Int64V(v, fastpathCheckNilFalse, false, d) case *map[int8]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]float32: + fastpathTV.DecMapInt8Float32V(v, fastpathCheckNilFalse, false, d) case *map[int8]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]float64: + fastpathTV.DecMapInt8Float64V(v, fastpathCheckNilFalse, false, d) case *map[int8]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int8]bool: + fastpathTV.DecMapInt8BoolV(v, fastpathCheckNilFalse, false, d) case *map[int8]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapInt8BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []int16: + fastpathTV.DecSliceInt16V(v, fastpathCheckNilFalse, false, d) + case *[]int16: + v2, changed2 := fastpathTV.DecSliceInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]interface{}: + fastpathTV.DecMapInt16IntfV(v, fastpathCheckNilFalse, false, d) case *map[int16]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]string: + fastpathTV.DecMapInt16StringV(v, fastpathCheckNilFalse, false, d) case *map[int16]string: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]uint: + fastpathTV.DecMapInt16UintV(v, fastpathCheckNilFalse, false, d) case *map[int16]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]uint8: + fastpathTV.DecMapInt16Uint8V(v, fastpathCheckNilFalse, false, d) case *map[int16]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]uint16: + fastpathTV.DecMapInt16Uint16V(v, fastpathCheckNilFalse, false, d) case *map[int16]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]uint32: + fastpathTV.DecMapInt16Uint32V(v, fastpathCheckNilFalse, false, d) case *map[int16]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]uint64: + fastpathTV.DecMapInt16Uint64V(v, fastpathCheckNilFalse, false, d) case *map[int16]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]uintptr: + fastpathTV.DecMapInt16UintptrV(v, fastpathCheckNilFalse, false, d) case *map[int16]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]int: + fastpathTV.DecMapInt16IntV(v, fastpathCheckNilFalse, false, d) case *map[int16]int: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]int8: + fastpathTV.DecMapInt16Int8V(v, fastpathCheckNilFalse, false, d) case *map[int16]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]int16: + fastpathTV.DecMapInt16Int16V(v, fastpathCheckNilFalse, false, d) case *map[int16]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]int32: + fastpathTV.DecMapInt16Int32V(v, fastpathCheckNilFalse, false, d) case *map[int16]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]int64: + fastpathTV.DecMapInt16Int64V(v, fastpathCheckNilFalse, false, d) case *map[int16]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]float32: + fastpathTV.DecMapInt16Float32V(v, fastpathCheckNilFalse, false, d) case *map[int16]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]float64: + fastpathTV.DecMapInt16Float64V(v, fastpathCheckNilFalse, false, d) case *map[int16]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int16]bool: + fastpathTV.DecMapInt16BoolV(v, fastpathCheckNilFalse, false, d) case *map[int16]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapInt16BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []int32: + fastpathTV.DecSliceInt32V(v, fastpathCheckNilFalse, false, d) + case *[]int32: + v2, changed2 := fastpathTV.DecSliceInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]interface{}: + fastpathTV.DecMapInt32IntfV(v, fastpathCheckNilFalse, false, d) case *map[int32]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]string: + fastpathTV.DecMapInt32StringV(v, fastpathCheckNilFalse, false, d) case *map[int32]string: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]uint: + fastpathTV.DecMapInt32UintV(v, fastpathCheckNilFalse, false, d) case *map[int32]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]uint8: + fastpathTV.DecMapInt32Uint8V(v, fastpathCheckNilFalse, false, d) case *map[int32]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]uint16: + fastpathTV.DecMapInt32Uint16V(v, fastpathCheckNilFalse, false, d) case *map[int32]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]uint32: + fastpathTV.DecMapInt32Uint32V(v, fastpathCheckNilFalse, false, d) case *map[int32]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]uint64: + fastpathTV.DecMapInt32Uint64V(v, fastpathCheckNilFalse, false, d) case *map[int32]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]uintptr: + fastpathTV.DecMapInt32UintptrV(v, fastpathCheckNilFalse, false, d) case *map[int32]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]int: + fastpathTV.DecMapInt32IntV(v, fastpathCheckNilFalse, false, d) case *map[int32]int: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]int8: + fastpathTV.DecMapInt32Int8V(v, fastpathCheckNilFalse, false, d) case *map[int32]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]int16: + fastpathTV.DecMapInt32Int16V(v, fastpathCheckNilFalse, false, d) case *map[int32]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]int32: + fastpathTV.DecMapInt32Int32V(v, fastpathCheckNilFalse, false, d) case *map[int32]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]int64: + fastpathTV.DecMapInt32Int64V(v, fastpathCheckNilFalse, false, d) case *map[int32]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]float32: + fastpathTV.DecMapInt32Float32V(v, fastpathCheckNilFalse, false, d) case *map[int32]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]float64: + fastpathTV.DecMapInt32Float64V(v, fastpathCheckNilFalse, false, d) case *map[int32]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int32]bool: + fastpathTV.DecMapInt32BoolV(v, fastpathCheckNilFalse, false, d) case *map[int32]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapInt32BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []int64: + fastpathTV.DecSliceInt64V(v, fastpathCheckNilFalse, false, d) + case *[]int64: + v2, changed2 := fastpathTV.DecSliceInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]interface{}: + fastpathTV.DecMapInt64IntfV(v, fastpathCheckNilFalse, false, d) case *map[int64]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64IntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]string: + fastpathTV.DecMapInt64StringV(v, fastpathCheckNilFalse, false, d) case *map[int64]string: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64StringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]uint: + fastpathTV.DecMapInt64UintV(v, fastpathCheckNilFalse, false, d) case *map[int64]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64UintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]uint8: + fastpathTV.DecMapInt64Uint8V(v, fastpathCheckNilFalse, false, d) case *map[int64]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Uint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]uint16: + fastpathTV.DecMapInt64Uint16V(v, fastpathCheckNilFalse, false, d) case *map[int64]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Uint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]uint32: + fastpathTV.DecMapInt64Uint32V(v, fastpathCheckNilFalse, false, d) case *map[int64]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Uint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]uint64: + fastpathTV.DecMapInt64Uint64V(v, fastpathCheckNilFalse, false, d) case *map[int64]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Uint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]uintptr: + fastpathTV.DecMapInt64UintptrV(v, fastpathCheckNilFalse, false, d) case *map[int64]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64UintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]int: + fastpathTV.DecMapInt64IntV(v, fastpathCheckNilFalse, false, d) case *map[int64]int: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64IntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]int8: + fastpathTV.DecMapInt64Int8V(v, fastpathCheckNilFalse, false, d) case *map[int64]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Int8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]int16: + fastpathTV.DecMapInt64Int16V(v, fastpathCheckNilFalse, false, d) case *map[int64]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Int16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]int32: + fastpathTV.DecMapInt64Int32V(v, fastpathCheckNilFalse, false, d) case *map[int64]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Int32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]int64: + fastpathTV.DecMapInt64Int64V(v, fastpathCheckNilFalse, false, d) case *map[int64]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Int64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]float32: + fastpathTV.DecMapInt64Float32V(v, fastpathCheckNilFalse, false, d) case *map[int64]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Float32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]float64: + fastpathTV.DecMapInt64Float64V(v, fastpathCheckNilFalse, false, d) case *map[int64]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64Float64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[int64]bool: + fastpathTV.DecMapInt64BoolV(v, fastpathCheckNilFalse, false, d) case *map[int64]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapInt64BoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case []bool: + fastpathTV.DecSliceBoolV(v, fastpathCheckNilFalse, false, d) + case *[]bool: + v2, changed2 := fastpathTV.DecSliceBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]interface{}: + fastpathTV.DecMapBoolIntfV(v, fastpathCheckNilFalse, false, d) case *map[bool]interface{}: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolIntfV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]string: + fastpathTV.DecMapBoolStringV(v, fastpathCheckNilFalse, false, d) case *map[bool]string: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolStringV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]uint: + fastpathTV.DecMapBoolUintV(v, fastpathCheckNilFalse, false, d) case *map[bool]uint: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolUintV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]uint8: + fastpathTV.DecMapBoolUint8V(v, fastpathCheckNilFalse, false, d) case *map[bool]uint8: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolUint8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]uint16: + fastpathTV.DecMapBoolUint16V(v, fastpathCheckNilFalse, false, d) case *map[bool]uint16: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolUint16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]uint32: + fastpathTV.DecMapBoolUint32V(v, fastpathCheckNilFalse, false, d) case *map[bool]uint32: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolUint32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]uint64: + fastpathTV.DecMapBoolUint64V(v, fastpathCheckNilFalse, false, d) case *map[bool]uint64: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolUint64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]uintptr: + fastpathTV.DecMapBoolUintptrV(v, fastpathCheckNilFalse, false, d) case *map[bool]uintptr: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolUintptrV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]int: + fastpathTV.DecMapBoolIntV(v, fastpathCheckNilFalse, false, d) case *map[bool]int: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolIntV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]int8: + fastpathTV.DecMapBoolInt8V(v, fastpathCheckNilFalse, false, d) case *map[bool]int8: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolInt8V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]int16: + fastpathTV.DecMapBoolInt16V(v, fastpathCheckNilFalse, false, d) case *map[bool]int16: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolInt16V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]int32: + fastpathTV.DecMapBoolInt32V(v, fastpathCheckNilFalse, false, d) case *map[bool]int32: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolInt32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]int64: + fastpathTV.DecMapBoolInt64V(v, fastpathCheckNilFalse, false, d) case *map[bool]int64: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolInt64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]float32: + fastpathTV.DecMapBoolFloat32V(v, fastpathCheckNilFalse, false, d) case *map[bool]float32: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolFloat32V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]float64: + fastpathTV.DecMapBoolFloat64V(v, fastpathCheckNilFalse, false, d) case *map[bool]float64: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolFloat64V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + + case map[bool]bool: + fastpathTV.DecMapBoolBoolV(v, fastpathCheckNilFalse, false, d) case *map[bool]bool: - *v = nil + v2, changed2 := fastpathTV.DecMapBoolBoolV(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } + default: - _ = v // workaround https://github.com/golang/go/issues/12927 seen in go1.4 + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) return false } return true @@ -17721,29 +18123,36 @@ func fastpathDecodeSetZeroTypeSwitch(iv interface{}) bool { // -- -- fast path functions -func (d *Decoder) fastpathDecSliceIntfR(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]interface{}) - v, changed := fastpathTV.DecSliceIntfV(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceIntfR(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]interface{}) + v, changed := fastpathTV.DecSliceIntfV(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]interface{}) - v2, changed := fastpathTV.DecSliceIntfV(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]interface{}) + fastpathTV.DecSliceIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceIntfX(vp *[]interface{}, d *Decoder) { - v, changed := f.DecSliceIntfV(*vp, true, d) + +func (f fastpathT) DecSliceIntfX(vp *[]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecSliceIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceIntfV(v []interface{}, canChange bool, d *Decoder) (_ []interface{}, changed bool) { +func (_ fastpathT) DecSliceIntfV(v []interface{}, checkNil bool, canChange bool, d *Decoder) (_ []interface{}, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -17757,89 +18166,127 @@ func (_ fastpathT) DecSliceIntfV(v []interface{}, canChange bool, d *Decoder) (_ slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 16) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 16) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]interface{}, xlen) + } + } else { + v = make([]interface{}, xlen) + } + changed = true } else { - v = make([]interface{}, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 16) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + d.decode(&v[j]) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, nil) + slh.ElemContainerState(j) + d.decode(&v[j]) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]interface{}, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, nil) + if v == nil { + v = []interface{}{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = nil - } else { - d.decode(&v[j]) + if cap(v) == 0 { + v = make([]interface{}, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, nil) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + d.decode(&v[j]) + + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]interface{}, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceStringR(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]string) - v, changed := fastpathTV.DecSliceStringV(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceStringR(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]string) + v, changed := fastpathTV.DecSliceStringV(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]string) - v2, changed := fastpathTV.DecSliceStringV(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]string) + fastpathTV.DecSliceStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceStringX(vp *[]string, d *Decoder) { - v, changed := f.DecSliceStringV(*vp, true, d) + +func (f fastpathT) DecSliceStringX(vp *[]string, checkNil bool, d *Decoder) { + v, changed := f.DecSliceStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceStringV(v []string, canChange bool, d *Decoder) (_ []string, changed bool) { +func (_ fastpathT) DecSliceStringV(v []string, checkNil bool, canChange bool, d *Decoder) (_ []string, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -17853,190 +18300,131 @@ func (_ fastpathT) DecSliceStringV(v []string, canChange bool, d *Decoder) (_ [] slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 16) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 16) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]string, xlen) + } + } else { + v = make([]string, xlen) + } + changed = true } else { - v = make([]string, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 16) - } else { - xlen = 8 - } - v = make([]string, xlen) - changed = true - } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { if canChange { - v = append(v, "") + v = v[:containerLenS] changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = "" - } else { + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) v[j] = dd.DecodeString() } - } - if canChange { - if j < len(v) { - v = v[:j] - changed = true - } else if j == 0 && v == nil { - v = make([]string, 0) - changed = true - } - } - slh.End() - return v, changed -} - -func (d *Decoder) fastpathDecSliceFloat32R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]float32) - v, changed := fastpathTV.DecSliceFloat32V(*vp, !array, d) - if changed { - *vp = v + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, "") + slh.ElemContainerState(j) + v[j] = dd.DecodeString() + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() + } } } else { - v := rv2i(rv).([]float32) - v2, changed := fastpathTV.DecSliceFloat32V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } - } -} -func (f fastpathT) DecSliceFloat32X(vp *[]float32, d *Decoder) { - v, changed := f.DecSliceFloat32V(*vp, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceFloat32V(v []float32, canChange bool, d *Decoder) (_ []float32, changed bool) { - dd := d.d - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []float32{} - } else if len(v) != 0 { - v = v[:0] + breakFound := dd.CheckBreak() + if breakFound { + if canChange { + if v == nil { + v = []string{} + } else if len(v) != 0 { + v = v[:0] + } + changed = true } - changed = true + slh.End() + return v, changed } - slh.End() - return v, changed - } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { - if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 4) - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]float32, xlen) - } - changed = true - } else if containerLenS != len(v) { - v = v[:containerLenS] + if cap(v) == 0 { + v = make([]string, 1, 4) changed = true } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 4) - } else { - xlen = 8 + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, "") + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } } - v = make([]float32, xlen) - changed = true - } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true + slh.ElemContainerState(j) + if j < len(v) { + v[j] = dd.DecodeString() } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true + d.swallow() } + breakFound = dd.CheckBreak() } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = float32(chkOvf.Float32V(dd.DecodeFloat64())) - } - } - if canChange { - if j < len(v) { + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]float32, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceFloat64R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]float64) - v, changed := fastpathTV.DecSliceFloat64V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceFloat32R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]float32) + v, changed := fastpathTV.DecSliceFloat32V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]float64) - v2, changed := fastpathTV.DecSliceFloat64V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]float32) + fastpathTV.DecSliceFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceFloat64X(vp *[]float64, d *Decoder) { - v, changed := f.DecSliceFloat64V(*vp, true, d) + +func (f fastpathT) DecSliceFloat32X(vp *[]float32, checkNil bool, d *Decoder) { + v, changed := f.DecSliceFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceFloat64V(v []float64, canChange bool, d *Decoder) (_ []float64, changed bool) { +func (_ fastpathT) DecSliceFloat32V(v []float32, checkNil bool, canChange bool, d *Decoder) (_ []float32, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { if v == nil { - v = []float64{} + v = []float32{} } else if len(v) != 0 { v = v[:0] } @@ -18045,94 +18433,131 @@ func (_ fastpathT) DecSliceFloat64V(v []float64, canChange bool, d *Decoder) (_ slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 4) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]float32, xlen) + } + } else { + v = make([]float32, xlen) + } + changed = true } else { - v = make([]float64, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = float32(dd.DecodeFloat(true)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = float32(dd.DecodeFloat(true)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]float64, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []float32{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = dd.DecodeFloat64() + if cap(v) == 0 { + v = make([]float32, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = float32(dd.DecodeFloat(true)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]float64, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceUintR(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]uint) - v, changed := fastpathTV.DecSliceUintV(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceFloat64R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]float64) + v, changed := fastpathTV.DecSliceFloat64V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]uint) - v2, changed := fastpathTV.DecSliceUintV(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]float64) + fastpathTV.DecSliceFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceUintX(vp *[]uint, d *Decoder) { - v, changed := f.DecSliceUintV(*vp, true, d) + +func (f fastpathT) DecSliceFloat64X(vp *[]float64, checkNil bool, d *Decoder) { + v, changed := f.DecSliceFloat64V(*vp, checkNil, true, d) if changed { *vp = v } -} -func (_ fastpathT) DecSliceUintV(v []uint, canChange bool, d *Decoder) (_ []uint, changed bool) { - dd := d.d +} +func (_ fastpathT) DecSliceFloat64V(v []float64, checkNil bool, canChange bool, d *Decoder) (_ []float64, changed bool) { + dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { if v == nil { - v = []uint{} + v = []float64{} } else if len(v) != 0 { v = v[:0] } @@ -18141,94 +18566,131 @@ func (_ fastpathT) DecSliceUintV(v []uint, canChange bool, d *Decoder) (_ []uint slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]float64, xlen) + } + } else { + v = make([]float64, xlen) + } + changed = true } else { - v = make([]uint, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = dd.DecodeFloat(false) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = dd.DecodeFloat(false) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]uint, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []float64{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) + if cap(v) == 0 { + v = make([]float64, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = dd.DecodeFloat(false) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]uint, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceUint8R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]uint8) - v, changed := fastpathTV.DecSliceUint8V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceUintR(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]uint) + v, changed := fastpathTV.DecSliceUintV(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]uint8) - v2, changed := fastpathTV.DecSliceUint8V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]uint) + fastpathTV.DecSliceUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceUint8X(vp *[]uint8, d *Decoder) { - v, changed := f.DecSliceUint8V(*vp, true, d) + +func (f fastpathT) DecSliceUintX(vp *[]uint, checkNil bool, d *Decoder) { + v, changed := f.DecSliceUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceUint8V(v []uint8, canChange bool, d *Decoder) (_ []uint8, changed bool) { +func (_ fastpathT) DecSliceUintV(v []uint, checkNil bool, canChange bool, d *Decoder) (_ []uint, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { if v == nil { - v = []uint8{} + v = []uint{} } else if len(v) != 0 { v = v[:0] } @@ -18237,89 +18699,126 @@ func (_ fastpathT) DecSliceUint8V(v []uint8, canChange bool, d *Decoder) (_ []ui slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 1) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]uint, xlen) + } + } else { + v = make([]uint, xlen) + } + changed = true } else { - v = make([]uint8, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 1) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = uint(dd.DecodeUint(uintBitsize)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = uint(dd.DecodeUint(uintBitsize)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]uint8, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []uint{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) + if cap(v) == 0 { + v = make([]uint, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = uint(dd.DecodeUint(uintBitsize)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]uint8, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceUint16R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]uint16) - v, changed := fastpathTV.DecSliceUint16V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceUint16R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]uint16) + v, changed := fastpathTV.DecSliceUint16V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]uint16) - v2, changed := fastpathTV.DecSliceUint16V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]uint16) + fastpathTV.DecSliceUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceUint16X(vp *[]uint16, d *Decoder) { - v, changed := f.DecSliceUint16V(*vp, true, d) + +func (f fastpathT) DecSliceUint16X(vp *[]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecSliceUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceUint16V(v []uint16, canChange bool, d *Decoder) (_ []uint16, changed bool) { +func (_ fastpathT) DecSliceUint16V(v []uint16, checkNil bool, canChange bool, d *Decoder) (_ []uint16, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18333,89 +18832,126 @@ func (_ fastpathT) DecSliceUint16V(v []uint16, canChange bool, d *Decoder) (_ [] slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 2) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 2) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]uint16, xlen) + } + } else { + v = make([]uint16, xlen) + } + changed = true } else { - v = make([]uint16, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 2) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = uint16(dd.DecodeUint(16)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = uint16(dd.DecodeUint(16)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]uint16, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []uint16{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) + if cap(v) == 0 { + v = make([]uint16, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = uint16(dd.DecodeUint(16)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]uint16, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceUint32R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]uint32) - v, changed := fastpathTV.DecSliceUint32V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceUint32R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]uint32) + v, changed := fastpathTV.DecSliceUint32V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]uint32) - v2, changed := fastpathTV.DecSliceUint32V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]uint32) + fastpathTV.DecSliceUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceUint32X(vp *[]uint32, d *Decoder) { - v, changed := f.DecSliceUint32V(*vp, true, d) + +func (f fastpathT) DecSliceUint32X(vp *[]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecSliceUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceUint32V(v []uint32, canChange bool, d *Decoder) (_ []uint32, changed bool) { +func (_ fastpathT) DecSliceUint32V(v []uint32, checkNil bool, canChange bool, d *Decoder) (_ []uint32, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18429,89 +18965,126 @@ func (_ fastpathT) DecSliceUint32V(v []uint32, canChange bool, d *Decoder) (_ [] slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 4) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 4) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]uint32, xlen) + } + } else { + v = make([]uint32, xlen) + } + changed = true } else { - v = make([]uint32, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 4) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = uint32(dd.DecodeUint(32)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = uint32(dd.DecodeUint(32)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]uint32, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []uint32{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) + if cap(v) == 0 { + v = make([]uint32, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = uint32(dd.DecodeUint(32)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]uint32, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceUint64R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]uint64) - v, changed := fastpathTV.DecSliceUint64V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceUint64R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]uint64) + v, changed := fastpathTV.DecSliceUint64V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]uint64) - v2, changed := fastpathTV.DecSliceUint64V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]uint64) + fastpathTV.DecSliceUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceUint64X(vp *[]uint64, d *Decoder) { - v, changed := f.DecSliceUint64V(*vp, true, d) + +func (f fastpathT) DecSliceUint64X(vp *[]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecSliceUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceUint64V(v []uint64, canChange bool, d *Decoder) (_ []uint64, changed bool) { +func (_ fastpathT) DecSliceUint64V(v []uint64, checkNil bool, canChange bool, d *Decoder) (_ []uint64, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18525,89 +19098,126 @@ func (_ fastpathT) DecSliceUint64V(v []uint64, canChange bool, d *Decoder) (_ [] slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]uint64, xlen) + } + } else { + v = make([]uint64, xlen) + } + changed = true } else { - v = make([]uint64, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = dd.DecodeUint(64) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = dd.DecodeUint(64) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]uint64, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []uint64{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = dd.DecodeUint64() + if cap(v) == 0 { + v = make([]uint64, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = dd.DecodeUint(64) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]uint64, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceUintptrR(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]uintptr) - v, changed := fastpathTV.DecSliceUintptrV(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceUintptrR(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]uintptr) + v, changed := fastpathTV.DecSliceUintptrV(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]uintptr) - v2, changed := fastpathTV.DecSliceUintptrV(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]uintptr) + fastpathTV.DecSliceUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceUintptrX(vp *[]uintptr, d *Decoder) { - v, changed := f.DecSliceUintptrV(*vp, true, d) + +func (f fastpathT) DecSliceUintptrX(vp *[]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecSliceUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceUintptrV(v []uintptr, canChange bool, d *Decoder) (_ []uintptr, changed bool) { +func (_ fastpathT) DecSliceUintptrV(v []uintptr, checkNil bool, canChange bool, d *Decoder) (_ []uintptr, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18621,89 +19231,126 @@ func (_ fastpathT) DecSliceUintptrV(v []uintptr, canChange bool, d *Decoder) (_ slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]uintptr, xlen) + } + } else { + v = make([]uintptr, xlen) + } + changed = true } else { - v = make([]uintptr, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = uintptr(dd.DecodeUint(uintBitsize)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = uintptr(dd.DecodeUint(uintBitsize)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]uintptr, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []uintptr{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) + if cap(v) == 0 { + v = make([]uintptr, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = uintptr(dd.DecodeUint(uintBitsize)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]uintptr, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceIntR(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]int) - v, changed := fastpathTV.DecSliceIntV(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceIntR(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]int) + v, changed := fastpathTV.DecSliceIntV(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]int) - v2, changed := fastpathTV.DecSliceIntV(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]int) + fastpathTV.DecSliceIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceIntX(vp *[]int, d *Decoder) { - v, changed := f.DecSliceIntV(*vp, true, d) + +func (f fastpathT) DecSliceIntX(vp *[]int, checkNil bool, d *Decoder) { + v, changed := f.DecSliceIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceIntV(v []int, canChange bool, d *Decoder) (_ []int, changed bool) { +func (_ fastpathT) DecSliceIntV(v []int, checkNil bool, canChange bool, d *Decoder) (_ []int, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18717,89 +19364,126 @@ func (_ fastpathT) DecSliceIntV(v []int, canChange bool, d *Decoder) (_ []int, c slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]int, xlen) + } + } else { + v = make([]int, xlen) + } + changed = true } else { - v = make([]int, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = int(dd.DecodeInt(intBitsize)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = int(dd.DecodeInt(intBitsize)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]int, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []int{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) + if cap(v) == 0 { + v = make([]int, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = int(dd.DecodeInt(intBitsize)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]int, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceInt8R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]int8) - v, changed := fastpathTV.DecSliceInt8V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceInt8R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]int8) + v, changed := fastpathTV.DecSliceInt8V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]int8) - v2, changed := fastpathTV.DecSliceInt8V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]int8) + fastpathTV.DecSliceInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceInt8X(vp *[]int8, d *Decoder) { - v, changed := f.DecSliceInt8V(*vp, true, d) + +func (f fastpathT) DecSliceInt8X(vp *[]int8, checkNil bool, d *Decoder) { + v, changed := f.DecSliceInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceInt8V(v []int8, canChange bool, d *Decoder) (_ []int8, changed bool) { +func (_ fastpathT) DecSliceInt8V(v []int8, checkNil bool, canChange bool, d *Decoder) (_ []int8, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18813,89 +19497,126 @@ func (_ fastpathT) DecSliceInt8V(v []int8, canChange bool, d *Decoder) (_ []int8 slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 1) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 1) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]int8, xlen) + } + } else { + v = make([]int8, xlen) + } + changed = true } else { - v = make([]int8, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 1) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = int8(dd.DecodeInt(8)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = int8(dd.DecodeInt(8)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() + } + } + } else { + breakFound := dd.CheckBreak() + if breakFound { + if canChange { + if v == nil { + v = []int8{} + } else if len(v) != 0 { + v = v[:0] + } + changed = true } - v = make([]int8, xlen) + slh.End() + return v, changed + } + if cap(v) == 0 { + v = make([]int8, 1, 4) changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = int8(dd.DecodeInt(8)) } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true + d.swallow() } + breakFound = dd.CheckBreak() } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - } - } - if canChange { - if j < len(v) { + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]int8, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceInt16R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]int16) - v, changed := fastpathTV.DecSliceInt16V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceInt16R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]int16) + v, changed := fastpathTV.DecSliceInt16V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]int16) - v2, changed := fastpathTV.DecSliceInt16V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]int16) + fastpathTV.DecSliceInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceInt16X(vp *[]int16, d *Decoder) { - v, changed := f.DecSliceInt16V(*vp, true, d) + +func (f fastpathT) DecSliceInt16X(vp *[]int16, checkNil bool, d *Decoder) { + v, changed := f.DecSliceInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceInt16V(v []int16, canChange bool, d *Decoder) (_ []int16, changed bool) { +func (_ fastpathT) DecSliceInt16V(v []int16, checkNil bool, canChange bool, d *Decoder) (_ []int16, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -18909,89 +19630,126 @@ func (_ fastpathT) DecSliceInt16V(v []int16, canChange bool, d *Decoder) (_ []in slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 2) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 2) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]int16, xlen) + } + } else { + v = make([]int16, xlen) + } + changed = true } else { - v = make([]int16, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 2) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = int16(dd.DecodeInt(16)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = int16(dd.DecodeInt(16)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]int16, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []int16{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) + if cap(v) == 0 { + v = make([]int16, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = int16(dd.DecodeInt(16)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]int16, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceInt32R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]int32) - v, changed := fastpathTV.DecSliceInt32V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceInt32R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]int32) + v, changed := fastpathTV.DecSliceInt32V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]int32) - v2, changed := fastpathTV.DecSliceInt32V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]int32) + fastpathTV.DecSliceInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceInt32X(vp *[]int32, d *Decoder) { - v, changed := f.DecSliceInt32V(*vp, true, d) + +func (f fastpathT) DecSliceInt32X(vp *[]int32, checkNil bool, d *Decoder) { + v, changed := f.DecSliceInt32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceInt32V(v []int32, canChange bool, d *Decoder) (_ []int32, changed bool) { +func (_ fastpathT) DecSliceInt32V(v []int32, checkNil bool, canChange bool, d *Decoder) (_ []int32, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -19005,89 +19763,126 @@ func (_ fastpathT) DecSliceInt32V(v []int32, canChange bool, d *Decoder) (_ []in slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 4) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 4) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]int32, xlen) + } + } else { + v = make([]int32, xlen) + } + changed = true } else { - v = make([]int32, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 4) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = int32(dd.DecodeInt(32)) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = int32(dd.DecodeInt(32)) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]int32, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []int32{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) + if cap(v) == 0 { + v = make([]int32, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = int32(dd.DecodeInt(32)) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]int32, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceInt64R(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]int64) - v, changed := fastpathTV.DecSliceInt64V(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceInt64R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]int64) + v, changed := fastpathTV.DecSliceInt64V(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]int64) - v2, changed := fastpathTV.DecSliceInt64V(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]int64) + fastpathTV.DecSliceInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceInt64X(vp *[]int64, d *Decoder) { - v, changed := f.DecSliceInt64V(*vp, true, d) + +func (f fastpathT) DecSliceInt64X(vp *[]int64, checkNil bool, d *Decoder) { + v, changed := f.DecSliceInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceInt64V(v []int64, canChange bool, d *Decoder) (_ []int64, changed bool) { +func (_ fastpathT) DecSliceInt64V(v []int64, checkNil bool, canChange bool, d *Decoder) (_ []int64, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -19101,89 +19896,126 @@ func (_ fastpathT) DecSliceInt64V(v []int64, canChange bool, d *Decoder) (_ []in slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]int64, xlen) + } + } else { + v = make([]int64, xlen) + } + changed = true } else { - v = make([]int64, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 8) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = dd.DecodeInt(64) + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, 0) + slh.ElemContainerState(j) + v[j] = dd.DecodeInt(64) + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]int64, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, 0) + if v == nil { + v = []int64{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = 0 - } else { - v[j] = dd.DecodeInt64() + if cap(v) == 0 { + v = make([]int64, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, 0) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = dd.DecodeInt(64) + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]int64, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecSliceBoolR(f *codecFnInfo, rv reflect.Value) { - if array := f.seq == seqTypeArray; !array && rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*[]bool) - v, changed := fastpathTV.DecSliceBoolV(*vp, !array, d) +func (f *decFnInfo) fastpathDecSliceBoolR(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { + vp := rv.Addr().Interface().(*[]bool) + v, changed := fastpathTV.DecSliceBoolV(*vp, fastpathCheckNilFalse, !array, f.d) if changed { *vp = v } } else { - v := rv2i(rv).([]bool) - v2, changed := fastpathTV.DecSliceBoolV(v, !array, d) - if changed && len(v) > 0 && len(v2) > 0 && !(len(v2) == len(v) && &v2[0] == &v[0]) { - copy(v, v2) - } + v := rv.Interface().([]bool) + fastpathTV.DecSliceBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecSliceBoolX(vp *[]bool, d *Decoder) { - v, changed := f.DecSliceBoolV(*vp, true, d) + +func (f fastpathT) DecSliceBoolX(vp *[]bool, checkNil bool, d *Decoder) { + v, changed := f.DecSliceBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecSliceBoolV(v []bool, canChange bool, d *Decoder) (_ []bool, changed bool) { +func (_ fastpathT) DecSliceBoolV(v []bool, checkNil bool, canChange bool, d *Decoder) (_ []bool, changed bool) { dd := d.d + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + slh, containerLenS := d.decSliceHelperStart() if containerLenS == 0 { if canChange { @@ -19197,15326 +20029,19324 @@ func (_ fastpathT) DecSliceBoolV(v []bool, canChange bool, d *Decoder) (_ []bool slh.End() return v, changed } - hasLen := containerLenS > 0 - var xlen int - if hasLen && canChange { + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool if containerLenS > cap(v) { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 1) - if xlen <= cap(v) { - v = v[:xlen] + if canChange { + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 1) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]bool, xlen) + } + } else { + v = make([]bool, xlen) + } + changed = true } else { - v = make([]bool, xlen) + d.arrayCannotExpand(len(v), containerLenS) } - changed = true + x2read = len(v) } else if containerLenS != len(v) { - v = v[:containerLenS] - changed = true + if canChange { + v = v[:containerLenS] + changed = true + } } - } - j := 0 - for ; (hasLen && j < containerLenS) || !(hasLen || dd.CheckBreak()); j++ { - if j == 0 && len(v) == 0 && canChange { - if hasLen { - xlen = decInferLen(containerLenS, d.h.MaxInitLen, 1) - } else { - xlen = 8 + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + v[j] = dd.DecodeBool() + } + if xtrunc { + for ; j < containerLenS; j++ { + v = append(v, false) + slh.ElemContainerState(j) + v[j] = dd.DecodeBool() + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() } - v = make([]bool, xlen) - changed = true } - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= len(v) { + } else { + breakFound := dd.CheckBreak() + if breakFound { if canChange { - v = append(v, false) + if v == nil { + v = []bool{} + } else if len(v) != 0 { + v = v[:0] + } changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - decodeIntoBlank = true } + slh.End() + return v, changed } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else if dd.TryDecodeAsNil() { - v[j] = false - } else { - v[j] = dd.DecodeBool() + if cap(v) == 0 { + v = make([]bool, 1, 4) + changed = true } - } - if canChange { - if j < len(v) { + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, false) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { + v[j] = dd.DecodeBool() + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { v = v[:j] changed = true - } else if j == 0 && v == nil { - v = make([]bool, 0) - changed = true } } slh.End() return v, changed } -func (d *Decoder) fastpathDecMapIntfIntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]interface{}) - v, changed := fastpathTV.DecMapIntfIntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfIntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]interface{}) + v, changed := fastpathTV.DecMapIntfIntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfIntfV(rv2i(rv).(map[interface{}]interface{}), false, d) + v := rv.Interface().(map[interface{}]interface{}) + fastpathTV.DecMapIntfIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfIntfX(vp *map[interface{}]interface{}, d *Decoder) { - v, changed := f.DecMapIntfIntfV(*vp, true, d) +func (f fastpathT) DecMapIntfIntfX(vp *map[interface{}]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfIntfV(v map[interface{}]interface{}, canChange bool, +func (_ fastpathT) DecMapIntfIntfV(v map[interface{}]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 32) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) v = make(map[interface{}]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk interface{} var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfStringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]string) - v, changed := fastpathTV.DecMapIntfStringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfStringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]string) + v, changed := fastpathTV.DecMapIntfStringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfStringV(rv2i(rv).(map[interface{}]string), false, d) + v := rv.Interface().(map[interface{}]string) + fastpathTV.DecMapIntfStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfStringX(vp *map[interface{}]string, d *Decoder) { - v, changed := f.DecMapIntfStringV(*vp, true, d) +func (f fastpathT) DecMapIntfStringX(vp *map[interface{}]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfStringV(v map[interface{}]string, canChange bool, +func (_ fastpathT) DecMapIntfStringV(v map[interface{}]string, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 32) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) v = make(map[interface{}]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfUintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]uint) - v, changed := fastpathTV.DecMapIntfUintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfUintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]uint) + v, changed := fastpathTV.DecMapIntfUintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfUintV(rv2i(rv).(map[interface{}]uint), false, d) + v := rv.Interface().(map[interface{}]uint) + fastpathTV.DecMapIntfUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfUintX(vp *map[interface{}]uint, d *Decoder) { - v, changed := f.DecMapIntfUintV(*vp, true, d) +func (f fastpathT) DecMapIntfUintX(vp *map[interface{}]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfUintV(v map[interface{}]uint, canChange bool, +func (_ fastpathT) DecMapIntfUintV(v map[interface{}]uint, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[interface{}]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfUint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]uint8) - v, changed := fastpathTV.DecMapIntfUint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfUint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]uint8) + v, changed := fastpathTV.DecMapIntfUint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfUint8V(rv2i(rv).(map[interface{}]uint8), false, d) + v := rv.Interface().(map[interface{}]uint8) + fastpathTV.DecMapIntfUint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfUint8X(vp *map[interface{}]uint8, d *Decoder) { - v, changed := f.DecMapIntfUint8V(*vp, true, d) +func (f fastpathT) DecMapIntfUint8X(vp *map[interface{}]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfUint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfUint8V(v map[interface{}]uint8, canChange bool, +func (_ fastpathT) DecMapIntfUint8V(v map[interface{}]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[interface{}]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfUint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]uint16) - v, changed := fastpathTV.DecMapIntfUint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfUint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]uint16) + v, changed := fastpathTV.DecMapIntfUint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfUint16V(rv2i(rv).(map[interface{}]uint16), false, d) + v := rv.Interface().(map[interface{}]uint16) + fastpathTV.DecMapIntfUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfUint16X(vp *map[interface{}]uint16, d *Decoder) { - v, changed := f.DecMapIntfUint16V(*vp, true, d) +func (f fastpathT) DecMapIntfUint16X(vp *map[interface{}]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfUint16V(v map[interface{}]uint16, canChange bool, +func (_ fastpathT) DecMapIntfUint16V(v map[interface{}]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[interface{}]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfUint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]uint32) - v, changed := fastpathTV.DecMapIntfUint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfUint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]uint32) + v, changed := fastpathTV.DecMapIntfUint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfUint32V(rv2i(rv).(map[interface{}]uint32), false, d) + v := rv.Interface().(map[interface{}]uint32) + fastpathTV.DecMapIntfUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfUint32X(vp *map[interface{}]uint32, d *Decoder) { - v, changed := f.DecMapIntfUint32V(*vp, true, d) +func (f fastpathT) DecMapIntfUint32X(vp *map[interface{}]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfUint32V(v map[interface{}]uint32, canChange bool, +func (_ fastpathT) DecMapIntfUint32V(v map[interface{}]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[interface{}]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfUint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]uint64) - v, changed := fastpathTV.DecMapIntfUint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfUint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]uint64) + v, changed := fastpathTV.DecMapIntfUint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfUint64V(rv2i(rv).(map[interface{}]uint64), false, d) + v := rv.Interface().(map[interface{}]uint64) + fastpathTV.DecMapIntfUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfUint64X(vp *map[interface{}]uint64, d *Decoder) { - v, changed := f.DecMapIntfUint64V(*vp, true, d) +func (f fastpathT) DecMapIntfUint64X(vp *map[interface{}]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfUint64V(v map[interface{}]uint64, canChange bool, +func (_ fastpathT) DecMapIntfUint64V(v map[interface{}]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[interface{}]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfUintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]uintptr) - v, changed := fastpathTV.DecMapIntfUintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfUintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]uintptr) + v, changed := fastpathTV.DecMapIntfUintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfUintptrV(rv2i(rv).(map[interface{}]uintptr), false, d) + v := rv.Interface().(map[interface{}]uintptr) + fastpathTV.DecMapIntfUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfUintptrX(vp *map[interface{}]uintptr, d *Decoder) { - v, changed := f.DecMapIntfUintptrV(*vp, true, d) +func (f fastpathT) DecMapIntfUintptrX(vp *map[interface{}]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfUintptrV(v map[interface{}]uintptr, canChange bool, +func (_ fastpathT) DecMapIntfUintptrV(v map[interface{}]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[interface{}]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfIntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]int) - v, changed := fastpathTV.DecMapIntfIntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfIntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]int) + v, changed := fastpathTV.DecMapIntfIntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfIntV(rv2i(rv).(map[interface{}]int), false, d) + v := rv.Interface().(map[interface{}]int) + fastpathTV.DecMapIntfIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfIntX(vp *map[interface{}]int, d *Decoder) { - v, changed := f.DecMapIntfIntV(*vp, true, d) +func (f fastpathT) DecMapIntfIntX(vp *map[interface{}]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfIntV(v map[interface{}]int, canChange bool, +func (_ fastpathT) DecMapIntfIntV(v map[interface{}]int, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[interface{}]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfInt8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]int8) - v, changed := fastpathTV.DecMapIntfInt8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfInt8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]int8) + v, changed := fastpathTV.DecMapIntfInt8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfInt8V(rv2i(rv).(map[interface{}]int8), false, d) + v := rv.Interface().(map[interface{}]int8) + fastpathTV.DecMapIntfInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfInt8X(vp *map[interface{}]int8, d *Decoder) { - v, changed := f.DecMapIntfInt8V(*vp, true, d) +func (f fastpathT) DecMapIntfInt8X(vp *map[interface{}]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfInt8V(v map[interface{}]int8, canChange bool, +func (_ fastpathT) DecMapIntfInt8V(v map[interface{}]int8, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[interface{}]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfInt16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]int16) - v, changed := fastpathTV.DecMapIntfInt16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfInt16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]int16) + v, changed := fastpathTV.DecMapIntfInt16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfInt16V(rv2i(rv).(map[interface{}]int16), false, d) + v := rv.Interface().(map[interface{}]int16) + fastpathTV.DecMapIntfInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfInt16X(vp *map[interface{}]int16, d *Decoder) { - v, changed := f.DecMapIntfInt16V(*vp, true, d) +func (f fastpathT) DecMapIntfInt16X(vp *map[interface{}]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfInt16V(v map[interface{}]int16, canChange bool, +func (_ fastpathT) DecMapIntfInt16V(v map[interface{}]int16, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[interface{}]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfInt32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]int32) - v, changed := fastpathTV.DecMapIntfInt32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfInt32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]int32) + v, changed := fastpathTV.DecMapIntfInt32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfInt32V(rv2i(rv).(map[interface{}]int32), false, d) + v := rv.Interface().(map[interface{}]int32) + fastpathTV.DecMapIntfInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfInt32X(vp *map[interface{}]int32, d *Decoder) { - v, changed := f.DecMapIntfInt32V(*vp, true, d) +func (f fastpathT) DecMapIntfInt32X(vp *map[interface{}]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfInt32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfInt32V(v map[interface{}]int32, canChange bool, +func (_ fastpathT) DecMapIntfInt32V(v map[interface{}]int32, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[interface{}]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfInt64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]int64) - v, changed := fastpathTV.DecMapIntfInt64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfInt64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]int64) + v, changed := fastpathTV.DecMapIntfInt64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfInt64V(rv2i(rv).(map[interface{}]int64), false, d) + v := rv.Interface().(map[interface{}]int64) + fastpathTV.DecMapIntfInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfInt64X(vp *map[interface{}]int64, d *Decoder) { - v, changed := f.DecMapIntfInt64V(*vp, true, d) +func (f fastpathT) DecMapIntfInt64X(vp *map[interface{}]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfInt64V(v map[interface{}]int64, canChange bool, +func (_ fastpathT) DecMapIntfInt64V(v map[interface{}]int64, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[interface{}]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfFloat32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]float32) - v, changed := fastpathTV.DecMapIntfFloat32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfFloat32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]float32) + v, changed := fastpathTV.DecMapIntfFloat32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfFloat32V(rv2i(rv).(map[interface{}]float32), false, d) + v := rv.Interface().(map[interface{}]float32) + fastpathTV.DecMapIntfFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfFloat32X(vp *map[interface{}]float32, d *Decoder) { - v, changed := f.DecMapIntfFloat32V(*vp, true, d) +func (f fastpathT) DecMapIntfFloat32X(vp *map[interface{}]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfFloat32V(v map[interface{}]float32, canChange bool, +func (_ fastpathT) DecMapIntfFloat32V(v map[interface{}]float32, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[interface{}]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfFloat64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]float64) - v, changed := fastpathTV.DecMapIntfFloat64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfFloat64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]float64) + v, changed := fastpathTV.DecMapIntfFloat64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfFloat64V(rv2i(rv).(map[interface{}]float64), false, d) + v := rv.Interface().(map[interface{}]float64) + fastpathTV.DecMapIntfFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfFloat64X(vp *map[interface{}]float64, d *Decoder) { - v, changed := f.DecMapIntfFloat64V(*vp, true, d) +func (f fastpathT) DecMapIntfFloat64X(vp *map[interface{}]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfFloat64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfFloat64V(v map[interface{}]float64, canChange bool, +func (_ fastpathT) DecMapIntfFloat64V(v map[interface{}]float64, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[interface{}]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntfBoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[interface{}]bool) - v, changed := fastpathTV.DecMapIntfBoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntfBoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[interface{}]bool) + v, changed := fastpathTV.DecMapIntfBoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntfBoolV(rv2i(rv).(map[interface{}]bool), false, d) + v := rv.Interface().(map[interface{}]bool) + fastpathTV.DecMapIntfBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntfBoolX(vp *map[interface{}]bool, d *Decoder) { - v, changed := f.DecMapIntfBoolV(*vp, true, d) +func (f fastpathT) DecMapIntfBoolX(vp *map[interface{}]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntfBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntfBoolV(v map[interface{}]bool, canChange bool, +func (_ fastpathT) DecMapIntfBoolV(v map[interface{}]bool, checkNil bool, canChange bool, d *Decoder) (_ map[interface{}]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[interface{}]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk interface{} var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) + } + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringIntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]interface{}) - v, changed := fastpathTV.DecMapStringIntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringIntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]interface{}) + v, changed := fastpathTV.DecMapStringIntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringIntfV(rv2i(rv).(map[string]interface{}), false, d) + v := rv.Interface().(map[string]interface{}) + fastpathTV.DecMapStringIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringIntfX(vp *map[string]interface{}, d *Decoder) { - v, changed := f.DecMapStringIntfV(*vp, true, d) +func (f fastpathT) DecMapStringIntfX(vp *map[string]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringIntfV(v map[string]interface{}, canChange bool, +func (_ fastpathT) DecMapStringIntfV(v map[string]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[string]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 32) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) v = make(map[string]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk string var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringStringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]string) - v, changed := fastpathTV.DecMapStringStringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringStringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]string) + v, changed := fastpathTV.DecMapStringStringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringStringV(rv2i(rv).(map[string]string), false, d) + v := rv.Interface().(map[string]string) + fastpathTV.DecMapStringStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringStringX(vp *map[string]string, d *Decoder) { - v, changed := f.DecMapStringStringV(*vp, true, d) +func (f fastpathT) DecMapStringStringX(vp *map[string]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringStringV(v map[string]string, canChange bool, +func (_ fastpathT) DecMapStringStringV(v map[string]string, checkNil bool, canChange bool, d *Decoder) (_ map[string]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 32) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) v = make(map[string]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringUintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]uint) - v, changed := fastpathTV.DecMapStringUintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringUintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]uint) + v, changed := fastpathTV.DecMapStringUintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringUintV(rv2i(rv).(map[string]uint), false, d) + v := rv.Interface().(map[string]uint) + fastpathTV.DecMapStringUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringUintX(vp *map[string]uint, d *Decoder) { - v, changed := f.DecMapStringUintV(*vp, true, d) +func (f fastpathT) DecMapStringUintX(vp *map[string]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringUintV(v map[string]uint, canChange bool, +func (_ fastpathT) DecMapStringUintV(v map[string]uint, checkNil bool, canChange bool, d *Decoder) (_ map[string]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[string]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringUint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]uint8) - v, changed := fastpathTV.DecMapStringUint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringUint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]uint8) + v, changed := fastpathTV.DecMapStringUint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringUint8V(rv2i(rv).(map[string]uint8), false, d) + v := rv.Interface().(map[string]uint8) + fastpathTV.DecMapStringUint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringUint8X(vp *map[string]uint8, d *Decoder) { - v, changed := f.DecMapStringUint8V(*vp, true, d) +func (f fastpathT) DecMapStringUint8X(vp *map[string]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringUint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringUint8V(v map[string]uint8, canChange bool, +func (_ fastpathT) DecMapStringUint8V(v map[string]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[string]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[string]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringUint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]uint16) - v, changed := fastpathTV.DecMapStringUint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringUint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]uint16) + v, changed := fastpathTV.DecMapStringUint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringUint16V(rv2i(rv).(map[string]uint16), false, d) + v := rv.Interface().(map[string]uint16) + fastpathTV.DecMapStringUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringUint16X(vp *map[string]uint16, d *Decoder) { - v, changed := f.DecMapStringUint16V(*vp, true, d) +func (f fastpathT) DecMapStringUint16X(vp *map[string]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringUint16V(v map[string]uint16, canChange bool, +func (_ fastpathT) DecMapStringUint16V(v map[string]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[string]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[string]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringUint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]uint32) - v, changed := fastpathTV.DecMapStringUint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringUint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]uint32) + v, changed := fastpathTV.DecMapStringUint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringUint32V(rv2i(rv).(map[string]uint32), false, d) + v := rv.Interface().(map[string]uint32) + fastpathTV.DecMapStringUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringUint32X(vp *map[string]uint32, d *Decoder) { - v, changed := f.DecMapStringUint32V(*vp, true, d) +func (f fastpathT) DecMapStringUint32X(vp *map[string]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringUint32V(v map[string]uint32, canChange bool, +func (_ fastpathT) DecMapStringUint32V(v map[string]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[string]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[string]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringUint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]uint64) - v, changed := fastpathTV.DecMapStringUint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringUint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]uint64) + v, changed := fastpathTV.DecMapStringUint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringUint64V(rv2i(rv).(map[string]uint64), false, d) + v := rv.Interface().(map[string]uint64) + fastpathTV.DecMapStringUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringUint64X(vp *map[string]uint64, d *Decoder) { - v, changed := f.DecMapStringUint64V(*vp, true, d) +func (f fastpathT) DecMapStringUint64X(vp *map[string]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringUint64V(v map[string]uint64, canChange bool, +func (_ fastpathT) DecMapStringUint64V(v map[string]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[string]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[string]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringUintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]uintptr) - v, changed := fastpathTV.DecMapStringUintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringUintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]uintptr) + v, changed := fastpathTV.DecMapStringUintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringUintptrV(rv2i(rv).(map[string]uintptr), false, d) + v := rv.Interface().(map[string]uintptr) + fastpathTV.DecMapStringUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringUintptrX(vp *map[string]uintptr, d *Decoder) { - v, changed := f.DecMapStringUintptrV(*vp, true, d) +func (f fastpathT) DecMapStringUintptrX(vp *map[string]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringUintptrV(v map[string]uintptr, canChange bool, +func (_ fastpathT) DecMapStringUintptrV(v map[string]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[string]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[string]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringIntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]int) - v, changed := fastpathTV.DecMapStringIntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringIntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]int) + v, changed := fastpathTV.DecMapStringIntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringIntV(rv2i(rv).(map[string]int), false, d) + v := rv.Interface().(map[string]int) + fastpathTV.DecMapStringIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringIntX(vp *map[string]int, d *Decoder) { - v, changed := f.DecMapStringIntV(*vp, true, d) +func (f fastpathT) DecMapStringIntX(vp *map[string]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringIntV(v map[string]int, canChange bool, +func (_ fastpathT) DecMapStringIntV(v map[string]int, checkNil bool, canChange bool, d *Decoder) (_ map[string]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[string]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringInt8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]int8) - v, changed := fastpathTV.DecMapStringInt8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringInt8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]int8) + v, changed := fastpathTV.DecMapStringInt8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringInt8V(rv2i(rv).(map[string]int8), false, d) + v := rv.Interface().(map[string]int8) + fastpathTV.DecMapStringInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringInt8X(vp *map[string]int8, d *Decoder) { - v, changed := f.DecMapStringInt8V(*vp, true, d) +func (f fastpathT) DecMapStringInt8X(vp *map[string]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringInt8V(v map[string]int8, canChange bool, +func (_ fastpathT) DecMapStringInt8V(v map[string]int8, checkNil bool, canChange bool, d *Decoder) (_ map[string]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[string]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringInt16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]int16) - v, changed := fastpathTV.DecMapStringInt16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringInt16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]int16) + v, changed := fastpathTV.DecMapStringInt16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringInt16V(rv2i(rv).(map[string]int16), false, d) + v := rv.Interface().(map[string]int16) + fastpathTV.DecMapStringInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringInt16X(vp *map[string]int16, d *Decoder) { - v, changed := f.DecMapStringInt16V(*vp, true, d) +func (f fastpathT) DecMapStringInt16X(vp *map[string]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringInt16V(v map[string]int16, canChange bool, +func (_ fastpathT) DecMapStringInt16V(v map[string]int16, checkNil bool, canChange bool, d *Decoder) (_ map[string]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[string]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringInt32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]int32) - v, changed := fastpathTV.DecMapStringInt32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringInt32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]int32) + v, changed := fastpathTV.DecMapStringInt32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringInt32V(rv2i(rv).(map[string]int32), false, d) + v := rv.Interface().(map[string]int32) + fastpathTV.DecMapStringInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringInt32X(vp *map[string]int32, d *Decoder) { - v, changed := f.DecMapStringInt32V(*vp, true, d) +func (f fastpathT) DecMapStringInt32X(vp *map[string]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringInt32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringInt32V(v map[string]int32, canChange bool, +func (_ fastpathT) DecMapStringInt32V(v map[string]int32, checkNil bool, canChange bool, d *Decoder) (_ map[string]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[string]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringInt64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]int64) - v, changed := fastpathTV.DecMapStringInt64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringInt64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]int64) + v, changed := fastpathTV.DecMapStringInt64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringInt64V(rv2i(rv).(map[string]int64), false, d) + v := rv.Interface().(map[string]int64) + fastpathTV.DecMapStringInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringInt64X(vp *map[string]int64, d *Decoder) { - v, changed := f.DecMapStringInt64V(*vp, true, d) +func (f fastpathT) DecMapStringInt64X(vp *map[string]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringInt64V(v map[string]int64, canChange bool, +func (_ fastpathT) DecMapStringInt64V(v map[string]int64, checkNil bool, canChange bool, d *Decoder) (_ map[string]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[string]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringFloat32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]float32) - v, changed := fastpathTV.DecMapStringFloat32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringFloat32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]float32) + v, changed := fastpathTV.DecMapStringFloat32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringFloat32V(rv2i(rv).(map[string]float32), false, d) + v := rv.Interface().(map[string]float32) + fastpathTV.DecMapStringFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringFloat32X(vp *map[string]float32, d *Decoder) { - v, changed := f.DecMapStringFloat32V(*vp, true, d) +func (f fastpathT) DecMapStringFloat32X(vp *map[string]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringFloat32V(v map[string]float32, canChange bool, +func (_ fastpathT) DecMapStringFloat32V(v map[string]float32, checkNil bool, canChange bool, d *Decoder) (_ map[string]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[string]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringFloat64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]float64) - v, changed := fastpathTV.DecMapStringFloat64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringFloat64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]float64) + v, changed := fastpathTV.DecMapStringFloat64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringFloat64V(rv2i(rv).(map[string]float64), false, d) + v := rv.Interface().(map[string]float64) + fastpathTV.DecMapStringFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringFloat64X(vp *map[string]float64, d *Decoder) { - v, changed := f.DecMapStringFloat64V(*vp, true, d) +func (f fastpathT) DecMapStringFloat64X(vp *map[string]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringFloat64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringFloat64V(v map[string]float64, canChange bool, +func (_ fastpathT) DecMapStringFloat64V(v map[string]float64, checkNil bool, canChange bool, d *Decoder) (_ map[string]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[string]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapStringBoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[string]bool) - v, changed := fastpathTV.DecMapStringBoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapStringBoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[string]bool) + v, changed := fastpathTV.DecMapStringBoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapStringBoolV(rv2i(rv).(map[string]bool), false, d) + v := rv.Interface().(map[string]bool) + fastpathTV.DecMapStringBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapStringBoolX(vp *map[string]bool, d *Decoder) { - v, changed := f.DecMapStringBoolV(*vp, true, d) +func (f fastpathT) DecMapStringBoolX(vp *map[string]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapStringBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapStringBoolV(v map[string]bool, canChange bool, +func (_ fastpathT) DecMapStringBoolV(v map[string]bool, checkNil bool, canChange bool, d *Decoder) (_ map[string]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[string]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk string var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeString() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeString() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]interface{}) - v, changed := fastpathTV.DecMapFloat32IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]interface{}) + v, changed := fastpathTV.DecMapFloat32IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32IntfV(rv2i(rv).(map[float32]interface{}), false, d) + v := rv.Interface().(map[float32]interface{}) + fastpathTV.DecMapFloat32IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32IntfX(vp *map[float32]interface{}, d *Decoder) { - v, changed := f.DecMapFloat32IntfV(*vp, true, d) +func (f fastpathT) DecMapFloat32IntfX(vp *map[float32]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32IntfV(v map[float32]interface{}, canChange bool, +func (_ fastpathT) DecMapFloat32IntfV(v map[float32]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[float32]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[float32]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk float32 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]string) - v, changed := fastpathTV.DecMapFloat32StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]string) + v, changed := fastpathTV.DecMapFloat32StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32StringV(rv2i(rv).(map[float32]string), false, d) + v := rv.Interface().(map[float32]string) + fastpathTV.DecMapFloat32StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32StringX(vp *map[float32]string, d *Decoder) { - v, changed := f.DecMapFloat32StringV(*vp, true, d) +func (f fastpathT) DecMapFloat32StringX(vp *map[float32]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32StringV(v map[float32]string, canChange bool, +func (_ fastpathT) DecMapFloat32StringV(v map[float32]string, checkNil bool, canChange bool, d *Decoder) (_ map[float32]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[float32]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]uint) - v, changed := fastpathTV.DecMapFloat32UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]uint) + v, changed := fastpathTV.DecMapFloat32UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32UintV(rv2i(rv).(map[float32]uint), false, d) + v := rv.Interface().(map[float32]uint) + fastpathTV.DecMapFloat32UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32UintX(vp *map[float32]uint, d *Decoder) { - v, changed := f.DecMapFloat32UintV(*vp, true, d) +func (f fastpathT) DecMapFloat32UintX(vp *map[float32]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32UintV(v map[float32]uint, canChange bool, +func (_ fastpathT) DecMapFloat32UintV(v map[float32]uint, checkNil bool, canChange bool, d *Decoder) (_ map[float32]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float32]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]uint8) - v, changed := fastpathTV.DecMapFloat32Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]uint8) + v, changed := fastpathTV.DecMapFloat32Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Uint8V(rv2i(rv).(map[float32]uint8), false, d) + v := rv.Interface().(map[float32]uint8) + fastpathTV.DecMapFloat32Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Uint8X(vp *map[float32]uint8, d *Decoder) { - v, changed := f.DecMapFloat32Uint8V(*vp, true, d) +func (f fastpathT) DecMapFloat32Uint8X(vp *map[float32]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Uint8V(v map[float32]uint8, canChange bool, +func (_ fastpathT) DecMapFloat32Uint8V(v map[float32]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[float32]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[float32]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]uint16) - v, changed := fastpathTV.DecMapFloat32Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]uint16) + v, changed := fastpathTV.DecMapFloat32Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Uint16V(rv2i(rv).(map[float32]uint16), false, d) + v := rv.Interface().(map[float32]uint16) + fastpathTV.DecMapFloat32Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Uint16X(vp *map[float32]uint16, d *Decoder) { - v, changed := f.DecMapFloat32Uint16V(*vp, true, d) +func (f fastpathT) DecMapFloat32Uint16X(vp *map[float32]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Uint16V(v map[float32]uint16, canChange bool, +func (_ fastpathT) DecMapFloat32Uint16V(v map[float32]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[float32]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[float32]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]uint32) - v, changed := fastpathTV.DecMapFloat32Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]uint32) + v, changed := fastpathTV.DecMapFloat32Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Uint32V(rv2i(rv).(map[float32]uint32), false, d) + v := rv.Interface().(map[float32]uint32) + fastpathTV.DecMapFloat32Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Uint32X(vp *map[float32]uint32, d *Decoder) { - v, changed := f.DecMapFloat32Uint32V(*vp, true, d) +func (f fastpathT) DecMapFloat32Uint32X(vp *map[float32]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Uint32V(v map[float32]uint32, canChange bool, +func (_ fastpathT) DecMapFloat32Uint32V(v map[float32]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[float32]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[float32]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]uint64) - v, changed := fastpathTV.DecMapFloat32Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]uint64) + v, changed := fastpathTV.DecMapFloat32Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Uint64V(rv2i(rv).(map[float32]uint64), false, d) + v := rv.Interface().(map[float32]uint64) + fastpathTV.DecMapFloat32Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Uint64X(vp *map[float32]uint64, d *Decoder) { - v, changed := f.DecMapFloat32Uint64V(*vp, true, d) +func (f fastpathT) DecMapFloat32Uint64X(vp *map[float32]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Uint64V(v map[float32]uint64, canChange bool, +func (_ fastpathT) DecMapFloat32Uint64V(v map[float32]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[float32]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float32]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]uintptr) - v, changed := fastpathTV.DecMapFloat32UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]uintptr) + v, changed := fastpathTV.DecMapFloat32UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32UintptrV(rv2i(rv).(map[float32]uintptr), false, d) + v := rv.Interface().(map[float32]uintptr) + fastpathTV.DecMapFloat32UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32UintptrX(vp *map[float32]uintptr, d *Decoder) { - v, changed := f.DecMapFloat32UintptrV(*vp, true, d) +func (f fastpathT) DecMapFloat32UintptrX(vp *map[float32]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32UintptrV(v map[float32]uintptr, canChange bool, +func (_ fastpathT) DecMapFloat32UintptrV(v map[float32]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[float32]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float32]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]int) - v, changed := fastpathTV.DecMapFloat32IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]int) + v, changed := fastpathTV.DecMapFloat32IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32IntV(rv2i(rv).(map[float32]int), false, d) + v := rv.Interface().(map[float32]int) + fastpathTV.DecMapFloat32IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32IntX(vp *map[float32]int, d *Decoder) { - v, changed := f.DecMapFloat32IntV(*vp, true, d) +func (f fastpathT) DecMapFloat32IntX(vp *map[float32]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32IntV(v map[float32]int, canChange bool, +func (_ fastpathT) DecMapFloat32IntV(v map[float32]int, checkNil bool, canChange bool, d *Decoder) (_ map[float32]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float32]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]int8) - v, changed := fastpathTV.DecMapFloat32Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]int8) + v, changed := fastpathTV.DecMapFloat32Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Int8V(rv2i(rv).(map[float32]int8), false, d) + v := rv.Interface().(map[float32]int8) + fastpathTV.DecMapFloat32Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Int8X(vp *map[float32]int8, d *Decoder) { - v, changed := f.DecMapFloat32Int8V(*vp, true, d) +func (f fastpathT) DecMapFloat32Int8X(vp *map[float32]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Int8V(v map[float32]int8, canChange bool, +func (_ fastpathT) DecMapFloat32Int8V(v map[float32]int8, checkNil bool, canChange bool, d *Decoder) (_ map[float32]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[float32]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]int16) - v, changed := fastpathTV.DecMapFloat32Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]int16) + v, changed := fastpathTV.DecMapFloat32Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Int16V(rv2i(rv).(map[float32]int16), false, d) + v := rv.Interface().(map[float32]int16) + fastpathTV.DecMapFloat32Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Int16X(vp *map[float32]int16, d *Decoder) { - v, changed := f.DecMapFloat32Int16V(*vp, true, d) +func (f fastpathT) DecMapFloat32Int16X(vp *map[float32]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Int16V(v map[float32]int16, canChange bool, +func (_ fastpathT) DecMapFloat32Int16V(v map[float32]int16, checkNil bool, canChange bool, d *Decoder) (_ map[float32]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[float32]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]int32) - v, changed := fastpathTV.DecMapFloat32Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]int32) + v, changed := fastpathTV.DecMapFloat32Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Int32V(rv2i(rv).(map[float32]int32), false, d) + v := rv.Interface().(map[float32]int32) + fastpathTV.DecMapFloat32Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Int32X(vp *map[float32]int32, d *Decoder) { - v, changed := f.DecMapFloat32Int32V(*vp, true, d) +func (f fastpathT) DecMapFloat32Int32X(vp *map[float32]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Int32V(v map[float32]int32, canChange bool, +func (_ fastpathT) DecMapFloat32Int32V(v map[float32]int32, checkNil bool, canChange bool, d *Decoder) (_ map[float32]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[float32]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]int64) - v, changed := fastpathTV.DecMapFloat32Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]int64) + v, changed := fastpathTV.DecMapFloat32Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Int64V(rv2i(rv).(map[float32]int64), false, d) + v := rv.Interface().(map[float32]int64) + fastpathTV.DecMapFloat32Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Int64X(vp *map[float32]int64, d *Decoder) { - v, changed := f.DecMapFloat32Int64V(*vp, true, d) +func (f fastpathT) DecMapFloat32Int64X(vp *map[float32]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Int64V(v map[float32]int64, canChange bool, +func (_ fastpathT) DecMapFloat32Int64V(v map[float32]int64, checkNil bool, canChange bool, d *Decoder) (_ map[float32]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float32]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]float32) - v, changed := fastpathTV.DecMapFloat32Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]float32) + v, changed := fastpathTV.DecMapFloat32Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Float32V(rv2i(rv).(map[float32]float32), false, d) + v := rv.Interface().(map[float32]float32) + fastpathTV.DecMapFloat32Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Float32X(vp *map[float32]float32, d *Decoder) { - v, changed := f.DecMapFloat32Float32V(*vp, true, d) +func (f fastpathT) DecMapFloat32Float32X(vp *map[float32]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Float32V(v map[float32]float32, canChange bool, +func (_ fastpathT) DecMapFloat32Float32V(v map[float32]float32, checkNil bool, canChange bool, d *Decoder) (_ map[float32]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[float32]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]float64) - v, changed := fastpathTV.DecMapFloat32Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]float64) + v, changed := fastpathTV.DecMapFloat32Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32Float64V(rv2i(rv).(map[float32]float64), false, d) + v := rv.Interface().(map[float32]float64) + fastpathTV.DecMapFloat32Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32Float64X(vp *map[float32]float64, d *Decoder) { - v, changed := f.DecMapFloat32Float64V(*vp, true, d) +func (f fastpathT) DecMapFloat32Float64X(vp *map[float32]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32Float64V(v map[float32]float64, canChange bool, +func (_ fastpathT) DecMapFloat32Float64V(v map[float32]float64, checkNil bool, canChange bool, d *Decoder) (_ map[float32]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float32]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat32BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float32]bool) - v, changed := fastpathTV.DecMapFloat32BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat32BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float32]bool) + v, changed := fastpathTV.DecMapFloat32BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat32BoolV(rv2i(rv).(map[float32]bool), false, d) + v := rv.Interface().(map[float32]bool) + fastpathTV.DecMapFloat32BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat32BoolX(vp *map[float32]bool, d *Decoder) { - v, changed := f.DecMapFloat32BoolV(*vp, true, d) +func (f fastpathT) DecMapFloat32BoolX(vp *map[float32]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat32BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat32BoolV(v map[float32]bool, canChange bool, +func (_ fastpathT) DecMapFloat32BoolV(v map[float32]bool, checkNil bool, canChange bool, d *Decoder) (_ map[float32]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[float32]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float32 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = float32(dd.DecodeFloat(true)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]interface{}) - v, changed := fastpathTV.DecMapFloat64IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]interface{}) + v, changed := fastpathTV.DecMapFloat64IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64IntfV(rv2i(rv).(map[float64]interface{}), false, d) + v := rv.Interface().(map[float64]interface{}) + fastpathTV.DecMapFloat64IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64IntfX(vp *map[float64]interface{}, d *Decoder) { - v, changed := f.DecMapFloat64IntfV(*vp, true, d) +func (f fastpathT) DecMapFloat64IntfX(vp *map[float64]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64IntfV(v map[float64]interface{}, canChange bool, +func (_ fastpathT) DecMapFloat64IntfV(v map[float64]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[float64]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[float64]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk float64 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]string) - v, changed := fastpathTV.DecMapFloat64StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]string) + v, changed := fastpathTV.DecMapFloat64StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64StringV(rv2i(rv).(map[float64]string), false, d) + v := rv.Interface().(map[float64]string) + fastpathTV.DecMapFloat64StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64StringX(vp *map[float64]string, d *Decoder) { - v, changed := f.DecMapFloat64StringV(*vp, true, d) +func (f fastpathT) DecMapFloat64StringX(vp *map[float64]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64StringV(v map[float64]string, canChange bool, +func (_ fastpathT) DecMapFloat64StringV(v map[float64]string, checkNil bool, canChange bool, d *Decoder) (_ map[float64]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[float64]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]uint) - v, changed := fastpathTV.DecMapFloat64UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]uint) + v, changed := fastpathTV.DecMapFloat64UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64UintV(rv2i(rv).(map[float64]uint), false, d) + v := rv.Interface().(map[float64]uint) + fastpathTV.DecMapFloat64UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64UintX(vp *map[float64]uint, d *Decoder) { - v, changed := f.DecMapFloat64UintV(*vp, true, d) +func (f fastpathT) DecMapFloat64UintX(vp *map[float64]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64UintV(v map[float64]uint, canChange bool, +func (_ fastpathT) DecMapFloat64UintV(v map[float64]uint, checkNil bool, canChange bool, d *Decoder) (_ map[float64]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[float64]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]uint8) - v, changed := fastpathTV.DecMapFloat64Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]uint8) + v, changed := fastpathTV.DecMapFloat64Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Uint8V(rv2i(rv).(map[float64]uint8), false, d) + v := rv.Interface().(map[float64]uint8) + fastpathTV.DecMapFloat64Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Uint8X(vp *map[float64]uint8, d *Decoder) { - v, changed := f.DecMapFloat64Uint8V(*vp, true, d) +func (f fastpathT) DecMapFloat64Uint8X(vp *map[float64]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Uint8V(*vp, checkNil, true, d) if changed { *vp = v } -} -func (_ fastpathT) DecMapFloat64Uint8V(v map[float64]uint8, canChange bool, - d *Decoder) (_ map[float64]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() +} +func (_ fastpathT) DecMapFloat64Uint8V(v map[float64]uint8, checkNil bool, canChange bool, + d *Decoder) (_ map[float64]uint8, changed bool) { + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[float64]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]uint16) - v, changed := fastpathTV.DecMapFloat64Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]uint16) + v, changed := fastpathTV.DecMapFloat64Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Uint16V(rv2i(rv).(map[float64]uint16), false, d) + v := rv.Interface().(map[float64]uint16) + fastpathTV.DecMapFloat64Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Uint16X(vp *map[float64]uint16, d *Decoder) { - v, changed := f.DecMapFloat64Uint16V(*vp, true, d) +func (f fastpathT) DecMapFloat64Uint16X(vp *map[float64]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Uint16V(v map[float64]uint16, canChange bool, +func (_ fastpathT) DecMapFloat64Uint16V(v map[float64]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[float64]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[float64]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]uint32) - v, changed := fastpathTV.DecMapFloat64Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]uint32) + v, changed := fastpathTV.DecMapFloat64Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Uint32V(rv2i(rv).(map[float64]uint32), false, d) + v := rv.Interface().(map[float64]uint32) + fastpathTV.DecMapFloat64Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Uint32X(vp *map[float64]uint32, d *Decoder) { - v, changed := f.DecMapFloat64Uint32V(*vp, true, d) +func (f fastpathT) DecMapFloat64Uint32X(vp *map[float64]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Uint32V(v map[float64]uint32, canChange bool, +func (_ fastpathT) DecMapFloat64Uint32V(v map[float64]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[float64]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float64]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]uint64) - v, changed := fastpathTV.DecMapFloat64Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]uint64) + v, changed := fastpathTV.DecMapFloat64Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Uint64V(rv2i(rv).(map[float64]uint64), false, d) + v := rv.Interface().(map[float64]uint64) + fastpathTV.DecMapFloat64Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Uint64X(vp *map[float64]uint64, d *Decoder) { - v, changed := f.DecMapFloat64Uint64V(*vp, true, d) +func (f fastpathT) DecMapFloat64Uint64X(vp *map[float64]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Uint64V(v map[float64]uint64, canChange bool, +func (_ fastpathT) DecMapFloat64Uint64V(v map[float64]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[float64]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[float64]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]uintptr) - v, changed := fastpathTV.DecMapFloat64UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]uintptr) + v, changed := fastpathTV.DecMapFloat64UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64UintptrV(rv2i(rv).(map[float64]uintptr), false, d) + v := rv.Interface().(map[float64]uintptr) + fastpathTV.DecMapFloat64UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64UintptrX(vp *map[float64]uintptr, d *Decoder) { - v, changed := f.DecMapFloat64UintptrV(*vp, true, d) +func (f fastpathT) DecMapFloat64UintptrX(vp *map[float64]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64UintptrV(v map[float64]uintptr, canChange bool, +func (_ fastpathT) DecMapFloat64UintptrV(v map[float64]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[float64]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[float64]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]int) - v, changed := fastpathTV.DecMapFloat64IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]int) + v, changed := fastpathTV.DecMapFloat64IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64IntV(rv2i(rv).(map[float64]int), false, d) + v := rv.Interface().(map[float64]int) + fastpathTV.DecMapFloat64IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64IntX(vp *map[float64]int, d *Decoder) { - v, changed := f.DecMapFloat64IntV(*vp, true, d) +func (f fastpathT) DecMapFloat64IntX(vp *map[float64]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64IntV(v map[float64]int, canChange bool, +func (_ fastpathT) DecMapFloat64IntV(v map[float64]int, checkNil bool, canChange bool, d *Decoder) (_ map[float64]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[float64]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]int8) - v, changed := fastpathTV.DecMapFloat64Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]int8) + v, changed := fastpathTV.DecMapFloat64Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Int8V(rv2i(rv).(map[float64]int8), false, d) + v := rv.Interface().(map[float64]int8) + fastpathTV.DecMapFloat64Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Int8X(vp *map[float64]int8, d *Decoder) { - v, changed := f.DecMapFloat64Int8V(*vp, true, d) +func (f fastpathT) DecMapFloat64Int8X(vp *map[float64]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Int8V(v map[float64]int8, canChange bool, +func (_ fastpathT) DecMapFloat64Int8V(v map[float64]int8, checkNil bool, canChange bool, d *Decoder) (_ map[float64]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[float64]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]int16) - v, changed := fastpathTV.DecMapFloat64Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]int16) + v, changed := fastpathTV.DecMapFloat64Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Int16V(rv2i(rv).(map[float64]int16), false, d) + v := rv.Interface().(map[float64]int16) + fastpathTV.DecMapFloat64Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Int16X(vp *map[float64]int16, d *Decoder) { - v, changed := f.DecMapFloat64Int16V(*vp, true, d) +func (f fastpathT) DecMapFloat64Int16X(vp *map[float64]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Int16V(v map[float64]int16, canChange bool, +func (_ fastpathT) DecMapFloat64Int16V(v map[float64]int16, checkNil bool, canChange bool, d *Decoder) (_ map[float64]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[float64]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]int32) - v, changed := fastpathTV.DecMapFloat64Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]int32) + v, changed := fastpathTV.DecMapFloat64Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Int32V(rv2i(rv).(map[float64]int32), false, d) + v := rv.Interface().(map[float64]int32) + fastpathTV.DecMapFloat64Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Int32X(vp *map[float64]int32, d *Decoder) { - v, changed := f.DecMapFloat64Int32V(*vp, true, d) +func (f fastpathT) DecMapFloat64Int32X(vp *map[float64]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Int32V(v map[float64]int32, canChange bool, +func (_ fastpathT) DecMapFloat64Int32V(v map[float64]int32, checkNil bool, canChange bool, d *Decoder) (_ map[float64]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float64]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]int64) - v, changed := fastpathTV.DecMapFloat64Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]int64) + v, changed := fastpathTV.DecMapFloat64Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Int64V(rv2i(rv).(map[float64]int64), false, d) + v := rv.Interface().(map[float64]int64) + fastpathTV.DecMapFloat64Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Int64X(vp *map[float64]int64, d *Decoder) { - v, changed := f.DecMapFloat64Int64V(*vp, true, d) +func (f fastpathT) DecMapFloat64Int64X(vp *map[float64]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Int64V(v map[float64]int64, canChange bool, +func (_ fastpathT) DecMapFloat64Int64V(v map[float64]int64, checkNil bool, canChange bool, d *Decoder) (_ map[float64]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[float64]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]float32) - v, changed := fastpathTV.DecMapFloat64Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]float32) + v, changed := fastpathTV.DecMapFloat64Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Float32V(rv2i(rv).(map[float64]float32), false, d) + v := rv.Interface().(map[float64]float32) + fastpathTV.DecMapFloat64Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Float32X(vp *map[float64]float32, d *Decoder) { - v, changed := f.DecMapFloat64Float32V(*vp, true, d) +func (f fastpathT) DecMapFloat64Float32X(vp *map[float64]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Float32V(v map[float64]float32, canChange bool, +func (_ fastpathT) DecMapFloat64Float32V(v map[float64]float32, checkNil bool, canChange bool, d *Decoder) (_ map[float64]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[float64]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]float64) - v, changed := fastpathTV.DecMapFloat64Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]float64) + v, changed := fastpathTV.DecMapFloat64Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64Float64V(rv2i(rv).(map[float64]float64), false, d) + v := rv.Interface().(map[float64]float64) + fastpathTV.DecMapFloat64Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64Float64X(vp *map[float64]float64, d *Decoder) { - v, changed := f.DecMapFloat64Float64V(*vp, true, d) +func (f fastpathT) DecMapFloat64Float64X(vp *map[float64]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64Float64V(v map[float64]float64, canChange bool, +func (_ fastpathT) DecMapFloat64Float64V(v map[float64]float64, checkNil bool, canChange bool, d *Decoder) (_ map[float64]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[float64]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapFloat64BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[float64]bool) - v, changed := fastpathTV.DecMapFloat64BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapFloat64BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[float64]bool) + v, changed := fastpathTV.DecMapFloat64BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapFloat64BoolV(rv2i(rv).(map[float64]bool), false, d) + v := rv.Interface().(map[float64]bool) + fastpathTV.DecMapFloat64BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapFloat64BoolX(vp *map[float64]bool, d *Decoder) { - v, changed := f.DecMapFloat64BoolV(*vp, true, d) +func (f fastpathT) DecMapFloat64BoolX(vp *map[float64]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapFloat64BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapFloat64BoolV(v map[float64]bool, canChange bool, +func (_ fastpathT) DecMapFloat64BoolV(v map[float64]bool, checkNil bool, canChange bool, d *Decoder) (_ map[float64]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[float64]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk float64 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeFloat64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeFloat(false) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintIntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]interface{}) - v, changed := fastpathTV.DecMapUintIntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintIntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]interface{}) + v, changed := fastpathTV.DecMapUintIntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintIntfV(rv2i(rv).(map[uint]interface{}), false, d) + v := rv.Interface().(map[uint]interface{}) + fastpathTV.DecMapUintIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintIntfX(vp *map[uint]interface{}, d *Decoder) { - v, changed := f.DecMapUintIntfV(*vp, true, d) +func (f fastpathT) DecMapUintIntfX(vp *map[uint]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintIntfV(v map[uint]interface{}, canChange bool, +func (_ fastpathT) DecMapUintIntfV(v map[uint]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[uint]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[uint]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk uint var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintStringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]string) - v, changed := fastpathTV.DecMapUintStringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintStringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]string) + v, changed := fastpathTV.DecMapUintStringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintStringV(rv2i(rv).(map[uint]string), false, d) + v := rv.Interface().(map[uint]string) + fastpathTV.DecMapUintStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintStringX(vp *map[uint]string, d *Decoder) { - v, changed := f.DecMapUintStringV(*vp, true, d) +func (f fastpathT) DecMapUintStringX(vp *map[uint]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintStringV(v map[uint]string, canChange bool, +func (_ fastpathT) DecMapUintStringV(v map[uint]string, checkNil bool, canChange bool, d *Decoder) (_ map[uint]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[uint]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintUintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]uint) - v, changed := fastpathTV.DecMapUintUintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintUintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]uint) + v, changed := fastpathTV.DecMapUintUintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintUintV(rv2i(rv).(map[uint]uint), false, d) + v := rv.Interface().(map[uint]uint) + fastpathTV.DecMapUintUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintUintX(vp *map[uint]uint, d *Decoder) { - v, changed := f.DecMapUintUintV(*vp, true, d) +func (f fastpathT) DecMapUintUintX(vp *map[uint]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintUintV(v map[uint]uint, canChange bool, +func (_ fastpathT) DecMapUintUintV(v map[uint]uint, checkNil bool, canChange bool, d *Decoder) (_ map[uint]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintUint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]uint8) - v, changed := fastpathTV.DecMapUintUint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintUint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]uint8) + v, changed := fastpathTV.DecMapUintUint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintUint8V(rv2i(rv).(map[uint]uint8), false, d) + v := rv.Interface().(map[uint]uint8) + fastpathTV.DecMapUintUint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintUint8X(vp *map[uint]uint8, d *Decoder) { - v, changed := f.DecMapUintUint8V(*vp, true, d) +func (f fastpathT) DecMapUintUint8X(vp *map[uint]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintUint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintUint8V(v map[uint]uint8, canChange bool, +func (_ fastpathT) DecMapUintUint8V(v map[uint]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[uint]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintUint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]uint16) - v, changed := fastpathTV.DecMapUintUint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintUint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]uint16) + v, changed := fastpathTV.DecMapUintUint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintUint16V(rv2i(rv).(map[uint]uint16), false, d) + v := rv.Interface().(map[uint]uint16) + fastpathTV.DecMapUintUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintUint16X(vp *map[uint]uint16, d *Decoder) { - v, changed := f.DecMapUintUint16V(*vp, true, d) +func (f fastpathT) DecMapUintUint16X(vp *map[uint]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintUint16V(v map[uint]uint16, canChange bool, +func (_ fastpathT) DecMapUintUint16V(v map[uint]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[uint]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintUint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]uint32) - v, changed := fastpathTV.DecMapUintUint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintUint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]uint32) + v, changed := fastpathTV.DecMapUintUint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintUint32V(rv2i(rv).(map[uint]uint32), false, d) + v := rv.Interface().(map[uint]uint32) + fastpathTV.DecMapUintUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintUint32X(vp *map[uint]uint32, d *Decoder) { - v, changed := f.DecMapUintUint32V(*vp, true, d) +func (f fastpathT) DecMapUintUint32X(vp *map[uint]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintUint32V(v map[uint]uint32, canChange bool, +func (_ fastpathT) DecMapUintUint32V(v map[uint]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[uint]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintUint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]uint64) - v, changed := fastpathTV.DecMapUintUint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintUint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]uint64) + v, changed := fastpathTV.DecMapUintUint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintUint64V(rv2i(rv).(map[uint]uint64), false, d) + v := rv.Interface().(map[uint]uint64) + fastpathTV.DecMapUintUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintUint64X(vp *map[uint]uint64, d *Decoder) { - v, changed := f.DecMapUintUint64V(*vp, true, d) +func (f fastpathT) DecMapUintUint64X(vp *map[uint]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintUint64V(v map[uint]uint64, canChange bool, +func (_ fastpathT) DecMapUintUint64V(v map[uint]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[uint]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintUintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]uintptr) - v, changed := fastpathTV.DecMapUintUintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintUintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]uintptr) + v, changed := fastpathTV.DecMapUintUintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintUintptrV(rv2i(rv).(map[uint]uintptr), false, d) + v := rv.Interface().(map[uint]uintptr) + fastpathTV.DecMapUintUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintUintptrX(vp *map[uint]uintptr, d *Decoder) { - v, changed := f.DecMapUintUintptrV(*vp, true, d) +func (f fastpathT) DecMapUintUintptrX(vp *map[uint]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintUintptrV(v map[uint]uintptr, canChange bool, +func (_ fastpathT) DecMapUintUintptrV(v map[uint]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[uint]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintIntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]int) - v, changed := fastpathTV.DecMapUintIntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintIntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]int) + v, changed := fastpathTV.DecMapUintIntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintIntV(rv2i(rv).(map[uint]int), false, d) + v := rv.Interface().(map[uint]int) + fastpathTV.DecMapUintIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintIntX(vp *map[uint]int, d *Decoder) { - v, changed := f.DecMapUintIntV(*vp, true, d) +func (f fastpathT) DecMapUintIntX(vp *map[uint]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintIntV(v map[uint]int, canChange bool, +func (_ fastpathT) DecMapUintIntV(v map[uint]int, checkNil bool, canChange bool, d *Decoder) (_ map[uint]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintInt8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]int8) - v, changed := fastpathTV.DecMapUintInt8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintInt8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]int8) + v, changed := fastpathTV.DecMapUintInt8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintInt8V(rv2i(rv).(map[uint]int8), false, d) + v := rv.Interface().(map[uint]int8) + fastpathTV.DecMapUintInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintInt8X(vp *map[uint]int8, d *Decoder) { - v, changed := f.DecMapUintInt8V(*vp, true, d) +func (f fastpathT) DecMapUintInt8X(vp *map[uint]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintInt8V(v map[uint]int8, canChange bool, +func (_ fastpathT) DecMapUintInt8V(v map[uint]int8, checkNil bool, canChange bool, d *Decoder) (_ map[uint]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintInt16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]int16) - v, changed := fastpathTV.DecMapUintInt16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintInt16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]int16) + v, changed := fastpathTV.DecMapUintInt16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintInt16V(rv2i(rv).(map[uint]int16), false, d) + v := rv.Interface().(map[uint]int16) + fastpathTV.DecMapUintInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintInt16X(vp *map[uint]int16, d *Decoder) { - v, changed := f.DecMapUintInt16V(*vp, true, d) +func (f fastpathT) DecMapUintInt16X(vp *map[uint]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintInt16V(v map[uint]int16, canChange bool, +func (_ fastpathT) DecMapUintInt16V(v map[uint]int16, checkNil bool, canChange bool, d *Decoder) (_ map[uint]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintInt32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]int32) - v, changed := fastpathTV.DecMapUintInt32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintInt32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]int32) + v, changed := fastpathTV.DecMapUintInt32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintInt32V(rv2i(rv).(map[uint]int32), false, d) + v := rv.Interface().(map[uint]int32) + fastpathTV.DecMapUintInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintInt32X(vp *map[uint]int32, d *Decoder) { - v, changed := f.DecMapUintInt32V(*vp, true, d) +func (f fastpathT) DecMapUintInt32X(vp *map[uint]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintInt32V(*vp, checkNil, true, d) if changed { *vp = v } -} -func (_ fastpathT) DecMapUintInt32V(v map[uint]int32, canChange bool, - d *Decoder) (_ map[uint]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() +} +func (_ fastpathT) DecMapUintInt32V(v map[uint]int32, checkNil bool, canChange bool, + d *Decoder) (_ map[uint]int32, changed bool) { + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintInt64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]int64) - v, changed := fastpathTV.DecMapUintInt64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintInt64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]int64) + v, changed := fastpathTV.DecMapUintInt64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintInt64V(rv2i(rv).(map[uint]int64), false, d) + v := rv.Interface().(map[uint]int64) + fastpathTV.DecMapUintInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintInt64X(vp *map[uint]int64, d *Decoder) { - v, changed := f.DecMapUintInt64V(*vp, true, d) +func (f fastpathT) DecMapUintInt64X(vp *map[uint]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintInt64V(v map[uint]int64, canChange bool, +func (_ fastpathT) DecMapUintInt64V(v map[uint]int64, checkNil bool, canChange bool, d *Decoder) (_ map[uint]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintFloat32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]float32) - v, changed := fastpathTV.DecMapUintFloat32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintFloat32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]float32) + v, changed := fastpathTV.DecMapUintFloat32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintFloat32V(rv2i(rv).(map[uint]float32), false, d) + v := rv.Interface().(map[uint]float32) + fastpathTV.DecMapUintFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintFloat32X(vp *map[uint]float32, d *Decoder) { - v, changed := f.DecMapUintFloat32V(*vp, true, d) +func (f fastpathT) DecMapUintFloat32X(vp *map[uint]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintFloat32V(v map[uint]float32, canChange bool, +func (_ fastpathT) DecMapUintFloat32V(v map[uint]float32, checkNil bool, canChange bool, d *Decoder) (_ map[uint]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintFloat64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]float64) - v, changed := fastpathTV.DecMapUintFloat64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintFloat64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]float64) + v, changed := fastpathTV.DecMapUintFloat64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintFloat64V(rv2i(rv).(map[uint]float64), false, d) + v := rv.Interface().(map[uint]float64) + fastpathTV.DecMapUintFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintFloat64X(vp *map[uint]float64, d *Decoder) { - v, changed := f.DecMapUintFloat64V(*vp, true, d) +func (f fastpathT) DecMapUintFloat64X(vp *map[uint]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintFloat64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintFloat64V(v map[uint]float64, canChange bool, +func (_ fastpathT) DecMapUintFloat64V(v map[uint]float64, checkNil bool, canChange bool, d *Decoder) (_ map[uint]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintBoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint]bool) - v, changed := fastpathTV.DecMapUintBoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintBoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint]bool) + v, changed := fastpathTV.DecMapUintBoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintBoolV(rv2i(rv).(map[uint]bool), false, d) + v := rv.Interface().(map[uint]bool) + fastpathTV.DecMapUintBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintBoolX(vp *map[uint]bool, d *Decoder) { - v, changed := f.DecMapUintBoolV(*vp, true, d) +func (f fastpathT) DecMapUintBoolX(vp *map[uint]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintBoolV(v map[uint]bool, canChange bool, +func (_ fastpathT) DecMapUintBoolV(v map[uint]bool, checkNil bool, canChange bool, d *Decoder) (_ map[uint]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]interface{}) - v, changed := fastpathTV.DecMapUint8IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]interface{}) + v, changed := fastpathTV.DecMapUint8IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8IntfV(rv2i(rv).(map[uint8]interface{}), false, d) + v := rv.Interface().(map[uint8]interface{}) + fastpathTV.DecMapUint8IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8IntfX(vp *map[uint8]interface{}, d *Decoder) { - v, changed := f.DecMapUint8IntfV(*vp, true, d) +func (f fastpathT) DecMapUint8IntfX(vp *map[uint8]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8IntfV(v map[uint8]interface{}, canChange bool, +func (_ fastpathT) DecMapUint8IntfV(v map[uint8]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[uint8]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk uint8 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]string) - v, changed := fastpathTV.DecMapUint8StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]string) + v, changed := fastpathTV.DecMapUint8StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8StringV(rv2i(rv).(map[uint8]string), false, d) + v := rv.Interface().(map[uint8]string) + fastpathTV.DecMapUint8StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8StringX(vp *map[uint8]string, d *Decoder) { - v, changed := f.DecMapUint8StringV(*vp, true, d) +func (f fastpathT) DecMapUint8StringX(vp *map[uint8]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8StringV(v map[uint8]string, canChange bool, +func (_ fastpathT) DecMapUint8StringV(v map[uint8]string, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[uint8]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]uint) - v, changed := fastpathTV.DecMapUint8UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]uint) + v, changed := fastpathTV.DecMapUint8UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8UintV(rv2i(rv).(map[uint8]uint), false, d) + v := rv.Interface().(map[uint8]uint) + fastpathTV.DecMapUint8UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8UintX(vp *map[uint8]uint, d *Decoder) { - v, changed := f.DecMapUint8UintV(*vp, true, d) +func (f fastpathT) DecMapUint8UintX(vp *map[uint8]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8UintV(v map[uint8]uint, canChange bool, +func (_ fastpathT) DecMapUint8UintV(v map[uint8]uint, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint8]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]uint8) - v, changed := fastpathTV.DecMapUint8Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]uint8) + v, changed := fastpathTV.DecMapUint8Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Uint8V(rv2i(rv).(map[uint8]uint8), false, d) + v := rv.Interface().(map[uint8]uint8) + fastpathTV.DecMapUint8Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Uint8X(vp *map[uint8]uint8, d *Decoder) { - v, changed := f.DecMapUint8Uint8V(*vp, true, d) +func (f fastpathT) DecMapUint8Uint8X(vp *map[uint8]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Uint8V(v map[uint8]uint8, canChange bool, +func (_ fastpathT) DecMapUint8Uint8V(v map[uint8]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[uint8]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]uint16) - v, changed := fastpathTV.DecMapUint8Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]uint16) + v, changed := fastpathTV.DecMapUint8Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Uint16V(rv2i(rv).(map[uint8]uint16), false, d) + v := rv.Interface().(map[uint8]uint16) + fastpathTV.DecMapUint8Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Uint16X(vp *map[uint8]uint16, d *Decoder) { - v, changed := f.DecMapUint8Uint16V(*vp, true, d) +func (f fastpathT) DecMapUint8Uint16X(vp *map[uint8]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Uint16V(v map[uint8]uint16, canChange bool, +func (_ fastpathT) DecMapUint8Uint16V(v map[uint8]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[uint8]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]uint32) - v, changed := fastpathTV.DecMapUint8Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]uint32) + v, changed := fastpathTV.DecMapUint8Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Uint32V(rv2i(rv).(map[uint8]uint32), false, d) + v := rv.Interface().(map[uint8]uint32) + fastpathTV.DecMapUint8Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Uint32X(vp *map[uint8]uint32, d *Decoder) { - v, changed := f.DecMapUint8Uint32V(*vp, true, d) +func (f fastpathT) DecMapUint8Uint32X(vp *map[uint8]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Uint32V(v map[uint8]uint32, canChange bool, +func (_ fastpathT) DecMapUint8Uint32V(v map[uint8]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[uint8]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]uint64) - v, changed := fastpathTV.DecMapUint8Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]uint64) + v, changed := fastpathTV.DecMapUint8Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Uint64V(rv2i(rv).(map[uint8]uint64), false, d) + v := rv.Interface().(map[uint8]uint64) + fastpathTV.DecMapUint8Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Uint64X(vp *map[uint8]uint64, d *Decoder) { - v, changed := f.DecMapUint8Uint64V(*vp, true, d) +func (f fastpathT) DecMapUint8Uint64X(vp *map[uint8]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Uint64V(v map[uint8]uint64, canChange bool, +func (_ fastpathT) DecMapUint8Uint64V(v map[uint8]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint8]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]uintptr) - v, changed := fastpathTV.DecMapUint8UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]uintptr) + v, changed := fastpathTV.DecMapUint8UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8UintptrV(rv2i(rv).(map[uint8]uintptr), false, d) + v := rv.Interface().(map[uint8]uintptr) + fastpathTV.DecMapUint8UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8UintptrX(vp *map[uint8]uintptr, d *Decoder) { - v, changed := f.DecMapUint8UintptrV(*vp, true, d) +func (f fastpathT) DecMapUint8UintptrX(vp *map[uint8]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8UintptrV(v map[uint8]uintptr, canChange bool, +func (_ fastpathT) DecMapUint8UintptrV(v map[uint8]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint8]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]int) - v, changed := fastpathTV.DecMapUint8IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]int) + v, changed := fastpathTV.DecMapUint8IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8IntV(rv2i(rv).(map[uint8]int), false, d) + v := rv.Interface().(map[uint8]int) + fastpathTV.DecMapUint8IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8IntX(vp *map[uint8]int, d *Decoder) { - v, changed := f.DecMapUint8IntV(*vp, true, d) +func (f fastpathT) DecMapUint8IntX(vp *map[uint8]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8IntV(v map[uint8]int, canChange bool, +func (_ fastpathT) DecMapUint8IntV(v map[uint8]int, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint8]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]int8) - v, changed := fastpathTV.DecMapUint8Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]int8) + v, changed := fastpathTV.DecMapUint8Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Int8V(rv2i(rv).(map[uint8]int8), false, d) + v := rv.Interface().(map[uint8]int8) + fastpathTV.DecMapUint8Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Int8X(vp *map[uint8]int8, d *Decoder) { - v, changed := f.DecMapUint8Int8V(*vp, true, d) +func (f fastpathT) DecMapUint8Int8X(vp *map[uint8]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Int8V(v map[uint8]int8, canChange bool, +func (_ fastpathT) DecMapUint8Int8V(v map[uint8]int8, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[uint8]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]int16) - v, changed := fastpathTV.DecMapUint8Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]int16) + v, changed := fastpathTV.DecMapUint8Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Int16V(rv2i(rv).(map[uint8]int16), false, d) + v := rv.Interface().(map[uint8]int16) + fastpathTV.DecMapUint8Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Int16X(vp *map[uint8]int16, d *Decoder) { - v, changed := f.DecMapUint8Int16V(*vp, true, d) +func (f fastpathT) DecMapUint8Int16X(vp *map[uint8]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Int16V(v map[uint8]int16, canChange bool, +func (_ fastpathT) DecMapUint8Int16V(v map[uint8]int16, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[uint8]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]int32) - v, changed := fastpathTV.DecMapUint8Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]int32) + v, changed := fastpathTV.DecMapUint8Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Int32V(rv2i(rv).(map[uint8]int32), false, d) + v := rv.Interface().(map[uint8]int32) + fastpathTV.DecMapUint8Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Int32X(vp *map[uint8]int32, d *Decoder) { - v, changed := f.DecMapUint8Int32V(*vp, true, d) +func (f fastpathT) DecMapUint8Int32X(vp *map[uint8]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Int32V(v map[uint8]int32, canChange bool, +func (_ fastpathT) DecMapUint8Int32V(v map[uint8]int32, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[uint8]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]int64) - v, changed := fastpathTV.DecMapUint8Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]int64) + v, changed := fastpathTV.DecMapUint8Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Int64V(rv2i(rv).(map[uint8]int64), false, d) + v := rv.Interface().(map[uint8]int64) + fastpathTV.DecMapUint8Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Int64X(vp *map[uint8]int64, d *Decoder) { - v, changed := f.DecMapUint8Int64V(*vp, true, d) +func (f fastpathT) DecMapUint8Int64X(vp *map[uint8]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Int64V(v map[uint8]int64, canChange bool, +func (_ fastpathT) DecMapUint8Int64V(v map[uint8]int64, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint8]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]float32) - v, changed := fastpathTV.DecMapUint8Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]float32) + v, changed := fastpathTV.DecMapUint8Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Float32V(rv2i(rv).(map[uint8]float32), false, d) + v := rv.Interface().(map[uint8]float32) + fastpathTV.DecMapUint8Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Float32X(vp *map[uint8]float32, d *Decoder) { - v, changed := f.DecMapUint8Float32V(*vp, true, d) +func (f fastpathT) DecMapUint8Float32X(vp *map[uint8]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Float32V(v map[uint8]float32, canChange bool, +func (_ fastpathT) DecMapUint8Float32V(v map[uint8]float32, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[uint8]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]float64) - v, changed := fastpathTV.DecMapUint8Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]float64) + v, changed := fastpathTV.DecMapUint8Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8Float64V(rv2i(rv).(map[uint8]float64), false, d) + v := rv.Interface().(map[uint8]float64) + fastpathTV.DecMapUint8Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8Float64X(vp *map[uint8]float64, d *Decoder) { - v, changed := f.DecMapUint8Float64V(*vp, true, d) +func (f fastpathT) DecMapUint8Float64X(vp *map[uint8]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8Float64V(v map[uint8]float64, canChange bool, +func (_ fastpathT) DecMapUint8Float64V(v map[uint8]float64, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint8]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint8BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint8]bool) - v, changed := fastpathTV.DecMapUint8BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint8BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint8]bool) + v, changed := fastpathTV.DecMapUint8BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint8BoolV(rv2i(rv).(map[uint8]bool), false, d) + v := rv.Interface().(map[uint8]bool) + fastpathTV.DecMapUint8BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint8BoolX(vp *map[uint8]bool, d *Decoder) { - v, changed := f.DecMapUint8BoolV(*vp, true, d) +func (f fastpathT) DecMapUint8BoolX(vp *map[uint8]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint8BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint8BoolV(v map[uint8]bool, canChange bool, +func (_ fastpathT) DecMapUint8BoolV(v map[uint8]bool, checkNil bool, canChange bool, d *Decoder) (_ map[uint8]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[uint8]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint8 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint8(dd.DecodeUint(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]interface{}) - v, changed := fastpathTV.DecMapUint16IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]interface{}) + v, changed := fastpathTV.DecMapUint16IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16IntfV(rv2i(rv).(map[uint16]interface{}), false, d) + v := rv.Interface().(map[uint16]interface{}) + fastpathTV.DecMapUint16IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16IntfX(vp *map[uint16]interface{}, d *Decoder) { - v, changed := f.DecMapUint16IntfV(*vp, true, d) +func (f fastpathT) DecMapUint16IntfX(vp *map[uint16]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16IntfV(v map[uint16]interface{}, canChange bool, +func (_ fastpathT) DecMapUint16IntfV(v map[uint16]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[uint16]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk uint16 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]string) - v, changed := fastpathTV.DecMapUint16StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]string) + v, changed := fastpathTV.DecMapUint16StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16StringV(rv2i(rv).(map[uint16]string), false, d) + v := rv.Interface().(map[uint16]string) + fastpathTV.DecMapUint16StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16StringX(vp *map[uint16]string, d *Decoder) { - v, changed := f.DecMapUint16StringV(*vp, true, d) +func (f fastpathT) DecMapUint16StringX(vp *map[uint16]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16StringV(v map[uint16]string, canChange bool, +func (_ fastpathT) DecMapUint16StringV(v map[uint16]string, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[uint16]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]uint) - v, changed := fastpathTV.DecMapUint16UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]uint) + v, changed := fastpathTV.DecMapUint16UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16UintV(rv2i(rv).(map[uint16]uint), false, d) + v := rv.Interface().(map[uint16]uint) + fastpathTV.DecMapUint16UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16UintX(vp *map[uint16]uint, d *Decoder) { - v, changed := f.DecMapUint16UintV(*vp, true, d) +func (f fastpathT) DecMapUint16UintX(vp *map[uint16]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16UintV(v map[uint16]uint, canChange bool, +func (_ fastpathT) DecMapUint16UintV(v map[uint16]uint, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint16]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]uint8) - v, changed := fastpathTV.DecMapUint16Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]uint8) + v, changed := fastpathTV.DecMapUint16Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Uint8V(rv2i(rv).(map[uint16]uint8), false, d) + v := rv.Interface().(map[uint16]uint8) + fastpathTV.DecMapUint16Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Uint8X(vp *map[uint16]uint8, d *Decoder) { - v, changed := f.DecMapUint16Uint8V(*vp, true, d) +func (f fastpathT) DecMapUint16Uint8X(vp *map[uint16]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Uint8V(*vp, checkNil, true, d) if changed { *vp = v } -} -func (_ fastpathT) DecMapUint16Uint8V(v map[uint16]uint8, canChange bool, - d *Decoder) (_ map[uint16]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() +} +func (_ fastpathT) DecMapUint16Uint8V(v map[uint16]uint8, checkNil bool, canChange bool, + d *Decoder) (_ map[uint16]uint8, changed bool) { + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[uint16]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]uint16) - v, changed := fastpathTV.DecMapUint16Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]uint16) + v, changed := fastpathTV.DecMapUint16Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Uint16V(rv2i(rv).(map[uint16]uint16), false, d) + v := rv.Interface().(map[uint16]uint16) + fastpathTV.DecMapUint16Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Uint16X(vp *map[uint16]uint16, d *Decoder) { - v, changed := f.DecMapUint16Uint16V(*vp, true, d) +func (f fastpathT) DecMapUint16Uint16X(vp *map[uint16]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Uint16V(v map[uint16]uint16, canChange bool, +func (_ fastpathT) DecMapUint16Uint16V(v map[uint16]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 4) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) v = make(map[uint16]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]uint32) - v, changed := fastpathTV.DecMapUint16Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]uint32) + v, changed := fastpathTV.DecMapUint16Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Uint32V(rv2i(rv).(map[uint16]uint32), false, d) + v := rv.Interface().(map[uint16]uint32) + fastpathTV.DecMapUint16Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Uint32X(vp *map[uint16]uint32, d *Decoder) { - v, changed := f.DecMapUint16Uint32V(*vp, true, d) +func (f fastpathT) DecMapUint16Uint32X(vp *map[uint16]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Uint32V(v map[uint16]uint32, canChange bool, +func (_ fastpathT) DecMapUint16Uint32V(v map[uint16]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[uint16]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]uint64) - v, changed := fastpathTV.DecMapUint16Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]uint64) + v, changed := fastpathTV.DecMapUint16Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Uint64V(rv2i(rv).(map[uint16]uint64), false, d) + v := rv.Interface().(map[uint16]uint64) + fastpathTV.DecMapUint16Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Uint64X(vp *map[uint16]uint64, d *Decoder) { - v, changed := f.DecMapUint16Uint64V(*vp, true, d) +func (f fastpathT) DecMapUint16Uint64X(vp *map[uint16]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Uint64V(v map[uint16]uint64, canChange bool, +func (_ fastpathT) DecMapUint16Uint64V(v map[uint16]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint16]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]uintptr) - v, changed := fastpathTV.DecMapUint16UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]uintptr) + v, changed := fastpathTV.DecMapUint16UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16UintptrV(rv2i(rv).(map[uint16]uintptr), false, d) + v := rv.Interface().(map[uint16]uintptr) + fastpathTV.DecMapUint16UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16UintptrX(vp *map[uint16]uintptr, d *Decoder) { - v, changed := f.DecMapUint16UintptrV(*vp, true, d) +func (f fastpathT) DecMapUint16UintptrX(vp *map[uint16]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16UintptrV(v map[uint16]uintptr, canChange bool, +func (_ fastpathT) DecMapUint16UintptrV(v map[uint16]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint16]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]int) - v, changed := fastpathTV.DecMapUint16IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]int) + v, changed := fastpathTV.DecMapUint16IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16IntV(rv2i(rv).(map[uint16]int), false, d) + v := rv.Interface().(map[uint16]int) + fastpathTV.DecMapUint16IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16IntX(vp *map[uint16]int, d *Decoder) { - v, changed := f.DecMapUint16IntV(*vp, true, d) +func (f fastpathT) DecMapUint16IntX(vp *map[uint16]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16IntV(v map[uint16]int, canChange bool, +func (_ fastpathT) DecMapUint16IntV(v map[uint16]int, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint16]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]int8) - v, changed := fastpathTV.DecMapUint16Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]int8) + v, changed := fastpathTV.DecMapUint16Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Int8V(rv2i(rv).(map[uint16]int8), false, d) + v := rv.Interface().(map[uint16]int8) + fastpathTV.DecMapUint16Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Int8X(vp *map[uint16]int8, d *Decoder) { - v, changed := f.DecMapUint16Int8V(*vp, true, d) +func (f fastpathT) DecMapUint16Int8X(vp *map[uint16]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Int8V(v map[uint16]int8, canChange bool, +func (_ fastpathT) DecMapUint16Int8V(v map[uint16]int8, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[uint16]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]int16) - v, changed := fastpathTV.DecMapUint16Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]int16) + v, changed := fastpathTV.DecMapUint16Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Int16V(rv2i(rv).(map[uint16]int16), false, d) + v := rv.Interface().(map[uint16]int16) + fastpathTV.DecMapUint16Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Int16X(vp *map[uint16]int16, d *Decoder) { - v, changed := f.DecMapUint16Int16V(*vp, true, d) +func (f fastpathT) DecMapUint16Int16X(vp *map[uint16]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Int16V(v map[uint16]int16, canChange bool, +func (_ fastpathT) DecMapUint16Int16V(v map[uint16]int16, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 4) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) v = make(map[uint16]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]int32) - v, changed := fastpathTV.DecMapUint16Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]int32) + v, changed := fastpathTV.DecMapUint16Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Int32V(rv2i(rv).(map[uint16]int32), false, d) + v := rv.Interface().(map[uint16]int32) + fastpathTV.DecMapUint16Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Int32X(vp *map[uint16]int32, d *Decoder) { - v, changed := f.DecMapUint16Int32V(*vp, true, d) +func (f fastpathT) DecMapUint16Int32X(vp *map[uint16]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Int32V(v map[uint16]int32, canChange bool, +func (_ fastpathT) DecMapUint16Int32V(v map[uint16]int32, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[uint16]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]int64) - v, changed := fastpathTV.DecMapUint16Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]int64) + v, changed := fastpathTV.DecMapUint16Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Int64V(rv2i(rv).(map[uint16]int64), false, d) + v := rv.Interface().(map[uint16]int64) + fastpathTV.DecMapUint16Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Int64X(vp *map[uint16]int64, d *Decoder) { - v, changed := f.DecMapUint16Int64V(*vp, true, d) +func (f fastpathT) DecMapUint16Int64X(vp *map[uint16]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Int64V(v map[uint16]int64, canChange bool, +func (_ fastpathT) DecMapUint16Int64V(v map[uint16]int64, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint16]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]float32) - v, changed := fastpathTV.DecMapUint16Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]float32) + v, changed := fastpathTV.DecMapUint16Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Float32V(rv2i(rv).(map[uint16]float32), false, d) + v := rv.Interface().(map[uint16]float32) + fastpathTV.DecMapUint16Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Float32X(vp *map[uint16]float32, d *Decoder) { - v, changed := f.DecMapUint16Float32V(*vp, true, d) +func (f fastpathT) DecMapUint16Float32X(vp *map[uint16]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Float32V(v map[uint16]float32, canChange bool, +func (_ fastpathT) DecMapUint16Float32V(v map[uint16]float32, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[uint16]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]float64) - v, changed := fastpathTV.DecMapUint16Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]float64) + v, changed := fastpathTV.DecMapUint16Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16Float64V(rv2i(rv).(map[uint16]float64), false, d) + v := rv.Interface().(map[uint16]float64) + fastpathTV.DecMapUint16Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16Float64X(vp *map[uint16]float64, d *Decoder) { - v, changed := f.DecMapUint16Float64V(*vp, true, d) +func (f fastpathT) DecMapUint16Float64X(vp *map[uint16]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16Float64V(v map[uint16]float64, canChange bool, +func (_ fastpathT) DecMapUint16Float64V(v map[uint16]float64, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint16]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint16BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint16]bool) - v, changed := fastpathTV.DecMapUint16BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint16BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint16]bool) + v, changed := fastpathTV.DecMapUint16BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint16BoolV(rv2i(rv).(map[uint16]bool), false, d) + v := rv.Interface().(map[uint16]bool) + fastpathTV.DecMapUint16BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint16BoolX(vp *map[uint16]bool, d *Decoder) { - v, changed := f.DecMapUint16BoolV(*vp, true, d) +func (f fastpathT) DecMapUint16BoolX(vp *map[uint16]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint16BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint16BoolV(v map[uint16]bool, canChange bool, +func (_ fastpathT) DecMapUint16BoolV(v map[uint16]bool, checkNil bool, canChange bool, d *Decoder) (_ map[uint16]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[uint16]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint16 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint16(dd.DecodeUint(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]interface{}) - v, changed := fastpathTV.DecMapUint32IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]interface{}) + v, changed := fastpathTV.DecMapUint32IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32IntfV(rv2i(rv).(map[uint32]interface{}), false, d) + v := rv.Interface().(map[uint32]interface{}) + fastpathTV.DecMapUint32IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32IntfX(vp *map[uint32]interface{}, d *Decoder) { - v, changed := f.DecMapUint32IntfV(*vp, true, d) +func (f fastpathT) DecMapUint32IntfX(vp *map[uint32]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32IntfV(v map[uint32]interface{}, canChange bool, +func (_ fastpathT) DecMapUint32IntfV(v map[uint32]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[uint32]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk uint32 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]string) - v, changed := fastpathTV.DecMapUint32StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]string) + v, changed := fastpathTV.DecMapUint32StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32StringV(rv2i(rv).(map[uint32]string), false, d) + v := rv.Interface().(map[uint32]string) + fastpathTV.DecMapUint32StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32StringX(vp *map[uint32]string, d *Decoder) { - v, changed := f.DecMapUint32StringV(*vp, true, d) +func (f fastpathT) DecMapUint32StringX(vp *map[uint32]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32StringV(v map[uint32]string, canChange bool, +func (_ fastpathT) DecMapUint32StringV(v map[uint32]string, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[uint32]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]uint) - v, changed := fastpathTV.DecMapUint32UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]uint) + v, changed := fastpathTV.DecMapUint32UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32UintV(rv2i(rv).(map[uint32]uint), false, d) + v := rv.Interface().(map[uint32]uint) + fastpathTV.DecMapUint32UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32UintX(vp *map[uint32]uint, d *Decoder) { - v, changed := f.DecMapUint32UintV(*vp, true, d) +func (f fastpathT) DecMapUint32UintX(vp *map[uint32]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32UintV(v map[uint32]uint, canChange bool, +func (_ fastpathT) DecMapUint32UintV(v map[uint32]uint, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint32]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]uint8) - v, changed := fastpathTV.DecMapUint32Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]uint8) + v, changed := fastpathTV.DecMapUint32Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Uint8V(rv2i(rv).(map[uint32]uint8), false, d) + v := rv.Interface().(map[uint32]uint8) + fastpathTV.DecMapUint32Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Uint8X(vp *map[uint32]uint8, d *Decoder) { - v, changed := f.DecMapUint32Uint8V(*vp, true, d) +func (f fastpathT) DecMapUint32Uint8X(vp *map[uint32]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Uint8V(v map[uint32]uint8, canChange bool, +func (_ fastpathT) DecMapUint32Uint8V(v map[uint32]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[uint32]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]uint16) - v, changed := fastpathTV.DecMapUint32Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]uint16) + v, changed := fastpathTV.DecMapUint32Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Uint16V(rv2i(rv).(map[uint32]uint16), false, d) + v := rv.Interface().(map[uint32]uint16) + fastpathTV.DecMapUint32Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Uint16X(vp *map[uint32]uint16, d *Decoder) { - v, changed := f.DecMapUint32Uint16V(*vp, true, d) +func (f fastpathT) DecMapUint32Uint16X(vp *map[uint32]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Uint16V(v map[uint32]uint16, canChange bool, +func (_ fastpathT) DecMapUint32Uint16V(v map[uint32]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[uint32]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]uint32) - v, changed := fastpathTV.DecMapUint32Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]uint32) + v, changed := fastpathTV.DecMapUint32Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Uint32V(rv2i(rv).(map[uint32]uint32), false, d) + v := rv.Interface().(map[uint32]uint32) + fastpathTV.DecMapUint32Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Uint32X(vp *map[uint32]uint32, d *Decoder) { - v, changed := f.DecMapUint32Uint32V(*vp, true, d) +func (f fastpathT) DecMapUint32Uint32X(vp *map[uint32]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Uint32V(v map[uint32]uint32, canChange bool, +func (_ fastpathT) DecMapUint32Uint32V(v map[uint32]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[uint32]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]uint64) - v, changed := fastpathTV.DecMapUint32Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]uint64) + v, changed := fastpathTV.DecMapUint32Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Uint64V(rv2i(rv).(map[uint32]uint64), false, d) + v := rv.Interface().(map[uint32]uint64) + fastpathTV.DecMapUint32Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Uint64X(vp *map[uint32]uint64, d *Decoder) { - v, changed := f.DecMapUint32Uint64V(*vp, true, d) +func (f fastpathT) DecMapUint32Uint64X(vp *map[uint32]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Uint64V(v map[uint32]uint64, canChange bool, +func (_ fastpathT) DecMapUint32Uint64V(v map[uint32]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint32]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]uintptr) - v, changed := fastpathTV.DecMapUint32UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]uintptr) + v, changed := fastpathTV.DecMapUint32UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32UintptrV(rv2i(rv).(map[uint32]uintptr), false, d) + v := rv.Interface().(map[uint32]uintptr) + fastpathTV.DecMapUint32UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32UintptrX(vp *map[uint32]uintptr, d *Decoder) { - v, changed := f.DecMapUint32UintptrV(*vp, true, d) +func (f fastpathT) DecMapUint32UintptrX(vp *map[uint32]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32UintptrV(v map[uint32]uintptr, canChange bool, +func (_ fastpathT) DecMapUint32UintptrV(v map[uint32]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint32]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]int) - v, changed := fastpathTV.DecMapUint32IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]int) + v, changed := fastpathTV.DecMapUint32IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32IntV(rv2i(rv).(map[uint32]int), false, d) + v := rv.Interface().(map[uint32]int) + fastpathTV.DecMapUint32IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32IntX(vp *map[uint32]int, d *Decoder) { - v, changed := f.DecMapUint32IntV(*vp, true, d) +func (f fastpathT) DecMapUint32IntX(vp *map[uint32]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32IntV(v map[uint32]int, canChange bool, +func (_ fastpathT) DecMapUint32IntV(v map[uint32]int, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint32]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]int8) - v, changed := fastpathTV.DecMapUint32Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]int8) + v, changed := fastpathTV.DecMapUint32Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Int8V(rv2i(rv).(map[uint32]int8), false, d) + v := rv.Interface().(map[uint32]int8) + fastpathTV.DecMapUint32Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Int8X(vp *map[uint32]int8, d *Decoder) { - v, changed := f.DecMapUint32Int8V(*vp, true, d) +func (f fastpathT) DecMapUint32Int8X(vp *map[uint32]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Int8V(v map[uint32]int8, canChange bool, +func (_ fastpathT) DecMapUint32Int8V(v map[uint32]int8, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[uint32]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]int16) - v, changed := fastpathTV.DecMapUint32Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]int16) + v, changed := fastpathTV.DecMapUint32Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Int16V(rv2i(rv).(map[uint32]int16), false, d) + v := rv.Interface().(map[uint32]int16) + fastpathTV.DecMapUint32Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Int16X(vp *map[uint32]int16, d *Decoder) { - v, changed := f.DecMapUint32Int16V(*vp, true, d) +func (f fastpathT) DecMapUint32Int16X(vp *map[uint32]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Int16V(v map[uint32]int16, canChange bool, +func (_ fastpathT) DecMapUint32Int16V(v map[uint32]int16, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[uint32]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]int32) - v, changed := fastpathTV.DecMapUint32Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]int32) + v, changed := fastpathTV.DecMapUint32Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Int32V(rv2i(rv).(map[uint32]int32), false, d) + v := rv.Interface().(map[uint32]int32) + fastpathTV.DecMapUint32Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Int32X(vp *map[uint32]int32, d *Decoder) { - v, changed := f.DecMapUint32Int32V(*vp, true, d) +func (f fastpathT) DecMapUint32Int32X(vp *map[uint32]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Int32V(v map[uint32]int32, canChange bool, +func (_ fastpathT) DecMapUint32Int32V(v map[uint32]int32, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[uint32]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]int64) - v, changed := fastpathTV.DecMapUint32Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]int64) + v, changed := fastpathTV.DecMapUint32Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Int64V(rv2i(rv).(map[uint32]int64), false, d) + v := rv.Interface().(map[uint32]int64) + fastpathTV.DecMapUint32Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Int64X(vp *map[uint32]int64, d *Decoder) { - v, changed := f.DecMapUint32Int64V(*vp, true, d) +func (f fastpathT) DecMapUint32Int64X(vp *map[uint32]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Int64V(v map[uint32]int64, canChange bool, +func (_ fastpathT) DecMapUint32Int64V(v map[uint32]int64, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint32]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]float32) - v, changed := fastpathTV.DecMapUint32Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]float32) + v, changed := fastpathTV.DecMapUint32Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Float32V(rv2i(rv).(map[uint32]float32), false, d) + v := rv.Interface().(map[uint32]float32) + fastpathTV.DecMapUint32Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Float32X(vp *map[uint32]float32, d *Decoder) { - v, changed := f.DecMapUint32Float32V(*vp, true, d) +func (f fastpathT) DecMapUint32Float32X(vp *map[uint32]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Float32V(v map[uint32]float32, canChange bool, +func (_ fastpathT) DecMapUint32Float32V(v map[uint32]float32, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[uint32]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]float64) - v, changed := fastpathTV.DecMapUint32Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]float64) + v, changed := fastpathTV.DecMapUint32Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32Float64V(rv2i(rv).(map[uint32]float64), false, d) + v := rv.Interface().(map[uint32]float64) + fastpathTV.DecMapUint32Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32Float64X(vp *map[uint32]float64, d *Decoder) { - v, changed := f.DecMapUint32Float64V(*vp, true, d) +func (f fastpathT) DecMapUint32Float64X(vp *map[uint32]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32Float64V(v map[uint32]float64, canChange bool, +func (_ fastpathT) DecMapUint32Float64V(v map[uint32]float64, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint32]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint32BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint32]bool) - v, changed := fastpathTV.DecMapUint32BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint32BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint32]bool) + v, changed := fastpathTV.DecMapUint32BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint32BoolV(rv2i(rv).(map[uint32]bool), false, d) + v := rv.Interface().(map[uint32]bool) + fastpathTV.DecMapUint32BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint32BoolX(vp *map[uint32]bool, d *Decoder) { - v, changed := f.DecMapUint32BoolV(*vp, true, d) +func (f fastpathT) DecMapUint32BoolX(vp *map[uint32]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint32BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint32BoolV(v map[uint32]bool, canChange bool, +func (_ fastpathT) DecMapUint32BoolV(v map[uint32]bool, checkNil bool, canChange bool, d *Decoder) (_ map[uint32]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[uint32]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint32 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uint32(dd.DecodeUint(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]interface{}) - v, changed := fastpathTV.DecMapUint64IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]interface{}) + v, changed := fastpathTV.DecMapUint64IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64IntfV(rv2i(rv).(map[uint64]interface{}), false, d) + v := rv.Interface().(map[uint64]interface{}) + fastpathTV.DecMapUint64IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64IntfX(vp *map[uint64]interface{}, d *Decoder) { - v, changed := f.DecMapUint64IntfV(*vp, true, d) +func (f fastpathT) DecMapUint64IntfX(vp *map[uint64]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64IntfV(v map[uint64]interface{}, canChange bool, +func (_ fastpathT) DecMapUint64IntfV(v map[uint64]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[uint64]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk uint64 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]string) - v, changed := fastpathTV.DecMapUint64StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]string) + v, changed := fastpathTV.DecMapUint64StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64StringV(rv2i(rv).(map[uint64]string), false, d) + v := rv.Interface().(map[uint64]string) + fastpathTV.DecMapUint64StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64StringX(vp *map[uint64]string, d *Decoder) { - v, changed := f.DecMapUint64StringV(*vp, true, d) +func (f fastpathT) DecMapUint64StringX(vp *map[uint64]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64StringV(v map[uint64]string, canChange bool, +func (_ fastpathT) DecMapUint64StringV(v map[uint64]string, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[uint64]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]uint) - v, changed := fastpathTV.DecMapUint64UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]uint) + v, changed := fastpathTV.DecMapUint64UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64UintV(rv2i(rv).(map[uint64]uint), false, d) + v := rv.Interface().(map[uint64]uint) + fastpathTV.DecMapUint64UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64UintX(vp *map[uint64]uint, d *Decoder) { - v, changed := f.DecMapUint64UintV(*vp, true, d) +func (f fastpathT) DecMapUint64UintX(vp *map[uint64]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64UintV(v map[uint64]uint, canChange bool, +func (_ fastpathT) DecMapUint64UintV(v map[uint64]uint, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint64]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]uint8) - v, changed := fastpathTV.DecMapUint64Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]uint8) + v, changed := fastpathTV.DecMapUint64Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Uint8V(rv2i(rv).(map[uint64]uint8), false, d) + v := rv.Interface().(map[uint64]uint8) + fastpathTV.DecMapUint64Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Uint8X(vp *map[uint64]uint8, d *Decoder) { - v, changed := f.DecMapUint64Uint8V(*vp, true, d) +func (f fastpathT) DecMapUint64Uint8X(vp *map[uint64]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Uint8V(v map[uint64]uint8, canChange bool, +func (_ fastpathT) DecMapUint64Uint8V(v map[uint64]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint64]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]uint16) - v, changed := fastpathTV.DecMapUint64Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]uint16) + v, changed := fastpathTV.DecMapUint64Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Uint16V(rv2i(rv).(map[uint64]uint16), false, d) + v := rv.Interface().(map[uint64]uint16) + fastpathTV.DecMapUint64Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Uint16X(vp *map[uint64]uint16, d *Decoder) { - v, changed := f.DecMapUint64Uint16V(*vp, true, d) +func (f fastpathT) DecMapUint64Uint16X(vp *map[uint64]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Uint16V(v map[uint64]uint16, canChange bool, +func (_ fastpathT) DecMapUint64Uint16V(v map[uint64]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint64]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]uint32) - v, changed := fastpathTV.DecMapUint64Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]uint32) + v, changed := fastpathTV.DecMapUint64Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Uint32V(rv2i(rv).(map[uint64]uint32), false, d) + v := rv.Interface().(map[uint64]uint32) + fastpathTV.DecMapUint64Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Uint32X(vp *map[uint64]uint32, d *Decoder) { - v, changed := f.DecMapUint64Uint32V(*vp, true, d) +func (f fastpathT) DecMapUint64Uint32X(vp *map[uint64]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Uint32V(v map[uint64]uint32, canChange bool, +func (_ fastpathT) DecMapUint64Uint32V(v map[uint64]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint64]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]uint64) - v, changed := fastpathTV.DecMapUint64Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]uint64) + v, changed := fastpathTV.DecMapUint64Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Uint64V(rv2i(rv).(map[uint64]uint64), false, d) + v := rv.Interface().(map[uint64]uint64) + fastpathTV.DecMapUint64Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Uint64X(vp *map[uint64]uint64, d *Decoder) { - v, changed := f.DecMapUint64Uint64V(*vp, true, d) +func (f fastpathT) DecMapUint64Uint64X(vp *map[uint64]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Uint64V(v map[uint64]uint64, canChange bool, +func (_ fastpathT) DecMapUint64Uint64V(v map[uint64]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint64]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]uintptr) - v, changed := fastpathTV.DecMapUint64UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]uintptr) + v, changed := fastpathTV.DecMapUint64UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64UintptrV(rv2i(rv).(map[uint64]uintptr), false, d) + v := rv.Interface().(map[uint64]uintptr) + fastpathTV.DecMapUint64UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64UintptrX(vp *map[uint64]uintptr, d *Decoder) { - v, changed := f.DecMapUint64UintptrV(*vp, true, d) +func (f fastpathT) DecMapUint64UintptrX(vp *map[uint64]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64UintptrV(*vp, checkNil, true, d) if changed { *vp = v } -} -func (_ fastpathT) DecMapUint64UintptrV(v map[uint64]uintptr, canChange bool, - d *Decoder) (_ map[uint64]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() +} +func (_ fastpathT) DecMapUint64UintptrV(v map[uint64]uintptr, checkNil bool, canChange bool, + d *Decoder) (_ map[uint64]uintptr, changed bool) { + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint64]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]int) - v, changed := fastpathTV.DecMapUint64IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]int) + v, changed := fastpathTV.DecMapUint64IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64IntV(rv2i(rv).(map[uint64]int), false, d) + v := rv.Interface().(map[uint64]int) + fastpathTV.DecMapUint64IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64IntX(vp *map[uint64]int, d *Decoder) { - v, changed := f.DecMapUint64IntV(*vp, true, d) +func (f fastpathT) DecMapUint64IntX(vp *map[uint64]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64IntV(v map[uint64]int, canChange bool, +func (_ fastpathT) DecMapUint64IntV(v map[uint64]int, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint64]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]int8) - v, changed := fastpathTV.DecMapUint64Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]int8) + v, changed := fastpathTV.DecMapUint64Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Int8V(rv2i(rv).(map[uint64]int8), false, d) + v := rv.Interface().(map[uint64]int8) + fastpathTV.DecMapUint64Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Int8X(vp *map[uint64]int8, d *Decoder) { - v, changed := f.DecMapUint64Int8V(*vp, true, d) +func (f fastpathT) DecMapUint64Int8X(vp *map[uint64]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Int8V(v map[uint64]int8, canChange bool, +func (_ fastpathT) DecMapUint64Int8V(v map[uint64]int8, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint64]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]int16) - v, changed := fastpathTV.DecMapUint64Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]int16) + v, changed := fastpathTV.DecMapUint64Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Int16V(rv2i(rv).(map[uint64]int16), false, d) + v := rv.Interface().(map[uint64]int16) + fastpathTV.DecMapUint64Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Int16X(vp *map[uint64]int16, d *Decoder) { - v, changed := f.DecMapUint64Int16V(*vp, true, d) +func (f fastpathT) DecMapUint64Int16X(vp *map[uint64]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Int16V(v map[uint64]int16, canChange bool, +func (_ fastpathT) DecMapUint64Int16V(v map[uint64]int16, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uint64]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]int32) - v, changed := fastpathTV.DecMapUint64Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]int32) + v, changed := fastpathTV.DecMapUint64Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Int32V(rv2i(rv).(map[uint64]int32), false, d) + v := rv.Interface().(map[uint64]int32) + fastpathTV.DecMapUint64Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Int32X(vp *map[uint64]int32, d *Decoder) { - v, changed := f.DecMapUint64Int32V(*vp, true, d) +func (f fastpathT) DecMapUint64Int32X(vp *map[uint64]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Int32V(v map[uint64]int32, canChange bool, +func (_ fastpathT) DecMapUint64Int32V(v map[uint64]int32, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint64]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]int64) - v, changed := fastpathTV.DecMapUint64Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]int64) + v, changed := fastpathTV.DecMapUint64Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Int64V(rv2i(rv).(map[uint64]int64), false, d) + v := rv.Interface().(map[uint64]int64) + fastpathTV.DecMapUint64Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Int64X(vp *map[uint64]int64, d *Decoder) { - v, changed := f.DecMapUint64Int64V(*vp, true, d) +func (f fastpathT) DecMapUint64Int64X(vp *map[uint64]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Int64V(v map[uint64]int64, canChange bool, +func (_ fastpathT) DecMapUint64Int64V(v map[uint64]int64, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint64]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]float32) - v, changed := fastpathTV.DecMapUint64Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]float32) + v, changed := fastpathTV.DecMapUint64Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Float32V(rv2i(rv).(map[uint64]float32), false, d) + v := rv.Interface().(map[uint64]float32) + fastpathTV.DecMapUint64Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Float32X(vp *map[uint64]float32, d *Decoder) { - v, changed := f.DecMapUint64Float32V(*vp, true, d) +func (f fastpathT) DecMapUint64Float32X(vp *map[uint64]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Float32V(v map[uint64]float32, canChange bool, +func (_ fastpathT) DecMapUint64Float32V(v map[uint64]float32, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uint64]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]float64) - v, changed := fastpathTV.DecMapUint64Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]float64) + v, changed := fastpathTV.DecMapUint64Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64Float64V(rv2i(rv).(map[uint64]float64), false, d) + v := rv.Interface().(map[uint64]float64) + fastpathTV.DecMapUint64Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64Float64X(vp *map[uint64]float64, d *Decoder) { - v, changed := f.DecMapUint64Float64V(*vp, true, d) +func (f fastpathT) DecMapUint64Float64X(vp *map[uint64]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64Float64V(v map[uint64]float64, canChange bool, +func (_ fastpathT) DecMapUint64Float64V(v map[uint64]float64, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uint64]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUint64BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uint64]bool) - v, changed := fastpathTV.DecMapUint64BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUint64BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uint64]bool) + v, changed := fastpathTV.DecMapUint64BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUint64BoolV(rv2i(rv).(map[uint64]bool), false, d) + v := rv.Interface().(map[uint64]bool) + fastpathTV.DecMapUint64BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUint64BoolX(vp *map[uint64]bool, d *Decoder) { - v, changed := f.DecMapUint64BoolV(*vp, true, d) +func (f fastpathT) DecMapUint64BoolX(vp *map[uint64]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapUint64BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUint64BoolV(v map[uint64]bool, canChange bool, +func (_ fastpathT) DecMapUint64BoolV(v map[uint64]bool, checkNil bool, canChange bool, d *Decoder) (_ map[uint64]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uint64]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uint64 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeUint64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeUint(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrIntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]interface{}) - v, changed := fastpathTV.DecMapUintptrIntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrIntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]interface{}) + v, changed := fastpathTV.DecMapUintptrIntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrIntfV(rv2i(rv).(map[uintptr]interface{}), false, d) + v := rv.Interface().(map[uintptr]interface{}) + fastpathTV.DecMapUintptrIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrIntfX(vp *map[uintptr]interface{}, d *Decoder) { - v, changed := f.DecMapUintptrIntfV(*vp, true, d) +func (f fastpathT) DecMapUintptrIntfX(vp *map[uintptr]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrIntfV(v map[uintptr]interface{}, canChange bool, +func (_ fastpathT) DecMapUintptrIntfV(v map[uintptr]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[uintptr]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk uintptr var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrStringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]string) - v, changed := fastpathTV.DecMapUintptrStringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrStringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]string) + v, changed := fastpathTV.DecMapUintptrStringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrStringV(rv2i(rv).(map[uintptr]string), false, d) + v := rv.Interface().(map[uintptr]string) + fastpathTV.DecMapUintptrStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrStringX(vp *map[uintptr]string, d *Decoder) { - v, changed := f.DecMapUintptrStringV(*vp, true, d) +func (f fastpathT) DecMapUintptrStringX(vp *map[uintptr]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrStringV(v map[uintptr]string, canChange bool, +func (_ fastpathT) DecMapUintptrStringV(v map[uintptr]string, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[uintptr]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrUintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]uint) - v, changed := fastpathTV.DecMapUintptrUintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrUintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]uint) + v, changed := fastpathTV.DecMapUintptrUintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrUintV(rv2i(rv).(map[uintptr]uint), false, d) + v := rv.Interface().(map[uintptr]uint) + fastpathTV.DecMapUintptrUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrUintX(vp *map[uintptr]uint, d *Decoder) { - v, changed := f.DecMapUintptrUintV(*vp, true, d) +func (f fastpathT) DecMapUintptrUintX(vp *map[uintptr]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrUintV(v map[uintptr]uint, canChange bool, +func (_ fastpathT) DecMapUintptrUintV(v map[uintptr]uint, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uintptr]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrUint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]uint8) - v, changed := fastpathTV.DecMapUintptrUint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrUint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]uint8) + v, changed := fastpathTV.DecMapUintptrUint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrUint8V(rv2i(rv).(map[uintptr]uint8), false, d) + v := rv.Interface().(map[uintptr]uint8) + fastpathTV.DecMapUintptrUint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrUint8X(vp *map[uintptr]uint8, d *Decoder) { - v, changed := f.DecMapUintptrUint8V(*vp, true, d) +func (f fastpathT) DecMapUintptrUint8X(vp *map[uintptr]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrUint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrUint8V(v map[uintptr]uint8, canChange bool, +func (_ fastpathT) DecMapUintptrUint8V(v map[uintptr]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uintptr]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrUint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]uint16) - v, changed := fastpathTV.DecMapUintptrUint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrUint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]uint16) + v, changed := fastpathTV.DecMapUintptrUint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrUint16V(rv2i(rv).(map[uintptr]uint16), false, d) + v := rv.Interface().(map[uintptr]uint16) + fastpathTV.DecMapUintptrUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrUint16X(vp *map[uintptr]uint16, d *Decoder) { - v, changed := f.DecMapUintptrUint16V(*vp, true, d) +func (f fastpathT) DecMapUintptrUint16X(vp *map[uintptr]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrUint16V(v map[uintptr]uint16, canChange bool, +func (_ fastpathT) DecMapUintptrUint16V(v map[uintptr]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uintptr]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrUint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]uint32) - v, changed := fastpathTV.DecMapUintptrUint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrUint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]uint32) + v, changed := fastpathTV.DecMapUintptrUint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrUint32V(rv2i(rv).(map[uintptr]uint32), false, d) + v := rv.Interface().(map[uintptr]uint32) + fastpathTV.DecMapUintptrUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrUint32X(vp *map[uintptr]uint32, d *Decoder) { - v, changed := f.DecMapUintptrUint32V(*vp, true, d) +func (f fastpathT) DecMapUintptrUint32X(vp *map[uintptr]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrUint32V(v map[uintptr]uint32, canChange bool, +func (_ fastpathT) DecMapUintptrUint32V(v map[uintptr]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uintptr]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrUint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]uint64) - v, changed := fastpathTV.DecMapUintptrUint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrUint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]uint64) + v, changed := fastpathTV.DecMapUintptrUint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrUint64V(rv2i(rv).(map[uintptr]uint64), false, d) + v := rv.Interface().(map[uintptr]uint64) + fastpathTV.DecMapUintptrUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrUint64X(vp *map[uintptr]uint64, d *Decoder) { - v, changed := f.DecMapUintptrUint64V(*vp, true, d) +func (f fastpathT) DecMapUintptrUint64X(vp *map[uintptr]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrUint64V(v map[uintptr]uint64, canChange bool, +func (_ fastpathT) DecMapUintptrUint64V(v map[uintptr]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uintptr]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrUintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]uintptr) - v, changed := fastpathTV.DecMapUintptrUintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrUintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]uintptr) + v, changed := fastpathTV.DecMapUintptrUintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrUintptrV(rv2i(rv).(map[uintptr]uintptr), false, d) + v := rv.Interface().(map[uintptr]uintptr) + fastpathTV.DecMapUintptrUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrUintptrX(vp *map[uintptr]uintptr, d *Decoder) { - v, changed := f.DecMapUintptrUintptrV(*vp, true, d) +func (f fastpathT) DecMapUintptrUintptrX(vp *map[uintptr]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrUintptrV(v map[uintptr]uintptr, canChange bool, +func (_ fastpathT) DecMapUintptrUintptrV(v map[uintptr]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uintptr]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrIntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]int) - v, changed := fastpathTV.DecMapUintptrIntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrIntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]int) + v, changed := fastpathTV.DecMapUintptrIntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrIntV(rv2i(rv).(map[uintptr]int), false, d) + v := rv.Interface().(map[uintptr]int) + fastpathTV.DecMapUintptrIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrIntX(vp *map[uintptr]int, d *Decoder) { - v, changed := f.DecMapUintptrIntV(*vp, true, d) +func (f fastpathT) DecMapUintptrIntX(vp *map[uintptr]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrIntV(v map[uintptr]int, canChange bool, +func (_ fastpathT) DecMapUintptrIntV(v map[uintptr]int, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uintptr]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrInt8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]int8) - v, changed := fastpathTV.DecMapUintptrInt8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrInt8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]int8) + v, changed := fastpathTV.DecMapUintptrInt8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrInt8V(rv2i(rv).(map[uintptr]int8), false, d) + v := rv.Interface().(map[uintptr]int8) + fastpathTV.DecMapUintptrInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrInt8X(vp *map[uintptr]int8, d *Decoder) { - v, changed := f.DecMapUintptrInt8V(*vp, true, d) +func (f fastpathT) DecMapUintptrInt8X(vp *map[uintptr]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrInt8V(v map[uintptr]int8, canChange bool, +func (_ fastpathT) DecMapUintptrInt8V(v map[uintptr]int8, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uintptr]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrInt16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]int16) - v, changed := fastpathTV.DecMapUintptrInt16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrInt16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]int16) + v, changed := fastpathTV.DecMapUintptrInt16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrInt16V(rv2i(rv).(map[uintptr]int16), false, d) + v := rv.Interface().(map[uintptr]int16) + fastpathTV.DecMapUintptrInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrInt16X(vp *map[uintptr]int16, d *Decoder) { - v, changed := f.DecMapUintptrInt16V(*vp, true, d) +func (f fastpathT) DecMapUintptrInt16X(vp *map[uintptr]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrInt16V(v map[uintptr]int16, canChange bool, +func (_ fastpathT) DecMapUintptrInt16V(v map[uintptr]int16, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[uintptr]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrInt32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]int32) - v, changed := fastpathTV.DecMapUintptrInt32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrInt32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]int32) + v, changed := fastpathTV.DecMapUintptrInt32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrInt32V(rv2i(rv).(map[uintptr]int32), false, d) + v := rv.Interface().(map[uintptr]int32) + fastpathTV.DecMapUintptrInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrInt32X(vp *map[uintptr]int32, d *Decoder) { - v, changed := f.DecMapUintptrInt32V(*vp, true, d) +func (f fastpathT) DecMapUintptrInt32X(vp *map[uintptr]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrInt32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrInt32V(v map[uintptr]int32, canChange bool, +func (_ fastpathT) DecMapUintptrInt32V(v map[uintptr]int32, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uintptr]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrInt64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]int64) - v, changed := fastpathTV.DecMapUintptrInt64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrInt64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]int64) + v, changed := fastpathTV.DecMapUintptrInt64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrInt64V(rv2i(rv).(map[uintptr]int64), false, d) + v := rv.Interface().(map[uintptr]int64) + fastpathTV.DecMapUintptrInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrInt64X(vp *map[uintptr]int64, d *Decoder) { - v, changed := f.DecMapUintptrInt64V(*vp, true, d) +func (f fastpathT) DecMapUintptrInt64X(vp *map[uintptr]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrInt64V(v map[uintptr]int64, canChange bool, +func (_ fastpathT) DecMapUintptrInt64V(v map[uintptr]int64, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uintptr]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrFloat32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]float32) - v, changed := fastpathTV.DecMapUintptrFloat32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrFloat32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]float32) + v, changed := fastpathTV.DecMapUintptrFloat32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrFloat32V(rv2i(rv).(map[uintptr]float32), false, d) + v := rv.Interface().(map[uintptr]float32) + fastpathTV.DecMapUintptrFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrFloat32X(vp *map[uintptr]float32, d *Decoder) { - v, changed := f.DecMapUintptrFloat32V(*vp, true, d) +func (f fastpathT) DecMapUintptrFloat32X(vp *map[uintptr]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrFloat32V(v map[uintptr]float32, canChange bool, +func (_ fastpathT) DecMapUintptrFloat32V(v map[uintptr]float32, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[uintptr]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrFloat64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]float64) - v, changed := fastpathTV.DecMapUintptrFloat64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrFloat64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]float64) + v, changed := fastpathTV.DecMapUintptrFloat64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrFloat64V(rv2i(rv).(map[uintptr]float64), false, d) + v := rv.Interface().(map[uintptr]float64) + fastpathTV.DecMapUintptrFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrFloat64X(vp *map[uintptr]float64, d *Decoder) { - v, changed := f.DecMapUintptrFloat64V(*vp, true, d) +func (f fastpathT) DecMapUintptrFloat64X(vp *map[uintptr]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrFloat64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrFloat64V(v map[uintptr]float64, canChange bool, +func (_ fastpathT) DecMapUintptrFloat64V(v map[uintptr]float64, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[uintptr]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapUintptrBoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[uintptr]bool) - v, changed := fastpathTV.DecMapUintptrBoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapUintptrBoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[uintptr]bool) + v, changed := fastpathTV.DecMapUintptrBoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapUintptrBoolV(rv2i(rv).(map[uintptr]bool), false, d) + v := rv.Interface().(map[uintptr]bool) + fastpathTV.DecMapUintptrBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapUintptrBoolX(vp *map[uintptr]bool, d *Decoder) { - v, changed := f.DecMapUintptrBoolV(*vp, true, d) +func (f fastpathT) DecMapUintptrBoolX(vp *map[uintptr]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapUintptrBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapUintptrBoolV(v map[uintptr]bool, canChange bool, +func (_ fastpathT) DecMapUintptrBoolV(v map[uintptr]bool, checkNil bool, canChange bool, d *Decoder) (_ map[uintptr]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[uintptr]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk uintptr var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = uintptr(dd.DecodeUint(uintBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntIntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]interface{}) - v, changed := fastpathTV.DecMapIntIntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntIntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]interface{}) + v, changed := fastpathTV.DecMapIntIntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntIntfV(rv2i(rv).(map[int]interface{}), false, d) + v := rv.Interface().(map[int]interface{}) + fastpathTV.DecMapIntIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntIntfX(vp *map[int]interface{}, d *Decoder) { - v, changed := f.DecMapIntIntfV(*vp, true, d) +func (f fastpathT) DecMapIntIntfX(vp *map[int]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntIntfV(v map[int]interface{}, canChange bool, +func (_ fastpathT) DecMapIntIntfV(v map[int]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[int]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[int]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk int var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntStringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]string) - v, changed := fastpathTV.DecMapIntStringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntStringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]string) + v, changed := fastpathTV.DecMapIntStringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntStringV(rv2i(rv).(map[int]string), false, d) + v := rv.Interface().(map[int]string) + fastpathTV.DecMapIntStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntStringX(vp *map[int]string, d *Decoder) { - v, changed := f.DecMapIntStringV(*vp, true, d) +func (f fastpathT) DecMapIntStringX(vp *map[int]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntStringV(v map[int]string, canChange bool, +func (_ fastpathT) DecMapIntStringV(v map[int]string, checkNil bool, canChange bool, d *Decoder) (_ map[int]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[int]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntUintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]uint) - v, changed := fastpathTV.DecMapIntUintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntUintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]uint) + v, changed := fastpathTV.DecMapIntUintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntUintV(rv2i(rv).(map[int]uint), false, d) + v := rv.Interface().(map[int]uint) + fastpathTV.DecMapIntUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntUintX(vp *map[int]uint, d *Decoder) { - v, changed := f.DecMapIntUintV(*vp, true, d) +func (f fastpathT) DecMapIntUintX(vp *map[int]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntUintV(v map[int]uint, canChange bool, +func (_ fastpathT) DecMapIntUintV(v map[int]uint, checkNil bool, canChange bool, d *Decoder) (_ map[int]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntUint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]uint8) - v, changed := fastpathTV.DecMapIntUint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntUint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]uint8) + v, changed := fastpathTV.DecMapIntUint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntUint8V(rv2i(rv).(map[int]uint8), false, d) + v := rv.Interface().(map[int]uint8) + fastpathTV.DecMapIntUint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntUint8X(vp *map[int]uint8, d *Decoder) { - v, changed := f.DecMapIntUint8V(*vp, true, d) +func (f fastpathT) DecMapIntUint8X(vp *map[int]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntUint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntUint8V(v map[int]uint8, canChange bool, +func (_ fastpathT) DecMapIntUint8V(v map[int]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[int]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntUint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]uint16) - v, changed := fastpathTV.DecMapIntUint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntUint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]uint16) + v, changed := fastpathTV.DecMapIntUint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntUint16V(rv2i(rv).(map[int]uint16), false, d) + v := rv.Interface().(map[int]uint16) + fastpathTV.DecMapIntUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntUint16X(vp *map[int]uint16, d *Decoder) { - v, changed := f.DecMapIntUint16V(*vp, true, d) +func (f fastpathT) DecMapIntUint16X(vp *map[int]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntUint16V(v map[int]uint16, canChange bool, +func (_ fastpathT) DecMapIntUint16V(v map[int]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[int]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntUint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]uint32) - v, changed := fastpathTV.DecMapIntUint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntUint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]uint32) + v, changed := fastpathTV.DecMapIntUint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntUint32V(rv2i(rv).(map[int]uint32), false, d) + v := rv.Interface().(map[int]uint32) + fastpathTV.DecMapIntUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntUint32X(vp *map[int]uint32, d *Decoder) { - v, changed := f.DecMapIntUint32V(*vp, true, d) +func (f fastpathT) DecMapIntUint32X(vp *map[int]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntUint32V(v map[int]uint32, canChange bool, +func (_ fastpathT) DecMapIntUint32V(v map[int]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[int]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntUint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]uint64) - v, changed := fastpathTV.DecMapIntUint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntUint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]uint64) + v, changed := fastpathTV.DecMapIntUint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntUint64V(rv2i(rv).(map[int]uint64), false, d) + v := rv.Interface().(map[int]uint64) + fastpathTV.DecMapIntUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntUint64X(vp *map[int]uint64, d *Decoder) { - v, changed := f.DecMapIntUint64V(*vp, true, d) +func (f fastpathT) DecMapIntUint64X(vp *map[int]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntUint64V(v map[int]uint64, canChange bool, +func (_ fastpathT) DecMapIntUint64V(v map[int]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[int]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntUintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]uintptr) - v, changed := fastpathTV.DecMapIntUintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntUintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]uintptr) + v, changed := fastpathTV.DecMapIntUintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntUintptrV(rv2i(rv).(map[int]uintptr), false, d) + v := rv.Interface().(map[int]uintptr) + fastpathTV.DecMapIntUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntUintptrX(vp *map[int]uintptr, d *Decoder) { - v, changed := f.DecMapIntUintptrV(*vp, true, d) +func (f fastpathT) DecMapIntUintptrX(vp *map[int]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntUintptrV(v map[int]uintptr, canChange bool, +func (_ fastpathT) DecMapIntUintptrV(v map[int]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[int]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntIntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]int) - v, changed := fastpathTV.DecMapIntIntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntIntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]int) + v, changed := fastpathTV.DecMapIntIntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntIntV(rv2i(rv).(map[int]int), false, d) + v := rv.Interface().(map[int]int) + fastpathTV.DecMapIntIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntIntX(vp *map[int]int, d *Decoder) { - v, changed := f.DecMapIntIntV(*vp, true, d) +func (f fastpathT) DecMapIntIntX(vp *map[int]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntIntV(v map[int]int, canChange bool, +func (_ fastpathT) DecMapIntIntV(v map[int]int, checkNil bool, canChange bool, d *Decoder) (_ map[int]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntInt8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]int8) - v, changed := fastpathTV.DecMapIntInt8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntInt8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]int8) + v, changed := fastpathTV.DecMapIntInt8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntInt8V(rv2i(rv).(map[int]int8), false, d) + v := rv.Interface().(map[int]int8) + fastpathTV.DecMapIntInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntInt8X(vp *map[int]int8, d *Decoder) { - v, changed := f.DecMapIntInt8V(*vp, true, d) +func (f fastpathT) DecMapIntInt8X(vp *map[int]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntInt8V(v map[int]int8, canChange bool, +func (_ fastpathT) DecMapIntInt8V(v map[int]int8, checkNil bool, canChange bool, d *Decoder) (_ map[int]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntInt16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]int16) - v, changed := fastpathTV.DecMapIntInt16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntInt16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]int16) + v, changed := fastpathTV.DecMapIntInt16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntInt16V(rv2i(rv).(map[int]int16), false, d) + v := rv.Interface().(map[int]int16) + fastpathTV.DecMapIntInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntInt16X(vp *map[int]int16, d *Decoder) { - v, changed := f.DecMapIntInt16V(*vp, true, d) +func (f fastpathT) DecMapIntInt16X(vp *map[int]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntInt16V(v map[int]int16, canChange bool, +func (_ fastpathT) DecMapIntInt16V(v map[int]int16, checkNil bool, canChange bool, d *Decoder) (_ map[int]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntInt32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]int32) - v, changed := fastpathTV.DecMapIntInt32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntInt32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]int32) + v, changed := fastpathTV.DecMapIntInt32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntInt32V(rv2i(rv).(map[int]int32), false, d) + v := rv.Interface().(map[int]int32) + fastpathTV.DecMapIntInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntInt32X(vp *map[int]int32, d *Decoder) { - v, changed := f.DecMapIntInt32V(*vp, true, d) +func (f fastpathT) DecMapIntInt32X(vp *map[int]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntInt32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntInt32V(v map[int]int32, canChange bool, +func (_ fastpathT) DecMapIntInt32V(v map[int]int32, checkNil bool, canChange bool, d *Decoder) (_ map[int]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int]int32, xlen) - changed = true - } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed + changed = true } + var mk int var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntInt64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]int64) - v, changed := fastpathTV.DecMapIntInt64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntInt64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]int64) + v, changed := fastpathTV.DecMapIntInt64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntInt64V(rv2i(rv).(map[int]int64), false, d) + v := rv.Interface().(map[int]int64) + fastpathTV.DecMapIntInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntInt64X(vp *map[int]int64, d *Decoder) { - v, changed := f.DecMapIntInt64V(*vp, true, d) +func (f fastpathT) DecMapIntInt64X(vp *map[int]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntInt64V(v map[int]int64, canChange bool, +func (_ fastpathT) DecMapIntInt64V(v map[int]int64, checkNil bool, canChange bool, d *Decoder) (_ map[int]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntFloat32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]float32) - v, changed := fastpathTV.DecMapIntFloat32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntFloat32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]float32) + v, changed := fastpathTV.DecMapIntFloat32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntFloat32V(rv2i(rv).(map[int]float32), false, d) + v := rv.Interface().(map[int]float32) + fastpathTV.DecMapIntFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntFloat32X(vp *map[int]float32, d *Decoder) { - v, changed := f.DecMapIntFloat32V(*vp, true, d) +func (f fastpathT) DecMapIntFloat32X(vp *map[int]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntFloat32V(v map[int]float32, canChange bool, +func (_ fastpathT) DecMapIntFloat32V(v map[int]float32, checkNil bool, canChange bool, d *Decoder) (_ map[int]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntFloat64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]float64) - v, changed := fastpathTV.DecMapIntFloat64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntFloat64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]float64) + v, changed := fastpathTV.DecMapIntFloat64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntFloat64V(rv2i(rv).(map[int]float64), false, d) + v := rv.Interface().(map[int]float64) + fastpathTV.DecMapIntFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntFloat64X(vp *map[int]float64, d *Decoder) { - v, changed := f.DecMapIntFloat64V(*vp, true, d) +func (f fastpathT) DecMapIntFloat64X(vp *map[int]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntFloat64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntFloat64V(v map[int]float64, canChange bool, +func (_ fastpathT) DecMapIntFloat64V(v map[int]float64, checkNil bool, canChange bool, d *Decoder) (_ map[int]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapIntBoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int]bool) - v, changed := fastpathTV.DecMapIntBoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapIntBoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int]bool) + v, changed := fastpathTV.DecMapIntBoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapIntBoolV(rv2i(rv).(map[int]bool), false, d) + v := rv.Interface().(map[int]bool) + fastpathTV.DecMapIntBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapIntBoolX(vp *map[int]bool, d *Decoder) { - v, changed := f.DecMapIntBoolV(*vp, true, d) +func (f fastpathT) DecMapIntBoolX(vp *map[int]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapIntBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapIntBoolV(v map[int]bool, canChange bool, +func (_ fastpathT) DecMapIntBoolV(v map[int]bool, checkNil bool, canChange bool, d *Decoder) (_ map[int]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int(dd.DecodeInt(intBitsize)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]interface{}) - v, changed := fastpathTV.DecMapInt8IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]interface{}) + v, changed := fastpathTV.DecMapInt8IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8IntfV(rv2i(rv).(map[int8]interface{}), false, d) + v := rv.Interface().(map[int8]interface{}) + fastpathTV.DecMapInt8IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8IntfX(vp *map[int8]interface{}, d *Decoder) { - v, changed := f.DecMapInt8IntfV(*vp, true, d) +func (f fastpathT) DecMapInt8IntfX(vp *map[int8]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8IntfV(v map[int8]interface{}, canChange bool, +func (_ fastpathT) DecMapInt8IntfV(v map[int8]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[int8]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[int8]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk int8 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]string) - v, changed := fastpathTV.DecMapInt8StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]string) + v, changed := fastpathTV.DecMapInt8StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8StringV(rv2i(rv).(map[int8]string), false, d) + v := rv.Interface().(map[int8]string) + fastpathTV.DecMapInt8StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8StringX(vp *map[int8]string, d *Decoder) { - v, changed := f.DecMapInt8StringV(*vp, true, d) +func (f fastpathT) DecMapInt8StringX(vp *map[int8]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8StringV(v map[int8]string, canChange bool, +func (_ fastpathT) DecMapInt8StringV(v map[int8]string, checkNil bool, canChange bool, d *Decoder) (_ map[int8]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[int8]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]uint) - v, changed := fastpathTV.DecMapInt8UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]uint) + v, changed := fastpathTV.DecMapInt8UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8UintV(rv2i(rv).(map[int8]uint), false, d) + v := rv.Interface().(map[int8]uint) + fastpathTV.DecMapInt8UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8UintX(vp *map[int8]uint, d *Decoder) { - v, changed := f.DecMapInt8UintV(*vp, true, d) +func (f fastpathT) DecMapInt8UintX(vp *map[int8]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8UintV(v map[int8]uint, canChange bool, +func (_ fastpathT) DecMapInt8UintV(v map[int8]uint, checkNil bool, canChange bool, d *Decoder) (_ map[int8]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int8]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]uint8) - v, changed := fastpathTV.DecMapInt8Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]uint8) + v, changed := fastpathTV.DecMapInt8Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Uint8V(rv2i(rv).(map[int8]uint8), false, d) + v := rv.Interface().(map[int8]uint8) + fastpathTV.DecMapInt8Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Uint8X(vp *map[int8]uint8, d *Decoder) { - v, changed := f.DecMapInt8Uint8V(*vp, true, d) +func (f fastpathT) DecMapInt8Uint8X(vp *map[int8]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Uint8V(v map[int8]uint8, canChange bool, +func (_ fastpathT) DecMapInt8Uint8V(v map[int8]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[int8]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[int8]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]uint16) - v, changed := fastpathTV.DecMapInt8Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]uint16) + v, changed := fastpathTV.DecMapInt8Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Uint16V(rv2i(rv).(map[int8]uint16), false, d) + v := rv.Interface().(map[int8]uint16) + fastpathTV.DecMapInt8Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Uint16X(vp *map[int8]uint16, d *Decoder) { - v, changed := f.DecMapInt8Uint16V(*vp, true, d) +func (f fastpathT) DecMapInt8Uint16X(vp *map[int8]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Uint16V(v map[int8]uint16, canChange bool, +func (_ fastpathT) DecMapInt8Uint16V(v map[int8]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[int8]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[int8]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]uint32) - v, changed := fastpathTV.DecMapInt8Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]uint32) + v, changed := fastpathTV.DecMapInt8Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Uint32V(rv2i(rv).(map[int8]uint32), false, d) + v := rv.Interface().(map[int8]uint32) + fastpathTV.DecMapInt8Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Uint32X(vp *map[int8]uint32, d *Decoder) { - v, changed := f.DecMapInt8Uint32V(*vp, true, d) +func (f fastpathT) DecMapInt8Uint32X(vp *map[int8]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Uint32V(v map[int8]uint32, canChange bool, +func (_ fastpathT) DecMapInt8Uint32V(v map[int8]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[int8]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[int8]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]uint64) - v, changed := fastpathTV.DecMapInt8Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]uint64) + v, changed := fastpathTV.DecMapInt8Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Uint64V(rv2i(rv).(map[int8]uint64), false, d) + v := rv.Interface().(map[int8]uint64) + fastpathTV.DecMapInt8Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Uint64X(vp *map[int8]uint64, d *Decoder) { - v, changed := f.DecMapInt8Uint64V(*vp, true, d) +func (f fastpathT) DecMapInt8Uint64X(vp *map[int8]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Uint64V(v map[int8]uint64, canChange bool, +func (_ fastpathT) DecMapInt8Uint64V(v map[int8]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[int8]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int8]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]uintptr) - v, changed := fastpathTV.DecMapInt8UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]uintptr) + v, changed := fastpathTV.DecMapInt8UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8UintptrV(rv2i(rv).(map[int8]uintptr), false, d) + v := rv.Interface().(map[int8]uintptr) + fastpathTV.DecMapInt8UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8UintptrX(vp *map[int8]uintptr, d *Decoder) { - v, changed := f.DecMapInt8UintptrV(*vp, true, d) +func (f fastpathT) DecMapInt8UintptrX(vp *map[int8]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8UintptrV(v map[int8]uintptr, canChange bool, +func (_ fastpathT) DecMapInt8UintptrV(v map[int8]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[int8]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int8]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]int) - v, changed := fastpathTV.DecMapInt8IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]int) + v, changed := fastpathTV.DecMapInt8IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8IntV(rv2i(rv).(map[int8]int), false, d) + v := rv.Interface().(map[int8]int) + fastpathTV.DecMapInt8IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8IntX(vp *map[int8]int, d *Decoder) { - v, changed := f.DecMapInt8IntV(*vp, true, d) +func (f fastpathT) DecMapInt8IntX(vp *map[int8]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8IntV(v map[int8]int, canChange bool, +func (_ fastpathT) DecMapInt8IntV(v map[int8]int, checkNil bool, canChange bool, d *Decoder) (_ map[int8]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int8]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]int8) - v, changed := fastpathTV.DecMapInt8Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]int8) + v, changed := fastpathTV.DecMapInt8Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Int8V(rv2i(rv).(map[int8]int8), false, d) + v := rv.Interface().(map[int8]int8) + fastpathTV.DecMapInt8Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Int8X(vp *map[int8]int8, d *Decoder) { - v, changed := f.DecMapInt8Int8V(*vp, true, d) +func (f fastpathT) DecMapInt8Int8X(vp *map[int8]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Int8V(v map[int8]int8, canChange bool, +func (_ fastpathT) DecMapInt8Int8V(v map[int8]int8, checkNil bool, canChange bool, d *Decoder) (_ map[int8]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[int8]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]int16) - v, changed := fastpathTV.DecMapInt8Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]int16) + v, changed := fastpathTV.DecMapInt8Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Int16V(rv2i(rv).(map[int8]int16), false, d) + v := rv.Interface().(map[int8]int16) + fastpathTV.DecMapInt8Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Int16X(vp *map[int8]int16, d *Decoder) { - v, changed := f.DecMapInt8Int16V(*vp, true, d) +func (f fastpathT) DecMapInt8Int16X(vp *map[int8]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Int16V(v map[int8]int16, canChange bool, +func (_ fastpathT) DecMapInt8Int16V(v map[int8]int16, checkNil bool, canChange bool, d *Decoder) (_ map[int8]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[int8]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]int32) - v, changed := fastpathTV.DecMapInt8Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]int32) + v, changed := fastpathTV.DecMapInt8Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Int32V(rv2i(rv).(map[int8]int32), false, d) + v := rv.Interface().(map[int8]int32) + fastpathTV.DecMapInt8Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Int32X(vp *map[int8]int32, d *Decoder) { - v, changed := f.DecMapInt8Int32V(*vp, true, d) +func (f fastpathT) DecMapInt8Int32X(vp *map[int8]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Int32V(v map[int8]int32, canChange bool, +func (_ fastpathT) DecMapInt8Int32V(v map[int8]int32, checkNil bool, canChange bool, d *Decoder) (_ map[int8]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[int8]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]int64) - v, changed := fastpathTV.DecMapInt8Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]int64) + v, changed := fastpathTV.DecMapInt8Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Int64V(rv2i(rv).(map[int8]int64), false, d) + v := rv.Interface().(map[int8]int64) + fastpathTV.DecMapInt8Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Int64X(vp *map[int8]int64, d *Decoder) { - v, changed := f.DecMapInt8Int64V(*vp, true, d) +func (f fastpathT) DecMapInt8Int64X(vp *map[int8]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Int64V(v map[int8]int64, canChange bool, +func (_ fastpathT) DecMapInt8Int64V(v map[int8]int64, checkNil bool, canChange bool, d *Decoder) (_ map[int8]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int8]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]float32) - v, changed := fastpathTV.DecMapInt8Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]float32) + v, changed := fastpathTV.DecMapInt8Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Float32V(rv2i(rv).(map[int8]float32), false, d) + v := rv.Interface().(map[int8]float32) + fastpathTV.DecMapInt8Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Float32X(vp *map[int8]float32, d *Decoder) { - v, changed := f.DecMapInt8Float32V(*vp, true, d) +func (f fastpathT) DecMapInt8Float32X(vp *map[int8]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Float32V(v map[int8]float32, canChange bool, +func (_ fastpathT) DecMapInt8Float32V(v map[int8]float32, checkNil bool, canChange bool, d *Decoder) (_ map[int8]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[int8]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]float64) - v, changed := fastpathTV.DecMapInt8Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]float64) + v, changed := fastpathTV.DecMapInt8Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8Float64V(rv2i(rv).(map[int8]float64), false, d) + v := rv.Interface().(map[int8]float64) + fastpathTV.DecMapInt8Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8Float64X(vp *map[int8]float64, d *Decoder) { - v, changed := f.DecMapInt8Float64V(*vp, true, d) +func (f fastpathT) DecMapInt8Float64X(vp *map[int8]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8Float64V(v map[int8]float64, canChange bool, +func (_ fastpathT) DecMapInt8Float64V(v map[int8]float64, checkNil bool, canChange bool, d *Decoder) (_ map[int8]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int8]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt8BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int8]bool) - v, changed := fastpathTV.DecMapInt8BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt8BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int8]bool) + v, changed := fastpathTV.DecMapInt8BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt8BoolV(rv2i(rv).(map[int8]bool), false, d) + v := rv.Interface().(map[int8]bool) + fastpathTV.DecMapInt8BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt8BoolX(vp *map[int8]bool, d *Decoder) { - v, changed := f.DecMapInt8BoolV(*vp, true, d) +func (f fastpathT) DecMapInt8BoolX(vp *map[int8]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt8BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt8BoolV(v map[int8]bool, canChange bool, +func (_ fastpathT) DecMapInt8BoolV(v map[int8]bool, checkNil bool, canChange bool, d *Decoder) (_ map[int8]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[int8]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int8 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int8(dd.DecodeInt(8)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]interface{}) - v, changed := fastpathTV.DecMapInt16IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]interface{}) + v, changed := fastpathTV.DecMapInt16IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16IntfV(rv2i(rv).(map[int16]interface{}), false, d) + v := rv.Interface().(map[int16]interface{}) + fastpathTV.DecMapInt16IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16IntfX(vp *map[int16]interface{}, d *Decoder) { - v, changed := f.DecMapInt16IntfV(*vp, true, d) +func (f fastpathT) DecMapInt16IntfX(vp *map[int16]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16IntfV(v map[int16]interface{}, canChange bool, +func (_ fastpathT) DecMapInt16IntfV(v map[int16]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[int16]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[int16]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk int16 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]string) - v, changed := fastpathTV.DecMapInt16StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]string) + v, changed := fastpathTV.DecMapInt16StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16StringV(rv2i(rv).(map[int16]string), false, d) + v := rv.Interface().(map[int16]string) + fastpathTV.DecMapInt16StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16StringX(vp *map[int16]string, d *Decoder) { - v, changed := f.DecMapInt16StringV(*vp, true, d) +func (f fastpathT) DecMapInt16StringX(vp *map[int16]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16StringV(v map[int16]string, canChange bool, +func (_ fastpathT) DecMapInt16StringV(v map[int16]string, checkNil bool, canChange bool, d *Decoder) (_ map[int16]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 18) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) v = make(map[int16]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]uint) - v, changed := fastpathTV.DecMapInt16UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]uint) + v, changed := fastpathTV.DecMapInt16UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16UintV(rv2i(rv).(map[int16]uint), false, d) + v := rv.Interface().(map[int16]uint) + fastpathTV.DecMapInt16UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16UintX(vp *map[int16]uint, d *Decoder) { - v, changed := f.DecMapInt16UintV(*vp, true, d) +func (f fastpathT) DecMapInt16UintX(vp *map[int16]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16UintV(v map[int16]uint, canChange bool, +func (_ fastpathT) DecMapInt16UintV(v map[int16]uint, checkNil bool, canChange bool, d *Decoder) (_ map[int16]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int16]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]uint8) - v, changed := fastpathTV.DecMapInt16Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]uint8) + v, changed := fastpathTV.DecMapInt16Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Uint8V(rv2i(rv).(map[int16]uint8), false, d) + v := rv.Interface().(map[int16]uint8) + fastpathTV.DecMapInt16Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Uint8X(vp *map[int16]uint8, d *Decoder) { - v, changed := f.DecMapInt16Uint8V(*vp, true, d) +func (f fastpathT) DecMapInt16Uint8X(vp *map[int16]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Uint8V(v map[int16]uint8, canChange bool, +func (_ fastpathT) DecMapInt16Uint8V(v map[int16]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[int16]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[int16]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]uint16) - v, changed := fastpathTV.DecMapInt16Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]uint16) + v, changed := fastpathTV.DecMapInt16Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Uint16V(rv2i(rv).(map[int16]uint16), false, d) + v := rv.Interface().(map[int16]uint16) + fastpathTV.DecMapInt16Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Uint16X(vp *map[int16]uint16, d *Decoder) { - v, changed := f.DecMapInt16Uint16V(*vp, true, d) +func (f fastpathT) DecMapInt16Uint16X(vp *map[int16]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Uint16V(v map[int16]uint16, canChange bool, +func (_ fastpathT) DecMapInt16Uint16V(v map[int16]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[int16]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 4) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) v = make(map[int16]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]uint32) - v, changed := fastpathTV.DecMapInt16Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]uint32) + v, changed := fastpathTV.DecMapInt16Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Uint32V(rv2i(rv).(map[int16]uint32), false, d) + v := rv.Interface().(map[int16]uint32) + fastpathTV.DecMapInt16Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Uint32X(vp *map[int16]uint32, d *Decoder) { - v, changed := f.DecMapInt16Uint32V(*vp, true, d) +func (f fastpathT) DecMapInt16Uint32X(vp *map[int16]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Uint32V(v map[int16]uint32, canChange bool, +func (_ fastpathT) DecMapInt16Uint32V(v map[int16]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[int16]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[int16]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]uint64) - v, changed := fastpathTV.DecMapInt16Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]uint64) + v, changed := fastpathTV.DecMapInt16Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Uint64V(rv2i(rv).(map[int16]uint64), false, d) + v := rv.Interface().(map[int16]uint64) + fastpathTV.DecMapInt16Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Uint64X(vp *map[int16]uint64, d *Decoder) { - v, changed := f.DecMapInt16Uint64V(*vp, true, d) +func (f fastpathT) DecMapInt16Uint64X(vp *map[int16]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Uint64V(v map[int16]uint64, canChange bool, +func (_ fastpathT) DecMapInt16Uint64V(v map[int16]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[int16]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int16]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]uintptr) - v, changed := fastpathTV.DecMapInt16UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]uintptr) + v, changed := fastpathTV.DecMapInt16UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16UintptrV(rv2i(rv).(map[int16]uintptr), false, d) + v := rv.Interface().(map[int16]uintptr) + fastpathTV.DecMapInt16UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16UintptrX(vp *map[int16]uintptr, d *Decoder) { - v, changed := f.DecMapInt16UintptrV(*vp, true, d) +func (f fastpathT) DecMapInt16UintptrX(vp *map[int16]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16UintptrV(v map[int16]uintptr, canChange bool, +func (_ fastpathT) DecMapInt16UintptrV(v map[int16]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[int16]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int16]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]int) - v, changed := fastpathTV.DecMapInt16IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]int) + v, changed := fastpathTV.DecMapInt16IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16IntV(rv2i(rv).(map[int16]int), false, d) + v := rv.Interface().(map[int16]int) + fastpathTV.DecMapInt16IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16IntX(vp *map[int16]int, d *Decoder) { - v, changed := f.DecMapInt16IntV(*vp, true, d) +func (f fastpathT) DecMapInt16IntX(vp *map[int16]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16IntV(v map[int16]int, canChange bool, +func (_ fastpathT) DecMapInt16IntV(v map[int16]int, checkNil bool, canChange bool, d *Decoder) (_ map[int16]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int16]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]int8) - v, changed := fastpathTV.DecMapInt16Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]int8) + v, changed := fastpathTV.DecMapInt16Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Int8V(rv2i(rv).(map[int16]int8), false, d) + v := rv.Interface().(map[int16]int8) + fastpathTV.DecMapInt16Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Int8X(vp *map[int16]int8, d *Decoder) { - v, changed := f.DecMapInt16Int8V(*vp, true, d) +func (f fastpathT) DecMapInt16Int8X(vp *map[int16]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Int8V(v map[int16]int8, canChange bool, +func (_ fastpathT) DecMapInt16Int8V(v map[int16]int8, checkNil bool, canChange bool, d *Decoder) (_ map[int16]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[int16]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]int16) - v, changed := fastpathTV.DecMapInt16Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]int16) + v, changed := fastpathTV.DecMapInt16Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Int16V(rv2i(rv).(map[int16]int16), false, d) + v := rv.Interface().(map[int16]int16) + fastpathTV.DecMapInt16Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Int16X(vp *map[int16]int16, d *Decoder) { - v, changed := f.DecMapInt16Int16V(*vp, true, d) +func (f fastpathT) DecMapInt16Int16X(vp *map[int16]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Int16V(v map[int16]int16, canChange bool, +func (_ fastpathT) DecMapInt16Int16V(v map[int16]int16, checkNil bool, canChange bool, d *Decoder) (_ map[int16]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 4) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) v = make(map[int16]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]int32) - v, changed := fastpathTV.DecMapInt16Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]int32) + v, changed := fastpathTV.DecMapInt16Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Int32V(rv2i(rv).(map[int16]int32), false, d) + v := rv.Interface().(map[int16]int32) + fastpathTV.DecMapInt16Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Int32X(vp *map[int16]int32, d *Decoder) { - v, changed := f.DecMapInt16Int32V(*vp, true, d) +func (f fastpathT) DecMapInt16Int32X(vp *map[int16]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Int32V(v map[int16]int32, canChange bool, +func (_ fastpathT) DecMapInt16Int32V(v map[int16]int32, checkNil bool, canChange bool, d *Decoder) (_ map[int16]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[int16]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]int64) - v, changed := fastpathTV.DecMapInt16Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]int64) + v, changed := fastpathTV.DecMapInt16Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Int64V(rv2i(rv).(map[int16]int64), false, d) + v := rv.Interface().(map[int16]int64) + fastpathTV.DecMapInt16Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Int64X(vp *map[int16]int64, d *Decoder) { - v, changed := f.DecMapInt16Int64V(*vp, true, d) +func (f fastpathT) DecMapInt16Int64X(vp *map[int16]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Int64V(v map[int16]int64, canChange bool, +func (_ fastpathT) DecMapInt16Int64V(v map[int16]int64, checkNil bool, canChange bool, d *Decoder) (_ map[int16]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int16]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]float32) - v, changed := fastpathTV.DecMapInt16Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]float32) + v, changed := fastpathTV.DecMapInt16Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Float32V(rv2i(rv).(map[int16]float32), false, d) + v := rv.Interface().(map[int16]float32) + fastpathTV.DecMapInt16Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Float32X(vp *map[int16]float32, d *Decoder) { - v, changed := f.DecMapInt16Float32V(*vp, true, d) +func (f fastpathT) DecMapInt16Float32X(vp *map[int16]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Float32V(v map[int16]float32, canChange bool, +func (_ fastpathT) DecMapInt16Float32V(v map[int16]float32, checkNil bool, canChange bool, d *Decoder) (_ map[int16]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[int16]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]float64) - v, changed := fastpathTV.DecMapInt16Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]float64) + v, changed := fastpathTV.DecMapInt16Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16Float64V(rv2i(rv).(map[int16]float64), false, d) + v := rv.Interface().(map[int16]float64) + fastpathTV.DecMapInt16Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16Float64X(vp *map[int16]float64, d *Decoder) { - v, changed := f.DecMapInt16Float64V(*vp, true, d) +func (f fastpathT) DecMapInt16Float64X(vp *map[int16]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16Float64V(v map[int16]float64, canChange bool, +func (_ fastpathT) DecMapInt16Float64V(v map[int16]float64, checkNil bool, canChange bool, d *Decoder) (_ map[int16]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int16]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt16BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int16]bool) - v, changed := fastpathTV.DecMapInt16BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt16BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int16]bool) + v, changed := fastpathTV.DecMapInt16BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt16BoolV(rv2i(rv).(map[int16]bool), false, d) + v := rv.Interface().(map[int16]bool) + fastpathTV.DecMapInt16BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt16BoolX(vp *map[int16]bool, d *Decoder) { - v, changed := f.DecMapInt16BoolV(*vp, true, d) +func (f fastpathT) DecMapInt16BoolX(vp *map[int16]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt16BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt16BoolV(v map[int16]bool, canChange bool, +func (_ fastpathT) DecMapInt16BoolV(v map[int16]bool, checkNil bool, canChange bool, d *Decoder) (_ map[int16]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[int16]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int16 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int16(dd.DecodeInt(16)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]interface{}) - v, changed := fastpathTV.DecMapInt32IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]interface{}) + v, changed := fastpathTV.DecMapInt32IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32IntfV(rv2i(rv).(map[int32]interface{}), false, d) + v := rv.Interface().(map[int32]interface{}) + fastpathTV.DecMapInt32IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32IntfX(vp *map[int32]interface{}, d *Decoder) { - v, changed := f.DecMapInt32IntfV(*vp, true, d) +func (f fastpathT) DecMapInt32IntfX(vp *map[int32]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32IntfV(v map[int32]interface{}, canChange bool, +func (_ fastpathT) DecMapInt32IntfV(v map[int32]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[int32]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[int32]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk int32 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]string) - v, changed := fastpathTV.DecMapInt32StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]string) + v, changed := fastpathTV.DecMapInt32StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32StringV(rv2i(rv).(map[int32]string), false, d) + v := rv.Interface().(map[int32]string) + fastpathTV.DecMapInt32StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32StringX(vp *map[int32]string, d *Decoder) { - v, changed := f.DecMapInt32StringV(*vp, true, d) +func (f fastpathT) DecMapInt32StringX(vp *map[int32]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32StringV(v map[int32]string, canChange bool, +func (_ fastpathT) DecMapInt32StringV(v map[int32]string, checkNil bool, canChange bool, d *Decoder) (_ map[int32]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 20) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) v = make(map[int32]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]uint) - v, changed := fastpathTV.DecMapInt32UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]uint) + v, changed := fastpathTV.DecMapInt32UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32UintV(rv2i(rv).(map[int32]uint), false, d) + v := rv.Interface().(map[int32]uint) + fastpathTV.DecMapInt32UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32UintX(vp *map[int32]uint, d *Decoder) { - v, changed := f.DecMapInt32UintV(*vp, true, d) +func (f fastpathT) DecMapInt32UintX(vp *map[int32]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32UintV(v map[int32]uint, canChange bool, +func (_ fastpathT) DecMapInt32UintV(v map[int32]uint, checkNil bool, canChange bool, d *Decoder) (_ map[int32]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int32]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]uint8) - v, changed := fastpathTV.DecMapInt32Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]uint8) + v, changed := fastpathTV.DecMapInt32Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Uint8V(rv2i(rv).(map[int32]uint8), false, d) + v := rv.Interface().(map[int32]uint8) + fastpathTV.DecMapInt32Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Uint8X(vp *map[int32]uint8, d *Decoder) { - v, changed := f.DecMapInt32Uint8V(*vp, true, d) +func (f fastpathT) DecMapInt32Uint8X(vp *map[int32]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Uint8V(v map[int32]uint8, canChange bool, +func (_ fastpathT) DecMapInt32Uint8V(v map[int32]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[int32]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[int32]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]uint16) - v, changed := fastpathTV.DecMapInt32Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]uint16) + v, changed := fastpathTV.DecMapInt32Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Uint16V(rv2i(rv).(map[int32]uint16), false, d) + v := rv.Interface().(map[int32]uint16) + fastpathTV.DecMapInt32Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Uint16X(vp *map[int32]uint16, d *Decoder) { - v, changed := f.DecMapInt32Uint16V(*vp, true, d) +func (f fastpathT) DecMapInt32Uint16X(vp *map[int32]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Uint16V(v map[int32]uint16, canChange bool, +func (_ fastpathT) DecMapInt32Uint16V(v map[int32]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[int32]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[int32]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]uint32) - v, changed := fastpathTV.DecMapInt32Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]uint32) + v, changed := fastpathTV.DecMapInt32Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Uint32V(rv2i(rv).(map[int32]uint32), false, d) + v := rv.Interface().(map[int32]uint32) + fastpathTV.DecMapInt32Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Uint32X(vp *map[int32]uint32, d *Decoder) { - v, changed := f.DecMapInt32Uint32V(*vp, true, d) +func (f fastpathT) DecMapInt32Uint32X(vp *map[int32]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Uint32V(v map[int32]uint32, canChange bool, +func (_ fastpathT) DecMapInt32Uint32V(v map[int32]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[int32]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[int32]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]uint64) - v, changed := fastpathTV.DecMapInt32Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]uint64) + v, changed := fastpathTV.DecMapInt32Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Uint64V(rv2i(rv).(map[int32]uint64), false, d) + v := rv.Interface().(map[int32]uint64) + fastpathTV.DecMapInt32Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Uint64X(vp *map[int32]uint64, d *Decoder) { - v, changed := f.DecMapInt32Uint64V(*vp, true, d) +func (f fastpathT) DecMapInt32Uint64X(vp *map[int32]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Uint64V(v map[int32]uint64, canChange bool, +func (_ fastpathT) DecMapInt32Uint64V(v map[int32]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[int32]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int32]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]uintptr) - v, changed := fastpathTV.DecMapInt32UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]uintptr) + v, changed := fastpathTV.DecMapInt32UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32UintptrV(rv2i(rv).(map[int32]uintptr), false, d) + v := rv.Interface().(map[int32]uintptr) + fastpathTV.DecMapInt32UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32UintptrX(vp *map[int32]uintptr, d *Decoder) { - v, changed := f.DecMapInt32UintptrV(*vp, true, d) +func (f fastpathT) DecMapInt32UintptrX(vp *map[int32]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32UintptrV(v map[int32]uintptr, canChange bool, +func (_ fastpathT) DecMapInt32UintptrV(v map[int32]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[int32]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int32]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]int) - v, changed := fastpathTV.DecMapInt32IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]int) + v, changed := fastpathTV.DecMapInt32IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32IntV(rv2i(rv).(map[int32]int), false, d) + v := rv.Interface().(map[int32]int) + fastpathTV.DecMapInt32IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32IntX(vp *map[int32]int, d *Decoder) { - v, changed := f.DecMapInt32IntV(*vp, true, d) +func (f fastpathT) DecMapInt32IntX(vp *map[int32]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32IntV(v map[int32]int, canChange bool, +func (_ fastpathT) DecMapInt32IntV(v map[int32]int, checkNil bool, canChange bool, d *Decoder) (_ map[int32]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int32]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]int8) - v, changed := fastpathTV.DecMapInt32Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]int8) + v, changed := fastpathTV.DecMapInt32Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Int8V(rv2i(rv).(map[int32]int8), false, d) + v := rv.Interface().(map[int32]int8) + fastpathTV.DecMapInt32Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Int8X(vp *map[int32]int8, d *Decoder) { - v, changed := f.DecMapInt32Int8V(*vp, true, d) +func (f fastpathT) DecMapInt32Int8X(vp *map[int32]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Int8V(v map[int32]int8, canChange bool, +func (_ fastpathT) DecMapInt32Int8V(v map[int32]int8, checkNil bool, canChange bool, d *Decoder) (_ map[int32]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[int32]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]int16) - v, changed := fastpathTV.DecMapInt32Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]int16) + v, changed := fastpathTV.DecMapInt32Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Int16V(rv2i(rv).(map[int32]int16), false, d) + v := rv.Interface().(map[int32]int16) + fastpathTV.DecMapInt32Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Int16X(vp *map[int32]int16, d *Decoder) { - v, changed := f.DecMapInt32Int16V(*vp, true, d) +func (f fastpathT) DecMapInt32Int16X(vp *map[int32]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Int16V(v map[int32]int16, canChange bool, +func (_ fastpathT) DecMapInt32Int16V(v map[int32]int16, checkNil bool, canChange bool, d *Decoder) (_ map[int32]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 6) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) v = make(map[int32]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]int32) - v, changed := fastpathTV.DecMapInt32Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]int32) + v, changed := fastpathTV.DecMapInt32Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Int32V(rv2i(rv).(map[int32]int32), false, d) + v := rv.Interface().(map[int32]int32) + fastpathTV.DecMapInt32Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Int32X(vp *map[int32]int32, d *Decoder) { - v, changed := f.DecMapInt32Int32V(*vp, true, d) +func (f fastpathT) DecMapInt32Int32X(vp *map[int32]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Int32V(v map[int32]int32, canChange bool, +func (_ fastpathT) DecMapInt32Int32V(v map[int32]int32, checkNil bool, canChange bool, d *Decoder) (_ map[int32]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[int32]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]int64) - v, changed := fastpathTV.DecMapInt32Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]int64) + v, changed := fastpathTV.DecMapInt32Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Int64V(rv2i(rv).(map[int32]int64), false, d) + v := rv.Interface().(map[int32]int64) + fastpathTV.DecMapInt32Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Int64X(vp *map[int32]int64, d *Decoder) { - v, changed := f.DecMapInt32Int64V(*vp, true, d) +func (f fastpathT) DecMapInt32Int64X(vp *map[int32]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Int64V(v map[int32]int64, canChange bool, +func (_ fastpathT) DecMapInt32Int64V(v map[int32]int64, checkNil bool, canChange bool, d *Decoder) (_ map[int32]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int32]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]float32) - v, changed := fastpathTV.DecMapInt32Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]float32) + v, changed := fastpathTV.DecMapInt32Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Float32V(rv2i(rv).(map[int32]float32), false, d) + v := rv.Interface().(map[int32]float32) + fastpathTV.DecMapInt32Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Float32X(vp *map[int32]float32, d *Decoder) { - v, changed := f.DecMapInt32Float32V(*vp, true, d) +func (f fastpathT) DecMapInt32Float32X(vp *map[int32]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Float32V(v map[int32]float32, canChange bool, +func (_ fastpathT) DecMapInt32Float32V(v map[int32]float32, checkNil bool, canChange bool, d *Decoder) (_ map[int32]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 8) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) v = make(map[int32]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]float64) - v, changed := fastpathTV.DecMapInt32Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]float64) + v, changed := fastpathTV.DecMapInt32Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32Float64V(rv2i(rv).(map[int32]float64), false, d) + v := rv.Interface().(map[int32]float64) + fastpathTV.DecMapInt32Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32Float64X(vp *map[int32]float64, d *Decoder) { - v, changed := f.DecMapInt32Float64V(*vp, true, d) +func (f fastpathT) DecMapInt32Float64X(vp *map[int32]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32Float64V(v map[int32]float64, canChange bool, +func (_ fastpathT) DecMapInt32Float64V(v map[int32]float64, checkNil bool, canChange bool, d *Decoder) (_ map[int32]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int32]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt32BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int32]bool) - v, changed := fastpathTV.DecMapInt32BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt32BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int32]bool) + v, changed := fastpathTV.DecMapInt32BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt32BoolV(rv2i(rv).(map[int32]bool), false, d) + v := rv.Interface().(map[int32]bool) + fastpathTV.DecMapInt32BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt32BoolX(vp *map[int32]bool, d *Decoder) { - v, changed := f.DecMapInt32BoolV(*vp, true, d) +func (f fastpathT) DecMapInt32BoolX(vp *map[int32]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt32BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt32BoolV(v map[int32]bool, canChange bool, +func (_ fastpathT) DecMapInt32BoolV(v map[int32]bool, checkNil bool, canChange bool, d *Decoder) (_ map[int32]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[int32]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int32 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = int32(dd.DecodeInt(32)) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64IntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]interface{}) - v, changed := fastpathTV.DecMapInt64IntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64IntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]interface{}) + v, changed := fastpathTV.DecMapInt64IntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64IntfV(rv2i(rv).(map[int64]interface{}), false, d) + v := rv.Interface().(map[int64]interface{}) + fastpathTV.DecMapInt64IntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64IntfX(vp *map[int64]interface{}, d *Decoder) { - v, changed := f.DecMapInt64IntfV(*vp, true, d) +func (f fastpathT) DecMapInt64IntfX(vp *map[int64]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64IntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64IntfV(v map[int64]interface{}, canChange bool, +func (_ fastpathT) DecMapInt64IntfV(v map[int64]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[int64]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[int64]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk int64 var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64StringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]string) - v, changed := fastpathTV.DecMapInt64StringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64StringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]string) + v, changed := fastpathTV.DecMapInt64StringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64StringV(rv2i(rv).(map[int64]string), false, d) + v := rv.Interface().(map[int64]string) + fastpathTV.DecMapInt64StringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64StringX(vp *map[int64]string, d *Decoder) { - v, changed := f.DecMapInt64StringV(*vp, true, d) +func (f fastpathT) DecMapInt64StringX(vp *map[int64]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64StringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64StringV(v map[int64]string, canChange bool, +func (_ fastpathT) DecMapInt64StringV(v map[int64]string, checkNil bool, canChange bool, d *Decoder) (_ map[int64]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 24) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) v = make(map[int64]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64UintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]uint) - v, changed := fastpathTV.DecMapInt64UintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64UintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]uint) + v, changed := fastpathTV.DecMapInt64UintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64UintV(rv2i(rv).(map[int64]uint), false, d) + v := rv.Interface().(map[int64]uint) + fastpathTV.DecMapInt64UintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64UintX(vp *map[int64]uint, d *Decoder) { - v, changed := f.DecMapInt64UintV(*vp, true, d) +func (f fastpathT) DecMapInt64UintX(vp *map[int64]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64UintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64UintV(v map[int64]uint, canChange bool, +func (_ fastpathT) DecMapInt64UintV(v map[int64]uint, checkNil bool, canChange bool, d *Decoder) (_ map[int64]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int64]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Uint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]uint8) - v, changed := fastpathTV.DecMapInt64Uint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Uint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]uint8) + v, changed := fastpathTV.DecMapInt64Uint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Uint8V(rv2i(rv).(map[int64]uint8), false, d) + v := rv.Interface().(map[int64]uint8) + fastpathTV.DecMapInt64Uint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Uint8X(vp *map[int64]uint8, d *Decoder) { - v, changed := f.DecMapInt64Uint8V(*vp, true, d) +func (f fastpathT) DecMapInt64Uint8X(vp *map[int64]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Uint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Uint8V(v map[int64]uint8, canChange bool, +func (_ fastpathT) DecMapInt64Uint8V(v map[int64]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[int64]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int64]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Uint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]uint16) - v, changed := fastpathTV.DecMapInt64Uint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Uint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]uint16) + v, changed := fastpathTV.DecMapInt64Uint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Uint16V(rv2i(rv).(map[int64]uint16), false, d) + v := rv.Interface().(map[int64]uint16) + fastpathTV.DecMapInt64Uint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Uint16X(vp *map[int64]uint16, d *Decoder) { - v, changed := f.DecMapInt64Uint16V(*vp, true, d) +func (f fastpathT) DecMapInt64Uint16X(vp *map[int64]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Uint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Uint16V(v map[int64]uint16, canChange bool, +func (_ fastpathT) DecMapInt64Uint16V(v map[int64]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[int64]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int64]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Uint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]uint32) - v, changed := fastpathTV.DecMapInt64Uint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Uint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]uint32) + v, changed := fastpathTV.DecMapInt64Uint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Uint32V(rv2i(rv).(map[int64]uint32), false, d) + v := rv.Interface().(map[int64]uint32) + fastpathTV.DecMapInt64Uint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Uint32X(vp *map[int64]uint32, d *Decoder) { - v, changed := f.DecMapInt64Uint32V(*vp, true, d) +func (f fastpathT) DecMapInt64Uint32X(vp *map[int64]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Uint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Uint32V(v map[int64]uint32, canChange bool, +func (_ fastpathT) DecMapInt64Uint32V(v map[int64]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[int64]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int64]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Uint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]uint64) - v, changed := fastpathTV.DecMapInt64Uint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Uint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]uint64) + v, changed := fastpathTV.DecMapInt64Uint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Uint64V(rv2i(rv).(map[int64]uint64), false, d) + v := rv.Interface().(map[int64]uint64) + fastpathTV.DecMapInt64Uint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Uint64X(vp *map[int64]uint64, d *Decoder) { - v, changed := f.DecMapInt64Uint64V(*vp, true, d) +func (f fastpathT) DecMapInt64Uint64X(vp *map[int64]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Uint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Uint64V(v map[int64]uint64, canChange bool, +func (_ fastpathT) DecMapInt64Uint64V(v map[int64]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[int64]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int64]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64UintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]uintptr) - v, changed := fastpathTV.DecMapInt64UintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64UintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]uintptr) + v, changed := fastpathTV.DecMapInt64UintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64UintptrV(rv2i(rv).(map[int64]uintptr), false, d) + v := rv.Interface().(map[int64]uintptr) + fastpathTV.DecMapInt64UintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64UintptrX(vp *map[int64]uintptr, d *Decoder) { - v, changed := f.DecMapInt64UintptrV(*vp, true, d) +func (f fastpathT) DecMapInt64UintptrX(vp *map[int64]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64UintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64UintptrV(v map[int64]uintptr, canChange bool, +func (_ fastpathT) DecMapInt64UintptrV(v map[int64]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[int64]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int64]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64IntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]int) - v, changed := fastpathTV.DecMapInt64IntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64IntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]int) + v, changed := fastpathTV.DecMapInt64IntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64IntV(rv2i(rv).(map[int64]int), false, d) + v := rv.Interface().(map[int64]int) + fastpathTV.DecMapInt64IntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64IntX(vp *map[int64]int, d *Decoder) { - v, changed := f.DecMapInt64IntV(*vp, true, d) +func (f fastpathT) DecMapInt64IntX(vp *map[int64]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64IntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64IntV(v map[int64]int, canChange bool, +func (_ fastpathT) DecMapInt64IntV(v map[int64]int, checkNil bool, canChange bool, d *Decoder) (_ map[int64]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int64]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Int8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]int8) - v, changed := fastpathTV.DecMapInt64Int8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Int8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]int8) + v, changed := fastpathTV.DecMapInt64Int8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Int8V(rv2i(rv).(map[int64]int8), false, d) + v := rv.Interface().(map[int64]int8) + fastpathTV.DecMapInt64Int8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Int8X(vp *map[int64]int8, d *Decoder) { - v, changed := f.DecMapInt64Int8V(*vp, true, d) +func (f fastpathT) DecMapInt64Int8X(vp *map[int64]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Int8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Int8V(v map[int64]int8, canChange bool, +func (_ fastpathT) DecMapInt64Int8V(v map[int64]int8, checkNil bool, canChange bool, d *Decoder) (_ map[int64]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int64]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Int16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]int16) - v, changed := fastpathTV.DecMapInt64Int16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Int16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]int16) + v, changed := fastpathTV.DecMapInt64Int16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Int16V(rv2i(rv).(map[int64]int16), false, d) + v := rv.Interface().(map[int64]int16) + fastpathTV.DecMapInt64Int16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Int16X(vp *map[int64]int16, d *Decoder) { - v, changed := f.DecMapInt64Int16V(*vp, true, d) +func (f fastpathT) DecMapInt64Int16X(vp *map[int64]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Int16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Int16V(v map[int64]int16, canChange bool, +func (_ fastpathT) DecMapInt64Int16V(v map[int64]int16, checkNil bool, canChange bool, d *Decoder) (_ map[int64]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 10) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) v = make(map[int64]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Int32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]int32) - v, changed := fastpathTV.DecMapInt64Int32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Int32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]int32) + v, changed := fastpathTV.DecMapInt64Int32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Int32V(rv2i(rv).(map[int64]int32), false, d) + v := rv.Interface().(map[int64]int32) + fastpathTV.DecMapInt64Int32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Int32X(vp *map[int64]int32, d *Decoder) { - v, changed := f.DecMapInt64Int32V(*vp, true, d) +func (f fastpathT) DecMapInt64Int32X(vp *map[int64]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Int32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Int32V(v map[int64]int32, canChange bool, +func (_ fastpathT) DecMapInt64Int32V(v map[int64]int32, checkNil bool, canChange bool, d *Decoder) (_ map[int64]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int64]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Int64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]int64) - v, changed := fastpathTV.DecMapInt64Int64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Int64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]int64) + v, changed := fastpathTV.DecMapInt64Int64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Int64V(rv2i(rv).(map[int64]int64), false, d) + v := rv.Interface().(map[int64]int64) + fastpathTV.DecMapInt64Int64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Int64X(vp *map[int64]int64, d *Decoder) { - v, changed := f.DecMapInt64Int64V(*vp, true, d) +func (f fastpathT) DecMapInt64Int64X(vp *map[int64]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Int64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Int64V(v map[int64]int64, canChange bool, +func (_ fastpathT) DecMapInt64Int64V(v map[int64]int64, checkNil bool, canChange bool, d *Decoder) (_ map[int64]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int64]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Float32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]float32) - v, changed := fastpathTV.DecMapInt64Float32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Float32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]float32) + v, changed := fastpathTV.DecMapInt64Float32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Float32V(rv2i(rv).(map[int64]float32), false, d) + v := rv.Interface().(map[int64]float32) + fastpathTV.DecMapInt64Float32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Float32X(vp *map[int64]float32, d *Decoder) { - v, changed := f.DecMapInt64Float32V(*vp, true, d) +func (f fastpathT) DecMapInt64Float32X(vp *map[int64]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Float32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Float32V(v map[int64]float32, canChange bool, +func (_ fastpathT) DecMapInt64Float32V(v map[int64]float32, checkNil bool, canChange bool, d *Decoder) (_ map[int64]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 12) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) v = make(map[int64]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64Float64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]float64) - v, changed := fastpathTV.DecMapInt64Float64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64Float64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]float64) + v, changed := fastpathTV.DecMapInt64Float64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64Float64V(rv2i(rv).(map[int64]float64), false, d) + v := rv.Interface().(map[int64]float64) + fastpathTV.DecMapInt64Float64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64Float64X(vp *map[int64]float64, d *Decoder) { - v, changed := f.DecMapInt64Float64V(*vp, true, d) +func (f fastpathT) DecMapInt64Float64X(vp *map[int64]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64Float64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64Float64V(v map[int64]float64, canChange bool, +func (_ fastpathT) DecMapInt64Float64V(v map[int64]float64, checkNil bool, canChange bool, d *Decoder) (_ map[int64]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 16) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) v = make(map[int64]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapInt64BoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[int64]bool) - v, changed := fastpathTV.DecMapInt64BoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapInt64BoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[int64]bool) + v, changed := fastpathTV.DecMapInt64BoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapInt64BoolV(rv2i(rv).(map[int64]bool), false, d) + v := rv.Interface().(map[int64]bool) + fastpathTV.DecMapInt64BoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapInt64BoolX(vp *map[int64]bool, d *Decoder) { - v, changed := f.DecMapInt64BoolV(*vp, true, d) +func (f fastpathT) DecMapInt64BoolX(vp *map[int64]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapInt64BoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapInt64BoolV(v map[int64]bool, canChange bool, +func (_ fastpathT) DecMapInt64BoolV(v map[int64]bool, checkNil bool, canChange bool, d *Decoder) (_ map[int64]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[int64]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk int64 var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeInt64() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeInt(64) + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolIntfR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]interface{}) - v, changed := fastpathTV.DecMapBoolIntfV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolIntfR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]interface{}) + v, changed := fastpathTV.DecMapBoolIntfV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolIntfV(rv2i(rv).(map[bool]interface{}), false, d) + v := rv.Interface().(map[bool]interface{}) + fastpathTV.DecMapBoolIntfV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolIntfX(vp *map[bool]interface{}, d *Decoder) { - v, changed := f.DecMapBoolIntfV(*vp, true, d) +func (f fastpathT) DecMapBoolIntfX(vp *map[bool]interface{}, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolIntfV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolIntfV(v map[bool]interface{}, canChange bool, +func (_ fastpathT) DecMapBoolIntfV(v map[bool]interface{}, checkNil bool, canChange bool, d *Decoder) (_ map[bool]interface{}, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[bool]interface{}, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } - mapGet := v != nil && !d.h.MapValueReset && !d.h.InterfaceReset + mapGet := !d.h.MapValueReset && !d.h.InterfaceReset var mk bool var mv interface{} - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] } else { - v[mk] = nil + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv } - continue - } - if mapGet { - mv = v[mk] - } else { - mv = nil } - d.decode(&mv) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + if mapGet { + mv = v[mk] + } else { + mv = nil + } + d.decode(&mv) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolStringR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]string) - v, changed := fastpathTV.DecMapBoolStringV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolStringR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]string) + v, changed := fastpathTV.DecMapBoolStringV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolStringV(rv2i(rv).(map[bool]string), false, d) + v := rv.Interface().(map[bool]string) + fastpathTV.DecMapBoolStringV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolStringX(vp *map[bool]string, d *Decoder) { - v, changed := f.DecMapBoolStringV(*vp, true, d) +func (f fastpathT) DecMapBoolStringX(vp *map[bool]string, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolStringV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolStringV(v map[bool]string, canChange bool, +func (_ fastpathT) DecMapBoolStringV(v map[bool]string, checkNil bool, canChange bool, d *Decoder) (_ map[bool]string, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 17) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) v = make(map[bool]string, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv string - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = "" + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeString() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolUintR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]uint) - v, changed := fastpathTV.DecMapBoolUintV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolUintR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]uint) + v, changed := fastpathTV.DecMapBoolUintV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolUintV(rv2i(rv).(map[bool]uint), false, d) + v := rv.Interface().(map[bool]uint) + fastpathTV.DecMapBoolUintV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolUintX(vp *map[bool]uint, d *Decoder) { - v, changed := f.DecMapBoolUintV(*vp, true, d) +func (f fastpathT) DecMapBoolUintX(vp *map[bool]uint, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolUintV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolUintV(v map[bool]uint, canChange bool, +func (_ fastpathT) DecMapBoolUintV(v map[bool]uint, checkNil bool, canChange bool, d *Decoder) (_ map[bool]uint, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[bool]uint, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv uint - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolUint8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]uint8) - v, changed := fastpathTV.DecMapBoolUint8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolUint8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]uint8) + v, changed := fastpathTV.DecMapBoolUint8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolUint8V(rv2i(rv).(map[bool]uint8), false, d) + v := rv.Interface().(map[bool]uint8) + fastpathTV.DecMapBoolUint8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolUint8X(vp *map[bool]uint8, d *Decoder) { - v, changed := f.DecMapBoolUint8V(*vp, true, d) +func (f fastpathT) DecMapBoolUint8X(vp *map[bool]uint8, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolUint8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolUint8V(v map[bool]uint8, canChange bool, +func (_ fastpathT) DecMapBoolUint8V(v map[bool]uint8, checkNil bool, canChange bool, d *Decoder) (_ map[bool]uint8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[bool]uint8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv uint8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv + } } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint8(dd.DecodeUint(8)) + if v != nil { + v[mk] = mv } - continue - } - mv = uint8(chkOvf.UintV(dd.DecodeUint64(), 8)) - if v != nil { - v[mk] = mv } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolUint16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]uint16) - v, changed := fastpathTV.DecMapBoolUint16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolUint16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]uint16) + v, changed := fastpathTV.DecMapBoolUint16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolUint16V(rv2i(rv).(map[bool]uint16), false, d) + v := rv.Interface().(map[bool]uint16) + fastpathTV.DecMapBoolUint16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolUint16X(vp *map[bool]uint16, d *Decoder) { - v, changed := f.DecMapBoolUint16V(*vp, true, d) +func (f fastpathT) DecMapBoolUint16X(vp *map[bool]uint16, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolUint16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolUint16V(v map[bool]uint16, canChange bool, +func (_ fastpathT) DecMapBoolUint16V(v map[bool]uint16, checkNil bool, canChange bool, d *Decoder) (_ map[bool]uint16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[bool]uint16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv uint16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv } - continue } - mv = uint16(chkOvf.UintV(dd.DecodeUint64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint16(dd.DecodeUint(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolUint32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]uint32) - v, changed := fastpathTV.DecMapBoolUint32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolUint32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]uint32) + v, changed := fastpathTV.DecMapBoolUint32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolUint32V(rv2i(rv).(map[bool]uint32), false, d) + v := rv.Interface().(map[bool]uint32) + fastpathTV.DecMapBoolUint32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolUint32X(vp *map[bool]uint32, d *Decoder) { - v, changed := f.DecMapBoolUint32V(*vp, true, d) +func (f fastpathT) DecMapBoolUint32X(vp *map[bool]uint32, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolUint32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolUint32V(v map[bool]uint32, canChange bool, +func (_ fastpathT) DecMapBoolUint32V(v map[bool]uint32, checkNil bool, canChange bool, d *Decoder) (_ map[bool]uint32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[bool]uint32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv uint32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv } - continue } - mv = uint32(chkOvf.UintV(dd.DecodeUint64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uint32(dd.DecodeUint(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolUint64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]uint64) - v, changed := fastpathTV.DecMapBoolUint64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolUint64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]uint64) + v, changed := fastpathTV.DecMapBoolUint64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolUint64V(rv2i(rv).(map[bool]uint64), false, d) + v := rv.Interface().(map[bool]uint64) + fastpathTV.DecMapBoolUint64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolUint64X(vp *map[bool]uint64, d *Decoder) { - v, changed := f.DecMapBoolUint64V(*vp, true, d) +func (f fastpathT) DecMapBoolUint64X(vp *map[bool]uint64, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolUint64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolUint64V(v map[bool]uint64, canChange bool, +func (_ fastpathT) DecMapBoolUint64V(v map[bool]uint64, checkNil bool, canChange bool, d *Decoder) (_ map[bool]uint64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[bool]uint64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv uint64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeUint64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeUint(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolUintptrR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]uintptr) - v, changed := fastpathTV.DecMapBoolUintptrV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolUintptrR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]uintptr) + v, changed := fastpathTV.DecMapBoolUintptrV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolUintptrV(rv2i(rv).(map[bool]uintptr), false, d) + v := rv.Interface().(map[bool]uintptr) + fastpathTV.DecMapBoolUintptrV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolUintptrX(vp *map[bool]uintptr, d *Decoder) { - v, changed := f.DecMapBoolUintptrV(*vp, true, d) +func (f fastpathT) DecMapBoolUintptrX(vp *map[bool]uintptr, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolUintptrV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolUintptrV(v map[bool]uintptr, canChange bool, +func (_ fastpathT) DecMapBoolUintptrV(v map[bool]uintptr, checkNil bool, canChange bool, d *Decoder) (_ map[bool]uintptr, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[bool]uintptr, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv uintptr - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = uintptr(dd.DecodeUint(uintBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolIntR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]int) - v, changed := fastpathTV.DecMapBoolIntV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolIntR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]int) + v, changed := fastpathTV.DecMapBoolIntV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolIntV(rv2i(rv).(map[bool]int), false, d) + v := rv.Interface().(map[bool]int) + fastpathTV.DecMapBoolIntV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolIntX(vp *map[bool]int, d *Decoder) { - v, changed := f.DecMapBoolIntV(*vp, true, d) +func (f fastpathT) DecMapBoolIntX(vp *map[bool]int, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolIntV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolIntV(v map[bool]int, canChange bool, +func (_ fastpathT) DecMapBoolIntV(v map[bool]int, checkNil bool, canChange bool, d *Decoder) (_ map[bool]int, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[bool]int, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv int - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv } - continue } - mv = int(chkOvf.IntV(dd.DecodeInt64(), intBitsize)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int(dd.DecodeInt(intBitsize)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolInt8R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]int8) - v, changed := fastpathTV.DecMapBoolInt8V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolInt8R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]int8) + v, changed := fastpathTV.DecMapBoolInt8V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolInt8V(rv2i(rv).(map[bool]int8), false, d) + v := rv.Interface().(map[bool]int8) + fastpathTV.DecMapBoolInt8V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolInt8X(vp *map[bool]int8, d *Decoder) { - v, changed := f.DecMapBoolInt8V(*vp, true, d) +func (f fastpathT) DecMapBoolInt8X(vp *map[bool]int8, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolInt8V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolInt8V(v map[bool]int8, canChange bool, +func (_ fastpathT) DecMapBoolInt8V(v map[bool]int8, checkNil bool, canChange bool, d *Decoder) (_ map[bool]int8, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[bool]int8, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv int8 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv } - continue } - mv = int8(chkOvf.IntV(dd.DecodeInt64(), 8)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int8(dd.DecodeInt(8)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolInt16R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]int16) - v, changed := fastpathTV.DecMapBoolInt16V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolInt16R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]int16) + v, changed := fastpathTV.DecMapBoolInt16V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolInt16V(rv2i(rv).(map[bool]int16), false, d) + v := rv.Interface().(map[bool]int16) + fastpathTV.DecMapBoolInt16V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolInt16X(vp *map[bool]int16, d *Decoder) { - v, changed := f.DecMapBoolInt16V(*vp, true, d) +func (f fastpathT) DecMapBoolInt16X(vp *map[bool]int16, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolInt16V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolInt16V(v map[bool]int16, canChange bool, +func (_ fastpathT) DecMapBoolInt16V(v map[bool]int16, checkNil bool, canChange bool, d *Decoder) (_ map[bool]int16, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 3) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) v = make(map[bool]int16, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv int16 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv } - continue } - mv = int16(chkOvf.IntV(dd.DecodeInt64(), 16)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int16(dd.DecodeInt(16)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolInt32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]int32) - v, changed := fastpathTV.DecMapBoolInt32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolInt32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]int32) + v, changed := fastpathTV.DecMapBoolInt32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolInt32V(rv2i(rv).(map[bool]int32), false, d) + v := rv.Interface().(map[bool]int32) + fastpathTV.DecMapBoolInt32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolInt32X(vp *map[bool]int32, d *Decoder) { - v, changed := f.DecMapBoolInt32V(*vp, true, d) +func (f fastpathT) DecMapBoolInt32X(vp *map[bool]int32, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolInt32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolInt32V(v map[bool]int32, canChange bool, +func (_ fastpathT) DecMapBoolInt32V(v map[bool]int32, checkNil bool, canChange bool, d *Decoder) (_ map[bool]int32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[bool]int32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv int32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv } - continue } - mv = int32(chkOvf.IntV(dd.DecodeInt64(), 32)) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = int32(dd.DecodeInt(32)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolInt64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]int64) - v, changed := fastpathTV.DecMapBoolInt64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolInt64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]int64) + v, changed := fastpathTV.DecMapBoolInt64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolInt64V(rv2i(rv).(map[bool]int64), false, d) + v := rv.Interface().(map[bool]int64) + fastpathTV.DecMapBoolInt64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolInt64X(vp *map[bool]int64, d *Decoder) { - v, changed := f.DecMapBoolInt64V(*vp, true, d) +func (f fastpathT) DecMapBoolInt64X(vp *map[bool]int64, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolInt64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolInt64V(v map[bool]int64, canChange bool, +func (_ fastpathT) DecMapBoolInt64V(v map[bool]int64, checkNil bool, canChange bool, d *Decoder) (_ map[bool]int64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[bool]int64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv int64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeInt64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeInt(64) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolFloat32R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]float32) - v, changed := fastpathTV.DecMapBoolFloat32V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolFloat32R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]float32) + v, changed := fastpathTV.DecMapBoolFloat32V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolFloat32V(rv2i(rv).(map[bool]float32), false, d) + v := rv.Interface().(map[bool]float32) + fastpathTV.DecMapBoolFloat32V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolFloat32X(vp *map[bool]float32, d *Decoder) { - v, changed := f.DecMapBoolFloat32V(*vp, true, d) +func (f fastpathT) DecMapBoolFloat32X(vp *map[bool]float32, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolFloat32V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolFloat32V(v map[bool]float32, canChange bool, +func (_ fastpathT) DecMapBoolFloat32V(v map[bool]float32, checkNil bool, canChange bool, d *Decoder) (_ map[bool]float32, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 5) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) v = make(map[bool]float32, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv float32 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv } - continue } - mv = float32(chkOvf.Float32V(dd.DecodeFloat64())) - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = float32(dd.DecodeFloat(true)) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolFloat64R(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]float64) - v, changed := fastpathTV.DecMapBoolFloat64V(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolFloat64R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]float64) + v, changed := fastpathTV.DecMapBoolFloat64V(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolFloat64V(rv2i(rv).(map[bool]float64), false, d) + v := rv.Interface().(map[bool]float64) + fastpathTV.DecMapBoolFloat64V(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolFloat64X(vp *map[bool]float64, d *Decoder) { - v, changed := f.DecMapBoolFloat64V(*vp, true, d) +func (f fastpathT) DecMapBoolFloat64X(vp *map[bool]float64, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolFloat64V(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolFloat64V(v map[bool]float64, canChange bool, +func (_ fastpathT) DecMapBoolFloat64V(v map[bool]float64, checkNil bool, canChange bool, d *Decoder) (_ map[bool]float64, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 9) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) v = make(map[bool]float64, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv float64 - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = 0 + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeFloat64() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeFloat(false) + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } -func (d *Decoder) fastpathDecMapBoolBoolR(f *codecFnInfo, rv reflect.Value) { - if rv.Kind() == reflect.Ptr { - vp := rv2i(rv).(*map[bool]bool) - v, changed := fastpathTV.DecMapBoolBoolV(*vp, true, d) +func (f *decFnInfo) fastpathDecMapBoolBoolR(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[bool]bool) + v, changed := fastpathTV.DecMapBoolBoolV(*vp, fastpathCheckNilFalse, true, f.d) if changed { *vp = v } } else { - fastpathTV.DecMapBoolBoolV(rv2i(rv).(map[bool]bool), false, d) + v := rv.Interface().(map[bool]bool) + fastpathTV.DecMapBoolBoolV(v, fastpathCheckNilFalse, false, f.d) } } -func (f fastpathT) DecMapBoolBoolX(vp *map[bool]bool, d *Decoder) { - v, changed := f.DecMapBoolBoolV(*vp, true, d) +func (f fastpathT) DecMapBoolBoolX(vp *map[bool]bool, checkNil bool, d *Decoder) { + v, changed := f.DecMapBoolBoolV(*vp, checkNil, true, d) if changed { *vp = v } } -func (_ fastpathT) DecMapBoolBoolV(v map[bool]bool, canChange bool, +func (_ fastpathT) DecMapBoolBoolV(v map[bool]bool, checkNil bool, canChange bool, d *Decoder) (_ map[bool]bool, changed bool) { - dd, esep := d.d, d.hh.hasElemSeparators() + dd := d.d + cr := d.cr + + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + containerLen := dd.ReadMapStart() if canChange && v == nil { - xlen := decInferLen(containerLen, d.h.MaxInitLen, 2) + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) v = make(map[bool]bool, xlen) changed = true } - if containerLen == 0 { - dd.ReadMapEnd() - return v, changed - } + var mk bool var mv bool - hasLen := containerLen > 0 - for j := 0; (hasLen && j < containerLen) || !(hasLen || dd.CheckBreak()); j++ { - if esep { - dd.ReadMapElemKey() - } - mk = dd.DecodeBool() - if esep { - dd.ReadMapElemValue() - } - if dd.TryDecodeAsNil() { - if v == nil { - } else if d.h.DeleteOnNilMapValue { - delete(v, mk) - } else { - v[mk] = false + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv } - continue } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { + cr.sendContainerState(containerMapKey) + } + mk = dd.DecodeBool() + if cr != nil { + cr.sendContainerState(containerMapValue) + } + mv = dd.DecodeBool() + if v != nil { + v[mk] = mv + } } } - dd.ReadMapEnd() + if cr != nil { + cr.sendContainerState(containerMapEnd) + } return v, changed } diff --git a/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl b/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl new file mode 100644 index 000000000..c3ffdf93d --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/fast-path.go.tmpl @@ -0,0 +1,527 @@ +// +build !notfastpath + +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED from fast-path.go.tmpl +// ************************************************************ + +package codec + +// Fast path functions try to create a fast path encode or decode implementation +// for common maps and slices. +// +// We define the functions and register then in this single file +// so as not to pollute the encode.go and decode.go, and create a dependency in there. +// This file can be omitted without causing a build failure. +// +// The advantage of fast paths is: +// - Many calls bypass reflection altogether +// +// Currently support +// - slice of all builtin types, +// - map of all builtin types to string or interface value +// - symmetrical maps of all builtin types (e.g. str-str, uint8-uint8) +// This should provide adequate "typical" implementations. +// +// Note that fast track decode functions must handle values for which an address cannot be obtained. +// For example: +// m2 := map[string]int{} +// p2 := []interface{}{m2} +// // decoding into p2 will bomb if fast track functions do not treat like unaddressable. +// + +import ( + "reflect" + "sort" +) + +const fastpathEnabled = true + +const fastpathCheckNilFalse = false // for reflect +const fastpathCheckNilTrue = true // for type switch + +type fastpathT struct {} + +var fastpathTV fastpathT + +type fastpathE struct { + rtid uintptr + rt reflect.Type + encfn func(*encFnInfo, reflect.Value) + decfn func(*decFnInfo, reflect.Value) +} + +type fastpathA [{{ .FastpathLen }}]fastpathE + +func (x *fastpathA) index(rtid uintptr) int { + // use binary search to grab the index (adapted from sort/search.go) + h, i, j := 0, 0, {{ .FastpathLen }} // len(x) + for i < j { + h = i + (j-i)/2 + if x[h].rtid < rtid { + i = h + 1 + } else { + j = h + } + } + if i < {{ .FastpathLen }} && x[i].rtid == rtid { + return i + } + return -1 +} + +type fastpathAslice []fastpathE + +func (x fastpathAslice) Len() int { return len(x) } +func (x fastpathAslice) Less(i, j int) bool { return x[i].rtid < x[j].rtid } +func (x fastpathAslice) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +var fastpathAV fastpathA + +// due to possible initialization loop error, make fastpath in an init() +func init() { + i := 0 + fn := func(v interface{}, fe func(*encFnInfo, reflect.Value), fd func(*decFnInfo, reflect.Value)) (f fastpathE) { + xrt := reflect.TypeOf(v) + xptr := reflect.ValueOf(xrt).Pointer() + fastpathAV[i] = fastpathE{xptr, xrt, fe, fd} + i++ + return + } + + {{range .Values}}{{if not .Primitive}}{{if not .MapKey }} + fn([]{{ .Elem }}(nil), (*encFnInfo).{{ .MethodNamePfx "fastpathEnc" false }}R, (*decFnInfo).{{ .MethodNamePfx "fastpathDec" false }}R){{end}}{{end}}{{end}} + + {{range .Values}}{{if not .Primitive}}{{if .MapKey }} + fn(map[{{ .MapKey }}]{{ .Elem }}(nil), (*encFnInfo).{{ .MethodNamePfx "fastpathEnc" false }}R, (*decFnInfo).{{ .MethodNamePfx "fastpathDec" false }}R){{end}}{{end}}{{end}} + + sort.Sort(fastpathAslice(fastpathAV[:])) +} + +// -- encode + +// -- -- fast path type switch +func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { + switch v := iv.(type) { +{{range .Values}}{{if not .Primitive}}{{if not .MapKey }} + case []{{ .Elem }}:{{else}} + case map[{{ .MapKey }}]{{ .Elem }}:{{end}} + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(v, fastpathCheckNilTrue, e){{if not .MapKey }} + case *[]{{ .Elem }}:{{else}} + case *map[{{ .MapKey }}]{{ .Elem }}:{{end}} + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(*v, fastpathCheckNilTrue, e) +{{end}}{{end}} + default: + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) + return false + } + return true +} + +func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { + switch v := iv.(type) { +{{range .Values}}{{if not .Primitive}}{{if not .MapKey }} + case []{{ .Elem }}: + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(v, fastpathCheckNilTrue, e) + case *[]{{ .Elem }}: + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(*v, fastpathCheckNilTrue, e) +{{end}}{{end}}{{end}} + default: + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) + return false + } + return true +} + +func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { + switch v := iv.(type) { +{{range .Values}}{{if not .Primitive}}{{if .MapKey }} + case map[{{ .MapKey }}]{{ .Elem }}: + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(v, fastpathCheckNilTrue, e) + case *map[{{ .MapKey }}]{{ .Elem }}: + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(*v, fastpathCheckNilTrue, e) +{{end}}{{end}}{{end}} + default: + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) + return false + } + return true +} + +// -- -- fast path functions +{{range .Values}}{{if not .Primitive}}{{if not .MapKey }} + +func (f *encFnInfo) {{ .MethodNamePfx "fastpathEnc" false }}R(rv reflect.Value) { + if f.ti.mbs { + fastpathTV.{{ .MethodNamePfx "EncAsMap" false }}V(rv.Interface().([]{{ .Elem }}), fastpathCheckNilFalse, f.e) + } else { + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(rv.Interface().([]{{ .Elem }}), fastpathCheckNilFalse, f.e) + } +} +func (_ fastpathT) {{ .MethodNamePfx "Enc" false }}V(v []{{ .Elem }}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeArrayStart(len(v)) + for _, v2 := range v { + if cr != nil { cr.sendContainerState(containerArrayElem) } + {{ encmd .Elem "v2"}} + } + if cr != nil { cr.sendContainerState(containerArrayEnd) }{{/* ee.EncodeEnd() */}} +} + +func (_ fastpathT) {{ .MethodNamePfx "EncAsMap" false }}V(v []{{ .Elem }}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + if len(v)%2 == 1 { + e.errorf("mapBySlice requires even slice length, but got %v", len(v)) + return + } + ee.EncodeMapStart(len(v) / 2) + for j, v2 := range v { + if cr != nil { + if j%2 == 0 { + cr.sendContainerState(containerMapKey) + } else { + cr.sendContainerState(containerMapValue) + } + } + {{ encmd .Elem "v2"}} + } + if cr != nil { cr.sendContainerState(containerMapEnd) } +} + +{{end}}{{end}}{{end}} + +{{range .Values}}{{if not .Primitive}}{{if .MapKey }} + +func (f *encFnInfo) {{ .MethodNamePfx "fastpathEnc" false }}R(rv reflect.Value) { + fastpathTV.{{ .MethodNamePfx "Enc" false }}V(rv.Interface().(map[{{ .MapKey }}]{{ .Elem }}), fastpathCheckNilFalse, f.e) +} +func (_ fastpathT) {{ .MethodNamePfx "Enc" false }}V(v map[{{ .MapKey }}]{{ .Elem }}, checkNil bool, e *Encoder) { + ee := e.e + cr := e.cr + if checkNil && v == nil { + ee.EncodeNil() + return + } + ee.EncodeMapStart(len(v)) + {{if eq .MapKey "string"}}asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 + {{end}}if e.h.Canonical { + {{if eq .MapKey "interface{}"}}{{/* out of band + */}}var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding + e2 := NewEncoderBytes(&mksv, e.hh) + v2 := make([]bytesI, len(v)) + var i, l int + var vp *bytesI {{/* put loop variables outside. seems currently needed for better perf */}} + for k2, _ := range v { + l = len(mksv) + e2.MustEncode(k2) + vp = &v2[i] + vp.v = mksv[l:] + vp.i = k2 + i++ + } + sort.Sort(bytesISlice(v2)) + for j := range v2 { + if cr != nil { cr.sendContainerState(containerMapKey) } + e.asis(v2[j].v) + if cr != nil { cr.sendContainerState(containerMapValue) } + e.encode(v[v2[j].i]) + } {{else}}{{ $x := sorttype .MapKey true}}v2 := make([]{{ $x }}, len(v)) + var i int + for k, _ := range v { + v2[i] = {{ $x }}(k) + i++ + } + sort.Sort({{ sorttype .MapKey false}}(v2)) + for _, k2 := range v2 { + if cr != nil { cr.sendContainerState(containerMapKey) } + {{if eq .MapKey "string"}}if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + }{{else}}{{ $y := printf "%s(k2)" .MapKey }}{{ encmd .MapKey $y }}{{end}} + if cr != nil { cr.sendContainerState(containerMapValue) } + {{ $y := printf "v[%s(k2)]" .MapKey }}{{ encmd .Elem $y }} + } {{end}} + } else { + for k2, v2 := range v { + if cr != nil { cr.sendContainerState(containerMapKey) } + {{if eq .MapKey "string"}}if asSymbols { + ee.EncodeSymbol(k2) + } else { + ee.EncodeString(c_UTF8, k2) + }{{else}}{{ encmd .MapKey "k2"}}{{end}} + if cr != nil { cr.sendContainerState(containerMapValue) } + {{ encmd .Elem "v2"}} + } + } + if cr != nil { cr.sendContainerState(containerMapEnd) }{{/* ee.EncodeEnd() */}} +} + +{{end}}{{end}}{{end}} + +// -- decode + +// -- -- fast path type switch +func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { + switch v := iv.(type) { +{{range .Values}}{{if not .Primitive}}{{if not .MapKey }} + case []{{ .Elem }}:{{else}} + case map[{{ .MapKey }}]{{ .Elem }}:{{end}} + fastpathTV.{{ .MethodNamePfx "Dec" false }}V(v, fastpathCheckNilFalse, false, d){{if not .MapKey }} + case *[]{{ .Elem }}:{{else}} + case *map[{{ .MapKey }}]{{ .Elem }}:{{end}} + v2, changed2 := fastpathTV.{{ .MethodNamePfx "Dec" false }}V(*v, fastpathCheckNilFalse, true, d) + if changed2 { + *v = v2 + } +{{end}}{{end}} + default: + _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) + return false + } + return true +} + +// -- -- fast path functions +{{range .Values}}{{if not .Primitive}}{{if not .MapKey }} +{{/* +Slices can change if they +- did not come from an array +- are addressable (from a ptr) +- are settable (e.g. contained in an interface{}) +*/}} +func (f *decFnInfo) {{ .MethodNamePfx "fastpathDec" false }}R(rv reflect.Value) { + array := f.seq == seqTypeArray + if !array && rv.CanAddr() { {{/* // CanSet => CanAddr + Exported */}} + vp := rv.Addr().Interface().(*[]{{ .Elem }}) + v, changed := fastpathTV.{{ .MethodNamePfx "Dec" false }}V(*vp, fastpathCheckNilFalse, !array, f.d) + if changed { + *vp = v + } + } else { + v := rv.Interface().([]{{ .Elem }}) + fastpathTV.{{ .MethodNamePfx "Dec" false }}V(v, fastpathCheckNilFalse, false, f.d) + } +} + +func (f fastpathT) {{ .MethodNamePfx "Dec" false }}X(vp *[]{{ .Elem }}, checkNil bool, d *Decoder) { + v, changed := f.{{ .MethodNamePfx "Dec" false }}V(*vp, checkNil, true, d) + if changed { + *vp = v + } +} +func (_ fastpathT) {{ .MethodNamePfx "Dec" false }}V(v []{{ .Elem }}, checkNil bool, canChange bool, d *Decoder) (_ []{{ .Elem }}, changed bool) { + dd := d.d + {{/* // if dd.isContainerType(valueTypeNil) { dd.TryDecodeAsNil() */}} + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + + slh, containerLenS := d.decSliceHelperStart() + if containerLenS == 0 { + if canChange { + if v == nil { + v = []{{ .Elem }}{} + } else if len(v) != 0 { + v = v[:0] + } + changed = true + } + slh.End() + return v, changed + } + + if containerLenS > 0 { + x2read := containerLenS + var xtrunc bool + if containerLenS > cap(v) { + if canChange { {{/* + // fast-path is for "basic" immutable types, so no need to copy them over + // s := make([]{{ .Elem }}, decInferLen(containerLenS, d.h.MaxInitLen)) + // copy(s, v[:cap(v)]) + // v = s */}} + var xlen int + xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, {{ .Size }}) + if xtrunc { + if xlen <= cap(v) { + v = v[:xlen] + } else { + v = make([]{{ .Elem }}, xlen) + } + } else { + v = make([]{{ .Elem }}, xlen) + } + changed = true + } else { + d.arrayCannotExpand(len(v), containerLenS) + } + x2read = len(v) + } else if containerLenS != len(v) { + if canChange { + v = v[:containerLenS] + changed = true + } + } {{/* // all checks done. cannot go past len. */}} + j := 0 + for ; j < x2read; j++ { + slh.ElemContainerState(j) + {{ if eq .Elem "interface{}" }}d.decode(&v[j]){{ else }}v[j] = {{ decmd .Elem }}{{ end }} + } + if xtrunc { {{/* // means canChange=true, changed=true already. */}} + for ; j < containerLenS; j++ { + v = append(v, {{ zerocmd .Elem }}) + slh.ElemContainerState(j) + {{ if eq .Elem "interface{}" }}d.decode(&v[j]){{ else }}v[j] = {{ decmd .Elem }}{{ end }} + } + } else if !canChange { + for ; j < containerLenS; j++ { + slh.ElemContainerState(j) + d.swallow() + } + } + } else { + breakFound := dd.CheckBreak() {{/* check break first, so we can initialize v with a capacity of 4 if necessary */}} + if breakFound { + if canChange { + if v == nil { + v = []{{ .Elem }}{} + } else if len(v) != 0 { + v = v[:0] + } + changed = true + } + slh.End() + return v, changed + } + if cap(v) == 0 { + v = make([]{{ .Elem }}, 1, 4) + changed = true + } + j := 0 + for ; !breakFound; j++ { + if j >= len(v) { + if canChange { + v = append(v, {{ zerocmd .Elem }}) + changed = true + } else { + d.arrayCannotExpand(len(v), j+1) + } + } + slh.ElemContainerState(j) + if j < len(v) { {{/* // all checks done. cannot go past len. */}} + {{ if eq .Elem "interface{}" }}d.decode(&v[j]) + {{ else }}v[j] = {{ decmd .Elem }}{{ end }} + } else { + d.swallow() + } + breakFound = dd.CheckBreak() + } + if canChange && j < len(v) { + v = v[:j] + changed = true + } + } + slh.End() + return v, changed +} + +{{end}}{{end}}{{end}} + + +{{range .Values}}{{if not .Primitive}}{{if .MapKey }} +{{/* +Maps can change if they are +- addressable (from a ptr) +- settable (e.g. contained in an interface{}) +*/}} +func (f *decFnInfo) {{ .MethodNamePfx "fastpathDec" false }}R(rv reflect.Value) { + if rv.CanAddr() { + vp := rv.Addr().Interface().(*map[{{ .MapKey }}]{{ .Elem }}) + v, changed := fastpathTV.{{ .MethodNamePfx "Dec" false }}V(*vp, fastpathCheckNilFalse, true, f.d) + if changed { + *vp = v + } + } else { + v := rv.Interface().(map[{{ .MapKey }}]{{ .Elem }}) + fastpathTV.{{ .MethodNamePfx "Dec" false }}V(v, fastpathCheckNilFalse, false, f.d) + } +} +func (f fastpathT) {{ .MethodNamePfx "Dec" false }}X(vp *map[{{ .MapKey }}]{{ .Elem }}, checkNil bool, d *Decoder) { + v, changed := f.{{ .MethodNamePfx "Dec" false }}V(*vp, checkNil, true, d) + if changed { + *vp = v + } +} +func (_ fastpathT) {{ .MethodNamePfx "Dec" false }}V(v map[{{ .MapKey }}]{{ .Elem }}, checkNil bool, canChange bool, + d *Decoder) (_ map[{{ .MapKey }}]{{ .Elem }}, changed bool) { + dd := d.d + cr := d.cr + {{/* // if dd.isContainerType(valueTypeNil) {dd.TryDecodeAsNil() */}} + if checkNil && dd.TryDecodeAsNil() { + if v != nil { + changed = true + } + return nil, changed + } + + containerLen := dd.ReadMapStart() + if canChange && v == nil { + xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, {{ .Size }}) + v = make(map[{{ .MapKey }}]{{ .Elem }}, xlen) + changed = true + } + {{ if eq .Elem "interface{}" }}mapGet := !d.h.MapValueReset && !d.h.InterfaceReset{{end}} + var mk {{ .MapKey }} + var mv {{ .Elem }} + if containerLen > 0 { + for j := 0; j < containerLen; j++ { + if cr != nil { cr.sendContainerState(containerMapKey) } + {{ if eq .MapKey "interface{}" }}mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) {{/* // maps cannot have []byte as key. switch to string. */}} + }{{ else }}mk = {{ decmd .MapKey }}{{ end }} + if cr != nil { cr.sendContainerState(containerMapValue) } + {{ if eq .Elem "interface{}" }}if mapGet { mv = v[mk] } else { mv = nil } + d.decode(&mv){{ else }}mv = {{ decmd .Elem }}{{ end }} + if v != nil { + v[mk] = mv + } + } + } else if containerLen < 0 { + for j := 0; !dd.CheckBreak(); j++ { + if cr != nil { cr.sendContainerState(containerMapKey) } + {{ if eq .MapKey "interface{}" }}mk = nil + d.decode(&mk) + if bv, bok := mk.([]byte); bok { + mk = d.string(bv) {{/* // maps cannot have []byte as key. switch to string. */}} + }{{ else }}mk = {{ decmd .MapKey }}{{ end }} + if cr != nil { cr.sendContainerState(containerMapValue) } + {{ if eq .Elem "interface{}" }}if mapGet { mv = v[mk] } else { mv = nil } + d.decode(&mv){{ else }}mv = {{ decmd .Elem }}{{ end }} + if v != nil { + v[mk] = mv + } + } + } + if cr != nil { cr.sendContainerState(containerMapEnd) } + return v, changed +} + +{{end}}{{end}}{{end}} diff --git a/vendor/github.com/ugorji/go/codec/fast-path.not.go b/vendor/github.com/ugorji/go/codec/fast-path.not.go index f11b4674f..63e591145 100644 --- a/vendor/github.com/ugorji/go/codec/fast-path.not.go +++ b/vendor/github.com/ugorji/go/codec/fast-path.not.go @@ -1,6 +1,3 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - // +build notfastpath package codec @@ -21,27 +18,17 @@ func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { return fal func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { return false } func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { return false } func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { return false } -func fastpathDecodeSetZeroTypeSwitch(iv interface{}) bool { return false } type fastpathT struct{} type fastpathE struct { rtid uintptr rt reflect.Type - encfn func(*Encoder, *codecFnInfo, reflect.Value) - decfn func(*Decoder, *codecFnInfo, reflect.Value) + encfn func(*encFnInfo, reflect.Value) + decfn func(*decFnInfo, reflect.Value) } type fastpathA [0]fastpathE func (x fastpathA) index(rtid uintptr) int { return -1 } -func (_ fastpathT) DecSliceUint8V(v []uint8, canChange bool, d *Decoder) (_ []uint8, changed bool) { - fn := d.cfer().get(uint8SliceTyp, true, true) - d.kSlice(&fn.i, reflect.ValueOf(&v).Elem()) - return v, true -} - var fastpathAV fastpathA var fastpathTV fastpathT - -// ---- -type TestMammoth2Wrapper struct{} // to allow testMammoth work in notfastpath mode diff --git a/vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl b/vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl new file mode 100644 index 000000000..32df54144 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl @@ -0,0 +1,104 @@ +{{var "v"}} := {{if not isArray}}*{{end}}{{ .Varname }} +{{var "h"}}, {{var "l"}} := z.DecSliceHelperStart() {{/* // helper, containerLenS */}}{{if not isArray}} +var {{var "c"}} bool {{/* // changed */}} +_ = {{var "c"}}{{end}} +if {{var "l"}} == 0 { + {{if isSlice }}if {{var "v"}} == nil { + {{var "v"}} = []{{ .Typ }}{} + {{var "c"}} = true + } else if len({{var "v"}}) != 0 { + {{var "v"}} = {{var "v"}}[:0] + {{var "c"}} = true + } {{end}} {{if isChan }}if {{var "v"}} == nil { + {{var "v"}} = make({{ .CTyp }}, 0) + {{var "c"}} = true + } {{end}} +} else if {{var "l"}} > 0 { + {{if isChan }}if {{var "v"}} == nil { + {{var "rl"}}, _ = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) + {{var "v"}} = make({{ .CTyp }}, {{var "rl"}}) + {{var "c"}} = true + } + for {{var "r"}} := 0; {{var "r"}} < {{var "l"}}; {{var "r"}}++ { + {{var "h"}}.ElemContainerState({{var "r"}}) + var {{var "t"}} {{ .Typ }} + {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }} + {{var "v"}} <- {{var "t"}} + } + {{ else }} var {{var "rr"}}, {{var "rl"}} int {{/* // num2read, length of slice/array/chan */}} + var {{var "rt"}} bool {{/* truncated */}} + _, _ = {{var "rl"}}, {{var "rt"}} + {{var "rr"}} = {{var "l"}} // len({{var "v"}}) + if {{var "l"}} > cap({{var "v"}}) { + {{if isArray }}z.DecArrayCannotExpand(len({{var "v"}}), {{var "l"}}) + {{ else }}{{if not .Immutable }} + {{var "rg"}} := len({{var "v"}}) > 0 + {{var "v2"}} := {{var "v"}} {{end}} + {{var "rl"}}, {{var "rt"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) + if {{var "rt"}} { + if {{var "rl"}} <= cap({{var "v"}}) { + {{var "v"}} = {{var "v"}}[:{{var "rl"}}] + } else { + {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}}) + } + } else { + {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}}) + } + {{var "c"}} = true + {{var "rr"}} = len({{var "v"}}) {{if not .Immutable }} + if {{var "rg"}} { copy({{var "v"}}, {{var "v2"}}) } {{end}} {{end}}{{/* end not Immutable, isArray */}} + } {{if isSlice }} else if {{var "l"}} != len({{var "v"}}) { + {{var "v"}} = {{var "v"}}[:{{var "l"}}] + {{var "c"}} = true + } {{end}} {{/* end isSlice:47 */}} + {{var "j"}} := 0 + for ; {{var "j"}} < {{var "rr"}} ; {{var "j"}}++ { + {{var "h"}}.ElemContainerState({{var "j"}}) + {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} + } + {{if isArray }}for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ { + {{var "h"}}.ElemContainerState({{var "j"}}) + z.DecSwallow() + } + {{ else }}if {{var "rt"}} { + for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ { + {{var "v"}} = append({{var "v"}}, {{ zero}}) + {{var "h"}}.ElemContainerState({{var "j"}}) + {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} + } + } {{end}} {{/* end isArray:56 */}} + {{end}} {{/* end isChan:16 */}} +} else { {{/* len < 0 */}} + {{var "j"}} := 0 + for ; !r.CheckBreak(); {{var "j"}}++ { + {{if isChan }} + {{var "h"}}.ElemContainerState({{var "j"}}) + var {{var "t"}} {{ .Typ }} + {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }} + {{var "v"}} <- {{var "t"}} + {{ else }} + if {{var "j"}} >= len({{var "v"}}) { + {{if isArray }}z.DecArrayCannotExpand(len({{var "v"}}), {{var "j"}}+1) + {{ else }}{{var "v"}} = append({{var "v"}}, {{zero}})// var {{var "z"}} {{ .Typ }} + {{var "c"}} = true {{end}} + } + {{var "h"}}.ElemContainerState({{var "j"}}) + if {{var "j"}} < len({{var "v"}}) { + {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} + } else { + z.DecSwallow() + } + {{end}} + } + {{if isSlice }}if {{var "j"}} < len({{var "v"}}) { + {{var "v"}} = {{var "v"}}[:{{var "j"}}] + {{var "c"}} = true + } else if {{var "j"}} == 0 && {{var "v"}} == nil { + {{var "v"}} = []{{ .Typ }}{} + {{var "c"}} = true + }{{end}} +} +{{var "h"}}.End() +{{if not isArray }}if {{var "c"}} { + *{{ .Varname }} = {{var "v"}} +}{{end}} diff --git a/vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl b/vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl new file mode 100644 index 000000000..77400e0a1 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl @@ -0,0 +1,58 @@ +{{var "v"}} := *{{ .Varname }} +{{var "l"}} := r.ReadMapStart() +{{var "bh"}} := z.DecBasicHandle() +if {{var "v"}} == nil { + {{var "rl"}}, _ := z.DecInferLen({{var "l"}}, {{var "bh"}}.MaxInitLen, {{ .Size }}) + {{var "v"}} = make(map[{{ .KTyp }}]{{ .Typ }}, {{var "rl"}}) + *{{ .Varname }} = {{var "v"}} +} +var {{var "mk"}} {{ .KTyp }} +var {{var "mv"}} {{ .Typ }} +var {{var "mg"}} {{if decElemKindPtr}}, {{var "ms"}}, {{var "mok"}}{{end}} bool +if {{var "bh"}}.MapValueReset { + {{if decElemKindPtr}}{{var "mg"}} = true + {{else if decElemKindIntf}}if !{{var "bh"}}.InterfaceReset { {{var "mg"}} = true } + {{else if not decElemKindImmutable}}{{var "mg"}} = true + {{end}} } +if {{var "l"}} > 0 { +for {{var "j"}} := 0; {{var "j"}} < {{var "l"}}; {{var "j"}}++ { + z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) + {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }} +{{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */}}if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} { + {{var "mk"}} = string({{var "bv"}}) + }{{ end }}{{if decElemKindPtr}} + {{var "ms"}} = true{{end}} + if {{var "mg"}} { + {{if decElemKindPtr}}{{var "mv"}}, {{var "mok"}} = {{var "v"}}[{{var "mk"}}] + if {{var "mok"}} { + {{var "ms"}} = false + } {{else}}{{var "mv"}} = {{var "v"}}[{{var "mk"}}] {{end}} + } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}} + z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) + {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }} + if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { + {{var "v"}}[{{var "mk"}}] = {{var "mv"}} + } +} +} else if {{var "l"}} < 0 { +for {{var "j"}} := 0; !r.CheckBreak(); {{var "j"}}++ { + z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) + {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }} +{{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */}}if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} { + {{var "mk"}} = string({{var "bv"}}) + }{{ end }}{{if decElemKindPtr}} + {{var "ms"}} = true {{ end }} + if {{var "mg"}} { + {{if decElemKindPtr}}{{var "mv"}}, {{var "mok"}} = {{var "v"}}[{{var "mk"}}] + if {{var "mok"}} { + {{var "ms"}} = false + } {{else}}{{var "mv"}} = {{var "v"}}[{{var "mk"}}] {{end}} + } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}} + z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) + {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }} + if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { + {{var "v"}}[{{var "mk"}}] = {{var "mv"}} + } +} +} // else len==0: TODO: Should we clear map entries? +z.DecSendContainerState(codecSelfer_containerMapEnd{{ .Sfx }}) diff --git a/vendor/github.com/ugorji/go/codec/gen-helper.generated.go b/vendor/github.com/ugorji/go/codec/gen-helper.generated.go index 917d28283..eb0bdad35 100644 --- a/vendor/github.com/ugorji/go/codec/gen-helper.generated.go +++ b/vendor/github.com/ugorji/go/codec/gen-helper.generated.go @@ -3,7 +3,10 @@ // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. -// Code generated from gen-helper.go.tmpl - DO NOT EDIT. +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED from gen-helper.go.tmpl +// ************************************************************ package codec @@ -12,9 +15,6 @@ import ( "reflect" ) -// GenVersion is the current version of codecgen. -const GenVersion = 8 - // This file is used to generate helper code for codecgen. // The values here i.e. genHelper(En|De)coder are not to be used directly by // library users. They WILL change continuously and without notice. @@ -26,75 +26,25 @@ const GenVersion = 8 // to perform encoding or decoding of primitives or known slice or map types. // GenHelperEncoder is exported so that it can be used externally by codecgen. -// // Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE. -func GenHelperEncoder(e *Encoder) (ge genHelperEncoder, ee genHelperEncDriver) { - ge = genHelperEncoder{e: e} - ee = genHelperEncDriver{encDriver: e.e} - return +func GenHelperEncoder(e *Encoder) (genHelperEncoder, encDriver) { + return genHelperEncoder{e: e}, e.e } // GenHelperDecoder is exported so that it can be used externally by codecgen. -// // Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE. -func GenHelperDecoder(d *Decoder) (gd genHelperDecoder, dd genHelperDecDriver) { - gd = genHelperDecoder{d: d} - dd = genHelperDecDriver{decDriver: d.d} - return -} - -type genHelperEncDriver struct { - encDriver -} - -func (x genHelperEncDriver) EncodeBuiltin(rt uintptr, v interface{}) {} -func (x genHelperEncDriver) EncStructFieldKey(keyType valueType, s string) { - encStructFieldKey(x.encDriver, keyType, s) -} -func (x genHelperEncDriver) EncodeSymbol(s string) { - x.encDriver.EncodeString(cUTF8, s) -} - -type genHelperDecDriver struct { - decDriver - C checkOverflow -} - -func (x genHelperDecDriver) DecodeBuiltin(rt uintptr, v interface{}) {} -func (x genHelperDecDriver) DecStructFieldKey(keyType valueType, buf *[decScratchByteArrayLen]byte) []byte { - return decStructFieldKey(x.decDriver, keyType, buf) -} -func (x genHelperDecDriver) DecodeInt(bitsize uint8) (i int64) { - return x.C.IntV(x.decDriver.DecodeInt64(), bitsize) -} -func (x genHelperDecDriver) DecodeUint(bitsize uint8) (ui uint64) { - return x.C.UintV(x.decDriver.DecodeUint64(), bitsize) -} -func (x genHelperDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { - f = x.DecodeFloat64() - if chkOverflow32 && chkOvf.Float32(f) { - panicv.errorf("float32 overflow: %v", f) - } - return -} -func (x genHelperDecDriver) DecodeFloat32As64() (f float64) { - f = x.DecodeFloat64() - if chkOvf.Float32(f) { - panicv.errorf("float32 overflow: %v", f) - } - return +func GenHelperDecoder(d *Decoder) (genHelperDecoder, decDriver) { + return genHelperDecoder{d: d}, d.d } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* type genHelperEncoder struct { - M must e *Encoder F fastpathT } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* type genHelperDecoder struct { - C checkOverflow d *Decoder F fastpathT } @@ -109,86 +59,74 @@ func (f genHelperEncoder) EncBinary() bool { return f.e.be // f.e.hh.isBinaryEncoding() } -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) IsJSONHandle() bool { - return f.e.js -} - // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperEncoder) EncFallback(iv interface{}) { // println(">>>>>>>>> EncFallback") - // f.e.encodeI(iv, false, false) - f.e.encodeValue(reflect.ValueOf(iv), nil, false) + f.e.encodeI(iv, false, false) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperEncoder) EncTextMarshal(iv encoding.TextMarshaler) { bs, fnerr := iv.MarshalText() - f.e.marshal(bs, fnerr, false, cUTF8) + f.e.marshal(bs, fnerr, false, c_UTF8) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperEncoder) EncJSONMarshal(iv jsonMarshaler) { bs, fnerr := iv.MarshalJSON() - f.e.marshal(bs, fnerr, true, cUTF8) + f.e.marshal(bs, fnerr, true, c_UTF8) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperEncoder) EncBinaryMarshal(iv encoding.BinaryMarshaler) { bs, fnerr := iv.MarshalBinary() - f.e.marshal(bs, fnerr, false, cRAW) + f.e.marshal(bs, fnerr, false, c_RAW) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncRaw(iv Raw) { f.e.rawBytes(iv) } - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: builtin no longer supported - so we make this method a no-op, -// but leave in-place so that old generated files continue to work without regeneration. -func (f genHelperEncoder) TimeRtidIfBinc() (v uintptr) { return } - -// func (f genHelperEncoder) TimeRtidIfBinc() uintptr { -// if _, ok := f.e.hh.(*BincHandle); ok { -// return timeTypId -// } -// } - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) I2Rtid(v interface{}) uintptr { - return i2rtid(v) +func (f genHelperEncoder) EncRaw(iv Raw) { + f.e.raw(iv) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) Extension(rtid uintptr) (xfn *extTypeTagFn) { - return f.e.h.getExt(rtid) +func (f genHelperEncoder) TimeRtidIfBinc() uintptr { + if _, ok := f.e.hh.(*BincHandle); ok { + return timeTypId + } + return 0 } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncExtension(v interface{}, xfFn *extTypeTagFn) { - f.e.e.EncodeExt(v, xfFn.tag, xfFn.ext, f.e) +func (f genHelperEncoder) IsJSONHandle() bool { + return f.e.js } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: No longer used, -// but leave in-place so that old generated files continue to work without regeneration. func (f genHelperEncoder) HasExtensions() bool { return len(f.e.h.extHandle) != 0 } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: No longer used, -// but leave in-place so that old generated files continue to work without regeneration. func (f genHelperEncoder) EncExt(v interface{}) (r bool) { - if xfFn := f.e.h.getExt(i2rtid(v)); xfFn != nil { + rt := reflect.TypeOf(v) + if rt.Kind() == reflect.Ptr { + rt = rt.Elem() + } + rtid := reflect.ValueOf(rt).Pointer() + if xfFn := f.e.h.getExt(rtid); xfFn != nil { f.e.e.EncodeExt(v, xfFn.tag, xfFn.ext, f.e) return true } return false } +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncSendContainerState(c containerState) { + if f.e.cr != nil { + f.e.cr.sendContainerState(c) + } +} + // ---------------- DECODER FOLLOWS ----------------- // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* @@ -202,27 +140,19 @@ func (f genHelperDecoder) DecBinary() bool { } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecSwallow() { f.d.swallow() } +func (f genHelperDecoder) DecSwallow() { + f.d.swallow() +} // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) DecScratchBuffer() []byte { return f.d.b[:] } -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecScratchArrayBuffer() *[decScratchByteArrayLen]byte { - return &f.d.b -} - // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) DecFallback(iv interface{}, chkPtr bool) { // println(">>>>>>>>> DecFallback") - rv := reflect.ValueOf(iv) - if chkPtr { - rv = f.d.ensureDecodeable(rv) - } - f.d.decodeValue(rv, nil, false) - // f.d.decodeValueFallback(rv) + f.d.decodeI(iv, chkPtr, false, false, false) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* @@ -242,7 +172,7 @@ func (f genHelperDecoder) DecArrayCannotExpand(sliceLen, streamLen int) { // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) DecTextUnmarshal(tm encoding.TextUnmarshaler) { - fnerr := tm.UnmarshalText(f.d.d.DecodeStringAsBytes()) + fnerr := tm.UnmarshalText(f.d.d.DecodeBytes(f.d.b[:], true, true)) if fnerr != nil { panic(fnerr) } @@ -250,7 +180,7 @@ func (f genHelperDecoder) DecTextUnmarshal(tm encoding.TextUnmarshaler) { // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) DecJSONUnmarshal(tm jsonUnmarshaler) { - // bs := f.dd.DecodeStringAsBytes() + // bs := f.dd.DecodeBytes(f.d.b[:], true, true) // grab the bytes to be read, as UnmarshalJSON needs the full JSON so as to unmarshal it itself. fnerr := tm.UnmarshalJSON(f.d.nextValueBytes()) if fnerr != nil { @@ -260,63 +190,40 @@ func (f genHelperDecoder) DecJSONUnmarshal(tm jsonUnmarshaler) { // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* func (f genHelperDecoder) DecBinaryUnmarshal(bm encoding.BinaryUnmarshaler) { - fnerr := bm.UnmarshalBinary(f.d.d.DecodeBytes(nil, true)) + fnerr := bm.UnmarshalBinary(f.d.d.DecodeBytes(nil, false, true)) if fnerr != nil { panic(fnerr) } } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecRaw() []byte { return f.d.rawBytes() } - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: builtin no longer supported - so we make this method a no-op, -// but leave in-place so that old generated files continue to work without regeneration. -func (f genHelperDecoder) TimeRtidIfBinc() (v uintptr) { return } - -// func (f genHelperDecoder) TimeRtidIfBinc() uintptr { -// // Note: builtin is no longer supported - so make this a no-op -// if _, ok := f.d.hh.(*BincHandle); ok { -// return timeTypId -// } -// return 0 -// } - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) IsJSONHandle() bool { - return f.d.js +func (f genHelperDecoder) DecRaw() []byte { + return f.d.raw() } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) I2Rtid(v interface{}) uintptr { - return i2rtid(v) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) Extension(rtid uintptr) (xfn *extTypeTagFn) { - return f.d.h.getExt(rtid) +func (f genHelperDecoder) TimeRtidIfBinc() uintptr { + if _, ok := f.d.hh.(*BincHandle); ok { + return timeTypId + } + return 0 } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecExtension(v interface{}, xfFn *extTypeTagFn) { - f.d.d.DecodeExt(v, xfFn.tag, xfFn.ext) +func (f genHelperDecoder) IsJSONHandle() bool { + return f.d.js } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: No longer used, -// but leave in-place so that old generated files continue to work without regeneration. func (f genHelperDecoder) HasExtensions() bool { return len(f.d.h.extHandle) != 0 } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: No longer used, -// but leave in-place so that old generated files continue to work without regeneration. func (f genHelperDecoder) DecExt(v interface{}) (r bool) { - if xfFn := f.d.h.getExt(i2rtid(v)); xfFn != nil { + rt := reflect.TypeOf(v).Elem() + rtid := reflect.ValueOf(rt).Pointer() + if xfFn := f.d.h.getExt(rtid); xfFn != nil { f.d.d.DecodeExt(v, xfFn.tag, xfFn.ext) return true } @@ -324,12 +231,13 @@ func (f genHelperDecoder) DecExt(v interface{}) (r bool) { } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecInferLen(clen, maxlen, unit int) (rvlen int) { +func (f genHelperDecoder) DecInferLen(clen, maxlen, unit int) (rvlen int, truncated bool) { return decInferLen(clen, maxlen, unit) } // FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -// -// Deprecated: no longer used, -// but leave in-place so that old generated files continue to work without regeneration. -func (f genHelperDecoder) StringView(v []byte) string { return stringView(v) } +func (f genHelperDecoder) DecSendContainerState(c containerState) { + if f.d.cr != nil { + f.d.cr.sendContainerState(c) + } +} diff --git a/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl b/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl new file mode 100644 index 000000000..ad99f6671 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl @@ -0,0 +1,372 @@ +/* // +build ignore */ + +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED from gen-helper.go.tmpl +// ************************************************************ + +package codec + +import ( + "encoding" + "reflect" +) + +// This file is used to generate helper code for codecgen. +// The values here i.e. genHelper(En|De)coder are not to be used directly by +// library users. They WILL change continuously and without notice. +// +// To help enforce this, we create an unexported type with exported members. +// The only way to get the type is via the one exported type that we control (somewhat). +// +// When static codecs are created for types, they will use this value +// to perform encoding or decoding of primitives or known slice or map types. + +// GenHelperEncoder is exported so that it can be used externally by codecgen. +// Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE. +func GenHelperEncoder(e *Encoder) (genHelperEncoder, encDriver) { + return genHelperEncoder{e:e}, e.e +} + +// GenHelperDecoder is exported so that it can be used externally by codecgen. +// Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE. +func GenHelperDecoder(d *Decoder) (genHelperDecoder, decDriver) { + return genHelperDecoder{d:d}, d.d +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +type genHelperEncoder struct { + e *Encoder + F fastpathT +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +type genHelperDecoder struct { + d *Decoder + F fastpathT +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncBasicHandle() *BasicHandle { + return f.e.h +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncBinary() bool { + return f.e.be // f.e.hh.isBinaryEncoding() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncFallback(iv interface{}) { + // println(">>>>>>>>> EncFallback") + f.e.encodeI(iv, false, false) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncTextMarshal(iv encoding.TextMarshaler) { + bs, fnerr := iv.MarshalText() + f.e.marshal(bs, fnerr, false, c_UTF8) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncJSONMarshal(iv jsonMarshaler) { + bs, fnerr := iv.MarshalJSON() + f.e.marshal(bs, fnerr, true, c_UTF8) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncBinaryMarshal(iv encoding.BinaryMarshaler) { + bs, fnerr := iv.MarshalBinary() + f.e.marshal(bs, fnerr, false, c_RAW) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncRaw(iv Raw) { + f.e.raw(iv) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) TimeRtidIfBinc() uintptr { + if _, ok := f.e.hh.(*BincHandle); ok { + return timeTypId + } + return 0 +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) IsJSONHandle() bool { + return f.e.js +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) HasExtensions() bool { + return len(f.e.h.extHandle) != 0 +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncExt(v interface{}) (r bool) { + rt := reflect.TypeOf(v) + if rt.Kind() == reflect.Ptr { + rt = rt.Elem() + } + rtid := reflect.ValueOf(rt).Pointer() + if xfFn := f.e.h.getExt(rtid); xfFn != nil { + f.e.e.EncodeExt(v, xfFn.tag, xfFn.ext, f.e) + return true + } + return false +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncSendContainerState(c containerState) { + if f.e.cr != nil { + f.e.cr.sendContainerState(c) + } +} + +// ---------------- DECODER FOLLOWS ----------------- + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecBasicHandle() *BasicHandle { + return f.d.h +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecBinary() bool { + return f.d.be // f.d.hh.isBinaryEncoding() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecSwallow() { + f.d.swallow() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecScratchBuffer() []byte { + return f.d.b[:] +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecFallback(iv interface{}, chkPtr bool) { + // println(">>>>>>>>> DecFallback") + f.d.decodeI(iv, chkPtr, false, false, false) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecSliceHelperStart() (decSliceHelper, int) { + return f.d.decSliceHelperStart() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecStructFieldNotFound(index int, name string) { + f.d.structFieldNotFound(index, name) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecArrayCannotExpand(sliceLen, streamLen int) { + f.d.arrayCannotExpand(sliceLen, streamLen) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecTextUnmarshal(tm encoding.TextUnmarshaler) { + fnerr := tm.UnmarshalText(f.d.d.DecodeBytes(f.d.b[:], true, true)) + if fnerr != nil { + panic(fnerr) + } +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecJSONUnmarshal(tm jsonUnmarshaler) { + // bs := f.dd.DecodeBytes(f.d.b[:], true, true) + // grab the bytes to be read, as UnmarshalJSON needs the full JSON so as to unmarshal it itself. + fnerr := tm.UnmarshalJSON(f.d.nextValueBytes()) + if fnerr != nil { + panic(fnerr) + } +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecBinaryUnmarshal(bm encoding.BinaryUnmarshaler) { + fnerr := bm.UnmarshalBinary(f.d.d.DecodeBytes(nil, false, true)) + if fnerr != nil { + panic(fnerr) + } +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecRaw() []byte { + return f.d.raw() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) TimeRtidIfBinc() uintptr { + if _, ok := f.d.hh.(*BincHandle); ok { + return timeTypId + } + return 0 +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) IsJSONHandle() bool { + return f.d.js +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) HasExtensions() bool { + return len(f.d.h.extHandle) != 0 +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecExt(v interface{}) (r bool) { + rt := reflect.TypeOf(v).Elem() + rtid := reflect.ValueOf(rt).Pointer() + if xfFn := f.d.h.getExt(rtid); xfFn != nil { + f.d.d.DecodeExt(v, xfFn.tag, xfFn.ext) + return true + } + return false +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecInferLen(clen, maxlen, unit int) (rvlen int, truncated bool) { + return decInferLen(clen, maxlen, unit) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecSendContainerState(c containerState) { + if f.d.cr != nil { + f.d.cr.sendContainerState(c) + } +} + +{{/* + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncDriver() encDriver { + return f.e.e +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecDriver() decDriver { + return f.d.d +} + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncNil() { + f.e.e.EncodeNil() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncBytes(v []byte) { + f.e.e.EncodeStringBytes(c_RAW, v) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncArrayStart(length int) { + f.e.e.EncodeArrayStart(length) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncArrayEnd() { + f.e.e.EncodeArrayEnd() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncArrayEntrySeparator() { + f.e.e.EncodeArrayEntrySeparator() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncMapStart(length int) { + f.e.e.EncodeMapStart(length) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncMapEnd() { + f.e.e.EncodeMapEnd() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncMapEntrySeparator() { + f.e.e.EncodeMapEntrySeparator() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) EncMapKVSeparator() { + f.e.e.EncodeMapKVSeparator() +} + +// --------- + +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecBytes(v *[]byte) { + *v = f.d.d.DecodeBytes(*v) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecTryNil() bool { + return f.d.d.TryDecodeAsNil() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecContainerIsNil() (b bool) { + return f.d.d.IsContainerType(valueTypeNil) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecContainerIsMap() (b bool) { + return f.d.d.IsContainerType(valueTypeMap) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecContainerIsArray() (b bool) { + return f.d.d.IsContainerType(valueTypeArray) +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecCheckBreak() bool { + return f.d.d.CheckBreak() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecMapStart() int { + return f.d.d.ReadMapStart() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecArrayStart() int { + return f.d.d.ReadArrayStart() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecMapEnd() { + f.d.d.ReadMapEnd() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecArrayEnd() { + f.d.d.ReadArrayEnd() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecArrayEntrySeparator() { + f.d.d.ReadArrayEntrySeparator() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecMapEntrySeparator() { + f.d.d.ReadMapEntrySeparator() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) DecMapKVSeparator() { + f.d.d.ReadMapKVSeparator() +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) ReadStringAsBytes(bs []byte) []byte { + return f.d.d.DecodeStringAsBytes(bs) +} + + +// -- encode calls (primitives) +{{range .Values}}{{if .Primitive }}{{if ne .Primitive "interface{}" }} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) {{ .MethodNamePfx "Enc" true }}(v {{ .Primitive }}) { + ee := f.e.e + {{ encmd .Primitive "v" }} +} +{{ end }}{{ end }}{{ end }} + +// -- decode calls (primitives) +{{range .Values}}{{if .Primitive }}{{if ne .Primitive "interface{}" }} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) {{ .MethodNamePfx "Dec" true }}(vp *{{ .Primitive }}) { + dd := f.d.d + *vp = {{ decmd .Primitive }} +} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperDecoder) {{ .MethodNamePfx "Read" true }}() (v {{ .Primitive }}) { + dd := f.d.d + v = {{ decmd .Primitive }} + return +} +{{ end }}{{ end }}{{ end }} + + +// -- encode calls (slices/maps) +{{range .Values}}{{if not .Primitive }}{{if .Slice }} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) {{ .MethodNamePfx "Enc" false }}(v []{{ .Elem }}) { {{ else }} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +func (f genHelperEncoder) {{ .MethodNamePfx "Enc" false }}(v map[{{ .MapKey }}]{{ .Elem }}) { {{end}} + f.F.{{ .MethodNamePfx "Enc" false }}V(v, false, f.e) +} +{{ end }}{{ end }} + +// -- decode calls (slices/maps) +{{range .Values}}{{if not .Primitive }} +// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* +{{if .Slice }}func (f genHelperDecoder) {{ .MethodNamePfx "Dec" false }}(vp *[]{{ .Elem }}) { +{{else}}func (f genHelperDecoder) {{ .MethodNamePfx "Dec" false }}(vp *map[{{ .MapKey }}]{{ .Elem }}) { {{end}} + v, changed := f.F.{{ .MethodNamePfx "Dec" false }}V(*vp, false, true, f.d) + if changed { + *vp = v + } +} +{{ end }}{{ end }} +*/}} diff --git a/vendor/github.com/ugorji/go/codec/gen.generated.go b/vendor/github.com/ugorji/go/codec/gen.generated.go index 240ba9f8c..2ace97b78 100644 --- a/vendor/github.com/ugorji/go/codec/gen.generated.go +++ b/vendor/github.com/ugorji/go/codec/gen.generated.go @@ -1,5 +1,3 @@ -// +build codecgen.exec - // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. @@ -12,22 +10,21 @@ const genDecMapTmpl = ` {{var "l"}} := r.ReadMapStart() {{var "bh"}} := z.DecBasicHandle() if {{var "v"}} == nil { - {{var "rl"}} := z.DecInferLen({{var "l"}}, {{var "bh"}}.MaxInitLen, {{ .Size }}) + {{var "rl"}}, _ := z.DecInferLen({{var "l"}}, {{var "bh"}}.MaxInitLen, {{ .Size }}) {{var "v"}} = make(map[{{ .KTyp }}]{{ .Typ }}, {{var "rl"}}) *{{ .Varname }} = {{var "v"}} } var {{var "mk"}} {{ .KTyp }} var {{var "mv"}} {{ .Typ }} -var {{var "mg"}}, {{var "mdn"}} {{if decElemKindPtr}}, {{var "ms"}}, {{var "mok"}}{{end}} bool +var {{var "mg"}} {{if decElemKindPtr}}, {{var "ms"}}, {{var "mok"}}{{end}} bool if {{var "bh"}}.MapValueReset { {{if decElemKindPtr}}{{var "mg"}} = true {{else if decElemKindIntf}}if !{{var "bh"}}.InterfaceReset { {{var "mg"}} = true } {{else if not decElemKindImmutable}}{{var "mg"}} = true {{end}} } -if {{var "l"}} != 0 { -{{var "hl"}} := {{var "l"}} > 0 - for {{var "j"}} := 0; ({{var "hl"}} && {{var "j"}} < {{var "l"}}) || !({{var "hl"}} || r.CheckBreak()); {{var "j"}}++ { - r.ReadMapElemKey() {{/* z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) */}} +if {{var "l"}} > 0 { +for {{var "j"}} := 0; {{var "j"}} < {{var "l"}}; {{var "j"}}++ { + z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }} {{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */}}if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} { {{var "mk"}} = string({{var "bv"}}) @@ -39,17 +36,34 @@ if {{var "l"}} != 0 { {{var "ms"}} = false } {{else}}{{var "mv"}} = {{var "v"}}[{{var "mk"}}] {{end}} } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}} - r.ReadMapElemValue() {{/* z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) */}} - {{var "mdn"}} = false - {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ $y := printf "%vmdn%v" .TempVar .Rand }}{{ decLineVar $x $y }} - if {{var "mdn"}} { - if {{ var "bh" }}.DeleteOnNilMapValue { delete({{var "v"}}, {{var "mk"}}) } else { {{var "v"}}[{{var "mk"}}] = {{decElemZero}} } - } else if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { + z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) + {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }} + if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { + {{var "v"}}[{{var "mk"}}] = {{var "mv"}} + } +} +} else if {{var "l"}} < 0 { +for {{var "j"}} := 0; !r.CheckBreak(); {{var "j"}}++ { + z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) + {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }} +{{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */}}if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} { + {{var "mk"}} = string({{var "bv"}}) + }{{ end }}{{if decElemKindPtr}} + {{var "ms"}} = true {{ end }} + if {{var "mg"}} { + {{if decElemKindPtr}}{{var "mv"}}, {{var "mok"}} = {{var "v"}}[{{var "mk"}}] + if {{var "mok"}} { + {{var "ms"}} = false + } {{else}}{{var "mv"}} = {{var "v"}}[{{var "mk"}}] {{end}} + } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}} + z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) + {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }} + if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { {{var "v"}}[{{var "mk"}}] = {{var "mv"}} } } } // else len==0: TODO: Should we clear map entries? -r.ReadMapEnd() {{/* z.DecSendContainerState(codecSelfer_containerMapEnd{{ .Sfx }}) */}} +z.DecSendContainerState(codecSelfer_containerMapEnd{{ .Sfx }}) ` const genDecListTmpl = ` @@ -64,68 +78,94 @@ if {{var "l"}} == 0 { } else if len({{var "v"}}) != 0 { {{var "v"}} = {{var "v"}}[:0] {{var "c"}} = true - } {{else if isChan }}if {{var "v"}} == nil { + } {{end}} {{if isChan }}if {{var "v"}} == nil { {{var "v"}} = make({{ .CTyp }}, 0) {{var "c"}} = true } {{end}} -} else { - {{var "hl"}} := {{var "l"}} > 0 - var {{var "rl"}} int - _ = {{var "rl"}} - {{if isSlice }} if {{var "hl"}} { +} else if {{var "l"}} > 0 { + {{if isChan }}if {{var "v"}} == nil { + {{var "rl"}}, _ = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) + {{var "v"}} = make({{ .CTyp }}, {{var "rl"}}) + {{var "c"}} = true + } + for {{var "r"}} := 0; {{var "r"}} < {{var "l"}}; {{var "r"}}++ { + {{var "h"}}.ElemContainerState({{var "r"}}) + var {{var "t"}} {{ .Typ }} + {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }} + {{var "v"}} <- {{var "t"}} + } + {{ else }} var {{var "rr"}}, {{var "rl"}} int {{/* // num2read, length of slice/array/chan */}} + var {{var "rt"}} bool {{/* truncated */}} + _, _ = {{var "rl"}}, {{var "rt"}} + {{var "rr"}} = {{var "l"}} // len({{var "v"}}) if {{var "l"}} > cap({{var "v"}}) { - {{var "rl"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) - if {{var "rl"}} <= cap({{var "v"}}) { - {{var "v"}} = {{var "v"}}[:{{var "rl"}}] + {{if isArray }}z.DecArrayCannotExpand(len({{var "v"}}), {{var "l"}}) + {{ else }}{{if not .Immutable }} + {{var "rg"}} := len({{var "v"}}) > 0 + {{var "v2"}} := {{var "v"}} {{end}} + {{var "rl"}}, {{var "rt"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) + if {{var "rt"}} { + if {{var "rl"}} <= cap({{var "v"}}) { + {{var "v"}} = {{var "v"}}[:{{var "rl"}}] + } else { + {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}}) + } } else { {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}}) } {{var "c"}} = true - } else if {{var "l"}} != len({{var "v"}}) { + {{var "rr"}} = len({{var "v"}}) {{if not .Immutable }} + if {{var "rg"}} { copy({{var "v"}}, {{var "v2"}}) } {{end}} {{end}}{{/* end not Immutable, isArray */}} + } {{if isSlice }} else if {{var "l"}} != len({{var "v"}}) { {{var "v"}} = {{var "v"}}[:{{var "l"}}] {{var "c"}} = true + } {{end}} {{/* end isSlice:47 */}} + {{var "j"}} := 0 + for ; {{var "j"}} < {{var "rr"}} ; {{var "j"}}++ { + {{var "h"}}.ElemContainerState({{var "j"}}) + {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} } - } {{end}} - var {{var "j"}} int - // var {{var "dn"}} bool - for ; ({{var "hl"}} && {{var "j"}} < {{var "l"}}) || !({{var "hl"}} || r.CheckBreak()); {{var "j"}}++ { - {{if not isArray}} if {{var "j"}} == 0 && {{var "v"}} == nil { - if {{var "hl"}} { - {{var "rl"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) - } else { - {{var "rl"}} = {{if isSlice}}8{{else if isChan}}64{{end}} - } - {{var "v"}} = make({{if isSlice}}[]{{ .Typ }}{{else if isChan}}{{.CTyp}}{{end}}, {{var "rl"}}) - {{var "c"}} = true - }{{end}} + {{if isArray }}for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ { + {{var "h"}}.ElemContainerState({{var "j"}}) + z.DecSwallow() + } + {{ else }}if {{var "rt"}} { + for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ { + {{var "v"}} = append({{var "v"}}, {{ zero}}) + {{var "h"}}.ElemContainerState({{var "j"}}) + {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} + } + } {{end}} {{/* end isArray:56 */}} + {{end}} {{/* end isChan:16 */}} +} else { {{/* len < 0 */}} + {{var "j"}} := 0 + for ; !r.CheckBreak(); {{var "j"}}++ { + {{if isChan }} {{var "h"}}.ElemContainerState({{var "j"}}) - {{/* {{var "dn"}} = r.TryDecodeAsNil() */}}{{/* commented out, as decLineVar handles this already each time */}} - {{if isChan}}{{ $x := printf "%[1]vvcx%[2]v" .TempVar .Rand }}var {{$x}} {{ .Typ }} - {{ decLineVar $x }} - {{var "v"}} <- {{ $x }} - // println(">>>> sending ", {{ $x }}, " into ", {{var "v"}}) // TODO: remove this - {{else}}{{/* // if indefinite, etc, then expand the slice if necessary */}} - var {{var "db"}} bool + var {{var "t"}} {{ .Typ }} + {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }} + {{var "v"}} <- {{var "t"}} + {{ else }} if {{var "j"}} >= len({{var "v"}}) { - {{if isSlice }} {{var "v"}} = append({{var "v"}}, {{ zero }}) - {{var "c"}} = true - {{else}} z.DecArrayCannotExpand(len(v), {{var "j"}}+1); {{var "db"}} = true - {{end}} + {{if isArray }}z.DecArrayCannotExpand(len({{var "v"}}), {{var "j"}}+1) + {{ else }}{{var "v"}} = append({{var "v"}}, {{zero}})// var {{var "z"}} {{ .Typ }} + {{var "c"}} = true {{end}} } - if {{var "db"}} { - z.DecSwallow() - } else { + {{var "h"}}.ElemContainerState({{var "j"}}) + if {{var "j"}} < len({{var "v"}}) { {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} + } else { + z.DecSwallow() } - {{end}} + {{end}} } - {{if isSlice}} if {{var "j"}} < len({{var "v"}}) { + {{if isSlice }}if {{var "j"}} < len({{var "v"}}) { {{var "v"}} = {{var "v"}}[:{{var "j"}}] {{var "c"}} = true } else if {{var "j"}} == 0 && {{var "v"}} == nil { - {{var "v"}} = make([]{{ .Typ }}, 0) + {{var "v"}} = []{{ .Typ }}{} {{var "c"}} = true - } {{end}} + }{{end}} } {{var "h"}}.End() {{if not isArray }}if {{var "c"}} { @@ -133,32 +173,3 @@ if {{var "l"}} == 0 { }{{end}} ` -const genEncChanTmpl = ` -{{.Label}}: -switch timeout{{.Sfx}} := z.EncBasicHandle().ChanRecvTimeout; { -case timeout{{.Sfx}} == 0: // only consume available - for { - select { - case b{{.Sfx}} := <-{{.Chan}}: - {{ .Slice }} = append({{.Slice}}, b{{.Sfx}}) - default: - break {{.Label}} - } - } -case timeout{{.Sfx}} > 0: // consume until timeout - tt{{.Sfx}} := time.NewTimer(timeout{{.Sfx}}) - for { - select { - case b{{.Sfx}} := <-{{.Chan}}: - {{.Slice}} = append({{.Slice}}, b{{.Sfx}}) - case <-tt{{.Sfx}}.C: - // close(tt.C) - break {{.Label}} - } - } -default: // consume until close - for b{{.Sfx}} := range {{.Chan}} { - {{.Slice}} = append({{.Slice}}, b{{.Sfx}}) - } -} -` diff --git a/vendor/github.com/ugorji/go/codec/gen.go b/vendor/github.com/ugorji/go/codec/gen.go index b4c4031ff..c4944dbff 100644 --- a/vendor/github.com/ugorji/go/codec/gen.go +++ b/vendor/github.com/ugorji/go/codec/gen.go @@ -1,6 +1,4 @@ -// +build codecgen.exec - -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec @@ -30,6 +28,7 @@ import ( // codecgen supports the full cycle of reflection-based codec: // - RawExt // - Raw +// - Builtins // - Extensions // - (Binary|Text|JSON)(Unm|M)arshal // - generic by-kind @@ -81,10 +80,6 @@ import ( // Note: // It was a conscious decision to have gen.go always explicitly call EncodeNil or TryDecodeAsNil. // This way, there isn't a function call overhead just to see that we should not enter a block of code. -// -// Note: -// codecgen-generated code depends on the variables defined by fast-path.generated.go. -// consequently, you cannot run with tags "codecgen notfastpath". // GenVersion is the current version of codecgen. // @@ -99,10 +94,7 @@ import ( // changes in signature of some unpublished helper methods and codecgen cmdline arguments. // v4: Removed separator support from (en|de)cDriver, and refactored codec(gen) // v5: changes to support faster json decoding. Let encoder/decoder maintain state of collections. -// v6: removed unsafe from gen, and now uses codecgen.exec tag -// v7: -// v8: current - we now maintain compatibility with old generated code. -const genVersion = 8 +const GenVersion = 5 const ( genCodecPkg = "codec1978" @@ -130,27 +122,13 @@ const ( ) var ( - errGenAllTypesSamePkg = errors.New("All types must be in the same package") - errGenExpectArrayOrMap = errors.New("unexpected type. Expecting array/map/slice") - - genBase64enc = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789__") - genQNameRegex = regexp.MustCompile(`[A-Za-z_.]+`) + genAllTypesSamePkgErr = errors.New("All types must be in the same package") + genExpectArrayOrMapErr = errors.New("unexpected type. Expecting array/map/slice") + genBase64enc = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789__") + genQNameRegex = regexp.MustCompile(`[A-Za-z_.]+`) + genCheckVendor bool ) -type genBuf struct { - buf []byte -} - -func (x *genBuf) s(s string) *genBuf { x.buf = append(x.buf, s...); return x } -func (x *genBuf) b(s []byte) *genBuf { x.buf = append(x.buf, s...); return x } -func (x *genBuf) v() string { return string(x.buf) } -func (x *genBuf) f(s string, args ...interface{}) { x.s(fmt.Sprintf(s, args...)) } -func (x *genBuf) reset() { - if x.buf != nil { - x.buf = x.buf[:0] - } -} - // genRunner holds some state used during a Gen run. type genRunner struct { w io.Writer // output @@ -169,7 +147,8 @@ type genRunner struct { is map[reflect.Type]struct{} // types seen during import search bp string // base PkgPath, for which we are generating for - cpfx string // codec package prefix + cpfx string // codec package prefix + unsafe bool // is unsafe to be used in generated code? tm map[reflect.Type]struct{} // types for which enc/dec must be generated ts []reflect.Type // types for which enc/dec must be generated @@ -179,16 +158,13 @@ type genRunner struct { ti *TypeInfos // rr *rand.Rand // random generator for file-specific types - - nx bool // no extensions } // Gen will write a complete go file containing Selfer implementations for each // type passed. All the types must be in the same package. // -// Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINUOUSLY WITHOUT NOTICE. -func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, - ti *TypeInfos, typ ...reflect.Type) { +// Library users: *DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE.* +func Gen(w io.Writer, buildTags, pkgName, uid string, useUnsafe bool, ti *TypeInfos, typ ...reflect.Type) { // All types passed to this method do not have a codec.Selfer method implemented directly. // codecgen already checks the AST and skips any types that define the codec.Selfer methods. // Consequently, there's no need to check and trim them if they implement codec.Selfer @@ -197,19 +173,19 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, return } x := genRunner{ - w: w, - t: typ, - te: make(map[uintptr]bool), - td: make(map[uintptr]bool), - im: make(map[string]reflect.Type), - imn: make(map[string]string), - is: make(map[reflect.Type]struct{}), - tm: make(map[reflect.Type]struct{}), - ts: []reflect.Type{}, - bp: genImportPath(typ[0]), - xs: uid, - ti: ti, - nx: noExtensions, + unsafe: useUnsafe, + w: w, + t: typ, + te: make(map[uintptr]bool), + td: make(map[uintptr]bool), + im: make(map[string]reflect.Type), + imn: make(map[string]string), + is: make(map[reflect.Type]struct{}), + tm: make(map[reflect.Type]struct{}), + ts: []reflect.Type{}, + bp: genImportPath(typ[0]), + xs: uid, + ti: ti, } if x.ti == nil { x.ti = defTypeInfos @@ -225,7 +201,7 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, for _, t := range typ { // fmt.Printf("###########: PkgPath: '%v', Name: '%s'\n", genImportPath(t), t.Name()) if genImportPath(t) != x.bp { - panic(errGenAllTypesSamePkg) + panic(genAllTypesSamePkgErr) } x.genRefPkgs(t) } @@ -235,7 +211,10 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, } x.line(` -// Code generated by codecgen - DO NOT EDIT. +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED BY codecgen. +// ************************************************************ `) x.line("package " + pkgName) @@ -247,20 +226,19 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, } // use a sorted set of im keys, so that we can get consistent output imKeys := make([]string, 0, len(x.im)) - for k := range x.im { + for k, _ := range x.im { imKeys = append(imKeys, k) } sort.Strings(imKeys) for _, k := range imKeys { // for k, _ := range x.im { - if k == x.imn[k] { - x.linef("\"%s\"", k) - } else { - x.linef("%s \"%s\"", x.imn[k], k) - } + x.linef("%s \"%s\"", x.imn[k], k) } // add required packages - for _, k := range [...]string{"runtime", "errors", "strconv"} { // "reflect", "fmt" + for _, k := range [...]string{"reflect", "unsafe", "runtime", "fmt", "errors"} { if _, ok := x.im[k]; !ok { + if k == "unsafe" && !x.unsafe { + continue + } x.line("\"" + k + "\"") } } @@ -269,36 +247,41 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, x.line("const (") x.linef("// ----- content types ----") - x.linef("codecSelferCcUTF8%s = %v", x.xs, int64(cUTF8)) - x.linef("codecSelferCcRAW%s = %v", x.xs, int64(cRAW)) + x.linef("codecSelferC_UTF8%s = %v", x.xs, int64(c_UTF8)) + x.linef("codecSelferC_RAW%s = %v", x.xs, int64(c_RAW)) x.linef("// ----- value types used ----") - for _, vt := range [...]valueType{ - valueTypeArray, valueTypeMap, valueTypeString, - valueTypeInt, valueTypeUint, valueTypeFloat} { - x.linef("codecSelferValueType%s%s = %v", vt.String(), x.xs, int64(vt)) - } - - x.linef("codecSelferBitsize%s = uint8(32 << (^uint(0) >> 63))", x.xs) + x.linef("codecSelferValueTypeArray%s = %v", x.xs, int64(valueTypeArray)) + x.linef("codecSelferValueTypeMap%s = %v", x.xs, int64(valueTypeMap)) + x.linef("// ----- containerStateValues ----") + x.linef("codecSelfer_containerMapKey%s = %v", x.xs, int64(containerMapKey)) + x.linef("codecSelfer_containerMapValue%s = %v", x.xs, int64(containerMapValue)) + x.linef("codecSelfer_containerMapEnd%s = %v", x.xs, int64(containerMapEnd)) + x.linef("codecSelfer_containerArrayElem%s = %v", x.xs, int64(containerArrayElem)) + x.linef("codecSelfer_containerArrayEnd%s = %v", x.xs, int64(containerArrayEnd)) x.line(")") x.line("var (") - x.line("errCodecSelferOnlyMapOrArrayEncodeToStruct" + x.xs + " = errors.New(`only encoded map or array can be decoded into a struct`)") + x.line("codecSelferBitsize" + x.xs + " = uint8(reflect.TypeOf(uint(0)).Bits())") + x.line("codecSelferOnlyMapOrArrayEncodeToStructErr" + x.xs + " = errors.New(`only encoded map or array can be decoded into a struct`)") x.line(")") x.line("") + if x.unsafe { + x.line("type codecSelferUnsafeString" + x.xs + " struct { Data uintptr; Len int}") + x.line("") + } x.hn = "codecSelfer" + x.xs x.line("type " + x.hn + " struct{}") x.line("") x.varsfxreset() x.line("func init() {") - x.linef("if %sGenVersion != %v {", x.cpfx, genVersion) + x.linef("if %sGenVersion != %v {", x.cpfx, GenVersion) x.line("_, file, _, _ := runtime.Caller(0)") - x.outf(`panic("codecgen version mismatch: current: %v, need " + strconv.FormatInt(int64(%sGenVersion), 10) + ". Re-generate file: " + file)`, genVersion, x.cpfx) - // x.out(`panic(fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", `) - // x.linef(`%v, %sGenVersion, file))`, genVersion, x.cpfx) + x.line(`err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", `) + x.linef(`%v, %sGenVersion, file)`, GenVersion, x.cpfx) + x.line("panic(err)") x.linef("}") x.line("if false { // reference the types, but skip this branch at build/run time") - // x.line("_ = strconv.ParseInt") var n int // for k, t := range x.im { for _, k := range imKeys { @@ -306,6 +289,10 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, x.linef("var v%v %s.%s", n, x.imn[k], t.Name()) n++ } + if x.unsafe { + x.linef("var v%v unsafe.Pointer", n) + n++ + } if n > 0 { x.out("_") for i := 1; i < n; i++ { @@ -328,7 +315,7 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, } for _, t := range x.ts { - rtid := rt2id(t) + rtid := reflect.ValueOf(t).Pointer() // generate enc functions for all these slice/map types. x.varsfxreset() x.linef("func (x %s) enc%s(v %s%s, e *%sEncoder) {", x.hn, x.genMethodNameT(t), x.arr2str(t, "*"), x.genTypeName(t), x.cpfx) @@ -339,7 +326,7 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, case reflect.Map: x.encMapFallback("v", t) default: - panic(errGenExpectArrayOrMap) + panic(genExpectArrayOrMapErr) } x.line("}") x.line("") @@ -354,7 +341,7 @@ func Gen(w io.Writer, buildTags, pkgName, uid string, noExtensions bool, case reflect.Map: x.decMapFallback("v", rtid, t) default: - panic(errGenExpectArrayOrMap) + panic(genExpectArrayOrMapErr) } x.line("}") x.line("") @@ -390,6 +377,7 @@ func (x *genRunner) genRefPkgs(t reflect.Type) { if _, ok := x.is[t]; ok { return } + // fmt.Printf(">>>>>>: PkgPath: '%v', Name: '%s'\n", genImportPath(t), t.Name()) x.is[t] = struct{}{} tpkg, tname := genImportPath(t), t.Name() if tpkg != "" && tpkg != x.bp && tpkg != x.cp && tname != "" && tname[0] >= 'A' && tname[0] <= 'Z' { @@ -418,6 +406,13 @@ func (x *genRunner) genRefPkgs(t reflect.Type) { } } +func (x *genRunner) line(s string) { + x.out(s) + if len(s) == 0 || s[len(s)-1] != '\n' { + x.out("\n") + } +} + func (x *genRunner) varsfx() string { x.c++ return strconv.FormatUint(x.c, 10) @@ -428,31 +423,17 @@ func (x *genRunner) varsfxreset() { } func (x *genRunner) out(s string) { - _, err := io.WriteString(x.w, s) - if err != nil { - panic(err) - } -} - -func (x *genRunner) outf(s string, params ...interface{}) { - _, err := fmt.Fprintf(x.w, s, params...) - if err != nil { + if _, err := io.WriteString(x.w, s); err != nil { panic(err) } } -func (x *genRunner) line(s string) { - x.out(s) - if len(s) == 0 || s[len(s)-1] != '\n' { - x.out("\n") - } +func (x *genRunner) linef(s string, params ...interface{}) { + x.line(fmt.Sprintf(s, params...)) } -func (x *genRunner) linef(s string, params ...interface{}) { - x.outf(s, params...) - if len(s) == 0 || s[len(s)-1] != '\n' { - x.out("\n") - } +func (x *genRunner) outf(s string, params ...interface{}) { + x.out(fmt.Sprintf(s, params...)) } func (x *genRunner) genTypeName(t reflect.Type) (n string) { @@ -525,23 +506,23 @@ func (x *genRunner) selfer(encode bool) { t := x.tc t0 := t // always make decode use a pointer receiver, - // and structs/arrays always use a ptr receiver (encode|decode) - isptr := !encode || t.Kind() == reflect.Array || (t.Kind() == reflect.Struct && t != timeTyp) + // and structs always use a ptr receiver (encode|decode) + isptr := !encode || t.Kind() == reflect.Struct x.varsfxreset() - - fnSigPfx := "func (" + genTopLevelVarName + " " + fnSigPfx := "func (x " if isptr { fnSigPfx += "*" } fnSigPfx += x.genTypeName(t) - x.out(fnSigPfx) + x.out(fnSigPfx) if isptr { t = reflect.PtrTo(t) } if encode { x.line(") CodecEncodeSelf(e *" + x.cpfx + "Encoder) {") x.genRequiredMethodVars(true) + // x.enc(genTopLevelVarName, t) x.encVar(genTopLevelVarName, t) } else { x.line(") CodecDecodeSelf(d *" + x.cpfx + "Decoder) {") @@ -550,7 +531,7 @@ func (x *genRunner) selfer(encode bool) { // or way to elegantly handle that, and also setting it to a // non-nil value doesn't affect the pointer passed. // x.decVar(genTopLevelVarName, t, false) - x.dec(genTopLevelVarName, t0, true) + x.dec(genTopLevelVarName, t0) } x.line("}") x.line("") @@ -564,21 +545,21 @@ func (x *genRunner) selfer(encode bool) { x.out(fnSigPfx) x.line(") codecDecodeSelfFromMap(l int, d *" + x.cpfx + "Decoder) {") x.genRequiredMethodVars(false) - x.decStructMap(genTopLevelVarName, "l", rt2id(t0), t0, genStructMapStyleConsolidated) + x.decStructMap(genTopLevelVarName, "l", reflect.ValueOf(t0).Pointer(), t0, genStructMapStyleConsolidated) x.line("}") x.line("") } else { x.out(fnSigPfx) x.line(") codecDecodeSelfFromMapLenPrefix(l int, d *" + x.cpfx + "Decoder) {") x.genRequiredMethodVars(false) - x.decStructMap(genTopLevelVarName, "l", rt2id(t0), t0, genStructMapStyleLenPrefix) + x.decStructMap(genTopLevelVarName, "l", reflect.ValueOf(t0).Pointer(), t0, genStructMapStyleLenPrefix) x.line("}") x.line("") x.out(fnSigPfx) x.line(") codecDecodeSelfFromMapCheckBreak(l int, d *" + x.cpfx + "Decoder) {") x.genRequiredMethodVars(false) - x.decStructMap(genTopLevelVarName, "l", rt2id(t0), t0, genStructMapStyleCheckBreak) + x.decStructMap(genTopLevelVarName, "l", reflect.ValueOf(t0).Pointer(), t0, genStructMapStyleCheckBreak) x.line("}") x.line("") } @@ -587,24 +568,18 @@ func (x *genRunner) selfer(encode bool) { x.out(fnSigPfx) x.line(") codecDecodeSelfFromArray(l int, d *" + x.cpfx + "Decoder) {") x.genRequiredMethodVars(false) - x.decStructArray(genTopLevelVarName, "l", "return", rt2id(t0), t0) + x.decStructArray(genTopLevelVarName, "l", "return", reflect.ValueOf(t0).Pointer(), t0) x.line("}") x.line("") } // used for chan, array, slice, map -func (x *genRunner) xtraSM(varname string, t reflect.Type, encode, isptr bool) { - var ptrPfx, addrPfx string - if isptr { - ptrPfx = "*" - } else { - addrPfx = "&" - } +func (x *genRunner) xtraSM(varname string, encode bool, t reflect.Type) { if encode { - x.linef("h.enc%s((%s%s)(%s), e)", x.genMethodNameT(t), ptrPfx, x.genTypeName(t), varname) + x.linef("h.enc%s((%s%s)(%s), e)", x.genMethodNameT(t), x.arr2str(t, "*"), x.genTypeName(t), varname) } else { - x.linef("h.dec%s((*%s)(%s%s), d)", x.genMethodNameT(t), x.genTypeName(t), addrPfx, varname) + x.linef("h.dec%s((*%s)(%s), d)", x.genMethodNameT(t), x.genTypeName(t), varname) } x.registerXtraT(t) } @@ -643,23 +618,17 @@ func (x *genRunner) encVar(varname string, t reflect.Type) { if checkNil { x.linef("if %s == nil { r.EncodeNil() } else { ", varname) } - switch t.Kind() { case reflect.Ptr: - telem := t.Elem() - tek := telem.Kind() - if tek == reflect.Array || (tek == reflect.Struct && telem != timeTyp) { + switch t.Elem().Kind() { + case reflect.Struct, reflect.Array: x.enc(varname, genNonPtr(t)) - break + default: + i := x.varsfx() + x.line(genTempVarPfx + i + " := *" + varname) + x.enc(genTempVarPfx+i, genNonPtr(t)) } - i := x.varsfx() - x.line(genTempVarPfx + i + " := *" + varname) - x.enc(genTempVarPfx+i, genNonPtr(t)) case reflect.Struct, reflect.Array: - if t == timeTyp { - x.enc(varname, t) - break - } i := x.varsfx() x.line(genTempVarPfx + i + " := &" + varname) x.enc(genTempVarPfx+i, t) @@ -673,33 +642,29 @@ func (x *genRunner) encVar(varname string, t reflect.Type) { } -// enc will encode a variable (varname) of type t, where t represents T. -// if t is !time.Time and t is of kind reflect.Struct or reflect.Array, varname is of type *T -// (to prevent copying), -// else t is of type T +// enc will encode a variable (varname) of type t, +// except t is of kind reflect.Struct or reflect.Array, wherein varname is of type ptrTo(T) (to prevent copying) func (x *genRunner) enc(varname string, t reflect.Type) { - rtid := rt2id(t) - ti2 := x.ti.get(rtid, t) + rtid := reflect.ValueOf(t).Pointer() // We call CodecEncodeSelf if one of the following are honored: // - the type already implements Selfer, call that // - the type has a Selfer implementation just created, use that // - the type is in the list of the ones we will generate for, but it is not currently being generated mi := x.varsfx() - // tptr := reflect.PtrTo(t) + tptr := reflect.PtrTo(t) tk := t.Kind() if x.checkForSelfer(t, varname) { - if tk == reflect.Array || (tk == reflect.Struct && rtid != timeTypId) { // varname is of type *T - // if tptr.Implements(selferTyp) || t.Implements(selferTyp) { - if ti2.isFlag(typeInfoFlagIsZeroerPtr) || ti2.isFlag(typeInfoFlagIsZeroer) { + if tk == reflect.Array || tk == reflect.Struct { // varname is of type *T + if tptr.Implements(selferTyp) || t.Implements(selferTyp) { x.line(varname + ".CodecEncodeSelf(e)") return } } else { // varname is of type T - if ti2.cs { // t.Implements(selferTyp) { + if t.Implements(selferTyp) { x.line(varname + ".CodecEncodeSelf(e)") return - } else if ti2.csp { // tptr.Implements(selferTyp) { + } else if tptr.Implements(selferTyp) { x.linef("%ssf%s := &%s", genTempVarPfx, mi, varname) x.linef("%ssf%s.CodecEncodeSelf(e)", genTempVarPfx, mi) return @@ -731,53 +696,57 @@ func (x *genRunner) enc(varname string, t reflect.Type) { } // check if - // - type is time.Time, RawExt, Raw + // - type is RawExt, Raw // - the type implements (Text|JSON|Binary)(Unm|M)arshal - + x.linef("%sm%s := z.EncBinary()", genTempVarPfx, mi) + x.linef("_ = %sm%s", genTempVarPfx, mi) x.line("if false {") //start if block defer func() { x.line("}") }() //end if block - if t == timeTyp { - x.linef("} else { r.EncodeTime(%s)", varname) - return - } if t == rawTyp { - x.linef("} else { z.EncRaw(%s)", varname) + x.linef("} else { z.EncRaw(%v)", varname) return } if t == rawExtTyp { - x.linef("} else { r.EncodeRawExt(%s, e)", varname) + x.linef("} else { r.EncodeRawExt(%v, e)", varname) return } + // HACK: Support for Builtins. + // Currently, only Binc supports builtins, and the only builtin type is time.Time. + // Have a method that returns the rtid for time.Time if Handle is Binc. + if t == timeTyp { + vrtid := genTempVarPfx + "m" + x.varsfx() + x.linef("} else if %s := z.TimeRtidIfBinc(); %s != 0 { ", vrtid, vrtid) + x.linef("r.EncodeBuiltin(%s, %s)", vrtid, varname) + } // only check for extensions if the type is named, and has a packagePath. - var arrayOrStruct = tk == reflect.Array || tk == reflect.Struct // meaning varname if of type *T - if !x.nx && genImportPath(t) != "" && t.Name() != "" { - yy := fmt.Sprintf("%sxt%s", genTempVarPfx, mi) - x.linef("} else if %s := z.Extension(z.I2Rtid(%s)); %s != nil { z.EncExtension(%s, %s) ", yy, varname, yy, varname, yy) - } - if arrayOrStruct { // varname is of type *T - if ti2.bm || ti2.bmp { // t.Implements(binaryMarshalerTyp) || tptr.Implements(binaryMarshalerTyp) { - x.linef("} else if z.EncBinary() { z.EncBinaryMarshal(%v) ", varname) + if genImportPath(t) != "" && t.Name() != "" { + // first check if extensions are configued, before doing the interface conversion + x.linef("} else if z.HasExtensions() && z.EncExt(%s) {", varname) + } + if tk == reflect.Array || tk == reflect.Struct { // varname is of type *T + if t.Implements(binaryMarshalerTyp) || tptr.Implements(binaryMarshalerTyp) { + x.linef("} else if %sm%s { z.EncBinaryMarshal(%v) ", genTempVarPfx, mi, varname) } - if ti2.jm || ti2.jmp { // t.Implements(jsonMarshalerTyp) || tptr.Implements(jsonMarshalerTyp) { - x.linef("} else if !z.EncBinary() && z.IsJSONHandle() { z.EncJSONMarshal(%v) ", varname) - } else if ti2.tm || ti2.tmp { // t.Implements(textMarshalerTyp) || tptr.Implements(textMarshalerTyp) { - x.linef("} else if !z.EncBinary() { z.EncTextMarshal(%v) ", varname) + if t.Implements(jsonMarshalerTyp) || tptr.Implements(jsonMarshalerTyp) { + x.linef("} else if !%sm%s && z.IsJSONHandle() { z.EncJSONMarshal(%v) ", genTempVarPfx, mi, varname) + } else if t.Implements(textMarshalerTyp) || tptr.Implements(textMarshalerTyp) { + x.linef("} else if !%sm%s { z.EncTextMarshal(%v) ", genTempVarPfx, mi, varname) } } else { // varname is of type T - if ti2.bm { // t.Implements(binaryMarshalerTyp) { - x.linef("} else if z.EncBinary() { z.EncBinaryMarshal(%v) ", varname) - } else if ti2.bmp { // tptr.Implements(binaryMarshalerTyp) { - x.linef("} else if z.EncBinary() { z.EncBinaryMarshal(&%v) ", varname) + if t.Implements(binaryMarshalerTyp) { + x.linef("} else if %sm%s { z.EncBinaryMarshal(%v) ", genTempVarPfx, mi, varname) + } else if tptr.Implements(binaryMarshalerTyp) { + x.linef("} else if %sm%s { z.EncBinaryMarshal(&%v) ", genTempVarPfx, mi, varname) } - if ti2.jm { // t.Implements(jsonMarshalerTyp) { - x.linef("} else if !z.EncBinary() && z.IsJSONHandle() { z.EncJSONMarshal(%v) ", varname) - } else if ti2.jmp { // tptr.Implements(jsonMarshalerTyp) { - x.linef("} else if !z.EncBinary() && z.IsJSONHandle() { z.EncJSONMarshal(&%v) ", varname) - } else if ti2.tm { // t.Implements(textMarshalerTyp) { - x.linef("} else if !z.EncBinary() { z.EncTextMarshal(%v) ", varname) - } else if ti2.tmp { // tptr.Implements(textMarshalerTyp) { - x.linef("} else if !z.EncBinary() { z.EncTextMarshal(&%v) ", varname) + if t.Implements(jsonMarshalerTyp) { + x.linef("} else if !%sm%s && z.IsJSONHandle() { z.EncJSONMarshal(%v) ", genTempVarPfx, mi, varname) + } else if tptr.Implements(jsonMarshalerTyp) { + x.linef("} else if !%sm%s && z.IsJSONHandle() { z.EncJSONMarshal(&%v) ", genTempVarPfx, mi, varname) + } else if t.Implements(textMarshalerTyp) { + x.linef("} else if !%sm%s { z.EncTextMarshal(%v) ", genTempVarPfx, mi, varname) + } else if tptr.Implements(textMarshalerTyp) { + x.linef("} else if !%sm%s { z.EncTextMarshal(&%v) ", genTempVarPfx, mi, varname) } } x.line("} else {") @@ -794,12 +763,12 @@ func (x *genRunner) enc(varname string, t reflect.Type) { case reflect.Bool: x.line("r.EncodeBool(bool(" + varname + "))") case reflect.String: - x.line("r.EncodeString(codecSelferCcUTF8" + x.xs + ", string(" + varname + "))") + x.line("r.EncodeString(codecSelferC_UTF8" + x.xs + ", string(" + varname + "))") case reflect.Chan: - x.xtraSM(varname, t, true, false) + x.xtraSM(varname, true, t) // x.encListFallback(varname, rtid, t) case reflect.Array: - x.xtraSM(varname, t, true, true) + x.xtraSM(varname, true, t) case reflect.Slice: // if nil, call dedicated function // if a []uint8, call dedicated function @@ -808,12 +777,12 @@ func (x *genRunner) enc(varname string, t reflect.Type) { // - if elements are primitives or Selfers, call dedicated function on each member. // - else call Encoder.encode(XXX) on it. if rtid == uint8SliceTypId { - x.line("r.EncodeStringBytes(codecSelferCcRAW" + x.xs + ", []byte(" + varname + "))") + x.line("r.EncodeStringBytes(codecSelferC_RAW" + x.xs + ", []byte(" + varname + "))") } else if fastpathAV.index(rtid) != -1 { g := x.newGenV(t) - x.line("z.F." + g.MethodNamePfx("Enc", false) + "V(" + varname + ", e)") + x.line("z.F." + g.MethodNamePfx("Enc", false) + "V(" + varname + ", false, e)") } else { - x.xtraSM(varname, t, true, false) + x.xtraSM(varname, true, t) // x.encListFallback(varname, rtid, t) } case reflect.Map: @@ -825,9 +794,9 @@ func (x *genRunner) enc(varname string, t reflect.Type) { // x.line("if " + varname + " == nil { \nr.EncodeNil()\n } else { ") if fastpathAV.index(rtid) != -1 { g := x.newGenV(t) - x.line("z.F." + g.MethodNamePfx("Enc", false) + "V(" + varname + ", e)") + x.line("z.F." + g.MethodNamePfx("Enc", false) + "V(" + varname + ", false, e)") } else { - x.xtraSM(varname, t, true, false) + x.xtraSM(varname, true, t) // x.encMapFallback(varname, rtid, t) } case reflect.Struct: @@ -858,53 +827,12 @@ func (x *genRunner) encZero(t reflect.Type) { case reflect.Bool: x.line("r.EncodeBool(false)") case reflect.String: - x.line("r.EncodeString(codecSelferCcUTF8" + x.xs + `, "")`) + x.line("r.EncodeString(codecSelferC_UTF8" + x.xs + `, "")`) default: x.line("r.EncodeNil()") } } -func (x *genRunner) encOmitEmptyLine(t2 reflect.StructField, varname string, buf *genBuf) { - // smartly check omitEmpty on a struct type, as it may contain uncomparable map/slice/etc. - // also, for maps/slices/arrays, check if len ! 0 (not if == zero value) - varname2 := varname + "." + t2.Name - switch t2.Type.Kind() { - case reflect.Struct: - rtid2 := rt2id(t2.Type) - ti2 := x.ti.get(rtid2, t2.Type) - // fmt.Printf(">>>> structfield: omitempty: type: %s, field: %s\n", t2.Type.Name(), t2.Name) - if ti2.rtid == timeTypId { - buf.s("!(").s(varname2).s(".IsZero())") - break - } - if ti2.isFlag(typeInfoFlagIsZeroerPtr) || ti2.isFlag(typeInfoFlagIsZeroer) { - buf.s("!(").s(varname2).s(".IsZero())") - break - } - if ti2.isFlag(typeInfoFlagComparable) { - buf.s(varname2).s(" != ").s(x.genZeroValueR(t2.Type)) - break - } - // buf.s("(") - buf.s("false") - for i, n := 0, t2.Type.NumField(); i < n; i++ { - f := t2.Type.Field(i) - if f.PkgPath != "" { // unexported - continue - } - buf.s(" || ") - x.encOmitEmptyLine(f, varname2, buf) - } - //buf.s(")") - case reflect.Bool: - buf.s(varname2) - case reflect.Map, reflect.Slice, reflect.Array, reflect.Chan: - buf.s("len(").s(varname2).s(") != 0") - default: - buf.s(varname2).s(" != ").s(x.genZeroValueR(t2.Type)) - } -} - func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { // Use knowledge from structfieldinfo (mbs, encodable fields. Ignore omitempty. ) // replicate code in kStruct i.e. for each field, deref type to non-pointer, and call x.enc on it @@ -919,71 +847,60 @@ func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { x.line(sepVarname + " := !z.EncBinary()") x.linef("%s := z.EncBasicHandle().StructToArray", struct2arrvar) - x.linef("_, _ = %s, %s", sepVarname, struct2arrvar) - x.linef("const %s bool = %v // struct tag has 'toArray'", ti2arrayvar, ti.toArray) - - tisfi := ti.sfiSrc // always use sequence from file. decStruct expects same thing. - - // var nn int + tisfi := ti.sfip // always use sequence from file. decStruct expects same thing. // due to omitEmpty, we need to calculate the // number of non-empty things we write out first. // This is required as we need to pre-determine the size of the container, // to support length-prefixing. - if ti.anyOmitEmpty { - x.linef("var %s = [%v]bool{ // should field at this index be written?", numfieldsvar, len(tisfi)) - - for j, si := range tisfi { - _ = j - if !si.omitEmpty() { - // x.linef("%s[%v] = true // %s", numfieldsvar, j, si.fieldName) - x.linef("true, // %s", si.fieldName) - // nn++ - continue - } - var t2 reflect.StructField - var omitline genBuf - { - t2typ := t - varname3 := varname - // go through the loop, record the t2 field explicitly, - // and gather the omit line if embedded in pointers. - for ij, ix := range si.is { - if uint8(ij) == si.nis { - break - } - for t2typ.Kind() == reflect.Ptr { - t2typ = t2typ.Elem() - } - t2 = t2typ.Field(int(ix)) - t2typ = t2.Type - varname3 = varname3 + "." + t2.Name - // do not include actual field in the omit line. - // that is done subsequently (right after - below). - if uint8(ij+1) < si.nis && t2typ.Kind() == reflect.Ptr { - omitline.s(varname3).s(" != nil && ") - } + x.linef("var %s [%v]bool", numfieldsvar, len(tisfi)) + x.linef("_, _, _ = %s, %s, %s", sepVarname, numfieldsvar, struct2arrvar) + x.linef("const %s bool = %v", ti2arrayvar, ti.toArray) + nn := 0 + for j, si := range tisfi { + if !si.omitEmpty { + nn++ + continue + } + var t2 reflect.StructField + var omitline string + if si.i != -1 { + t2 = t.Field(int(si.i)) + } else { + t2typ := t + varname3 := varname + for _, ix := range si.is { + for t2typ.Kind() == reflect.Ptr { + t2typ = t2typ.Elem() + } + t2 = t2typ.Field(ix) + t2typ = t2.Type + varname3 = varname3 + "." + t2.Name + if t2typ.Kind() == reflect.Ptr { + omitline += varname3 + " != nil && " } } - x.encOmitEmptyLine(t2, varname, &omitline) - x.linef("%s, // %s", omitline.v(), si.fieldName) } - x.line("}") - x.linef("_ = %s", numfieldsvar) + // never check omitEmpty on a struct type, as it may contain uncomparable map/slice/etc. + // also, for maps/slices/arrays, check if len ! 0 (not if == zero value) + switch t2.Type.Kind() { + case reflect.Struct: + omitline += " true" + case reflect.Map, reflect.Slice, reflect.Array, reflect.Chan: + omitline += "len(" + varname + "." + t2.Name + ") != 0" + default: + omitline += varname + "." + t2.Name + " != " + x.genZeroValueR(t2.Type) + } + x.linef("%s[%v] = %s", numfieldsvar, j, omitline) } - // x.linef("var %snn%s int", genTempVarPfx, i) + x.linef("var %snn%s int", genTempVarPfx, i) x.linef("if %s || %s {", ti2arrayvar, struct2arrvar) // if ti.toArray { - x.linef("r.WriteArrayStart(%d)", len(tisfi)) + x.line("r.EncodeArrayStart(" + strconv.FormatInt(int64(len(tisfi)), 10) + ")") x.linef("} else {") // if not ti.toArray - if ti.anyOmitEmpty { - // nn = 0 - // x.linef("var %snn%s = %v", genTempVarPfx, i, nn) - x.linef("var %snn%s int", genTempVarPfx, i) - x.linef("for _, b := range %s { if b { %snn%s++ } }", numfieldsvar, genTempVarPfx, i) - x.linef("r.WriteMapStart(%snn%s)", genTempVarPfx, i) - x.linef("%snn%s = %v", genTempVarPfx, i, 0) - } else { - x.linef("r.WriteMapStart(%d)", len(tisfi)) - } + x.linef("%snn%s = %v", genTempVarPfx, i, nn) + x.linef("for _, b := range %s { if b { %snn%s++ } }", numfieldsvar, genTempVarPfx, i) + x.linef("r.EncodeMapStart(%snn%s)", genTempVarPfx, i) + x.linef("%snn%s = %v", genTempVarPfx, i, 0) + // x.line("r.EncodeMapStart(" + strconv.FormatInt(int64(len(tisfi)), 10) + ")") x.line("}") // close if not StructToArray for j, si := range tisfi { @@ -991,17 +908,17 @@ func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { isNilVarName := genTempVarPfx + "n" + i var labelUsed bool var t2 reflect.StructField - { + if si.i != -1 { + t2 = t.Field(int(si.i)) + } else { t2typ := t varname3 := varname - for ij, ix := range si.is { - if uint8(ij) == si.nis { - break - } + for _, ix := range si.is { + // fmt.Printf("%%%% %v, ix: %v\n", t2typ, ix) for t2typ.Kind() == reflect.Ptr { t2typ = t2typ.Elem() } - t2 = t2typ.Field(int(ix)) + t2 = t2typ.Field(ix) t2typ = t2.Type varname3 = varname3 + "." + t2.Name if t2typ.Kind() == reflect.Ptr { @@ -1024,14 +941,14 @@ func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { x.linef("if %s || %s {", ti2arrayvar, struct2arrvar) // if ti.toArray if labelUsed { - x.linef("if %s { r.WriteArrayElem(); r.EncodeNil() } else { ", isNilVarName) + x.line("if " + isNilVarName + " { r.EncodeNil() } else { ") } - x.line("r.WriteArrayElem()") - if si.omitEmpty() { + x.linef("z.EncSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) + if si.omitEmpty { x.linef("if %s[%v] {", numfieldsvar, j) } x.encVar(varname+"."+t2.Name, t2.Type) - if si.omitEmpty() { + if si.omitEmpty { x.linef("} else {") x.encZero(t2.Type) x.linef("}") @@ -1042,25 +959,12 @@ func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { x.linef("} else {") // if not ti.toArray - if si.omitEmpty() { + if si.omitEmpty { x.linef("if %s[%v] {", numfieldsvar, j) } - x.line("r.WriteMapElemKey()") - - // x.line("r.EncodeString(codecSelferCcUTF8" + x.xs + ", `" + si.encName + "`)") - // emulate EncStructFieldKey - switch ti.keyType { - case valueTypeInt: - x.linef("r.EncodeInt(z.M.Int(strconv.ParseInt(`%s`, 10, 64)))", si.encName) - case valueTypeUint: - x.linef("r.EncodeUint(z.M.Uint(strconv.ParseUint(`%s`, 10, 64)))", si.encName) - case valueTypeFloat: - x.linef("r.EncodeFloat64(z.M.Float(strconv.ParseFloat(`%s`, 64)))", si.encName) - default: // string - x.linef("r.EncodeString(codecSelferCcUTF8%s, `%s`)", x.xs, si.encName) - } - // x.linef("r.EncStructFieldKey(codecSelferValueType%s%s, `%s`)", ti.keyType.String(), x.xs, si.encName) - x.line("r.WriteMapElemValue()") + x.linef("z.EncSendContainerState(codecSelfer_containerMapKey%s)", x.xs) + x.line("r.EncodeString(codecSelferC_UTF8" + x.xs + ", string(\"" + si.encName + "\"))") + x.linef("z.EncSendContainerState(codecSelfer_containerMapValue%s)", x.xs) if labelUsed { x.line("if " + isNilVarName + " { r.EncodeNil() } else { ") x.encVar(varname+"."+t2.Name, t2.Type) @@ -1068,218 +972,136 @@ func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { } else { x.encVar(varname+"."+t2.Name, t2.Type) } - if si.omitEmpty() { + if si.omitEmpty { x.line("}") } x.linef("} ") // end if/else ti.toArray } x.linef("if %s || %s {", ti2arrayvar, struct2arrvar) // if ti.toArray { - x.line("r.WriteArrayEnd()") + x.linef("z.EncSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) x.line("} else {") - x.line("r.WriteMapEnd()") + x.linef("z.EncSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) x.line("}") } func (x *genRunner) encListFallback(varname string, t reflect.Type) { - elemBytes := t.Elem().Kind() == reflect.Uint8 if t.AssignableTo(uint8SliceTyp) { - x.linef("r.EncodeStringBytes(codecSelferCcRAW%s, []byte(%s))", x.xs, varname) + x.linef("r.EncodeStringBytes(codecSelferC_RAW%s, []byte(%s))", x.xs, varname) return } - if t.Kind() == reflect.Array && elemBytes { - x.linef("r.EncodeStringBytes(codecSelferCcRAW%s, ((*[%d]byte)(%s))[:])", x.xs, t.Len(), varname) + if t.Kind() == reflect.Array && t.Elem().Kind() == reflect.Uint8 { + x.linef("r.EncodeStringBytes(codecSelferC_RAW%s, ([%v]byte(%s))[:])", x.xs, t.Len(), varname) return } i := x.varsfx() + g := genTempVarPfx + x.line("r.EncodeArrayStart(len(" + varname + "))") if t.Kind() == reflect.Chan { - type ts struct { - Label, Chan, Slice, Sfx string - } - tm, err := template.New("").Parse(genEncChanTmpl) - if err != nil { - panic(err) - } - x.linef("if %s == nil { r.EncodeNil() } else { ", varname) - x.linef("var sch%s []%s", i, x.genTypeName(t.Elem())) - err = tm.Execute(x.w, &ts{"Lsch" + i, varname, "sch" + i, i}) - if err != nil { - panic(err) - } - // x.linef("%s = sch%s", varname, i) - if elemBytes { - x.linef("r.EncodeStringBytes(codecSelferCcRAW%s, []byte(%s))", x.xs, "sch"+i) - x.line("}") - return - } - varname = "sch" + i + x.linef("for %si%s, %si2%s := 0, len(%s); %si%s < %si2%s; %si%s++ {", g, i, g, i, varname, g, i, g, i, g, i) + x.linef("z.EncSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) + x.linef("%sv%s := <-%s", g, i, varname) + } else { + // x.linef("for %si%s, %sv%s := range %s {", genTempVarPfx, i, genTempVarPfx, i, varname) + x.linef("for _, %sv%s := range %s {", genTempVarPfx, i, varname) + x.linef("z.EncSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) } - - x.line("r.WriteArrayStart(len(" + varname + "))") - x.linef("for _, %sv%s := range %s {", genTempVarPfx, i, varname) - x.line("r.WriteArrayElem()") - x.encVar(genTempVarPfx+"v"+i, t.Elem()) x.line("}") - x.line("r.WriteArrayEnd()") - if t.Kind() == reflect.Chan { - x.line("}") - } + x.linef("z.EncSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) } func (x *genRunner) encMapFallback(varname string, t reflect.Type) { // TODO: expand this to handle canonical. i := x.varsfx() - x.line("r.WriteMapStart(len(" + varname + "))") + x.line("r.EncodeMapStart(len(" + varname + "))") x.linef("for %sk%s, %sv%s := range %s {", genTempVarPfx, i, genTempVarPfx, i, varname) - x.line("r.WriteMapElemKey()") + // x.line("for " + genTempVarPfx + "k" + i + ", " + genTempVarPfx + "v" + i + " := range " + varname + " {") + x.linef("z.EncSendContainerState(codecSelfer_containerMapKey%s)", x.xs) x.encVar(genTempVarPfx+"k"+i, t.Key()) - x.line("r.WriteMapElemValue()") + x.linef("z.EncSendContainerState(codecSelfer_containerMapValue%s)", x.xs) x.encVar(genTempVarPfx+"v"+i, t.Elem()) x.line("}") - x.line("r.WriteMapEnd()") -} - -func (x *genRunner) decVarInitPtr(varname, nilvar string, t reflect.Type, si *structFieldInfo, - newbuf, nilbuf *genBuf) (t2 reflect.StructField) { - //we must accommodate anonymous fields, where the embedded field is a nil pointer in the value. - // t2 = t.FieldByIndex(si.is) - t2typ := t - varname3 := varname - t2kind := t2typ.Kind() - var nilbufed bool - if si != nil { - for ij, ix := range si.is { - if uint8(ij) == si.nis { - break - } - for t2typ.Kind() == reflect.Ptr { - t2typ = t2typ.Elem() - } - t2 = t2typ.Field(int(ix)) - t2typ = t2.Type - varname3 = varname3 + "." + t2.Name - t2kind = t2typ.Kind() - if t2kind != reflect.Ptr { - continue - } - if newbuf != nil { - newbuf.f("if %s == nil { %s = new(%s) }\n", varname3, varname3, x.genTypeName(t2typ.Elem())) - } - if nilbuf != nil { - if !nilbufed { - nilbuf.s("if true") - nilbufed = true - } - nilbuf.s(" && ").s(varname3).s(" != nil") - } - } - } - // if t2typ.Kind() == reflect.Ptr { - // varname3 = varname3 + t2.Name - // } - if nilbuf != nil { - if nilbufed { - nilbuf.s(" { ") - } - if nilvar != "" { - nilbuf.s(nilvar).s(" = true") - } else if tk := t2typ.Kind(); tk == reflect.Ptr { - if strings.IndexByte(varname3, '.') != -1 || strings.IndexByte(varname3, '[') != -1 { - nilbuf.s(varname3).s(" = nil") - } else { - nilbuf.s("*").s(varname3).s(" = ").s(x.genZeroValueR(t2typ.Elem())) - } - } else { - nilbuf.s(varname3).s(" = ").s(x.genZeroValueR(t2typ)) - } - if nilbufed { - nilbuf.s("}") - } - } - return t2 + x.linef("z.EncSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) } -// decVar takes a variable called varname, of type t -func (x *genRunner) decVarMain(varname, rand string, t reflect.Type, checkNotNil bool) { +func (x *genRunner) decVar(varname string, t reflect.Type, canBeNil bool) { // We only encode as nil if a nillable value. // This removes some of the wasted checks for TryDecodeAsNil. // We need to think about this more, to see what happens if omitempty, etc // cause a nil value to be stored when something is expected. // This could happen when decoding from a struct encoded as an array. // For that, decVar should be called with canNil=true, to force true as its value. - var varname2 string - if t.Kind() != reflect.Ptr { - if t.PkgPath() != "" || !x.decTryAssignPrimitive(varname, t, false) { - x.dec(varname, t, false) + i := x.varsfx() + if !canBeNil { + canBeNil = genAnythingCanBeNil || !genIsImmutable(t) + } + if canBeNil { + x.line("if r.TryDecodeAsNil() {") + if t.Kind() == reflect.Ptr { + x.line("if " + varname + " != nil { ") + + // if varname is a field of a struct (has a dot in it), + // then just set it to nil + if strings.IndexByte(varname, '.') != -1 { + x.line(varname + " = nil") + } else { + x.line("*" + varname + " = " + x.genZeroValueR(t.Elem())) + } + x.line("}") + } else { + x.line(varname + " = " + x.genZeroValueR(t)) } + x.line("} else {") } else { - if checkNotNil { - x.linef("if %s == nil { %s = new(%s) }", varname, varname, x.genTypeName(t.Elem())) + x.line("// cannot be nil") + } + if t.Kind() != reflect.Ptr { + if x.decTryAssignPrimitive(varname, t) { + x.line(genTempVarPfx + "v" + i + " := &" + varname) + x.dec(genTempVarPfx+"v"+i, t) } + } else { + x.linef("if %s == nil { %s = new(%s) }", varname, varname, x.genTypeName(t.Elem())) // Ensure we set underlying ptr to a non-nil value (so we can deref to it later). // There's a chance of a **T in here which is nil. var ptrPfx string for t = t.Elem(); t.Kind() == reflect.Ptr; t = t.Elem() { ptrPfx += "*" - if checkNotNil { - x.linef("if %s%s == nil { %s%s = new(%s)}", - ptrPfx, varname, ptrPfx, varname, x.genTypeName(t)) - } + x.linef("if %s%s == nil { %s%s = new(%s)}", + ptrPfx, varname, ptrPfx, varname, x.genTypeName(t)) + } + // if varname has [ in it, then create temp variable for this ptr thingie + if strings.Index(varname, "[") >= 0 { + varname2 := genTempVarPfx + "w" + i + x.line(varname2 + " := " + varname) + varname = varname2 } - // Should we create temp var if a slice/map indexing? No. dec(...) can now handle it. if ptrPfx == "" { - x.dec(varname, t, true) + x.dec(varname, t) } else { - varname2 = genTempVarPfx + "z" + rand - x.line(varname2 + " := " + ptrPfx + varname) - x.dec(varname2, t, true) + x.line(genTempVarPfx + "z" + i + " := " + ptrPfx + varname) + x.dec(genTempVarPfx+"z"+i, t) } - } -} -// decVar takes a variable called varname, of type t -func (x *genRunner) decVar(varname, nilvar string, t reflect.Type, canBeNil, checkNotNil bool) { - i := x.varsfx() - - // We only encode as nil if a nillable value. - // This removes some of the wasted checks for TryDecodeAsNil. - // We need to think about this more, to see what happens if omitempty, etc - // cause a nil value to be stored when something is expected. - // This could happen when decoding from a struct encoded as an array. - // For that, decVar should be called with canNil=true, to force true as its value. - - if !canBeNil { - canBeNil = genAnythingCanBeNil || !genIsImmutable(t) } - if canBeNil { - var buf genBuf - x.decVarInitPtr(varname, nilvar, t, nil, nil, &buf) - x.linef("if r.TryDecodeAsNil() { %s } else {", buf.buf) - } else { - x.line("// cannot be nil") - } - - x.decVarMain(varname, i, t, checkNotNil) - if canBeNil { x.line("} ") } } -// dec will decode a variable (varname) of type t or ptrTo(t) if isptr==true. +// dec will decode a variable (varname) of type ptrTo(t). // t is always a basetype (i.e. not of kind reflect.Ptr). -func (x *genRunner) dec(varname string, t reflect.Type, isptr bool) { +func (x *genRunner) dec(varname string, t reflect.Type) { // assumptions: // - the varname is to a pointer already. No need to take address of it // - t is always a baseType T (not a *T, etc). - rtid := rt2id(t) - ti2 := x.ti.get(rtid, t) - // tptr := reflect.PtrTo(t) + rtid := reflect.ValueOf(t).Pointer() + tptr := reflect.PtrTo(t) if x.checkForSelfer(t, varname) { - if ti2.cs || ti2.csp { // t.Implements(selferTyp) || tptr.Implements(selferTyp) { + if t.Implements(selferTyp) || tptr.Implements(selferTyp) { x.line(varname + ".CodecDecodeSelf(d)") return } @@ -1308,61 +1130,100 @@ func (x *genRunner) dec(varname string, t reflect.Type, isptr bool) { } // check if - // - type is time.Time, Raw, RawExt + // - type is Raw, RawExt // - the type implements (Text|JSON|Binary)(Unm|M)arshal - mi := x.varsfx() - // x.linef("%sm%s := z.DecBinary()", genTempVarPfx, mi) - // x.linef("_ = %sm%s", genTempVarPfx, mi) + x.linef("%sm%s := z.DecBinary()", genTempVarPfx, mi) + x.linef("_ = %sm%s", genTempVarPfx, mi) x.line("if false {") //start if block defer func() { x.line("}") }() //end if block - var ptrPfx, addrPfx string - if isptr { - ptrPfx = "*" - } else { - addrPfx = "&" - } - if t == timeTyp { - x.linef("} else { %s%v = r.DecodeTime()", ptrPfx, varname) - return - } if t == rawTyp { - x.linef("} else { %s%v = z.DecRaw()", ptrPfx, varname) + x.linef("} else { *%v = z.DecRaw()", varname) return } - if t == rawExtTyp { - x.linef("} else { r.DecodeExt(%s%v, 0, nil)", addrPfx, varname) + x.linef("} else { r.DecodeExt(%v, 0, nil)", varname) return } + // HACK: Support for Builtins. + // Currently, only Binc supports builtins, and the only builtin type is time.Time. + // Have a method that returns the rtid for time.Time if Handle is Binc. + if t == timeTyp { + vrtid := genTempVarPfx + "m" + x.varsfx() + x.linef("} else if %s := z.TimeRtidIfBinc(); %s != 0 { ", vrtid, vrtid) + x.linef("r.DecodeBuiltin(%s, %s)", vrtid, varname) + } // only check for extensions if the type is named, and has a packagePath. - if !x.nx && genImportPath(t) != "" && t.Name() != "" { + if genImportPath(t) != "" && t.Name() != "" { // first check if extensions are configued, before doing the interface conversion - // x.linef("} else if z.HasExtensions() && z.DecExt(%s) {", varname) - yy := fmt.Sprintf("%sxt%s", genTempVarPfx, mi) - x.linef("} else if %s := z.Extension(z.I2Rtid(%s)); %s != nil { z.DecExtension(%s, %s) ", yy, varname, yy, varname, yy) + x.linef("} else if z.HasExtensions() && z.DecExt(%s) {", varname) } - if ti2.bu || ti2.bup { // t.Implements(binaryUnmarshalerTyp) || tptr.Implements(binaryUnmarshalerTyp) { - x.linef("} else if z.DecBinary() { z.DecBinaryUnmarshal(%s%v) ", addrPfx, varname) + if t.Implements(binaryUnmarshalerTyp) || tptr.Implements(binaryUnmarshalerTyp) { + x.linef("} else if %sm%s { z.DecBinaryUnmarshal(%v) ", genTempVarPfx, mi, varname) } - if ti2.ju || ti2.jup { // t.Implements(jsonUnmarshalerTyp) || tptr.Implements(jsonUnmarshalerTyp) { - x.linef("} else if !z.DecBinary() && z.IsJSONHandle() { z.DecJSONUnmarshal(%s%v)", addrPfx, varname) - } else if ti2.tu || ti2.tup { // t.Implements(textUnmarshalerTyp) || tptr.Implements(textUnmarshalerTyp) { - x.linef("} else if !z.DecBinary() { z.DecTextUnmarshal(%s%v)", addrPfx, varname) + if t.Implements(jsonUnmarshalerTyp) || tptr.Implements(jsonUnmarshalerTyp) { + x.linef("} else if !%sm%s && z.IsJSONHandle() { z.DecJSONUnmarshal(%v)", genTempVarPfx, mi, varname) + } else if t.Implements(textUnmarshalerTyp) || tptr.Implements(textUnmarshalerTyp) { + x.linef("} else if !%sm%s { z.DecTextUnmarshal(%v)", genTempVarPfx, mi, varname) } x.line("} else {") - if x.decTryAssignPrimitive(varname, t, isptr) { - return - } - + // Since these are pointers, we cannot share, and have to use them one by one switch t.Kind() { + case reflect.Int: + x.line("*((*int)(" + varname + ")) = int(r.DecodeInt(codecSelferBitsize" + x.xs + "))") + // x.line("z.DecInt((*int)(" + varname + "))") + case reflect.Int8: + x.line("*((*int8)(" + varname + ")) = int8(r.DecodeInt(8))") + // x.line("z.DecInt8((*int8)(" + varname + "))") + case reflect.Int16: + x.line("*((*int16)(" + varname + ")) = int16(r.DecodeInt(16))") + // x.line("z.DecInt16((*int16)(" + varname + "))") + case reflect.Int32: + x.line("*((*int32)(" + varname + ")) = int32(r.DecodeInt(32))") + // x.line("z.DecInt32((*int32)(" + varname + "))") + case reflect.Int64: + x.line("*((*int64)(" + varname + ")) = int64(r.DecodeInt(64))") + // x.line("z.DecInt64((*int64)(" + varname + "))") + + case reflect.Uint: + x.line("*((*uint)(" + varname + ")) = uint(r.DecodeUint(codecSelferBitsize" + x.xs + "))") + // x.line("z.DecUint((*uint)(" + varname + "))") + case reflect.Uint8: + x.line("*((*uint8)(" + varname + ")) = uint8(r.DecodeUint(8))") + // x.line("z.DecUint8((*uint8)(" + varname + "))") + case reflect.Uint16: + x.line("*((*uint16)(" + varname + ")) = uint16(r.DecodeUint(16))") + //x.line("z.DecUint16((*uint16)(" + varname + "))") + case reflect.Uint32: + x.line("*((*uint32)(" + varname + ")) = uint32(r.DecodeUint(32))") + //x.line("z.DecUint32((*uint32)(" + varname + "))") + case reflect.Uint64: + x.line("*((*uint64)(" + varname + ")) = uint64(r.DecodeUint(64))") + //x.line("z.DecUint64((*uint64)(" + varname + "))") + case reflect.Uintptr: + x.line("*((*uintptr)(" + varname + ")) = uintptr(r.DecodeUint(codecSelferBitsize" + x.xs + "))") + + case reflect.Float32: + x.line("*((*float32)(" + varname + ")) = float32(r.DecodeFloat(true))") + //x.line("z.DecFloat32((*float32)(" + varname + "))") + case reflect.Float64: + x.line("*((*float64)(" + varname + ")) = float64(r.DecodeFloat(false))") + // x.line("z.DecFloat64((*float64)(" + varname + "))") + + case reflect.Bool: + x.line("*((*bool)(" + varname + ")) = r.DecodeBool()") + // x.line("z.DecBool((*bool)(" + varname + "))") + case reflect.String: + x.line("*((*string)(" + varname + ")) = r.DecodeString()") + // x.line("z.DecString((*string)(" + varname + "))") case reflect.Array, reflect.Chan: - x.xtraSM(varname, t, false, isptr) + x.xtraSM(varname, false, t) + // x.decListFallback(varname, rtid, true, t) case reflect.Slice: // if a []uint8, call dedicated function // if a known fastpath slice, call dedicated function @@ -1370,13 +1231,12 @@ func (x *genRunner) dec(varname string, t reflect.Type, isptr bool) { // - if elements are primitives or Selfers, call dedicated function on each member. // - else call Encoder.encode(XXX) on it. if rtid == uint8SliceTypId { - x.linef("%s%s = r.DecodeBytes(%s(%s[]byte)(%s), false)", - ptrPfx, varname, ptrPfx, ptrPfx, varname) + x.line("*" + varname + " = r.DecodeBytes(*(*[]byte)(" + varname + "), false, false)") } else if fastpathAV.index(rtid) != -1 { g := x.newGenV(t) - x.linef("z.F.%sX(%s%s, d)", g.MethodNamePfx("Dec", false), addrPfx, varname) + x.line("z.F." + g.MethodNamePfx("Dec", false) + "X(" + varname + ", false, d)") } else { - x.xtraSM(varname, t, false, isptr) + x.xtraSM(varname, false, t) // x.decListFallback(varname, rtid, false, t) } case reflect.Map: @@ -1386,89 +1246,83 @@ func (x *genRunner) dec(varname string, t reflect.Type, isptr bool) { // - else call Encoder.encode(XXX) on it. if fastpathAV.index(rtid) != -1 { g := x.newGenV(t) - x.linef("z.F.%sX(%s%s, d)", g.MethodNamePfx("Dec", false), addrPfx, varname) + x.line("z.F." + g.MethodNamePfx("Dec", false) + "X(" + varname + ", false, d)") } else { - x.xtraSM(varname, t, false, isptr) + x.xtraSM(varname, false, t) // x.decMapFallback(varname, rtid, t) } case reflect.Struct: if inlist { - // no need to create temp variable if isptr, or x.F or x[F] - if isptr || strings.IndexByte(varname, '.') != -1 || strings.IndexByte(varname, '[') != -1 { - x.decStruct(varname, rtid, t) - } else { - varname2 := genTempVarPfx + "j" + mi - x.line(varname2 + " := &" + varname) - x.decStruct(varname2, rtid, t) - } + x.decStruct(varname, rtid, t) } else { // delete(x.td, rtid) - x.line("z.DecFallback(" + addrPfx + varname + ", false)") + x.line("z.DecFallback(" + varname + ", false)") } default: if rtidAdded { delete(x.te, rtid) } - x.line("z.DecFallback(" + addrPfx + varname + ", true)") + x.line("z.DecFallback(" + varname + ", true)") } } -func (x *genRunner) decTryAssignPrimitive(varname string, t reflect.Type, isptr bool) (done bool) { +func (x *genRunner) decTryAssignPrimitive(varname string, t reflect.Type) (tryAsPtr bool) { // This should only be used for exact primitives (ie un-named types). // Named types may be implementations of Selfer, Unmarshaler, etc. // They should be handled by dec(...) - var ptr string - if isptr { - ptr = "*" + if t.Name() != "" { + tryAsPtr = true + return } + switch t.Kind() { case reflect.Int: - x.linef("%s%s = (%s)(z.C.IntV(r.DecodeInt64(), codecSelferBitsize%s))", ptr, varname, x.genTypeName(t), x.xs) + x.linef("%s = r.DecodeInt(codecSelferBitsize%s)", varname, x.xs) case reflect.Int8: - x.linef("%s%s = (%s)(z.C.IntV(r.DecodeInt64(), 8))", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeInt(8)", varname) case reflect.Int16: - x.linef("%s%s = (%s)(z.C.IntV(r.DecodeInt64(), 16))", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeInt(16)", varname) case reflect.Int32: - x.linef("%s%s = (%s)(z.C.IntV(r.DecodeInt64(), 32))", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeInt(32)", varname) case reflect.Int64: - x.linef("%s%s = (%s)(r.DecodeInt64())", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeInt(64)", varname) case reflect.Uint: - x.linef("%s%s = (%s)(z.C.UintV(r.DecodeUint64(), codecSelferBitsize%s))", ptr, varname, x.genTypeName(t), x.xs) + x.linef("%s = r.DecodeUint(codecSelferBitsize%s)", varname, x.xs) case reflect.Uint8: - x.linef("%s%s = (%s)(z.C.UintV(r.DecodeUint64(), 8))", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeUint(8)", varname) case reflect.Uint16: - x.linef("%s%s = (%s)(z.C.UintV(r.DecodeUint64(), 16))", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeUint(16)", varname) case reflect.Uint32: - x.linef("%s%s = (%s)(z.C.UintV(r.DecodeUint64(), 32))", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeUint(32)", varname) case reflect.Uint64: - x.linef("%s%s = (%s)(r.DecodeUint64())", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeUint(64)", varname) case reflect.Uintptr: - x.linef("%s%s = (%s)(z.C.UintV(r.DecodeUint64(), codecSelferBitsize%s))", ptr, varname, x.genTypeName(t), x.xs) + x.linef("%s = r.DecodeUint(codecSelferBitsize%s)", varname, x.xs) case reflect.Float32: - x.linef("%s%s = (%s)(r.DecodeFloat32As64())", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeFloat(true)", varname) case reflect.Float64: - x.linef("%s%s = (%s)(r.DecodeFloat64())", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeFloat(false)", varname) case reflect.Bool: - x.linef("%s%s = (%s)(r.DecodeBool())", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeBool()", varname) case reflect.String: - x.linef("%s%s = (%s)(r.DecodeString())", ptr, varname, x.genTypeName(t)) + x.linef("%s = r.DecodeString()", varname) default: - return false + tryAsPtr = true } - return true + return } func (x *genRunner) decListFallback(varname string, rtid uintptr, t reflect.Type) { if t.AssignableTo(uint8SliceTyp) { - x.line("*" + varname + " = r.DecodeBytes(*((*[]byte)(" + varname + ")), false)") + x.line("*" + varname + " = r.DecodeBytes(*((*[]byte)(" + varname + ")), false, false)") return } if t.Kind() == reflect.Array && t.Elem().Kind() == reflect.Uint8 { - x.linef("r.DecodeBytes( ((*[%d]byte)(%s))[:], true)", t.Len(), varname) + x.linef("r.DecodeBytes( ((*[%s]byte)(%s))[:], false, true)", t.Len(), varname) return } type tstruc struct { @@ -1486,7 +1340,11 @@ func (x *genRunner) decListFallback(varname string, rtid uintptr, t reflect.Type funcs := make(template.FuncMap) funcs["decLineVar"] = func(varname string) string { - x.decVar(varname, "", telem, false, true) + x.decVar(varname, telem, false) + return "" + } + funcs["decLine"] = func(pfx string) string { + x.decVar(ts.TempVar+pfx+ts.Rand, reflect.PtrTo(telem), false) return "" } funcs["var"] = func(s string) string { @@ -1544,11 +1402,19 @@ func (x *genRunner) decMapFallback(varname string, rtid uintptr, t reflect.Type) return telem.Kind() == reflect.Interface } funcs["decLineVarK"] = func(varname string) string { - x.decVar(varname, "", tkey, false, true) + x.decVar(varname, tkey, false) return "" } - funcs["decLineVar"] = func(varname, decodedNilVarname string) string { - x.decVar(varname, decodedNilVarname, telem, false, true) + funcs["decLineVar"] = func(varname string) string { + x.decVar(varname, telem, false) + return "" + } + funcs["decLineK"] = func(pfx string) string { + x.decVar(ts.TempVar+pfx+ts.Rand, reflect.PtrTo(tkey), false) + return "" + } + funcs["decLine"] = func(pfx string) string { + x.decVar(ts.TempVar+pfx+ts.Rand, reflect.PtrTo(telem), false) return "" } funcs["var"] = func(s string) string { @@ -1566,17 +1432,31 @@ func (x *genRunner) decMapFallback(varname string, rtid uintptr, t reflect.Type) func (x *genRunner) decStructMapSwitch(kName string, varname string, rtid uintptr, t reflect.Type) { ti := x.ti.get(rtid, t) - tisfi := ti.sfiSrc // always use sequence from file. decStruct expects same thing. + tisfi := ti.sfip // always use sequence from file. decStruct expects same thing. x.line("switch (" + kName + ") {") - var newbuf, nilbuf genBuf for _, si := range tisfi { x.line("case \"" + si.encName + "\":") - newbuf.reset() - nilbuf.reset() - t2 := x.decVarInitPtr(varname, "", t, si, &newbuf, &nilbuf) - x.linef("if r.TryDecodeAsNil() { %s } else { %s", nilbuf.buf, newbuf.buf) - x.decVarMain(varname+"."+t2.Name, x.varsfx(), t2.Type, false) - x.line("}") + var t2 reflect.StructField + if si.i != -1 { + t2 = t.Field(int(si.i)) + } else { + //we must accommodate anonymous fields, where the embedded field is a nil pointer in the value. + // t2 = t.FieldByIndex(si.is) + t2typ := t + varname3 := varname + for _, ix := range si.is { + for t2typ.Kind() == reflect.Ptr { + t2typ = t2typ.Elem() + } + t2 = t2typ.Field(ix) + t2typ = t2.Type + varname3 = varname3 + "." + t2.Name + if t2typ.Kind() == reflect.Ptr { + x.linef("if %s == nil { %s = new(%s) }", varname3, varname3, x.genTypeName(t2typ.Elem())) + } + } + } + x.decVar(varname+"."+t2.Name, t2.Type, false) } x.line("default:") // pass the slice here, so that the string will not escape, and maybe save allocation @@ -1586,10 +1466,27 @@ func (x *genRunner) decStructMapSwitch(kName string, varname string, rtid uintpt func (x *genRunner) decStructMap(varname, lenvarname string, rtid uintptr, t reflect.Type, style genStructMapStyle) { tpfx := genTempVarPfx - ti := x.ti.get(rtid, t) i := x.varsfx() kName := tpfx + "s" + i + // We thought to use ReadStringAsBytes, as go compiler might optimize the copy out. + // However, using that was more expensive, as it seems that the switch expression + // is evaluated each time. + // + // We could depend on decodeString using a temporary/shared buffer internally. + // However, this model of creating a byte array, and using explicitly is faster, + // and allows optional use of unsafe []byte->string conversion without alloc. + + // Also, ensure that the slice array doesn't escape. + // That will help escape analysis prevent allocation when it gets better. + + // x.line("var " + kName + "Arr = [32]byte{} // default string to decode into") + // x.line("var " + kName + "Slc = " + kName + "Arr[:] // default slice to decode into") + // use the scratch buffer to avoid allocation (most field names are < 32). + + x.line("var " + kName + "Slc = z.DecScratchBuffer() // default slice to decode into") + + x.line("_ = " + kName + "Slc") switch style { case genStructMapStyleLenPrefix: x.linef("for %sj%s := 0; %sj%s < %s; %sj%s++ {", tpfx, i, tpfx, i, lenvarname, tpfx, i) @@ -1601,49 +1498,60 @@ func (x *genRunner) decStructMap(varname, lenvarname string, rtid uintptr, t ref x.linef("if %shl%s { if %sj%s >= %s { break }", tpfx, i, tpfx, i, lenvarname) x.line("} else { if r.CheckBreak() { break }; }") } - x.line("r.ReadMapElemKey()") - - // emulate decstructfieldkey - switch ti.keyType { - case valueTypeInt: - x.linef("%s := z.StringView(strconv.AppendInt(z.DecScratchArrayBuffer()[:0], r.DecodeInt64(), 10))", kName) - case valueTypeUint: - x.linef("%s := z.StringView(strconv.AppendUint(z.DecScratchArrayBuffer()[:0], r.DecodeUint64(), 10))", kName) - case valueTypeFloat: - x.linef("%s := z.StringView(strconv.AppendFloat(z.DecScratchArrayBuffer()[:0], r.DecodeFloat64(), 'f', -1, 64))", kName) - default: // string - x.linef("%s := z.StringView(r.DecodeStringAsBytes())", kName) + x.linef("z.DecSendContainerState(codecSelfer_containerMapKey%s)", x.xs) + x.line(kName + "Slc = r.DecodeBytes(" + kName + "Slc, true, true)") + // let string be scoped to this loop alone, so it doesn't escape. + if x.unsafe { + x.line(kName + "SlcHdr := codecSelferUnsafeString" + x.xs + "{uintptr(unsafe.Pointer(&" + + kName + "Slc[0])), len(" + kName + "Slc)}") + x.line(kName + " := *(*string)(unsafe.Pointer(&" + kName + "SlcHdr))") + } else { + x.line(kName + " := string(" + kName + "Slc)") } - // x.linef("%s := z.StringView(r.DecStructFieldKey(codecSelferValueType%s%s, z.DecScratchArrayBuffer()))", kName, ti.keyType.String(), x.xs) - - x.line("r.ReadMapElemValue()") + x.linef("z.DecSendContainerState(codecSelfer_containerMapValue%s)", x.xs) x.decStructMapSwitch(kName, varname, rtid, t) x.line("} // end for " + tpfx + "j" + i) - x.line("r.ReadMapEnd()") + x.linef("z.DecSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) } func (x *genRunner) decStructArray(varname, lenvarname, breakString string, rtid uintptr, t reflect.Type) { tpfx := genTempVarPfx i := x.varsfx() ti := x.ti.get(rtid, t) - tisfi := ti.sfiSrc // always use sequence from file. decStruct expects same thing. + tisfi := ti.sfip // always use sequence from file. decStruct expects same thing. x.linef("var %sj%s int", tpfx, i) x.linef("var %sb%s bool", tpfx, i) // break x.linef("var %shl%s bool = %s >= 0", tpfx, i, lenvarname) // has length - var newbuf, nilbuf genBuf for _, si := range tisfi { + var t2 reflect.StructField + if si.i != -1 { + t2 = t.Field(int(si.i)) + } else { + //we must accommodate anonymous fields, where the embedded field is a nil pointer in the value. + // t2 = t.FieldByIndex(si.is) + t2typ := t + varname3 := varname + for _, ix := range si.is { + for t2typ.Kind() == reflect.Ptr { + t2typ = t2typ.Elem() + } + t2 = t2typ.Field(ix) + t2typ = t2.Type + varname3 = varname3 + "." + t2.Name + if t2typ.Kind() == reflect.Ptr { + x.linef("if %s == nil { %s = new(%s) }", varname3, varname3, x.genTypeName(t2typ.Elem())) + } + } + } + x.linef("%sj%s++; if %shl%s { %sb%s = %sj%s > %s } else { %sb%s = r.CheckBreak() }", tpfx, i, tpfx, i, tpfx, i, tpfx, i, lenvarname, tpfx, i) - x.linef("if %sb%s { r.ReadArrayEnd(); %s }", tpfx, i, breakString) - x.line("r.ReadArrayElem()") - newbuf.reset() - nilbuf.reset() - t2 := x.decVarInitPtr(varname, "", t, si, &newbuf, &nilbuf) - x.linef("if r.TryDecodeAsNil() { %s } else { %s", nilbuf.buf, newbuf.buf) - x.decVarMain(varname+"."+t2.Name, x.varsfx(), t2.Type, false) - x.line("}") + x.linef("if %sb%s { z.DecSendContainerState(codecSelfer_containerArrayEnd%s); %s }", + tpfx, i, x.xs, breakString) + x.linef("z.DecSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) + x.decVar(varname+"."+t2.Name, t2.Type, true) } // read remaining values and throw away. x.line("for {") @@ -1651,28 +1559,28 @@ func (x *genRunner) decStructArray(varname, lenvarname, breakString string, rtid tpfx, i, tpfx, i, tpfx, i, tpfx, i, lenvarname, tpfx, i) x.linef("if %sb%s { break }", tpfx, i) - x.line("r.ReadArrayElem()") + x.linef("z.DecSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) x.linef(`z.DecStructFieldNotFound(%sj%s - 1, "")`, tpfx, i) x.line("}") - x.line("r.ReadArrayEnd()") + x.linef("z.DecSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) } func (x *genRunner) decStruct(varname string, rtid uintptr, t reflect.Type) { - // varname MUST be a ptr, or a struct field or a slice element. + // if container is map i := x.varsfx() x.linef("%sct%s := r.ContainerType()", genTempVarPfx, i) x.linef("if %sct%s == codecSelferValueTypeMap%s {", genTempVarPfx, i, x.xs) x.line(genTempVarPfx + "l" + i + " := r.ReadMapStart()") x.linef("if %sl%s == 0 {", genTempVarPfx, i) - x.line("r.ReadMapEnd()") + x.linef("z.DecSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) if genUseOneFunctionForDecStructMap { x.line("} else { ") - x.linef("%s.codecDecodeSelfFromMap(%sl%s, d)", varname, genTempVarPfx, i) + x.linef("x.codecDecodeSelfFromMap(%sl%s, d)", genTempVarPfx, i) } else { x.line("} else if " + genTempVarPfx + "l" + i + " > 0 { ") - x.line(varname + ".codecDecodeSelfFromMapLenPrefix(" + genTempVarPfx + "l" + i + ", d)") + x.line("x.codecDecodeSelfFromMapLenPrefix(" + genTempVarPfx + "l" + i + ", d)") x.line("} else {") - x.line(varname + ".codecDecodeSelfFromMapCheckBreak(" + genTempVarPfx + "l" + i + ", d)") + x.line("x.codecDecodeSelfFromMapCheckBreak(" + genTempVarPfx + "l" + i + ", d)") } x.line("}") @@ -1680,13 +1588,13 @@ func (x *genRunner) decStruct(varname string, rtid uintptr, t reflect.Type) { x.linef("} else if %sct%s == codecSelferValueTypeArray%s {", genTempVarPfx, i, x.xs) x.line(genTempVarPfx + "l" + i + " := r.ReadArrayStart()") x.linef("if %sl%s == 0 {", genTempVarPfx, i) - x.line("r.ReadArrayEnd()") + x.linef("z.DecSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) x.line("} else { ") - x.linef("%s.codecDecodeSelfFromArray(%sl%s, d)", varname, genTempVarPfx, i) + x.linef("x.codecDecodeSelfFromArray(%sl%s, d)", genTempVarPfx, i) x.line("}") // else panic x.line("} else { ") - x.line("panic(errCodecSelferOnlyMapOrArrayEncodeToStruct" + x.xs + ")") + x.line("panic(codecSelferOnlyMapOrArrayEncodeToStructErr" + x.xs + ")") x.line("} ") } @@ -1745,8 +1653,15 @@ func (x *genV) MethodNamePfx(prefix string, prim bool) string { func genImportPath(t reflect.Type) (s string) { s = t.PkgPath() if genCheckVendor { - // HACK: always handle vendoring. It should be typically on in go 1.6, 1.7 - s = genStripVendor(s) + // HACK: Misbehaviour occurs in go 1.5. May have to re-visit this later. + // if s contains /vendor/ OR startsWith vendor/, then return everything after it. + const vendorStart = "vendor/" + const vendorInline = "/vendor/" + if i := strings.LastIndex(s, vendorInline); i >= 0 { + s = s[i+len(vendorInline):] + } else if strings.HasPrefix(s, vendorStart) { + s = s[len(vendorStart):] + } } return } @@ -1868,13 +1783,13 @@ func genIsImmutable(t reflect.Type) (v bool) { } type genInternal struct { - Version int - Values []genV + Values []genV + Unsafe bool } func (x genInternal) FastpathLen() (l int) { for _, v := range x.Values { - if v.Primitive == "" && !(v.MapKey == "" && v.Elem == "uint8") { + if v.Primitive == "" { l++ } } @@ -1894,32 +1809,6 @@ func genInternalZeroValue(s string) string { } } -var genInternalNonZeroValueIdx [5]uint64 -var genInternalNonZeroValueStrs = [2][5]string{ - {`"string-is-an-interface"`, "true", `"some-string"`, "11.1", "33"}, - {`"string-is-an-interface-2"`, "true", `"some-string-2"`, "22.2", "44"}, -} - -func genInternalNonZeroValue(s string) string { - switch s { - case "interface{}", "interface {}": - genInternalNonZeroValueIdx[0]++ - return genInternalNonZeroValueStrs[genInternalNonZeroValueIdx[0]%2][0] // return string, to remove ambiguity - case "bool": - genInternalNonZeroValueIdx[1]++ - return genInternalNonZeroValueStrs[genInternalNonZeroValueIdx[1]%2][1] - case "string": - genInternalNonZeroValueIdx[2]++ - return genInternalNonZeroValueStrs[genInternalNonZeroValueIdx[2]%2][2] - case "float32", "float64", "float", "double": - genInternalNonZeroValueIdx[3]++ - return genInternalNonZeroValueStrs[genInternalNonZeroValueIdx[3]%2][3] - default: - genInternalNonZeroValueIdx[4]++ - return genInternalNonZeroValueStrs[genInternalNonZeroValueIdx[4]%2][4] - } -} - func genInternalEncCommandAsString(s string, vname string) string { switch s { case "uint", "uint8", "uint16", "uint32", "uint64": @@ -1927,15 +1816,15 @@ func genInternalEncCommandAsString(s string, vname string) string { case "int", "int8", "int16", "int32", "int64": return "ee.EncodeInt(int64(" + vname + "))" case "string": - return "ee.EncodeString(cUTF8, " + vname + ")" + return "ee.EncodeString(c_UTF8, " + vname + ")" case "float32": return "ee.EncodeFloat32(" + vname + ")" case "float64": return "ee.EncodeFloat64(" + vname + ")" case "bool": return "ee.EncodeBool(" + vname + ")" - // case "symbol": - // return "ee.EncodeSymbol(" + vname + ")" + case "symbol": + return "ee.EncodeSymbol(" + vname + ")" default: return "e.encode(" + vname + ")" } @@ -1944,34 +1833,34 @@ func genInternalEncCommandAsString(s string, vname string) string { func genInternalDecCommandAsString(s string) string { switch s { case "uint": - return "uint(chkOvf.UintV(dd.DecodeUint64(), uintBitsize))" + return "uint(dd.DecodeUint(uintBitsize))" case "uint8": - return "uint8(chkOvf.UintV(dd.DecodeUint64(), 8))" + return "uint8(dd.DecodeUint(8))" case "uint16": - return "uint16(chkOvf.UintV(dd.DecodeUint64(), 16))" + return "uint16(dd.DecodeUint(16))" case "uint32": - return "uint32(chkOvf.UintV(dd.DecodeUint64(), 32))" + return "uint32(dd.DecodeUint(32))" case "uint64": - return "dd.DecodeUint64()" + return "dd.DecodeUint(64)" case "uintptr": - return "uintptr(chkOvf.UintV(dd.DecodeUint64(), uintBitsize))" + return "uintptr(dd.DecodeUint(uintBitsize))" case "int": - return "int(chkOvf.IntV(dd.DecodeInt64(), intBitsize))" + return "int(dd.DecodeInt(intBitsize))" case "int8": - return "int8(chkOvf.IntV(dd.DecodeInt64(), 8))" + return "int8(dd.DecodeInt(8))" case "int16": - return "int16(chkOvf.IntV(dd.DecodeInt64(), 16))" + return "int16(dd.DecodeInt(16))" case "int32": - return "int32(chkOvf.IntV(dd.DecodeInt64(), 32))" + return "int32(dd.DecodeInt(32))" case "int64": - return "dd.DecodeInt64()" + return "dd.DecodeInt(64)" case "string": return "dd.DecodeString()" case "float32": - return "float32(chkOvf.Float32V(dd.DecodeFloat64()))" + return "float32(dd.DecodeFloat(true))" case "float64": - return "dd.DecodeFloat64()" + return "dd.DecodeFloat(false)" case "bool": return "dd.DecodeBool()" default: @@ -1995,21 +1884,8 @@ func genInternalSortType(s string, elem bool) string { panic("sorttype: unexpected type: " + s) } -func genStripVendor(s string) string { - // HACK: Misbehaviour occurs in go 1.5. May have to re-visit this later. - // if s contains /vendor/ OR startsWith vendor/, then return everything after it. - const vendorStart = "vendor/" - const vendorInline = "/vendor/" - if i := strings.LastIndex(s, vendorInline); i >= 0 { - s = s[i+len(vendorInline):] - } else if strings.HasPrefix(s, vendorStart) { - s = s[len(vendorStart):] - } - return s -} - // var genInternalMu sync.Mutex -var genInternalV = genInternal{Version: genVersion} +var genInternalV genInternal var genInternalTmplFuncs template.FuncMap var genInternalOnce sync.Once @@ -2072,15 +1948,14 @@ func genInternalInit() { "float64": 8, "bool": 1, } - var gt = genInternal{Version: genVersion} + var gt genInternal // For each slice or map type, there must be a (symmetrical) Encode and Decode fast-path function for _, s := range types { gt.Values = append(gt.Values, genV{Primitive: s, Size: mapvaltypes2[s]}) - // if s != "uint8" { // do not generate fast path for slice of bytes. Treat specially already. - // gt.Values = append(gt.Values, genV{Elem: s, Size: mapvaltypes2[s]}) - // } - gt.Values = append(gt.Values, genV{Elem: s, Size: mapvaltypes2[s]}) + if s != "uint8" { // do not generate fast path for slice of bytes. Treat specially already. + gt.Values = append(gt.Values, genV{Elem: s, Size: mapvaltypes2[s]}) + } if _, ok := mapvaltypes2[s]; !ok { gt.Values = append(gt.Values, genV{MapKey: s, Elem: s, Size: 2 * mapvaltypes2[s]}) } @@ -2094,7 +1969,6 @@ func genInternalInit() { funcs["encmd"] = genInternalEncCommandAsString funcs["decmd"] = genInternalDecCommandAsString funcs["zerocmd"] = genInternalZeroValue - funcs["nonzerocmd"] = genInternalNonZeroValue funcs["hasprefix"] = strings.HasPrefix funcs["sorttype"] = genInternalSortType @@ -2106,10 +1980,11 @@ func genInternalInit() { // It is run by the program author alone. // Unfortunately, it has to be exported so that it can be called from a command line tool. // *** DO NOT USE *** -func genInternalGoFile(r io.Reader, w io.Writer) (err error) { +func genInternalGoFile(r io.Reader, w io.Writer, safe bool) (err error) { genInternalOnce.Do(genInternalInit) gt := genInternalV + gt.Unsafe = !safe t := template.New("").Funcs(genInternalTmplFuncs) diff --git a/vendor/github.com/ugorji/go/codec/gen_15.go b/vendor/github.com/ugorji/go/codec/gen_15.go new file mode 100644 index 000000000..ab76c3102 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/gen_15.go @@ -0,0 +1,12 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.5,!go1.6 + +package codec + +import "os" + +func init() { + genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") == "1" +} diff --git a/vendor/github.com/ugorji/go/codec/gen_16.go b/vendor/github.com/ugorji/go/codec/gen_16.go new file mode 100644 index 000000000..87c04e2e1 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/gen_16.go @@ -0,0 +1,12 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +// +build go1.6 + +package codec + +import "os" + +func init() { + genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") != "0" +} diff --git a/vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go b/vendor/github.com/ugorji/go/codec/gen_17.go similarity index 53% rename from vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go rename to vendor/github.com/ugorji/go/codec/gen_17.go index c5b815505..3881a43ce 100644 --- a/vendor/github.com/ugorji/go/codec/goversion_vendor_gte_go17.go +++ b/vendor/github.com/ugorji/go/codec/gen_17.go @@ -1,8 +1,10 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. // +build go1.7 package codec -const genCheckVendor = true +func init() { + genCheckVendor = true +} diff --git a/vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go b/vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go deleted file mode 100644 index 9ddbe2059..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_arrayof_gte_go15.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.5 - -package codec - -import "reflect" - -const reflectArrayOfSupported = true - -func reflectArrayOf(count int, elem reflect.Type) reflect.Type { - return reflect.ArrayOf(count, elem) -} diff --git a/vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go b/vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go deleted file mode 100644 index c5fcd6697..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_arrayof_lt_go15.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build !go1.5 - -package codec - -import "reflect" - -const reflectArrayOfSupported = false - -func reflectArrayOf(count int, elem reflect.Type) reflect.Type { - panic("codec: reflect.ArrayOf unsupported in this go version") -} diff --git a/vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go b/vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go deleted file mode 100644 index bc39d6b71..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_makemap_gte_go19.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.9 - -package codec - -import "reflect" - -func makeMapReflect(t reflect.Type, size int) reflect.Value { - if size < 0 { - return reflect.MakeMapWithSize(t, 4) - } - return reflect.MakeMapWithSize(t, size) -} diff --git a/vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go b/vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go deleted file mode 100644 index cde4cd372..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_makemap_lt_go19.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build !go1.9 - -package codec - -import "reflect" - -func makeMapReflect(t reflect.Type, size int) reflect.Value { - return reflect.MakeMap(t) -} diff --git a/vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go b/vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go deleted file mode 100644 index 794133a3c..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_gte_go110.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.10 - -package codec - -const allowSetUnexportedEmbeddedPtr = false diff --git a/vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go b/vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go deleted file mode 100644 index fd92ede35..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_unexportedembeddedptr_lt_go110.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build !go1.10 - -package codec - -const allowSetUnexportedEmbeddedPtr = true diff --git a/vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go b/vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go deleted file mode 100644 index 8debfa613..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_unsupported_lt_go14.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build !go1.4 - -package codec - -// This codec package will only work for go1.4 and above. -// This is for the following reasons: -// - go 1.4 was released in 2014 -// - go runtime is written fully in go -// - interface only holds pointers -// - reflect.Value is stabilized as 3 words - -func init() { - panic("codec: go 1.3 and below are not supported") -} diff --git a/vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go b/vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go deleted file mode 100644 index 0f1bb01e5..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go15.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.5,!go1.6 - -package codec - -import "os" - -var genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") == "1" diff --git a/vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go b/vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go deleted file mode 100644 index 2fb4b057d..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_vendor_eq_go16.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.6,!go1.7 - -package codec - -import "os" - -var genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") != "0" diff --git a/vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go b/vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go deleted file mode 100644 index 837cf240b..000000000 --- a/vendor/github.com/ugorji/go/codec/goversion_vendor_lt_go15.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build !go1.5 - -package codec - -var genCheckVendor = false diff --git a/vendor/github.com/ugorji/go/codec/helper.go b/vendor/github.com/ugorji/go/codec/helper.go index bd29895b6..8b94fc1e4 100644 --- a/vendor/github.com/ugorji/go/codec/helper.go +++ b/vendor/github.com/ugorji/go/codec/helper.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec @@ -102,11 +102,9 @@ import ( "encoding/binary" "errors" "fmt" - "io" "math" "reflect" "sort" - "strconv" "strings" "sync" "time" @@ -114,28 +112,32 @@ import ( const ( scratchByteArrayLen = 32 - // initCollectionCap = 16 // 32 is defensive. 16 is preferred. + initCollectionCap = 32 // 32 is defensive. 16 is preferred. // Support encoding.(Binary|Text)(Unm|M)arshaler. // This constant flag will enable or disable it. supportMarshalInterfaces = true + // Each Encoder or Decoder uses a cache of functions based on conditionals, + // so that the conditionals are not run every time. + // + // Either a map or a slice is used to keep track of the functions. + // The map is more natural, but has a higher cost than a slice/array. + // This flag (useMapForCodecCache) controls which is used. + // + // From benchmarks, slices with linear search perform better with < 32 entries. + // We have typically seen a high threshold of about 24 entries. + useMapForCodecCache = false + // for debugging, set this to false, to catch panic traces. // Note that this will always cause rpc tests to fail, since they need io.EOF sent via panic. recoverPanicToErr = true - // arrayCacheLen is the length of the cache used in encoder or decoder for - // allowing zero-alloc initialization. - arrayCacheLen = 8 - - // size of the cacheline: defaulting to value for archs: amd64, arm64, 386 - // should use "runtime/internal/sys".CacheLineSize, but that is not exposed. - cacheLineSize = 64 - - wordSizeBits = 32 << (^uint(0) >> 63) // strconv.IntSize - wordSize = wordSizeBits / 8 - - maxLevelsEmbedding = 15 // use this, so structFieldInfo fits into 8 bytes + // if resetSliceElemToZeroValue, then on decoding a slice, reset the element to a zero value first. + // Only concern is that, if the slice already contained some garbage, we will decode into that garbage. + // The chances of this are slim, so leave this "optimization". + // TODO: should this be true, to ensure that we always decode into a "zero" "empty" value? + resetSliceElemToZeroValue bool = false ) var ( @@ -143,28 +145,15 @@ var ( zeroByteSlice = oneByteArr[:0:0] ) -var refBitset bitset32 -var pool pooler -var panicv panicHdl - -func init() { - pool.init() - - refBitset.set(byte(reflect.Map)) - refBitset.set(byte(reflect.Ptr)) - refBitset.set(byte(reflect.Func)) - refBitset.set(byte(reflect.Chan)) -} - type charEncoding uint8 const ( - cRAW charEncoding = iota - cUTF8 - cUTF16LE - cUTF16BE - cUTF32LE - cUTF32BE + c_RAW charEncoding = iota + c_UTF8 + c_UTF16LE + c_UTF16BE + c_UTF32LE + c_UTF32BE ) // valueType is the stream type @@ -182,35 +171,12 @@ const ( valueTypeBytes valueTypeMap valueTypeArray - valueTypeTime + valueTypeTimestamp valueTypeExt // valueTypeInvalid = 0xff ) -var valueTypeStrings = [...]string{ - "Unset", - "Nil", - "Int", - "Uint", - "Float", - "Bool", - "String", - "Symbol", - "Bytes", - "Map", - "Array", - "Timestamp", - "Ext", -} - -func (x valueType) String() string { - if int(x) < len(valueTypeStrings) { - return valueTypeStrings[x] - } - return strconv.FormatInt(int64(x), 10) -} - type seqType uint8 const ( @@ -236,11 +202,11 @@ const ( containerArrayEnd ) -// // sfiIdx used for tracking where a (field/enc)Name is seen in a []*structFieldInfo -// type sfiIdx struct { -// name string -// index int -// } +// sfiIdx used for tracking where a (field/enc)Name is seen in a []*structFieldInfo +type sfiIdx struct { + name string + index int +} // do not recurse if a containing type refers to an embedded type // which refers back to its containing type (via a pointer). @@ -249,39 +215,34 @@ const ( const rgetMaxRecursion = 2 // Anecdotally, we believe most types have <= 12 fields. -// - even Java's PMD rules set TooManyFields threshold to 15. -// However, go has embedded fields, which should be regarded as -// top level, allowing structs to possibly double or triple. -// In addition, we don't want to keep creating transient arrays, -// especially for the sfi index tracking, and the evtypes tracking. -// -// So - try to keep typeInfoLoadArray within 2K bytes -const ( - typeInfoLoadArraySfisLen = 16 - typeInfoLoadArraySfiidxLen = 8 * 112 - typeInfoLoadArrayEtypesLen = 12 - typeInfoLoadArrayBLen = 8 * 4 -) +// Java's PMD rules set TooManyFields threshold to 15. +const rgetPoolTArrayLen = 12 + +type rgetT struct { + fNames []string + encNames []string + etypes []uintptr + sfis []*structFieldInfo +} + +type rgetPoolT struct { + fNames [rgetPoolTArrayLen]string + encNames [rgetPoolTArrayLen]string + etypes [rgetPoolTArrayLen]uintptr + sfis [rgetPoolTArrayLen]*structFieldInfo + sfiidx [rgetPoolTArrayLen]sfiIdx +} -type typeInfoLoad struct { - // fNames []string - // encNames []string - etypes []uintptr - sfis []structFieldInfo +var rgetPool = sync.Pool{ + New: func() interface{} { return new(rgetPoolT) }, } -type typeInfoLoadArray struct { - // fNames [typeInfoLoadArrayLen]string - // encNames [typeInfoLoadArrayLen]string - sfis [typeInfoLoadArraySfisLen]structFieldInfo - sfiidx [typeInfoLoadArraySfiidxLen]byte - etypes [typeInfoLoadArrayEtypesLen]uintptr - b [typeInfoLoadArrayBLen]byte // scratch - used for struct field names +type containerStateRecv interface { + sendContainerState(containerState) } // mirror json.Marshaler and json.Unmarshaler here, // so we don't import the encoding/json package - type jsonMarshaler interface { MarshalJSON() ([]byte, error) } @@ -289,12 +250,6 @@ type jsonUnmarshaler interface { UnmarshalJSON([]byte) error } -type isZeroer interface { - IsZero() bool -} - -// type byteAccepter func(byte) bool - var ( bigen = binary.BigEndian structInfoFieldName = "_struct" @@ -304,17 +259,11 @@ var ( intfSliceTyp = reflect.TypeOf([]interface{}(nil)) intfTyp = intfSliceTyp.Elem() - reflectValTyp = reflect.TypeOf((*reflect.Value)(nil)).Elem() - stringTyp = reflect.TypeOf("") timeTyp = reflect.TypeOf(time.Time{}) rawExtTyp = reflect.TypeOf(RawExt{}) rawTyp = reflect.TypeOf(Raw{}) - uintptrTyp = reflect.TypeOf(uintptr(0)) - uint8Typ = reflect.TypeOf(uint8(0)) uint8SliceTyp = reflect.TypeOf([]uint8(nil)) - uintTyp = reflect.TypeOf(uint(0)) - intTyp = reflect.TypeOf(int(0)) mapBySliceTyp = reflect.TypeOf((*MapBySlice)(nil)).Elem() @@ -328,130 +277,65 @@ var ( jsonUnmarshalerTyp = reflect.TypeOf((*jsonUnmarshaler)(nil)).Elem() selferTyp = reflect.TypeOf((*Selfer)(nil)).Elem() - iszeroTyp = reflect.TypeOf((*isZeroer)(nil)).Elem() - uint8TypId = rt2id(uint8Typ) - uint8SliceTypId = rt2id(uint8SliceTyp) - rawExtTypId = rt2id(rawExtTyp) - rawTypId = rt2id(rawTyp) - intfTypId = rt2id(intfTyp) - timeTypId = rt2id(timeTyp) - stringTypId = rt2id(stringTyp) + uint8SliceTypId = reflect.ValueOf(uint8SliceTyp).Pointer() + rawExtTypId = reflect.ValueOf(rawExtTyp).Pointer() + rawTypId = reflect.ValueOf(rawTyp).Pointer() + intfTypId = reflect.ValueOf(intfTyp).Pointer() + timeTypId = reflect.ValueOf(timeTyp).Pointer() + stringTypId = reflect.ValueOf(stringTyp).Pointer() - mapStrIntfTypId = rt2id(mapStrIntfTyp) - mapIntfIntfTypId = rt2id(mapIntfIntfTyp) - intfSliceTypId = rt2id(intfSliceTyp) - // mapBySliceTypId = rt2id(mapBySliceTyp) + mapStrIntfTypId = reflect.ValueOf(mapStrIntfTyp).Pointer() + mapIntfIntfTypId = reflect.ValueOf(mapIntfIntfTyp).Pointer() + intfSliceTypId = reflect.ValueOf(intfSliceTyp).Pointer() + // mapBySliceTypId = reflect.ValueOf(mapBySliceTyp).Pointer() - intBitsize = uint8(intTyp.Bits()) - uintBitsize = uint8(uintTyp.Bits()) + intBitsize uint8 = uint8(reflect.TypeOf(int(0)).Bits()) + uintBitsize uint8 = uint8(reflect.TypeOf(uint(0)).Bits()) bsAll0x00 = []byte{0, 0, 0, 0, 0, 0, 0, 0} bsAll0xff = []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} chkOvf checkOverflow - errNoFieldNameToStructFieldInfo = errors.New("no field name passed to parseStructFieldInfo") + noFieldNameToStructFieldInfoErr = errors.New("no field name passed to parseStructFieldInfo") ) var defTypeInfos = NewTypeInfos([]string{"codec", "json"}) -var immutableKindsSet = [32]bool{ - // reflect.Invalid: , - reflect.Bool: true, - reflect.Int: true, - reflect.Int8: true, - reflect.Int16: true, - reflect.Int32: true, - reflect.Int64: true, - reflect.Uint: true, - reflect.Uint8: true, - reflect.Uint16: true, - reflect.Uint32: true, - reflect.Uint64: true, - reflect.Uintptr: true, - reflect.Float32: true, - reflect.Float64: true, - reflect.Complex64: true, - reflect.Complex128: true, - // reflect.Array - // reflect.Chan - // reflect.Func: true, - // reflect.Interface - // reflect.Map - // reflect.Ptr - // reflect.Slice - reflect.String: true, - // reflect.Struct - // reflect.UnsafePointer -} - // Selfer defines methods by which a value can encode or decode itself. // // Any type which implements Selfer will be able to encode or decode itself. // Consequently, during (en|de)code, this takes precedence over // (text|binary)(M|Unm)arshal or extension support. -// -// Note: *the first set of bytes of any value MUST NOT represent nil in the format*. -// This is because, during each decode, we first check the the next set of bytes -// represent nil, and if so, we just set the value to nil. type Selfer interface { CodecEncodeSelf(*Encoder) CodecDecodeSelf(*Decoder) } -// MapBySlice is a tag interface that denotes wrapped slice should encode as a map in the stream. +// MapBySlice represents a slice which should be encoded as a map in the stream. // The slice contains a sequence of key-value pairs. // This affords storing a map in a specific sequence in the stream. // -// Example usage: -// type T1 []string // or []int or []Point or any other "slice" type -// func (_ T1) MapBySlice{} // T1 now implements MapBySlice, and will be encoded as a map -// type T2 struct { KeyValues T1 } -// -// var kvs = []string{"one", "1", "two", "2", "three", "3"} -// var v2 = T2{ KeyValues: T1(kvs) } -// // v2 will be encoded like the map: {"KeyValues": {"one": "1", "two": "2", "three": "3"} } -// // The support of MapBySlice affords the following: // - A slice type which implements MapBySlice will be encoded as a map // - A slice can be decoded from a map in the stream -// - It MUST be a slice type (not a pointer receiver) that implements MapBySlice type MapBySlice interface { MapBySlice() } -// BasicHandle encapsulates the common options and extension functions. +// WARNING: DO NOT USE DIRECTLY. EXPORTED FOR GODOC BENEFIT. WILL BE REMOVED. // -// Deprecated: DO NOT USE DIRECTLY. EXPORTED FOR GODOC BENEFIT. WILL BE REMOVED. +// BasicHandle encapsulates the common options and extension functions. type BasicHandle struct { - // BasicHandle is always a part of a different type. - // It doesn't have to fit into it own cache lines. - // TypeInfos is used to get the type info for any type. // // If not configured, the default TypeInfos is used, which uses struct tag keys: codec, json TypeInfos *TypeInfos - // Note: BasicHandle is not comparable, due to these slices here (extHandle, intf2impls). - // If *[]T is used instead, this becomes comparable, at the cost of extra indirection. - // Thses slices are used all the time, so keep as slices (not pointers). - extHandle - - intf2impls - - RPCOptions - - // ---- cache line - - DecodeOptions - - // ---- cache line - EncodeOptions - - // noBuiltInTypeChecker + DecodeOptions } func (x *BasicHandle) getBasicHandle() *BasicHandle { @@ -459,10 +343,10 @@ func (x *BasicHandle) getBasicHandle() *BasicHandle { } func (x *BasicHandle) getTypeInfo(rtid uintptr, rt reflect.Type) (pti *typeInfo) { - if x.TypeInfos == nil { - return defTypeInfos.get(rtid, rt) + if x.TypeInfos != nil { + return x.TypeInfos.get(rtid, rt) } - return x.TypeInfos.get(rtid, rt) + return defTypeInfos.get(rtid, rt) } // Handle is the interface for a specific encoding format. @@ -471,36 +355,28 @@ func (x *BasicHandle) getTypeInfo(rtid uintptr, rt reflect.Type) (pti *typeInfo) // and not modified while in use. Such a pre-configured Handle // is safe for concurrent access. type Handle interface { - Name() string getBasicHandle() *BasicHandle - recreateEncDriver(encDriver) bool newEncDriver(w *Encoder) encDriver newDecDriver(r *Decoder) decDriver isBinary() bool - hasElemSeparators() bool - // IsBuiltinType(rtid uintptr) bool } // Raw represents raw formatted bytes. -// We "blindly" store it during encode and retrieve the raw bytes during decode. -// Note: it is dangerous during encode, so we may gate the behaviour -// behind an Encode flag which must be explicitly set. +// We "blindly" store it during encode and store the raw bytes during decode. +// Note: it is dangerous during encode, so we may gate the behaviour behind an Encode flag which must be explicitly set. type Raw []byte // RawExt represents raw unprocessed extension data. -// Some codecs will decode extension data as a *RawExt -// if there is no registered extension for the tag. +// Some codecs will decode extension data as a *RawExt if there is no registered extension for the tag. // -// Only one of Data or Value is nil. -// If Data is nil, then the content of the RawExt is in the Value. +// Only one of Data or Value is nil. If Data is nil, then the content of the RawExt is in the Value. type RawExt struct { Tag uint64 - // Data is the []byte which represents the raw ext. If nil, ext is exposed in Value. - // Data is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of types + // Data is the []byte which represents the raw ext. If Data is nil, ext is exposed in Value. + // Data is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of the types Data []byte // Value represents the extension, if Data is nil. - // Value is used by codecs (e.g. cbor, json) which leverage the format to do - // custom serialization of the types. + // Value is used by codecs (e.g. cbor, json) which use the format to do custom serialization of the types. Value interface{} } @@ -509,30 +385,24 @@ type RawExt struct { type BytesExt interface { // WriteExt converts a value to a []byte. // - // Note: v is a pointer iff the registered extension type is a struct or array kind. + // Note: v *may* be a pointer to the extension type, if the extension type was a struct or array. WriteExt(v interface{}) []byte // ReadExt updates a value from a []byte. - // - // Note: dst is always a pointer kind to the registered extension type. ReadExt(dst interface{}, src []byte) } // InterfaceExt handles custom (de)serialization of types to/from another interface{} value. // The Encoder or Decoder will then handle the further (de)serialization of that known type. // -// It is used by codecs (e.g. cbor, json) which use the format to do custom serialization of types. +// It is used by codecs (e.g. cbor, json) which use the format to do custom serialization of the types. type InterfaceExt interface { - // ConvertExt converts a value into a simpler interface for easy encoding - // e.g. convert time.Time to int64. + // ConvertExt converts a value into a simpler interface for easy encoding e.g. convert time.Time to int64. // - // Note: v is a pointer iff the registered extension type is a struct or array kind. + // Note: v *may* be a pointer to the extension type, if the extension type was a struct or array. ConvertExt(v interface{}) interface{} - // UpdateExt updates a value from a simpler interface for easy decoding - // e.g. convert int64 to time.Time. - // - // Note: dst is always a pointer kind to the registered extension type. + // UpdateExt updates a value from a simpler interface for easy decoding e.g. convert int64 to time.Time. UpdateExt(dst interface{}, src interface{}) } @@ -570,59 +440,64 @@ func (x addExtWrapper) UpdateExt(dest interface{}, v interface{}) { x.ReadExt(dest, v.([]byte)) } -type extWrapper struct { - BytesExt - InterfaceExt +type setExtWrapper struct { + b BytesExt + i InterfaceExt } -type bytesExtFailer struct{} - -func (bytesExtFailer) WriteExt(v interface{}) []byte { - panicv.errorstr("BytesExt.WriteExt is not supported") - return nil +func (x *setExtWrapper) WriteExt(v interface{}) []byte { + if x.b == nil { + panic("BytesExt.WriteExt is not supported") + } + return x.b.WriteExt(v) } -func (bytesExtFailer) ReadExt(v interface{}, bs []byte) { - panicv.errorstr("BytesExt.ReadExt is not supported") + +func (x *setExtWrapper) ReadExt(v interface{}, bs []byte) { + if x.b == nil { + panic("BytesExt.WriteExt is not supported") + + } + x.b.ReadExt(v, bs) } -type interfaceExtFailer struct{} +func (x *setExtWrapper) ConvertExt(v interface{}) interface{} { + if x.i == nil { + panic("InterfaceExt.ConvertExt is not supported") -func (interfaceExtFailer) ConvertExt(v interface{}) interface{} { - panicv.errorstr("InterfaceExt.ConvertExt is not supported") - return nil + } + return x.i.ConvertExt(v) } -func (interfaceExtFailer) UpdateExt(dest interface{}, v interface{}) { - panicv.errorstr("InterfaceExt.UpdateExt is not supported") + +func (x *setExtWrapper) UpdateExt(dest interface{}, v interface{}) { + if x.i == nil { + panic("InterfaceExxt.UpdateExt is not supported") + + } + x.i.UpdateExt(dest, v) } +// type errorString string +// func (x errorString) Error() string { return string(x) } + type binaryEncodingType struct{} -func (binaryEncodingType) isBinary() bool { return true } +func (_ binaryEncodingType) isBinary() bool { return true } type textEncodingType struct{} -func (textEncodingType) isBinary() bool { return false } +func (_ textEncodingType) isBinary() bool { return false } // noBuiltInTypes is embedded into many types which do not support builtins // e.g. msgpack, simple, cbor. - -// type noBuiltInTypeChecker struct{} -// func (noBuiltInTypeChecker) IsBuiltinType(rt uintptr) bool { return false } -// type noBuiltInTypes struct{ noBuiltInTypeChecker } - type noBuiltInTypes struct{} -func (noBuiltInTypes) EncodeBuiltin(rt uintptr, v interface{}) {} -func (noBuiltInTypes) DecodeBuiltin(rt uintptr, v interface{}) {} +func (_ noBuiltInTypes) IsBuiltinType(rt uintptr) bool { return false } +func (_ noBuiltInTypes) EncodeBuiltin(rt uintptr, v interface{}) {} +func (_ noBuiltInTypes) DecodeBuiltin(rt uintptr, v interface{}) {} -// type noStreamingCodec struct{} -// func (noStreamingCodec) CheckBreak() bool { return false } -// func (noStreamingCodec) hasElemSeparators() bool { return false } +type noStreamingCodec struct{} -type noElemSeparators struct{} - -func (noElemSeparators) hasElemSeparators() (v bool) { return } -func (noElemSeparators) recreateEncDriver(e encDriver) (v bool) { return } +func (_ noStreamingCodec) CheckBreak() bool { return false } // bigenHelper. // Users must already slice the x completely, because we will not reslice. @@ -647,256 +522,165 @@ func (z bigenHelper) writeUint64(v uint64) { } type extTypeTagFn struct { - rtid uintptr - rtidptr uintptr - rt reflect.Type - tag uint64 - ext Ext - _ [1]uint64 // padding + rtid uintptr + rt reflect.Type + tag uint64 + ext Ext } type extHandle []extTypeTagFn +// DEPRECATED: Use SetBytesExt or SetInterfaceExt on the Handle instead. +// // AddExt registes an encode and decode function for a reflect.Type. +// AddExt internally calls SetExt. // To deregister an Ext, call AddExt with nil encfn and/or nil decfn. -// -// Deprecated: Use SetBytesExt or SetInterfaceExt on the Handle instead. -func (o *extHandle) AddExt(rt reflect.Type, tag byte, - encfn func(reflect.Value) ([]byte, error), - decfn func(reflect.Value, []byte) error) (err error) { +func (o *extHandle) AddExt( + rt reflect.Type, tag byte, + encfn func(reflect.Value) ([]byte, error), decfn func(reflect.Value, []byte) error, +) (err error) { if encfn == nil || decfn == nil { return o.SetExt(rt, uint64(tag), nil) } return o.SetExt(rt, uint64(tag), addExtWrapper{encfn, decfn}) } -// SetExt will set the extension for a tag and reflect.Type. -// Note that the type must be a named type, and specifically not a pointer or Interface. -// An error is returned if that is not honored. -// To Deregister an ext, call SetExt with nil Ext. +// DEPRECATED: Use SetBytesExt or SetInterfaceExt on the Handle instead. // -// Deprecated: Use SetBytesExt or SetInterfaceExt on the Handle instead. +// Note that the type must be a named type, and specifically not +// a pointer or Interface. An error is returned if that is not honored. +// +// To Deregister an ext, call SetExt with nil Ext func (o *extHandle) SetExt(rt reflect.Type, tag uint64, ext Ext) (err error) { // o is a pointer, because we may need to initialize it - rk := rt.Kind() - for rk == reflect.Ptr { - rt = rt.Elem() - rk = rt.Kind() - } - - if rt.PkgPath() == "" || rk == reflect.Interface { // || rk == reflect.Ptr { - return fmt.Errorf("codec.Handle.SetExt: Takes named type, not a pointer or interface: %v", rt) + if rt.PkgPath() == "" || rt.Kind() == reflect.Interface { + err = fmt.Errorf("codec.Handle.AddExt: Takes named type, not a pointer or interface: %T", + reflect.Zero(rt).Interface()) + return } - rtid := rt2id(rt) - switch rtid { - case timeTypId, rawTypId, rawExtTypId: - // all natively supported type, so cannot have an extension - return // TODO: should we silently ignore, or return an error??? - } - // if o == nil { - // return errors.New("codec.Handle.SetExt: extHandle not initialized") - // } - o2 := *o - // if o2 == nil { - // return errors.New("codec.Handle.SetExt: extHandle not initialized") - // } - for i := range o2 { - v := &o2[i] + rtid := reflect.ValueOf(rt).Pointer() + for _, v := range *o { if v.rtid == rtid { v.tag, v.ext = tag, ext return } } - rtidptr := rt2id(reflect.PtrTo(rt)) - *o = append(o2, extTypeTagFn{rtid, rtidptr, rt, tag, ext, [1]uint64{}}) + + if *o == nil { + *o = make([]extTypeTagFn, 0, 4) + } + *o = append(*o, extTypeTagFn{rtid, rt, tag, ext}) return } -func (o extHandle) getExt(rtid uintptr) (v *extTypeTagFn) { +func (o extHandle) getExt(rtid uintptr) *extTypeTagFn { + var v *extTypeTagFn for i := range o { v = &o[i] - if v.rtid == rtid || v.rtidptr == rtid { - return + if v.rtid == rtid { + return v } } return nil } -func (o extHandle) getExtForTag(tag uint64) (v *extTypeTagFn) { +func (o extHandle) getExtForTag(tag uint64) *extTypeTagFn { + var v *extTypeTagFn for i := range o { v = &o[i] if v.tag == tag { - return + return v } } return nil } -type intf2impl struct { - rtid uintptr // for intf - impl reflect.Type - // _ [1]uint64 // padding // not-needed, as *intf2impl is never returned. -} - -type intf2impls []intf2impl - -// Intf2Impl maps an interface to an implementing type. -// This allows us support infering the concrete type -// and populating it when passed an interface. -// e.g. var v io.Reader can be decoded as a bytes.Buffer, etc. -// -// Passing a nil impl will clear the mapping. -func (o *intf2impls) Intf2Impl(intf, impl reflect.Type) (err error) { - if impl != nil && !impl.Implements(intf) { - return fmt.Errorf("Intf2Impl: %v does not implement %v", impl, intf) - } - rtid := rt2id(intf) - o2 := *o - for i := range o2 { - v := &o2[i] - if v.rtid == rtid { - v.impl = impl - return - } - } - *o = append(o2, intf2impl{rtid, impl}) - return -} - -func (o intf2impls) intf2impl(rtid uintptr) (rv reflect.Value) { - for i := range o { - v := &o[i] - if v.rtid == rtid { - if v.impl == nil { - return - } - if v.impl.Kind() == reflect.Ptr { - return reflect.New(v.impl.Elem()) - } - return reflect.New(v.impl).Elem() - } - } - return -} - -type structFieldInfoFlag uint8 - -const ( - _ structFieldInfoFlag = 1 << iota - structFieldInfoFlagReady - structFieldInfoFlagOmitEmpty -) - -func (x *structFieldInfoFlag) flagSet(f structFieldInfoFlag) { - *x = *x | f -} - -func (x *structFieldInfoFlag) flagClr(f structFieldInfoFlag) { - *x = *x &^ f -} - -func (x structFieldInfoFlag) flagGet(f structFieldInfoFlag) bool { - return x&f != 0 -} - -func (x structFieldInfoFlag) omitEmpty() bool { - return x.flagGet(structFieldInfoFlagOmitEmpty) -} - -func (x structFieldInfoFlag) ready() bool { - return x.flagGet(structFieldInfoFlagReady) -} - type structFieldInfo struct { encName string // encode name fieldName string // field name - is [maxLevelsEmbedding]uint16 // (recursive/embedded) field index in struct - nis uint8 // num levels of embedding. if 1, then it's not embedded. - structFieldInfoFlag -} + // only one of 'i' or 'is' can be set. If 'i' is -1, then 'is' has been set. -func (si *structFieldInfo) setToZeroValue(v reflect.Value) { - if v, valid := si.field(v, false); valid { - v.Set(reflect.Zero(v.Type())) - } + is []int // (recursive/embedded) field index in struct + i int16 // field index in struct + omitEmpty bool + toArray bool // if field is _struct, is the toArray set? } +// func (si *structFieldInfo) isZero() bool { +// return si.encName == "" && len(si.is) == 0 && si.i == 0 && !si.omitEmpty && !si.toArray +// } + // rv returns the field of the struct. // If anonymous, it returns an Invalid -func (si *structFieldInfo) field(v reflect.Value, update bool) (rv2 reflect.Value, valid bool) { +func (si *structFieldInfo) field(v reflect.Value, update bool) (rv2 reflect.Value) { + if si.i != -1 { + v = v.Field(int(si.i)) + return v + } // replicate FieldByIndex - for i, x := range si.is { - if uint8(i) == si.nis { - break - } - if v, valid = baseStructRv(v, update); !valid { - return + for _, x := range si.is { + for v.Kind() == reflect.Ptr { + if v.IsNil() { + if !update { + return + } + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() } - v = v.Field(int(x)) + v = v.Field(x) } - - return v, true + return v } -// func (si *structFieldInfo) fieldval(v reflect.Value, update bool) reflect.Value { -// v, _ = si.field(v, update) -// return v -// } - -func parseStructInfo(stag string) (toArray, omitEmpty bool, keytype valueType) { - keytype = valueTypeString // default - if stag == "" { - return - } - for i, s := range strings.Split(stag, ",") { - if i == 0 { - } else { - switch s { - case "omitempty": - omitEmpty = true - case "toarray": - toArray = true - case "int": - keytype = valueTypeInt - case "uint": - keytype = valueTypeUint - case "float": - keytype = valueTypeFloat - // case "bool": - // keytype = valueTypeBool - case "string": - keytype = valueTypeString +func (si *structFieldInfo) setToZeroValue(v reflect.Value) { + if si.i != -1 { + v = v.Field(int(si.i)) + v.Set(reflect.Zero(v.Type())) + // v.Set(reflect.New(v.Type()).Elem()) + // v.Set(reflect.New(v.Type())) + } else { + // replicate FieldByIndex + for _, x := range si.is { + for v.Kind() == reflect.Ptr { + if v.IsNil() { + return + } + v = v.Elem() } + v = v.Field(x) } + v.Set(reflect.Zero(v.Type())) } - return } -func (si *structFieldInfo) parseTag(stag string) { +func parseStructFieldInfo(fname string, stag string) *structFieldInfo { // if fname == "" { - // panic(errNoFieldNameToStructFieldInfo) + // panic(noFieldNameToStructFieldInfoErr) // } - - if stag == "" { - return + si := structFieldInfo{ + encName: fname, } - for i, s := range strings.Split(stag, ",") { - if i == 0 { - if s != "" { - si.encName = s - } - } else { - switch s { - case "omitempty": - si.flagSet(structFieldInfoFlagOmitEmpty) - // si.omitEmpty = true - // case "toarray": - // si.toArray = true + + if stag != "" { + for i, s := range strings.Split(stag, ",") { + if i == 0 { + if s != "" { + si.encName = s + } + } else { + if s == "omitempty" { + si.omitEmpty = true + } else if s == "toarray" { + si.toArray = true + } } } } + // si.encNameBs = []byte(si.encName) + return &si } type sfiSortedByEncName []*structFieldInfo @@ -913,105 +697,7 @@ func (p sfiSortedByEncName) Swap(i, j int) { p[i], p[j] = p[j], p[i] } -const structFieldNodeNumToCache = 4 - -type structFieldNodeCache struct { - rv [structFieldNodeNumToCache]reflect.Value - idx [structFieldNodeNumToCache]uint32 - num uint8 -} - -func (x *structFieldNodeCache) get(key uint32) (fv reflect.Value, valid bool) { - for i, k := range &x.idx { - if uint8(i) == x.num { - return // break - } - if key == k { - return x.rv[i], true - } - } - return -} - -func (x *structFieldNodeCache) tryAdd(fv reflect.Value, key uint32) { - if x.num < structFieldNodeNumToCache { - x.rv[x.num] = fv - x.idx[x.num] = key - x.num++ - return - } -} - -type structFieldNode struct { - v reflect.Value - cache2 structFieldNodeCache - cache3 structFieldNodeCache - update bool -} - -func (x *structFieldNode) field(si *structFieldInfo) (fv reflect.Value) { - // return si.fieldval(x.v, x.update) - // Note: we only cache if nis=2 or nis=3 i.e. up to 2 levels of embedding - // This mostly saves us time on the repeated calls to v.Elem, v.Field, etc. - var valid bool - switch si.nis { - case 1: - fv = x.v.Field(int(si.is[0])) - case 2: - if fv, valid = x.cache2.get(uint32(si.is[0])); valid { - fv = fv.Field(int(si.is[1])) - return - } - fv = x.v.Field(int(si.is[0])) - if fv, valid = baseStructRv(fv, x.update); !valid { - return - } - x.cache2.tryAdd(fv, uint32(si.is[0])) - fv = fv.Field(int(si.is[1])) - case 3: - var key uint32 = uint32(si.is[0])<<16 | uint32(si.is[1]) - if fv, valid = x.cache3.get(key); valid { - fv = fv.Field(int(si.is[2])) - return - } - fv = x.v.Field(int(si.is[0])) - if fv, valid = baseStructRv(fv, x.update); !valid { - return - } - fv = fv.Field(int(si.is[1])) - if fv, valid = baseStructRv(fv, x.update); !valid { - return - } - x.cache3.tryAdd(fv, key) - fv = fv.Field(int(si.is[2])) - default: - fv, _ = si.field(x.v, x.update) - } - return -} - -func baseStructRv(v reflect.Value, update bool) (v2 reflect.Value, valid bool) { - for v.Kind() == reflect.Ptr { - if v.IsNil() { - if !update { - return - } - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - } - return v, true -} - -type typeInfoFlag uint8 - -const ( - typeInfoFlagComparable = 1 << iota - typeInfoFlagIsZeroer - typeInfoFlagIsZeroerPtr -) - -// typeInfo keeps information about each (non-ptr) type referenced in the encode/decode sequence. +// typeInfo keeps information about each type referenced in the encode/decode sequence. // // During an encode/decode sequence, we work as below: // - If base is a built in type, en/decode base value @@ -1020,82 +706,70 @@ const ( // - If type is text(M/Unm)arshaler, call Text(M/Unm)arshal method // - Else decode appropriately based on the reflect.Kind type typeInfo struct { - rt reflect.Type - elem reflect.Type - pkgpath string + sfi []*structFieldInfo // sorted. Used when enc/dec struct to map. + sfip []*structFieldInfo // unsorted. Used when enc/dec struct to array. + rt reflect.Type rtid uintptr - // rv0 reflect.Value // saved zero value, used if immutableKind numMeth uint16 // number of methods - kind uint8 - chandir uint8 - anyOmitEmpty bool // true if a struct, and any of the fields are tagged "omitempty" - toArray bool // whether this (struct) type should be encoded as an array - keyType valueType // if struct, how is the field name stored in a stream? default is string - mbs bool // base type (T or *T) is a MapBySlice + // baseId gives pointer to the base reflect.Type, after deferencing + // the pointers. E.g. base type of ***time.Time is time.Time. + base reflect.Type + baseId uintptr + baseIndir int8 // number of indirections to get to base - // ---- cpu cache line boundary? - sfiSort []*structFieldInfo // sorted. Used when enc/dec struct to map. - sfiSrc []*structFieldInfo // unsorted. Used when enc/dec struct to array. + mbs bool // base type (T or *T) is a MapBySlice - key reflect.Type + bm bool // base type (T or *T) is a binaryMarshaler + bunm bool // base type (T or *T) is a binaryUnmarshaler + bmIndir int8 // number of indirections to get to binaryMarshaler type + bunmIndir int8 // number of indirections to get to binaryUnmarshaler type - // ---- cpu cache line boundary? - // sfis []structFieldInfo // all sfi, in src order, as created. - sfiNamesSort []byte // all names, with indexes into the sfiSort + tm bool // base type (T or *T) is a textMarshaler + tunm bool // base type (T or *T) is a textUnmarshaler + tmIndir int8 // number of indirections to get to textMarshaler type + tunmIndir int8 // number of indirections to get to textUnmarshaler type - // format of marshal type fields below: [btj][mu]p? OR csp? + jm bool // base type (T or *T) is a jsonMarshaler + junm bool // base type (T or *T) is a jsonUnmarshaler + jmIndir int8 // number of indirections to get to jsonMarshaler type + junmIndir int8 // number of indirections to get to jsonUnmarshaler type - bm bool // T is a binaryMarshaler - bmp bool // *T is a binaryMarshaler - bu bool // T is a binaryUnmarshaler - bup bool // *T is a binaryUnmarshaler - tm bool // T is a textMarshaler - tmp bool // *T is a textMarshaler - tu bool // T is a textUnmarshaler - tup bool // *T is a textUnmarshaler + cs bool // base type (T or *T) is a Selfer + csIndir int8 // number of indirections to get to Selfer type - jm bool // T is a jsonMarshaler - jmp bool // *T is a jsonMarshaler - ju bool // T is a jsonUnmarshaler - jup bool // *T is a jsonUnmarshaler - cs bool // T is a Selfer - csp bool // *T is a Selfer - - // other flags, with individual bits representing if set. - flags typeInfoFlag - - // _ [2]byte // padding - _ [3]uint64 // padding -} - -func (ti *typeInfo) isFlag(f typeInfoFlag) bool { - return ti.flags&f != 0 + toArray bool // whether this (struct) type should be encoded as an array } -func (ti *typeInfo) indexForEncName(name []byte) (index int16) { - var sn []byte - if len(name)+2 <= 32 { - var buf [32]byte // should not escape - sn = buf[:len(name)+2] +func (ti *typeInfo) indexForEncName(name string) int { + // NOTE: name may be a stringView, so don't pass it to another function. + //tisfi := ti.sfi + const binarySearchThreshold = 16 + if sfilen := len(ti.sfi); sfilen < binarySearchThreshold { + // linear search. faster than binary search in my testing up to 16-field structs. + for i, si := range ti.sfi { + if si.encName == name { + return i + } + } } else { - sn = make([]byte, len(name)+2) - } - copy(sn[1:], name) - sn[0], sn[len(sn)-1] = tiSep2(name), 0xff - j := bytes.Index(ti.sfiNamesSort, sn) - if j < 0 { - return -1 + // binary search. adapted from sort/search.go. + h, i, j := 0, 0, sfilen + for i < j { + h = i + (j-i)/2 + if ti.sfi[h].encName < name { + i = h + 1 + } else { + j = h + } + } + if i < sfilen && ti.sfi[i].encName == name { + return i + } } - index = int16(uint16(ti.sfiNamesSort[j+len(sn)+1]) | uint16(ti.sfiNamesSort[j+len(sn)])<<8) - return -} - -type rtid2ti struct { - rtid uintptr - ti *typeInfo + return -1 } // TypeInfos caches typeInfo for each type on first inspection. @@ -1103,11 +777,9 @@ type rtid2ti struct { // It is configured with a set of tag keys, which are used to get // configuration for the type. type TypeInfos struct { - // infos: formerly map[uintptr]*typeInfo, now *[]rtid2ti, 2 words expected - infos atomicTypeInfoSlice - mu sync.Mutex + infos map[uintptr]*typeInfo + mu sync.RWMutex tags []string - _ [2]uint64 // padding } // NewTypeInfos creates a TypeInfos given a set of struct tags keys. @@ -1115,7 +787,7 @@ type TypeInfos struct { // This allows users customize the struct tag keys which contain configuration // of their types. func NewTypeInfos(tags []string) *TypeInfos { - return &TypeInfos{tags: tags} + return &TypeInfos{tags: tags, infos: make(map[uintptr]*typeInfo, 64)} } func (x *TypeInfos) structTag(t reflect.StructTag) (s string) { @@ -1130,124 +802,91 @@ func (x *TypeInfos) structTag(t reflect.StructTag) (s string) { return } -func (x *TypeInfos) find(s []rtid2ti, rtid uintptr) (idx int, ti *typeInfo) { - // binary search. adapted from sort/search.go. - // if sp == nil { - // return -1, nil - // } - // s := *sp - h, i, j := 0, 0, len(s) - for i < j { - h = i + (j-i)/2 - if s[h].rtid < rtid { - i = h + 1 - } else { - j = h - } - } - if i < len(s) && s[i].rtid == rtid { - return i, s[i].ti - } - return i, nil -} - func (x *TypeInfos) get(rtid uintptr, rt reflect.Type) (pti *typeInfo) { - sp := x.infos.load() - var idx int - if sp != nil { - idx, pti = x.find(sp, rtid) - if pti != nil { - return - } - } - - rk := rt.Kind() - - if rk == reflect.Ptr { // || (rk == reflect.Interface && rtid != intfTypId) { - panicv.errorf("invalid kind passed to TypeInfos.get: %v - %v", rk, rt) + var ok bool + x.mu.RLock() + pti, ok = x.infos[rtid] + x.mu.RUnlock() + if ok { + return } // do not hold lock while computing this. // it may lead to duplication, but that's ok. - ti := typeInfo{rt: rt, rtid: rtid, kind: uint8(rk), pkgpath: rt.PkgPath()} - // ti.rv0 = reflect.Zero(rt) - - // ti.comparable = rt.Comparable() + ti := typeInfo{rt: rt, rtid: rtid} ti.numMeth = uint16(rt.NumMethod()) - ti.bm, ti.bmp = implIntf(rt, binaryMarshalerTyp) - ti.bu, ti.bup = implIntf(rt, binaryUnmarshalerTyp) - ti.tm, ti.tmp = implIntf(rt, textMarshalerTyp) - ti.tu, ti.tup = implIntf(rt, textUnmarshalerTyp) - ti.jm, ti.jmp = implIntf(rt, jsonMarshalerTyp) - ti.ju, ti.jup = implIntf(rt, jsonUnmarshalerTyp) - ti.cs, ti.csp = implIntf(rt, selferTyp) - - b1, b2 := implIntf(rt, iszeroTyp) - if b1 { - ti.flags |= typeInfoFlagIsZeroer + var indir int8 + if ok, indir = implementsIntf(rt, binaryMarshalerTyp); ok { + ti.bm, ti.bmIndir = true, indir + } + if ok, indir = implementsIntf(rt, binaryUnmarshalerTyp); ok { + ti.bunm, ti.bunmIndir = true, indir + } + if ok, indir = implementsIntf(rt, textMarshalerTyp); ok { + ti.tm, ti.tmIndir = true, indir + } + if ok, indir = implementsIntf(rt, textUnmarshalerTyp); ok { + ti.tunm, ti.tunmIndir = true, indir + } + if ok, indir = implementsIntf(rt, jsonMarshalerTyp); ok { + ti.jm, ti.jmIndir = true, indir + } + if ok, indir = implementsIntf(rt, jsonUnmarshalerTyp); ok { + ti.junm, ti.junmIndir = true, indir + } + if ok, indir = implementsIntf(rt, selferTyp); ok { + ti.cs, ti.csIndir = true, indir } - if b2 { - ti.flags |= typeInfoFlagIsZeroerPtr + if ok, _ = implementsIntf(rt, mapBySliceTyp); ok { + ti.mbs = true } - if rt.Comparable() { - ti.flags |= typeInfoFlagComparable + + pt := rt + var ptIndir int8 + // for ; pt.Kind() == reflect.Ptr; pt, ptIndir = pt.Elem(), ptIndir+1 { } + for pt.Kind() == reflect.Ptr { + pt = pt.Elem() + ptIndir++ + } + if ptIndir == 0 { + ti.base = rt + ti.baseId = rtid + } else { + ti.base = pt + ti.baseId = reflect.ValueOf(pt).Pointer() + ti.baseIndir = ptIndir } - switch rk { - case reflect.Struct: + if rt.Kind() == reflect.Struct { var omitEmpty bool if f, ok := rt.FieldByName(structInfoFieldName); ok { - ti.toArray, omitEmpty, ti.keyType = parseStructInfo(x.structTag(f.Tag)) - } else { - ti.keyType = valueTypeString + siInfo := parseStructFieldInfo(structInfoFieldName, x.structTag(f.Tag)) + ti.toArray = siInfo.toArray + omitEmpty = siInfo.omitEmpty } - pp, pi := pool.tiLoad() - pv := pi.(*typeInfoLoadArray) - pv.etypes[0] = ti.rtid - // vv := typeInfoLoad{pv.fNames[:0], pv.encNames[:0], pv.etypes[:1], pv.sfis[:0]} - vv := typeInfoLoad{pv.etypes[:1], pv.sfis[:0]} + pi := rgetPool.Get() + pv := pi.(*rgetPoolT) + pv.etypes[0] = ti.baseId + vv := rgetT{pv.fNames[:0], pv.encNames[:0], pv.etypes[:1], pv.sfis[:0]} x.rget(rt, rtid, omitEmpty, nil, &vv) - // ti.sfis = vv.sfis - ti.sfiSrc, ti.sfiSort, ti.sfiNamesSort, ti.anyOmitEmpty = rgetResolveSFI(rt, vv.sfis, pv) - pp.Put(pi) - case reflect.Map: - ti.elem = rt.Elem() - ti.key = rt.Key() - case reflect.Slice: - ti.mbs, _ = implIntf(rt, mapBySliceTyp) - ti.elem = rt.Elem() - case reflect.Chan: - ti.elem = rt.Elem() - ti.chandir = uint8(rt.ChanDir()) - case reflect.Array, reflect.Ptr: - ti.elem = rt.Elem() + ti.sfip, ti.sfi = rgetResolveSFI(vv.sfis, pv.sfiidx[:0]) + rgetPool.Put(pi) } - // sfi = sfiSrc + // sfi = sfip x.mu.Lock() - sp = x.infos.load() - if sp == nil { + if pti, ok = x.infos[rtid]; !ok { pti = &ti - vs := []rtid2ti{{rtid, pti}} - x.infos.store(vs) - } else { - idx, pti = x.find(sp, rtid) - if pti == nil { - pti = &ti - vs := make([]rtid2ti, len(sp)+1) - copy(vs, sp[:idx]) - copy(vs[idx+1:], sp[idx:]) - vs[idx] = rtid2ti{rtid, pti} - x.infos.store(vs) - } + x.infos[rtid] = pti } x.mu.Unlock() return } func (x *TypeInfos) rget(rt reflect.Type, rtid uintptr, omitEmpty bool, - indexstack []uint16, pv *typeInfoLoad) { + indexstack []int, pv *rgetT, +) { // Read up fields and store how to access the value. // // It uses go's rules for message selectors, @@ -1256,15 +895,10 @@ func (x *TypeInfos) rget(rt reflect.Type, rtid uintptr, omitEmpty bool, // Note: we consciously use slices, not a map, to simulate a set. // Typically, types have < 16 fields, // and iteration using equals is faster than maps there - flen := rt.NumField() - if flen > (1< %v fields are not supported - has %v fields", - (1< maxLevelsEmbedding-1 { - panicv.errorf("codec: only supports up to %v depth of embedding - type has %v depth", - maxLevelsEmbedding-1, len(indexstack)) + if len(indexstack) == 0 { + si.i = int16(j) + } else { + si.i = -1 + si.is = make([]int, len(indexstack)+1) + copy(si.is, indexstack) + si.is[len(indexstack)] = j + // si.is = append(append(make([]int, 0, len(indexstack)+4), indexstack...), j) } - si.nis = uint8(len(indexstack)) + 1 - copy(si.is[:], indexstack) - si.is[len(indexstack)] = j if omitEmpty { - si.flagSet(structFieldInfoFlagOmitEmpty) + si.omitEmpty = true } pv.sfis = append(pv.sfis, si) } } -func tiSep(name string) uint8 { - // (xn[0]%64) // (between 192-255 - outside ascii BMP) - // return 0xfe - (name[0] & 63) - // return 0xfe - (name[0] & 63) - uint8(len(name)) - // return 0xfe - (name[0] & 63) - uint8(len(name)&63) - // return ((0xfe - (name[0] & 63)) & 0xf8) | (uint8(len(name) & 0x07)) - return 0xfe - (name[0] & 63) - uint8(len(name)&63) -} - -func tiSep2(name []byte) uint8 { - return 0xfe - (name[0] & 63) - uint8(len(name)&63) -} - // resolves the struct field info got from a call to rget. // Returns a trimmed, unsorted and sorted []*structFieldInfo. -func rgetResolveSFI(rt reflect.Type, x []structFieldInfo, pv *typeInfoLoadArray) ( - y, z []*structFieldInfo, ss []byte, anyOmitEmpty bool) { - sa := pv.sfiidx[:0] - sn := pv.b[:] - n := len(x) - - var xn string - var ui uint16 - var sep byte - - for i := range x { - ui = uint16(i) - xn = x[i].encName // fieldName or encName? use encName for now. - if len(xn)+2 > cap(pv.b) { - sn = make([]byte, len(xn)+2) - } else { - sn = sn[:len(xn)+2] - } - // use a custom sep, so that misses are less frequent, - // since the sep (first char in search) is as unique as first char in field name. - sep = tiSep(xn) - sn[0], sn[len(sn)-1] = sep, 0xff - copy(sn[1:], xn) - j := bytes.Index(sa, sn) - if j == -1 { - sa = append(sa, sep) - sa = append(sa, xn...) - sa = append(sa, 0xff, byte(ui>>8), byte(ui)) - } else { - index := uint16(sa[j+len(sn)+1]) | uint16(sa[j+len(sn)])<<8 - // one of them must be reset to nil, - // and the index updated appropriately to the other one - if x[i].nis == x[index].nis { - } else if x[i].nis < x[index].nis { - sa[j+len(sn)], sa[j+len(sn)+1] = byte(ui>>8), byte(ui) - if x[index].ready() { - x[index].flagClr(structFieldInfoFlagReady) - n-- - } - } else { - if x[i].ready() { - x[i].flagClr(structFieldInfoFlagReady) - n-- +func rgetResolveSFI(x []*structFieldInfo, pv []sfiIdx) (y, z []*structFieldInfo) { + var n int + for i, v := range x { + xn := v.encName //TODO: fieldName or encName? use encName for now. + var found bool + for j, k := range pv { + if k.name == xn { + // one of them must be reset to nil, and the index updated appropriately to the other one + if len(v.is) == len(x[k.index].is) { + } else if len(v.is) < len(x[k.index].is) { + pv[j].index = i + if x[k.index] != nil { + x[k.index] = nil + n++ + } + } else { + if x[i] != nil { + x[i] = nil + n++ + } } + found = true + break } } - - } - var w []structFieldInfo - sharingArray := len(x) <= typeInfoLoadArraySfisLen // sharing array with typeInfoLoadArray - if sharingArray { - w = make([]structFieldInfo, n) + if !found { + pv = append(pv, sfiIdx{xn, i}) + } } - // remove all the nils (non-ready) - y = make([]*structFieldInfo, n) + // remove all the nils + y = make([]*structFieldInfo, len(x)-n) n = 0 - var sslen int - for i := range x { - if !x[i].ready() { + for _, v := range x { + if v == nil { continue } - if !anyOmitEmpty && x[i].omitEmpty() { - anyOmitEmpty = true - } - if sharingArray { - w[n] = x[i] - y[n] = &w[n] - } else { - y[n] = &x[i] - } - sslen = sslen + len(x[i].encName) + 4 + y[n] = v n++ } - if n != len(y) { - panicv.errorf("failure reading struct %v - expecting %d of %d valid fields, got %d", - rt, len(y), len(x), n) - } z = make([]*structFieldInfo, len(y)) copy(z, y) sort.Sort(sfiSortedByEncName(z)) - - sharingArray = len(sa) <= typeInfoLoadArraySfiidxLen - if sharingArray { - ss = make([]byte, 0, sslen) - } else { - ss = sa[:0] // reuse the newly made sa array if necessary - } - for i := range z { - xn = z[i].encName - sep = tiSep(xn) - ui = uint16(i) - ss = append(ss, sep) - ss = append(ss, xn...) - ss = append(ss, 0xff, byte(ui>>8), byte(ui)) - } return } -func implIntf(rt, iTyp reflect.Type) (base bool, indir bool) { - return rt.Implements(iTyp), reflect.PtrTo(rt).Implements(iTyp) -} - -// isEmptyStruct is only called from isEmptyValue, and checks if a struct is empty: -// - does it implement IsZero() bool -// - is it comparable, and can i compare directly using == -// - if checkStruct, then walk through the encodable fields -// and check if they are empty or not. -func isEmptyStruct(v reflect.Value, tinfos *TypeInfos, deref, checkStruct bool) bool { - // v is a struct kind - no need to check again. - // We only check isZero on a struct kind, to reduce the amount of times - // that we lookup the rtid and typeInfo for each type as we walk the tree. - - vt := v.Type() - rtid := rt2id(vt) - if tinfos == nil { - tinfos = defTypeInfos - } - ti := tinfos.get(rtid, vt) - if ti.rtid == timeTypId { - return rv2i(v).(time.Time).IsZero() - } - if ti.isFlag(typeInfoFlagIsZeroerPtr) && v.CanAddr() { - return rv2i(v.Addr()).(isZeroer).IsZero() - } - if ti.isFlag(typeInfoFlagIsZeroer) { - return rv2i(v).(isZeroer).IsZero() - } - if ti.isFlag(typeInfoFlagComparable) { - return rv2i(v) == rv2i(reflect.Zero(vt)) - } - if !checkStruct { - return false - } - // We only care about what we can encode/decode, - // so that is what we use to check omitEmpty. - for _, si := range ti.sfiSrc { - sfv, valid := si.field(v, false) - if valid && !isEmptyValue(sfv, tinfos, deref, checkStruct) { - return false - } - } - return true -} - -// func roundFloat(x float64) float64 { -// t := math.Trunc(x) -// if math.Abs(x-t) >= 0.5 { -// return t + math.Copysign(1, x) -// } -// return t -// } - -func panicToErr(h errstrDecorator, err *error) { - // Note: This method MUST be called directly from defer i.e. defer panicToErr ... - // else it seems the recover is not fully handled +func panicToErr(err *error) { if recoverPanicToErr { if x := recover(); x != nil { - // fmt.Printf("panic'ing with: %v\n", x) - // debug.PrintStack() - panicValToErr(h, x, err) + //debug.PrintStack() + panicValToErr(x, err) } } } -func panicValToErr(h errstrDecorator, v interface{}, err *error) { - switch xerr := v.(type) { - case nil: - case error: - switch xerr { - case nil: - case io.EOF, io.ErrUnexpectedEOF, errEncoderNotInitialized, errDecoderNotInitialized: - // treat as special (bubble up) - *err = xerr - default: - h.wrapErrstr(xerr.Error(), err) - } - case string: - if xerr != "" { - h.wrapErrstr(xerr, err) - } - case fmt.Stringer: - if xerr != nil { - h.wrapErrstr(xerr.String(), err) - } - default: - h.wrapErrstr(v, err) - } -} +// func doPanic(tag string, format string, params ...interface{}) { +// params2 := make([]interface{}, len(params)+1) +// params2[0] = tag +// copy(params2[1:], params) +// panic(fmt.Errorf("%s: "+format, params2...)) +// } func isImmutableKind(k reflect.Kind) (v bool) { - return immutableKindsSet[k] -} - -// ---- - -type codecFnInfo struct { - ti *typeInfo - xfFn Ext - xfTag uint64 - seq seqType - addrD bool - addrF bool // if addrD, this says whether decode function can take a value or a ptr - addrE bool - ready bool // ready to use -} - -// codecFn encapsulates the captured variables and the encode function. -// This way, we only do some calculations one times, and pass to the -// code block that should be called (encapsulated in a function) -// instead of executing the checks every time. -type codecFn struct { - i codecFnInfo - fe func(*Encoder, *codecFnInfo, reflect.Value) - fd func(*Decoder, *codecFnInfo, reflect.Value) - _ [1]uint64 // padding -} - -type codecRtidFn struct { - rtid uintptr - fn *codecFn -} - -type codecFner struct { - // hh Handle - h *BasicHandle - s []codecRtidFn - be bool - js bool - _ [6]byte // padding - _ [3]uint64 // padding -} - -func (c *codecFner) reset(hh Handle) { - bh := hh.getBasicHandle() - // only reset iff extensions changed or *TypeInfos changed - var hhSame = true && - c.h == bh && c.h.TypeInfos == bh.TypeInfos && - len(c.h.extHandle) == len(bh.extHandle) && - (len(c.h.extHandle) == 0 || &c.h.extHandle[0] == &bh.extHandle[0]) - if !hhSame { - // c.hh = hh - c.h, bh = bh, c.h // swap both - _, c.js = hh.(*JsonHandle) - c.be = hh.isBinary() - for i := range c.s { - c.s[i].fn.i.ready = false - } - } -} - -func (c *codecFner) get(rt reflect.Type, checkFastpath, checkCodecSelfer bool) (fn *codecFn) { - rtid := rt2id(rt) - - for _, x := range c.s { - if x.rtid == rtid { - // if rtid exists, then there's a *codenFn attached (non-nil) - fn = x.fn - if fn.i.ready { - return - } - break - } - } - var ti *typeInfo - if fn == nil { - fn = new(codecFn) - if c.s == nil { - c.s = make([]codecRtidFn, 0, 8) - } - c.s = append(c.s, codecRtidFn{rtid, fn}) - } else { - ti = fn.i.ti - *fn = codecFn{} - fn.i.ti = ti - // fn.fe, fn.fd = nil, nil - } - fi := &(fn.i) - fi.ready = true - if ti == nil { - ti = c.h.getTypeInfo(rtid, rt) - fi.ti = ti - } - - rk := reflect.Kind(ti.kind) - - if checkCodecSelfer && (ti.cs || ti.csp) { - fn.fe = (*Encoder).selferMarshal - fn.fd = (*Decoder).selferUnmarshal - fi.addrF = true - fi.addrD = ti.csp - fi.addrE = ti.csp - } else if rtid == timeTypId { - fn.fe = (*Encoder).kTime - fn.fd = (*Decoder).kTime - } else if rtid == rawTypId { - fn.fe = (*Encoder).raw - fn.fd = (*Decoder).raw - } else if rtid == rawExtTypId { - fn.fe = (*Encoder).rawExt - fn.fd = (*Decoder).rawExt - fi.addrF = true - fi.addrD = true - fi.addrE = true - } else if xfFn := c.h.getExt(rtid); xfFn != nil { - fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext - fn.fe = (*Encoder).ext - fn.fd = (*Decoder).ext - fi.addrF = true - fi.addrD = true - if rk == reflect.Struct || rk == reflect.Array { - fi.addrE = true - } - } else if supportMarshalInterfaces && c.be && (ti.bm || ti.bmp) && (ti.bu || ti.bup) { - fn.fe = (*Encoder).binaryMarshal - fn.fd = (*Decoder).binaryUnmarshal - fi.addrF = true - fi.addrD = ti.bup - fi.addrE = ti.bmp - } else if supportMarshalInterfaces && !c.be && c.js && (ti.jm || ti.jmp) && (ti.ju || ti.jup) { - //If JSON, we should check JSONMarshal before textMarshal - fn.fe = (*Encoder).jsonMarshal - fn.fd = (*Decoder).jsonUnmarshal - fi.addrF = true - fi.addrD = ti.jup - fi.addrE = ti.jmp - } else if supportMarshalInterfaces && !c.be && (ti.tm || ti.tmp) && (ti.tu || ti.tup) { - fn.fe = (*Encoder).textMarshal - fn.fd = (*Decoder).textUnmarshal - fi.addrF = true - fi.addrD = ti.tup - fi.addrE = ti.tmp - } else { - if fastpathEnabled && checkFastpath && (rk == reflect.Map || rk == reflect.Slice) { - if ti.pkgpath == "" { // un-named slice or map - if idx := fastpathAV.index(rtid); idx != -1 { - fn.fe = fastpathAV[idx].encfn - fn.fd = fastpathAV[idx].decfn - fi.addrD = true - fi.addrF = false - } - } else { - // use mapping for underlying type if there - var rtu reflect.Type - if rk == reflect.Map { - rtu = reflect.MapOf(ti.key, ti.elem) - } else { - rtu = reflect.SliceOf(ti.elem) - } - rtuid := rt2id(rtu) - if idx := fastpathAV.index(rtuid); idx != -1 { - xfnf := fastpathAV[idx].encfn - xrt := fastpathAV[idx].rt - fn.fe = func(e *Encoder, xf *codecFnInfo, xrv reflect.Value) { - xfnf(e, xf, xrv.Convert(xrt)) - } - fi.addrD = true - fi.addrF = false // meaning it can be an address(ptr) or a value - xfnf2 := fastpathAV[idx].decfn - fn.fd = func(d *Decoder, xf *codecFnInfo, xrv reflect.Value) { - if xrv.Kind() == reflect.Ptr { - xfnf2(d, xf, xrv.Convert(reflect.PtrTo(xrt))) - } else { - xfnf2(d, xf, xrv.Convert(xrt)) - } - } - } - } - } - if fn.fe == nil && fn.fd == nil { - switch rk { - case reflect.Bool: - fn.fe = (*Encoder).kBool - fn.fd = (*Decoder).kBool - case reflect.String: - fn.fe = (*Encoder).kString - fn.fd = (*Decoder).kString - case reflect.Int: - fn.fd = (*Decoder).kInt - fn.fe = (*Encoder).kInt - case reflect.Int8: - fn.fe = (*Encoder).kInt8 - fn.fd = (*Decoder).kInt8 - case reflect.Int16: - fn.fe = (*Encoder).kInt16 - fn.fd = (*Decoder).kInt16 - case reflect.Int32: - fn.fe = (*Encoder).kInt32 - fn.fd = (*Decoder).kInt32 - case reflect.Int64: - fn.fe = (*Encoder).kInt64 - fn.fd = (*Decoder).kInt64 - case reflect.Uint: - fn.fd = (*Decoder).kUint - fn.fe = (*Encoder).kUint - case reflect.Uint8: - fn.fe = (*Encoder).kUint8 - fn.fd = (*Decoder).kUint8 - case reflect.Uint16: - fn.fe = (*Encoder).kUint16 - fn.fd = (*Decoder).kUint16 - case reflect.Uint32: - fn.fe = (*Encoder).kUint32 - fn.fd = (*Decoder).kUint32 - case reflect.Uint64: - fn.fe = (*Encoder).kUint64 - fn.fd = (*Decoder).kUint64 - case reflect.Uintptr: - fn.fe = (*Encoder).kUintptr - fn.fd = (*Decoder).kUintptr - case reflect.Float32: - fn.fe = (*Encoder).kFloat32 - fn.fd = (*Decoder).kFloat32 - case reflect.Float64: - fn.fe = (*Encoder).kFloat64 - fn.fd = (*Decoder).kFloat64 - case reflect.Invalid: - fn.fe = (*Encoder).kInvalid - fn.fd = (*Decoder).kErr - case reflect.Chan: - fi.seq = seqTypeChan - fn.fe = (*Encoder).kSlice - fn.fd = (*Decoder).kSlice - case reflect.Slice: - fi.seq = seqTypeSlice - fn.fe = (*Encoder).kSlice - fn.fd = (*Decoder).kSlice - case reflect.Array: - fi.seq = seqTypeArray - fn.fe = (*Encoder).kSlice - fi.addrF = false - fi.addrD = false - rt2 := reflect.SliceOf(ti.elem) - fn.fd = func(d *Decoder, xf *codecFnInfo, xrv reflect.Value) { - d.cfer().get(rt2, true, false).fd(d, xf, xrv.Slice(0, xrv.Len())) - } - // fn.fd = (*Decoder).kArray - case reflect.Struct: - if ti.anyOmitEmpty { - fn.fe = (*Encoder).kStruct - } else { - fn.fe = (*Encoder).kStructNoOmitempty - } - fn.fd = (*Decoder).kStruct - case reflect.Map: - fn.fe = (*Encoder).kMap - fn.fd = (*Decoder).kMap - case reflect.Interface: - // encode: reflect.Interface are handled already by preEncodeValue - fn.fd = (*Decoder).kInterface - fn.fe = (*Encoder).kErr - default: - // reflect.Ptr and reflect.Interface are handled already by preEncodeValue - fn.fe = (*Encoder).kErr - fn.fd = (*Decoder).kErr - } - } - } - return -} - -type codecFnPooler struct { - cf *codecFner - cfp *sync.Pool - hh Handle -} - -func (d *codecFnPooler) cfer() *codecFner { - if d.cf == nil { - var v interface{} - d.cfp, v = pool.codecFner() - d.cf = v.(*codecFner) - d.cf.reset(d.hh) - } - return d.cf -} - -func (d *codecFnPooler) alwaysAtEnd() { - if d.cf != nil { - d.cfp.Put(d.cf) - d.cf, d.cfp = nil, nil - } -} - -// ---- - -// these "checkOverflow" functions must be inlinable, and not call anybody. -// Overflow means that the value cannot be represented without wrapping/overflow. -// Overflow=false does not mean that the value can be represented without losing precision -// (especially for floating point). - + return false || + k == reflect.Int || + k == reflect.Int8 || + k == reflect.Int16 || + k == reflect.Int32 || + k == reflect.Int64 || + k == reflect.Uint || + k == reflect.Uint8 || + k == reflect.Uint16 || + k == reflect.Uint32 || + k == reflect.Uint64 || + k == reflect.Uintptr || + k == reflect.Float32 || + k == reflect.Float64 || + k == reflect.Bool || + k == reflect.String +} + +// these functions must be inlinable, and not call anybody type checkOverflow struct{} -// func (checkOverflow) Float16(f float64) (overflow bool) { -// panicv.errorf("unimplemented") -// if f < 0 { -// f = -f -// } -// return math.MaxFloat32 < f && f <= math.MaxFloat64 -// } - -func (checkOverflow) Float32(v float64) (overflow bool) { - if v < 0 { - v = -v +func (_ checkOverflow) Float32(f float64) (overflow bool) { + if f < 0 { + f = -f } - return math.MaxFloat32 < v && v <= math.MaxFloat64 + return math.MaxFloat32 < f && f <= math.MaxFloat64 } -func (checkOverflow) Uint(v uint64, bitsize uint8) (overflow bool) { + +func (_ checkOverflow) Uint(v uint64, bitsize uint8) (overflow bool) { if bitsize == 0 || bitsize >= 64 || v == 0 { return } @@ -1909,7 +1102,8 @@ func (checkOverflow) Uint(v uint64, bitsize uint8) (overflow bool) { } return } -func (checkOverflow) Int(v int64, bitsize uint8) (overflow bool) { + +func (_ checkOverflow) Int(v int64, bitsize uint8) (overflow bool) { if bitsize == 0 || bitsize >= 64 || v == 0 { return } @@ -1918,76 +1112,38 @@ func (checkOverflow) Int(v int64, bitsize uint8) (overflow bool) { } return } -func (checkOverflow) SignedInt(v uint64) (overflow bool) { + +func (_ checkOverflow) SignedInt(v uint64) (i int64, overflow bool) { //e.g. -127 to 128 for int8 pos := (v >> 63) == 0 ui2 := v & 0x7fffffffffffffff if pos { if ui2 > math.MaxInt64 { overflow = true + return } } else { if ui2 > math.MaxInt64-1 { overflow = true + return } } + i = int64(v) return } -func (x checkOverflow) Float32V(v float64) float64 { - if x.Float32(v) { - panicv.errorf("float32 overflow: %v", v) - } - return v -} -func (x checkOverflow) UintV(v uint64, bitsize uint8) uint64 { - if x.Uint(v, bitsize) { - panicv.errorf("uint64 overflow: %v", v) - } - return v -} -func (x checkOverflow) IntV(v int64, bitsize uint8) int64 { - if x.Int(v, bitsize) { - panicv.errorf("int64 overflow: %v", v) - } - return v -} -func (x checkOverflow) SignedIntV(v uint64) int64 { - if x.SignedInt(v) { - panicv.errorf("uint64 to int64 overflow: %v", v) - } - return int64(v) -} - // ------------------ SORT ----------------- func isNaN(f float64) bool { return f != f } // ----------------------- -type ioFlusher interface { - Flush() error -} - -type ioPeeker interface { - Peek(int) ([]byte, error) -} - -type ioBuffered interface { - Buffered() int -} - -// ----------------------- - type intSlice []int64 type uintSlice []uint64 - -// type uintptrSlice []uintptr type floatSlice []float64 type boolSlice []bool type stringSlice []string - -// type bytesSlice [][]byte +type bytesSlice [][]byte func (p intSlice) Len() int { return len(p) } func (p intSlice) Less(i, j int) bool { return p[i] < p[j] } @@ -1997,10 +1153,6 @@ func (p uintSlice) Len() int { return len(p) } func (p uintSlice) Less(i, j int) bool { return p[i] < p[j] } func (p uintSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } -// func (p uintptrSlice) Len() int { return len(p) } -// func (p uintptrSlice) Less(i, j int) bool { return p[i] < p[j] } -// func (p uintptrSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - func (p floatSlice) Len() int { return len(p) } func (p floatSlice) Less(i, j int) bool { return p[i] < p[j] || isNaN(p[i]) && !isNaN(p[j]) @@ -2011,9 +1163,9 @@ func (p stringSlice) Len() int { return len(p) } func (p stringSlice) Less(i, j int) bool { return p[i] < p[j] } func (p stringSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } -// func (p bytesSlice) Len() int { return len(p) } -// func (p bytesSlice) Less(i, j int) bool { return bytes.Compare(p[i], p[j]) == -1 } -// func (p bytesSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p bytesSlice) Len() int { return len(p) } +func (p bytesSlice) Less(i, j int) bool { return bytes.Compare(p[i], p[j]) == -1 } +func (p bytesSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p boolSlice) Len() int { return len(p) } func (p boolSlice) Less(i, j int) bool { return !p[i] && p[j] } @@ -2051,11 +1203,6 @@ type bytesRv struct { r reflect.Value } type bytesRvSlice []bytesRv -type timeRv struct { - v time.Time - r reflect.Value -} -type timeRvSlice []timeRv func (p intRvSlice) Len() int { return len(p) } func (p intRvSlice) Less(i, j int) bool { return p[i].v < p[j].v } @@ -2083,10 +1230,6 @@ func (p boolRvSlice) Len() int { return len(p) } func (p boolRvSlice) Less(i, j int) bool { return !p[i].v && p[j].v } func (p boolRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } -func (p timeRvSlice) Len() int { return len(p) } -func (p timeRvSlice) Less(i, j int) bool { return p[i].v.Before(p[j].v) } -func (p timeRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - // ----------------- type bytesI struct { @@ -2106,6 +1249,7 @@ type set []uintptr func (s *set) add(v uintptr) (exists bool) { // e.ci is always nil, or len >= 1 + // defer func() { fmt.Printf("$$$$$$$$$$$ cirRef Add: %v, exists: %v\n", v, exists) }() x := *s if x == nil { x = make([]uintptr, 1, 8) @@ -2146,6 +1290,7 @@ func (s *set) add(v uintptr) (exists bool) { } func (s *set) remove(v uintptr) (exists bool) { + // defer func() { fmt.Printf("$$$$$$$$$$$ cirRef Rm: %v, exists: %v\n", v, exists) }() x := *s if len(x) == 0 { return @@ -2167,248 +1312,3 @@ func (s *set) remove(v uintptr) (exists bool) { } return } - -// ------ - -// bitset types are better than [256]bool, because they permit the whole -// bitset array being on a single cache line and use less memory. - -// given x > 0 and n > 0 and x is exactly 2^n, then pos/x === pos>>n AND pos%x === pos&(x-1). -// consequently, pos/32 === pos>>5, pos/16 === pos>>4, pos/8 === pos>>3, pos%8 == pos&7 - -type bitset256 [32]byte - -func (x *bitset256) isset(pos byte) bool { - return x[pos>>3]&(1<<(pos&7)) != 0 -} -func (x *bitset256) issetv(pos byte) byte { - return x[pos>>3] & (1 << (pos & 7)) -} -func (x *bitset256) set(pos byte) { - x[pos>>3] |= (1 << (pos & 7)) -} - -// func (x *bitset256) unset(pos byte) { -// x[pos>>3] &^= (1 << (pos & 7)) -// } - -type bitset128 [16]byte - -func (x *bitset128) isset(pos byte) bool { - return x[pos>>3]&(1<<(pos&7)) != 0 -} -func (x *bitset128) set(pos byte) { - x[pos>>3] |= (1 << (pos & 7)) -} - -// func (x *bitset128) unset(pos byte) { -// x[pos>>3] &^= (1 << (pos & 7)) -// } - -type bitset32 [4]byte - -func (x *bitset32) isset(pos byte) bool { - return x[pos>>3]&(1<<(pos&7)) != 0 -} -func (x *bitset32) set(pos byte) { - x[pos>>3] |= (1 << (pos & 7)) -} - -// func (x *bitset32) unset(pos byte) { -// x[pos>>3] &^= (1 << (pos & 7)) -// } - -// type bit2set256 [64]byte - -// func (x *bit2set256) set(pos byte, v1, v2 bool) { -// var pos2 uint8 = (pos & 3) << 1 // returning 0, 2, 4 or 6 -// if v1 { -// x[pos>>2] |= 1 << (pos2 + 1) -// } -// if v2 { -// x[pos>>2] |= 1 << pos2 -// } -// } -// func (x *bit2set256) get(pos byte) uint8 { -// var pos2 uint8 = (pos & 3) << 1 // returning 0, 2, 4 or 6 -// return x[pos>>2] << (6 - pos2) >> 6 // 11000000 -> 00000011 -// } - -// ------------ - -type pooler struct { - dn sync.Pool // for decNaked - cfn sync.Pool // for codecFner - tiload sync.Pool - strRv8, strRv16, strRv32, strRv64, strRv128 sync.Pool // for stringRV -} - -func (p *pooler) init() { - p.strRv8.New = func() interface{} { return new([8]stringRv) } - p.strRv16.New = func() interface{} { return new([16]stringRv) } - p.strRv32.New = func() interface{} { return new([32]stringRv) } - p.strRv64.New = func() interface{} { return new([64]stringRv) } - p.strRv128.New = func() interface{} { return new([128]stringRv) } - p.dn.New = func() interface{} { x := new(decNaked); x.init(); return x } - p.tiload.New = func() interface{} { return new(typeInfoLoadArray) } - p.cfn.New = func() interface{} { return new(codecFner) } -} - -func (p *pooler) stringRv8() (sp *sync.Pool, v interface{}) { - return &p.strRv8, p.strRv8.Get() -} -func (p *pooler) stringRv16() (sp *sync.Pool, v interface{}) { - return &p.strRv16, p.strRv16.Get() -} -func (p *pooler) stringRv32() (sp *sync.Pool, v interface{}) { - return &p.strRv32, p.strRv32.Get() -} -func (p *pooler) stringRv64() (sp *sync.Pool, v interface{}) { - return &p.strRv64, p.strRv64.Get() -} -func (p *pooler) stringRv128() (sp *sync.Pool, v interface{}) { - return &p.strRv128, p.strRv128.Get() -} -func (p *pooler) decNaked() (sp *sync.Pool, v interface{}) { - return &p.dn, p.dn.Get() -} -func (p *pooler) codecFner() (sp *sync.Pool, v interface{}) { - return &p.cfn, p.cfn.Get() -} -func (p *pooler) tiLoad() (sp *sync.Pool, v interface{}) { - return &p.tiload, p.tiload.Get() -} - -// func (p *pooler) decNaked() (v *decNaked, f func(*decNaked) ) { -// sp := &(p.dn) -// vv := sp.Get() -// return vv.(*decNaked), func(x *decNaked) { sp.Put(vv) } -// } -// func (p *pooler) decNakedGet() (v interface{}) { -// return p.dn.Get() -// } -// func (p *pooler) codecFnerGet() (v interface{}) { -// return p.cfn.Get() -// } -// func (p *pooler) tiLoadGet() (v interface{}) { -// return p.tiload.Get() -// } -// func (p *pooler) decNakedPut(v interface{}) { -// p.dn.Put(v) -// } -// func (p *pooler) codecFnerPut(v interface{}) { -// p.cfn.Put(v) -// } -// func (p *pooler) tiLoadPut(v interface{}) { -// p.tiload.Put(v) -// } - -type panicHdl struct{} - -func (panicHdl) errorv(err error) { - if err != nil { - panic(err) - } -} - -func (panicHdl) errorstr(message string) { - if message != "" { - panic(message) - } -} - -func (panicHdl) errorf(format string, params ...interface{}) { - if format != "" { - if len(params) == 0 { - panic(format) - } else { - panic(fmt.Sprintf(format, params...)) - } - } -} - -type errstrDecorator interface { - wrapErrstr(interface{}, *error) -} - -type errstrDecoratorDef struct{} - -func (errstrDecoratorDef) wrapErrstr(v interface{}, e *error) { *e = fmt.Errorf("%v", v) } - -type must struct{} - -func (must) String(s string, err error) string { - if err != nil { - panicv.errorv(err) - } - return s -} -func (must) Int(s int64, err error) int64 { - if err != nil { - panicv.errorv(err) - } - return s -} -func (must) Uint(s uint64, err error) uint64 { - if err != nil { - panicv.errorv(err) - } - return s -} -func (must) Float(s float64, err error) float64 { - if err != nil { - panicv.errorv(err) - } - return s -} - -// xdebugf prints the message in red on the terminal. -// Use it in place of fmt.Printf (which it calls internally) -func xdebugf(pattern string, args ...interface{}) { - var delim string - if len(pattern) > 0 && pattern[len(pattern)-1] != '\n' { - delim = "\n" - } - fmt.Printf("\033[1;31m"+pattern+delim+"\033[0m", args...) -} - -// func isImmutableKind(k reflect.Kind) (v bool) { -// return false || -// k == reflect.Int || -// k == reflect.Int8 || -// k == reflect.Int16 || -// k == reflect.Int32 || -// k == reflect.Int64 || -// k == reflect.Uint || -// k == reflect.Uint8 || -// k == reflect.Uint16 || -// k == reflect.Uint32 || -// k == reflect.Uint64 || -// k == reflect.Uintptr || -// k == reflect.Float32 || -// k == reflect.Float64 || -// k == reflect.Bool || -// k == reflect.String -// } - -// func timeLocUTCName(tzint int16) string { -// if tzint == 0 { -// return "UTC" -// } -// var tzname = []byte("UTC+00:00") -// //tzname := fmt.Sprintf("UTC%s%02d:%02d", tzsign, tz/60, tz%60) //perf issue using Sprintf. inline below. -// //tzhr, tzmin := tz/60, tz%60 //faster if u convert to int first -// var tzhr, tzmin int16 -// if tzint < 0 { -// tzname[3] = '-' // (TODO: verify. this works here) -// tzhr, tzmin = -tzint/60, (-tzint)%60 -// } else { -// tzhr, tzmin = tzint/60, tzint%60 -// } -// tzname[4] = timeDigits[tzhr/10] -// tzname[5] = timeDigits[tzhr%10] -// tzname[7] = timeDigits[tzmin/10] -// tzname[8] = timeDigits[tzmin%10] -// return string(tzname) -// //return time.FixedZone(string(tzname), int(tzint)*60) -// } diff --git a/vendor/github.com/ugorji/go/codec/helper_internal.go b/vendor/github.com/ugorji/go/codec/helper_internal.go index 0cbd665e2..5d0727f77 100644 --- a/vendor/github.com/ugorji/go/codec/helper_internal.go +++ b/vendor/github.com/ugorji/go/codec/helper_internal.go @@ -6,6 +6,74 @@ package codec // All non-std package dependencies live in this file, // so porting to different environment is easy (just update functions). +import ( + "errors" + "fmt" + "math" + "reflect" +) + +func panicValToErr(panicVal interface{}, err *error) { + if panicVal == nil { + return + } + // case nil + switch xerr := panicVal.(type) { + case error: + *err = xerr + case string: + *err = errors.New(xerr) + default: + *err = fmt.Errorf("%v", panicVal) + } + return +} + +func hIsEmptyValue(v reflect.Value, deref, checkStruct bool) bool { + switch v.Kind() { + case reflect.Invalid: + return true + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + if deref { + if v.IsNil() { + return true + } + return hIsEmptyValue(v.Elem(), deref, checkStruct) + } else { + return v.IsNil() + } + case reflect.Struct: + if !checkStruct { + return false + } + // return true if all fields are empty. else return false. + // we cannot use equality check, because some fields may be maps/slices/etc + // and consequently the structs are not comparable. + // return v.Interface() == reflect.Zero(v.Type()).Interface() + for i, n := 0, v.NumField(); i < n; i++ { + if !hIsEmptyValue(v.Field(i), deref, checkStruct) { + return false + } + } + return true + } + return false +} + +func isEmptyValue(v reflect.Value, deref, checkStruct bool) bool { + return hIsEmptyValue(v, deref, checkStruct) +} + func pruneSignExt(v []byte, pos bool) (n int) { if len(v) < 2 { } else if pos && v[0] == 0 { @@ -18,6 +86,37 @@ func pruneSignExt(v []byte, pos bool) (n int) { return } +func implementsIntf(typ, iTyp reflect.Type) (success bool, indir int8) { + if typ == nil { + return + } + rt := typ + // The type might be a pointer and we need to keep + // dereferencing to the base type until we find an implementation. + for { + if rt.Implements(iTyp) { + return true, indir + } + if p := rt; p.Kind() == reflect.Ptr { + indir++ + if indir >= math.MaxInt8 { // insane number of indirections + return false, 0 + } + rt = p.Elem() + continue + } + break + } + // No luck yet, but if this is a base type (non-pointer), the pointer might satisfy. + if typ.Kind() != reflect.Ptr { + // Not a pointer, but does the pointer work? + if reflect.PtrTo(typ).Implements(iTyp) { + return true, -1 + } + } + return false, 0 +} + // validate that this function is correct ... // culled from OGRE (Object-Oriented Graphics Rendering Engine) // function: halfToFloatI (http://stderr.org/doc/ogre-doc/api/OgreBitwise_8h-source.html) @@ -30,20 +129,21 @@ func halfFloatToFloatBits(yy uint16) (d uint32) { if e == 0 { if m == 0 { // plu or minus 0 return s << 31 + } else { // Denormalized number -- renormalize it + for (m & 0x00000400) == 0 { + m <<= 1 + e -= 1 + } + e += 1 + const zz uint32 = 0x0400 + m &= ^zz } - // Denormalized number -- renormalize it - for (m & 0x00000400) == 0 { - m <<= 1 - e -= 1 - } - e += 1 - const zz uint32 = 0x0400 - m &= ^zz } else if e == 31 { if m == 0 { // Inf return (s << 31) | 0x7f800000 + } else { // NaN + return (s << 31) | 0x7f800000 | (m << 13) } - return (s << 31) | 0x7f800000 | (m << 13) // NaN } e = e + (127 - 15) m = m << 13 @@ -119,3 +219,24 @@ func growCap(oldCap, unit, num int) (newCap int) { } return } + +func expandSliceValue(s reflect.Value, num int) reflect.Value { + if num <= 0 { + return s + } + l0 := s.Len() + l1 := l0 + num // new slice length + if l1 < l0 { + panic("ExpandSlice: slice overflow") + } + c0 := s.Cap() + if l1 <= c0 { + return s.Slice(0, l1) + } + st := s.Type() + c1 := growCap(c0, int(st.Elem().Size()), num) + s2 := reflect.MakeSlice(st, l1, c1) + // println("expandslicevalue: cap-old: ", c0, ", cap-new: ", c1, ", len-new: ", l1) + reflect.Copy(s2, s) + return s2 +} diff --git a/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go b/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go index fd52690c9..8b06a0045 100644 --- a/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go +++ b/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go @@ -1,24 +1,13 @@ -// +build !go1.7 safe appengine +// +build !unsafe -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec -import ( - "reflect" - "sync/atomic" - "time" -) - -const safeMode = true - // stringView returns a view of the []byte as a string. // In unsafe mode, it doesn't incur allocation and copying caused by conversion. // In regular safe mode, it is an allocation and copy. -// -// Usage: Always maintain a reference to v while result of this call is in use, -// and call keepAlive4BytesView(v) at point where done with view. func stringView(v []byte) string { return string(v) } @@ -26,247 +15,6 @@ func stringView(v []byte) string { // bytesView returns a view of the string as a []byte. // In unsafe mode, it doesn't incur allocation and copying caused by conversion. // In regular safe mode, it is an allocation and copy. -// -// Usage: Always maintain a reference to v while result of this call is in use, -// and call keepAlive4BytesView(v) at point where done with view. func bytesView(v string) []byte { return []byte(v) } - -func definitelyNil(v interface{}) bool { - // this is a best-effort option. - // We just return false, so we don't unnecessarily incur the cost of reflection this early. - return false -} - -func rv2i(rv reflect.Value) interface{} { - return rv.Interface() -} - -func rt2id(rt reflect.Type) uintptr { - return reflect.ValueOf(rt).Pointer() -} - -func rv2rtid(rv reflect.Value) uintptr { - return reflect.ValueOf(rv.Type()).Pointer() -} - -func i2rtid(i interface{}) uintptr { - return reflect.ValueOf(reflect.TypeOf(i)).Pointer() -} - -// -------------------------- - -func isEmptyValue(v reflect.Value, tinfos *TypeInfos, deref, checkStruct bool) bool { - switch v.Kind() { - case reflect.Invalid: - return true - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - if deref { - if v.IsNil() { - return true - } - return isEmptyValue(v.Elem(), tinfos, deref, checkStruct) - } - return v.IsNil() - case reflect.Struct: - return isEmptyStruct(v, tinfos, deref, checkStruct) - } - return false -} - -// -------------------------- -// type ptrToRvMap struct{} - -// func (*ptrToRvMap) init() {} -// func (*ptrToRvMap) get(i interface{}) reflect.Value { -// return reflect.ValueOf(i).Elem() -// } - -// -------------------------- -type atomicTypeInfoSlice struct { // expected to be 2 words - v atomic.Value -} - -func (x *atomicTypeInfoSlice) load() []rtid2ti { - i := x.v.Load() - if i == nil { - return nil - } - return i.([]rtid2ti) -} - -func (x *atomicTypeInfoSlice) store(p []rtid2ti) { - x.v.Store(p) -} - -// -------------------------- -func (d *Decoder) raw(f *codecFnInfo, rv reflect.Value) { - rv.SetBytes(d.rawBytes()) -} - -func (d *Decoder) kString(f *codecFnInfo, rv reflect.Value) { - rv.SetString(d.d.DecodeString()) -} - -func (d *Decoder) kBool(f *codecFnInfo, rv reflect.Value) { - rv.SetBool(d.d.DecodeBool()) -} - -func (d *Decoder) kTime(f *codecFnInfo, rv reflect.Value) { - rv.Set(reflect.ValueOf(d.d.DecodeTime())) -} - -func (d *Decoder) kFloat32(f *codecFnInfo, rv reflect.Value) { - fv := d.d.DecodeFloat64() - if chkOvf.Float32(fv) { - d.errorf("float32 overflow: %v", fv) - } - rv.SetFloat(fv) -} - -func (d *Decoder) kFloat64(f *codecFnInfo, rv reflect.Value) { - rv.SetFloat(d.d.DecodeFloat64()) -} - -func (d *Decoder) kInt(f *codecFnInfo, rv reflect.Value) { - rv.SetInt(chkOvf.IntV(d.d.DecodeInt64(), intBitsize)) -} - -func (d *Decoder) kInt8(f *codecFnInfo, rv reflect.Value) { - rv.SetInt(chkOvf.IntV(d.d.DecodeInt64(), 8)) -} - -func (d *Decoder) kInt16(f *codecFnInfo, rv reflect.Value) { - rv.SetInt(chkOvf.IntV(d.d.DecodeInt64(), 16)) -} - -func (d *Decoder) kInt32(f *codecFnInfo, rv reflect.Value) { - rv.SetInt(chkOvf.IntV(d.d.DecodeInt64(), 32)) -} - -func (d *Decoder) kInt64(f *codecFnInfo, rv reflect.Value) { - rv.SetInt(d.d.DecodeInt64()) -} - -func (d *Decoder) kUint(f *codecFnInfo, rv reflect.Value) { - rv.SetUint(chkOvf.UintV(d.d.DecodeUint64(), uintBitsize)) -} - -func (d *Decoder) kUintptr(f *codecFnInfo, rv reflect.Value) { - rv.SetUint(chkOvf.UintV(d.d.DecodeUint64(), uintBitsize)) -} - -func (d *Decoder) kUint8(f *codecFnInfo, rv reflect.Value) { - rv.SetUint(chkOvf.UintV(d.d.DecodeUint64(), 8)) -} - -func (d *Decoder) kUint16(f *codecFnInfo, rv reflect.Value) { - rv.SetUint(chkOvf.UintV(d.d.DecodeUint64(), 16)) -} - -func (d *Decoder) kUint32(f *codecFnInfo, rv reflect.Value) { - rv.SetUint(chkOvf.UintV(d.d.DecodeUint64(), 32)) -} - -func (d *Decoder) kUint64(f *codecFnInfo, rv reflect.Value) { - rv.SetUint(d.d.DecodeUint64()) -} - -// ---------------- - -func (e *Encoder) kBool(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeBool(rv.Bool()) -} - -func (e *Encoder) kTime(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeTime(rv2i(rv).(time.Time)) -} - -func (e *Encoder) kString(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeString(cUTF8, rv.String()) -} - -func (e *Encoder) kFloat64(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeFloat64(rv.Float()) -} - -func (e *Encoder) kFloat32(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeFloat32(float32(rv.Float())) -} - -func (e *Encoder) kInt(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeInt(rv.Int()) -} - -func (e *Encoder) kInt8(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeInt(rv.Int()) -} - -func (e *Encoder) kInt16(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeInt(rv.Int()) -} - -func (e *Encoder) kInt32(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeInt(rv.Int()) -} - -func (e *Encoder) kInt64(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeInt(rv.Int()) -} - -func (e *Encoder) kUint(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeUint(rv.Uint()) -} - -func (e *Encoder) kUint8(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeUint(rv.Uint()) -} - -func (e *Encoder) kUint16(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeUint(rv.Uint()) -} - -func (e *Encoder) kUint32(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeUint(rv.Uint()) -} - -func (e *Encoder) kUint64(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeUint(rv.Uint()) -} - -func (e *Encoder) kUintptr(f *codecFnInfo, rv reflect.Value) { - e.e.EncodeUint(rv.Uint()) -} - -// // keepAlive4BytesView maintains a reference to the input parameter for bytesView. -// // -// // Usage: call this at point where done with the bytes view. -// func keepAlive4BytesView(v string) {} - -// // keepAlive4BytesView maintains a reference to the input parameter for stringView. -// // -// // Usage: call this at point where done with the string view. -// func keepAlive4StringView(v []byte) {} - -// func definitelyNil(v interface{}) bool { -// rv := reflect.ValueOf(v) -// switch rv.Kind() { -// case reflect.Invalid: -// return true -// case reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Slice, reflect.Map, reflect.Func: -// return rv.IsNil() -// default: -// return false -// } -// } diff --git a/vendor/github.com/ugorji/go/codec/helper_unsafe.go b/vendor/github.com/ugorji/go/codec/helper_unsafe.go index e3df60abe..0f596c71a 100644 --- a/vendor/github.com/ugorji/go/codec/helper_unsafe.go +++ b/vendor/github.com/ugorji/go/codec/helper_unsafe.go @@ -1,639 +1,49 @@ -// +build !safe -// +build !appengine -// +build go1.7 +// +build unsafe -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec import ( - "reflect" - "sync/atomic" - "time" "unsafe" ) // This file has unsafe variants of some helper methods. -// NOTE: See helper_not_unsafe.go for the usage information. - -// var zeroRTv [4]uintptr - -const safeMode = false -const unsafeFlagIndir = 1 << 7 // keep in sync with GO_ROOT/src/reflect/value.go type unsafeString struct { - Data unsafe.Pointer + Data uintptr Len int } type unsafeSlice struct { - Data unsafe.Pointer + Data uintptr Len int Cap int } -type unsafeIntf struct { - typ unsafe.Pointer - word unsafe.Pointer -} - -type unsafeReflectValue struct { - typ unsafe.Pointer - ptr unsafe.Pointer - flag uintptr -} - +// stringView returns a view of the []byte as a string. +// In unsafe mode, it doesn't incur allocation and copying caused by conversion. +// In regular safe mode, it is an allocation and copy. func stringView(v []byte) string { if len(v) == 0 { return "" } + bx := (*unsafeSlice)(unsafe.Pointer(&v)) - return *(*string)(unsafe.Pointer(&unsafeString{bx.Data, bx.Len})) + sx := unsafeString{bx.Data, bx.Len} + return *(*string)(unsafe.Pointer(&sx)) } +// bytesView returns a view of the string as a []byte. +// In unsafe mode, it doesn't incur allocation and copying caused by conversion. +// In regular safe mode, it is an allocation and copy. func bytesView(v string) []byte { if len(v) == 0 { return zeroByteSlice } - sx := (*unsafeString)(unsafe.Pointer(&v)) - return *(*[]byte)(unsafe.Pointer(&unsafeSlice{sx.Data, sx.Len, sx.Len})) -} - -func definitelyNil(v interface{}) bool { - // There is no global way of checking if an interface is nil. - // For true references (map, ptr, func, chan), you can just look - // at the word of the interface. However, for slices, you have to dereference - // the word, and get a pointer to the 3-word interface value. - // - // However, the following are cheap calls - // - TypeOf(interface): cheap 2-line call. - // - ValueOf(interface{}): expensive - // - type.Kind: cheap call through an interface - // - Value.Type(): cheap call - // except it's a method value (e.g. r.Read, which implies that it is a Func) - - return ((*unsafeIntf)(unsafe.Pointer(&v))).word == nil -} - -func rv2i(rv reflect.Value) interface{} { - // TODO: consider a more generally-known optimization for reflect.Value ==> Interface - // - // Currently, we use this fragile method that taps into implememtation details from - // the source go stdlib reflect/value.go, and trims the implementation. - - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - // true references (map, func, chan, ptr - NOT slice) may be double-referenced as flagIndir - var ptr unsafe.Pointer - if refBitset.isset(byte(urv.flag&(1<<5-1))) && urv.flag&unsafeFlagIndir != 0 { - ptr = *(*unsafe.Pointer)(urv.ptr) - } else { - ptr = urv.ptr - } - return *(*interface{})(unsafe.Pointer(&unsafeIntf{typ: urv.typ, word: ptr})) -} - -func rt2id(rt reflect.Type) uintptr { - return uintptr(((*unsafeIntf)(unsafe.Pointer(&rt))).word) -} - -func rv2rtid(rv reflect.Value) uintptr { - return uintptr((*unsafeReflectValue)(unsafe.Pointer(&rv)).typ) -} - -func i2rtid(i interface{}) uintptr { - return uintptr(((*unsafeIntf)(unsafe.Pointer(&i))).typ) -} - -// -------------------------- - -func isEmptyValue(v reflect.Value, tinfos *TypeInfos, deref, checkStruct bool) bool { - urv := (*unsafeReflectValue)(unsafe.Pointer(&v)) - if urv.flag == 0 { - return true - } - switch v.Kind() { - case reflect.Invalid: - return true - case reflect.String: - return (*unsafeString)(urv.ptr).Len == 0 - case reflect.Slice: - return (*unsafeSlice)(urv.ptr).Len == 0 - case reflect.Bool: - return !*(*bool)(urv.ptr) - case reflect.Int: - return *(*int)(urv.ptr) == 0 - case reflect.Int8: - return *(*int8)(urv.ptr) == 0 - case reflect.Int16: - return *(*int16)(urv.ptr) == 0 - case reflect.Int32: - return *(*int32)(urv.ptr) == 0 - case reflect.Int64: - return *(*int64)(urv.ptr) == 0 - case reflect.Uint: - return *(*uint)(urv.ptr) == 0 - case reflect.Uint8: - return *(*uint8)(urv.ptr) == 0 - case reflect.Uint16: - return *(*uint16)(urv.ptr) == 0 - case reflect.Uint32: - return *(*uint32)(urv.ptr) == 0 - case reflect.Uint64: - return *(*uint64)(urv.ptr) == 0 - case reflect.Uintptr: - return *(*uintptr)(urv.ptr) == 0 - case reflect.Float32: - return *(*float32)(urv.ptr) == 0 - case reflect.Float64: - return *(*float64)(urv.ptr) == 0 - case reflect.Interface: - isnil := urv.ptr == nil || *(*unsafe.Pointer)(urv.ptr) == nil - if deref { - if isnil { - return true - } - return isEmptyValue(v.Elem(), tinfos, deref, checkStruct) - } - return isnil - case reflect.Ptr: - // isnil := urv.ptr == nil (not sufficient, as a pointer value encodes the type) - isnil := urv.ptr == nil || *(*unsafe.Pointer)(urv.ptr) == nil - if deref { - if isnil { - return true - } - return isEmptyValue(v.Elem(), tinfos, deref, checkStruct) - } - return isnil - case reflect.Struct: - return isEmptyStruct(v, tinfos, deref, checkStruct) - case reflect.Map, reflect.Array, reflect.Chan: - return v.Len() == 0 - } - return false -} - -// -------------------------- - -// atomicTypeInfoSlice contains length and pointer to the array for a slice. -// It is expected to be 2 words. -// -// Previously, we atomically loaded and stored the length and array pointer separately, -// which could lead to some races. -// We now just atomically store and load the pointer to the value directly. - -type atomicTypeInfoSlice struct { // expected to be 2 words - l int // length of the data array (must be first in struct, for 64-bit alignment necessary for 386) - v unsafe.Pointer // data array - Pointer (not uintptr) to maintain GC reference -} - -func (x *atomicTypeInfoSlice) load() []rtid2ti { - xp := unsafe.Pointer(x) - x2 := *(*atomicTypeInfoSlice)(atomic.LoadPointer(&xp)) - if x2.l == 0 { - return nil - } - return *(*[]rtid2ti)(unsafe.Pointer(&unsafeSlice{Data: x2.v, Len: x2.l, Cap: x2.l})) -} - -func (x *atomicTypeInfoSlice) store(p []rtid2ti) { - s := (*unsafeSlice)(unsafe.Pointer(&p)) - xp := unsafe.Pointer(x) - atomic.StorePointer(&xp, unsafe.Pointer(&atomicTypeInfoSlice{l: s.Len, v: s.Data})) -} - -// -------------------------- -func (d *Decoder) raw(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*[]byte)(urv.ptr) = d.rawBytes() -} - -func (d *Decoder) kString(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*string)(urv.ptr) = d.d.DecodeString() -} - -func (d *Decoder) kBool(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*bool)(urv.ptr) = d.d.DecodeBool() -} - -func (d *Decoder) kTime(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*time.Time)(urv.ptr) = d.d.DecodeTime() -} - -func (d *Decoder) kFloat32(f *codecFnInfo, rv reflect.Value) { - fv := d.d.DecodeFloat64() - if chkOvf.Float32(fv) { - d.errorf("float32 overflow: %v", fv) - } - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*float32)(urv.ptr) = float32(fv) -} - -func (d *Decoder) kFloat64(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*float64)(urv.ptr) = d.d.DecodeFloat64() -} - -func (d *Decoder) kInt(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*int)(urv.ptr) = int(chkOvf.IntV(d.d.DecodeInt64(), intBitsize)) -} - -func (d *Decoder) kInt8(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*int8)(urv.ptr) = int8(chkOvf.IntV(d.d.DecodeInt64(), 8)) -} - -func (d *Decoder) kInt16(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*int16)(urv.ptr) = int16(chkOvf.IntV(d.d.DecodeInt64(), 16)) -} - -func (d *Decoder) kInt32(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*int32)(urv.ptr) = int32(chkOvf.IntV(d.d.DecodeInt64(), 32)) -} - -func (d *Decoder) kInt64(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*int64)(urv.ptr) = d.d.DecodeInt64() -} - -func (d *Decoder) kUint(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*uint)(urv.ptr) = uint(chkOvf.UintV(d.d.DecodeUint64(), uintBitsize)) -} - -func (d *Decoder) kUintptr(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*uintptr)(urv.ptr) = uintptr(chkOvf.UintV(d.d.DecodeUint64(), uintBitsize)) -} - -func (d *Decoder) kUint8(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*uint8)(urv.ptr) = uint8(chkOvf.UintV(d.d.DecodeUint64(), 8)) -} - -func (d *Decoder) kUint16(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*uint16)(urv.ptr) = uint16(chkOvf.UintV(d.d.DecodeUint64(), 16)) -} - -func (d *Decoder) kUint32(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*uint32)(urv.ptr) = uint32(chkOvf.UintV(d.d.DecodeUint64(), 32)) -} - -func (d *Decoder) kUint64(f *codecFnInfo, rv reflect.Value) { - urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - *(*uint64)(urv.ptr) = d.d.DecodeUint64() -} - -// ------------ - -func (e *Encoder) kBool(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeBool(*(*bool)(v.ptr)) -} - -func (e *Encoder) kTime(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeTime(*(*time.Time)(v.ptr)) -} - -func (e *Encoder) kString(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeString(cUTF8, *(*string)(v.ptr)) -} - -func (e *Encoder) kFloat64(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeFloat64(*(*float64)(v.ptr)) -} - -func (e *Encoder) kFloat32(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeFloat32(*(*float32)(v.ptr)) -} - -func (e *Encoder) kInt(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeInt(int64(*(*int)(v.ptr))) -} - -func (e *Encoder) kInt8(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeInt(int64(*(*int8)(v.ptr))) -} - -func (e *Encoder) kInt16(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeInt(int64(*(*int16)(v.ptr))) -} - -func (e *Encoder) kInt32(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeInt(int64(*(*int32)(v.ptr))) -} - -func (e *Encoder) kInt64(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeInt(int64(*(*int64)(v.ptr))) -} - -func (e *Encoder) kUint(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeUint(uint64(*(*uint)(v.ptr))) -} - -func (e *Encoder) kUint8(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeUint(uint64(*(*uint8)(v.ptr))) -} - -func (e *Encoder) kUint16(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeUint(uint64(*(*uint16)(v.ptr))) -} - -func (e *Encoder) kUint32(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeUint(uint64(*(*uint32)(v.ptr))) -} - -func (e *Encoder) kUint64(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeUint(uint64(*(*uint64)(v.ptr))) -} -func (e *Encoder) kUintptr(f *codecFnInfo, rv reflect.Value) { - v := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - e.e.EncodeUint(uint64(*(*uintptr)(v.ptr))) + sx := (*unsafeString)(unsafe.Pointer(&v)) + bx := unsafeSlice{sx.Data, sx.Len, sx.Len} + return *(*[]byte)(unsafe.Pointer(&bx)) } - -// ------------ - -// func (d *Decoder) raw(f *codecFnInfo, rv reflect.Value) { -// urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) -// // if urv.flag&unsafeFlagIndir != 0 { -// // urv.ptr = *(*unsafe.Pointer)(urv.ptr) -// // } -// *(*[]byte)(urv.ptr) = d.rawBytes() -// } - -// func rv0t(rt reflect.Type) reflect.Value { -// ut := (*unsafeIntf)(unsafe.Pointer(&rt)) -// // we need to determine whether ifaceIndir, and then whether to just pass 0 as the ptr -// uv := unsafeReflectValue{ut.word, &zeroRTv, flag(rt.Kind())} -// return *(*reflect.Value)(unsafe.Pointer(&uv}) -// } - -// func rv2i(rv reflect.Value) interface{} { -// urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) -// // true references (map, func, chan, ptr - NOT slice) may be double-referenced as flagIndir -// var ptr unsafe.Pointer -// // kk := reflect.Kind(urv.flag & (1<<5 - 1)) -// // if (kk == reflect.Map || kk == reflect.Ptr || kk == reflect.Chan || kk == reflect.Func) && urv.flag&unsafeFlagIndir != 0 { -// if refBitset.isset(byte(urv.flag&(1<<5-1))) && urv.flag&unsafeFlagIndir != 0 { -// ptr = *(*unsafe.Pointer)(urv.ptr) -// } else { -// ptr = urv.ptr -// } -// return *(*interface{})(unsafe.Pointer(&unsafeIntf{typ: urv.typ, word: ptr})) -// // return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: *(*unsafe.Pointer)(urv.ptr), typ: urv.typ})) -// // return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: urv.ptr, typ: urv.typ})) -// } - -// func definitelyNil(v interface{}) bool { -// var ui *unsafeIntf = (*unsafeIntf)(unsafe.Pointer(&v)) -// if ui.word == nil { -// return true -// } -// var tk = reflect.TypeOf(v).Kind() -// return (tk == reflect.Interface || tk == reflect.Slice) && *(*unsafe.Pointer)(ui.word) == nil -// fmt.Printf(">>>> definitely nil: isnil: %v, TYPE: \t%T, word: %v, *word: %v, type: %v, nil: %v\n", -// v == nil, v, word, *((*unsafe.Pointer)(word)), ui.typ, nil) -// } - -// func keepAlive4BytesView(v string) { -// runtime.KeepAlive(v) -// } - -// func keepAlive4StringView(v []byte) { -// runtime.KeepAlive(v) -// } - -// func rt2id(rt reflect.Type) uintptr { -// return uintptr(((*unsafeIntf)(unsafe.Pointer(&rt))).word) -// // var i interface{} = rt -// // // ui := (*unsafeIntf)(unsafe.Pointer(&i)) -// // return ((*unsafeIntf)(unsafe.Pointer(&i))).word -// } - -// func rv2i(rv reflect.Value) interface{} { -// urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) -// // non-reference type: already indir -// // reference type: depend on flagIndir property ('cos maybe was double-referenced) -// // const (unsafeRvFlagKindMask = 1<<5 - 1 , unsafeRvFlagIndir = 1 << 7 ) -// // rvk := reflect.Kind(urv.flag & (1<<5 - 1)) -// // if (rvk == reflect.Chan || -// // rvk == reflect.Func || -// // rvk == reflect.Interface || -// // rvk == reflect.Map || -// // rvk == reflect.Ptr || -// // rvk == reflect.UnsafePointer) && urv.flag&(1<<8) != 0 { -// // fmt.Printf(">>>>> ---- double indirect reference: %v, %v\n", rvk, rv.Type()) -// // return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: *(*unsafe.Pointer)(urv.ptr), typ: urv.typ})) -// // } -// if urv.flag&(1<<5-1) == uintptr(reflect.Map) && urv.flag&(1<<7) != 0 { -// // fmt.Printf(">>>>> ---- double indirect reference: %v, %v\n", rvk, rv.Type()) -// return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: *(*unsafe.Pointer)(urv.ptr), typ: urv.typ})) -// } -// // fmt.Printf(">>>>> ++++ direct reference: %v, %v\n", rvk, rv.Type()) -// return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: urv.ptr, typ: urv.typ})) -// } - -// const ( -// unsafeRvFlagKindMask = 1<<5 - 1 -// unsafeRvKindDirectIface = 1 << 5 -// unsafeRvFlagIndir = 1 << 7 -// unsafeRvFlagAddr = 1 << 8 -// unsafeRvFlagMethod = 1 << 9 - -// _USE_RV_INTERFACE bool = false -// _UNSAFE_RV_DEBUG = true -// ) - -// type unsafeRtype struct { -// _ [2]uintptr -// _ uint32 -// _ uint8 -// _ uint8 -// _ uint8 -// kind uint8 -// _ [2]uintptr -// _ int32 -// } - -// func _rv2i(rv reflect.Value) interface{} { -// // Note: From use, -// // - it's never an interface -// // - the only calls here are for ifaceIndir types. -// // (though that conditional is wrong) -// // To know for sure, we need the value of t.kind (which is not exposed). -// // -// // Need to validate the path: type is indirect ==> only value is indirect ==> default (value is direct) -// // - Type indirect, Value indirect: ==> numbers, boolean, slice, struct, array, string -// // - Type Direct, Value indirect: ==> map??? -// // - Type Direct, Value direct: ==> pointers, unsafe.Pointer, func, chan, map -// // -// // TRANSLATES TO: -// // if typeIndirect { } else if valueIndirect { } else { } -// // -// // Since we don't deal with funcs, then "flagNethod" is unset, and can be ignored. - -// if _USE_RV_INTERFACE { -// return rv.Interface() -// } -// urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) - -// // if urv.flag&unsafeRvFlagMethod != 0 || urv.flag&unsafeRvFlagKindMask == uintptr(reflect.Interface) { -// // println("***** IS flag method or interface: delegating to rv.Interface()") -// // return rv.Interface() -// // } - -// // if urv.flag&unsafeRvFlagKindMask == uintptr(reflect.Interface) { -// // println("***** IS Interface: delegate to rv.Interface") -// // return rv.Interface() -// // } -// // if urv.flag&unsafeRvFlagKindMask&unsafeRvKindDirectIface == 0 { -// // if urv.flag&unsafeRvFlagAddr == 0 { -// // println("***** IS ifaceIndir typ") -// // // ui := unsafeIntf{word: urv.ptr, typ: urv.typ} -// // // return *(*interface{})(unsafe.Pointer(&ui)) -// // // return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: urv.ptr, typ: urv.typ})) -// // } -// // } else if urv.flag&unsafeRvFlagIndir != 0 { -// // println("***** IS flagindir") -// // // return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: *(*unsafe.Pointer)(urv.ptr), typ: urv.typ})) -// // } else { -// // println("***** NOT flagindir") -// // return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: urv.ptr, typ: urv.typ})) -// // } -// // println("***** default: delegate to rv.Interface") - -// urt := (*unsafeRtype)(unsafe.Pointer(urv.typ)) -// if _UNSAFE_RV_DEBUG { -// fmt.Printf(">>>> start: %v: ", rv.Type()) -// fmt.Printf("%v - %v\n", *urv, *urt) -// } -// if urt.kind&unsafeRvKindDirectIface == 0 { -// if _UNSAFE_RV_DEBUG { -// fmt.Printf("**** +ifaceIndir type: %v\n", rv.Type()) -// } -// // println("***** IS ifaceIndir typ") -// // if true || urv.flag&unsafeRvFlagAddr == 0 { -// // // println(" ***** IS NOT addr") -// return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: urv.ptr, typ: urv.typ})) -// // } -// } else if urv.flag&unsafeRvFlagIndir != 0 { -// if _UNSAFE_RV_DEBUG { -// fmt.Printf("**** +flagIndir type: %v\n", rv.Type()) -// } -// // println("***** IS flagindir") -// return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: *(*unsafe.Pointer)(urv.ptr), typ: urv.typ})) -// } else { -// if _UNSAFE_RV_DEBUG { -// fmt.Printf("**** -flagIndir type: %v\n", rv.Type()) -// } -// // println("***** NOT flagindir") -// return *(*interface{})(unsafe.Pointer(&unsafeIntf{word: urv.ptr, typ: urv.typ})) -// } -// // println("***** default: delegating to rv.Interface()") -// // return rv.Interface() -// } - -// var staticM0 = make(map[string]uint64) -// var staticI0 = (int32)(-5) - -// func staticRv2iTest() { -// i0 := (int32)(-5) -// m0 := make(map[string]uint16) -// m0["1"] = 1 -// for _, i := range []interface{}{ -// (int)(7), -// (uint)(8), -// (int16)(-9), -// (uint16)(19), -// (uintptr)(77), -// (bool)(true), -// float32(-32.7), -// float64(64.9), -// complex(float32(19), 5), -// complex(float64(-32), 7), -// [4]uint64{1, 2, 3, 4}, -// (chan<- int)(nil), // chan, -// rv2i, // func -// io.Writer(ioutil.Discard), -// make(map[string]uint), -// (map[string]uint)(nil), -// staticM0, -// m0, -// &m0, -// i0, -// &i0, -// &staticI0, -// &staticM0, -// []uint32{6, 7, 8}, -// "abc", -// Raw{}, -// RawExt{}, -// &Raw{}, -// &RawExt{}, -// unsafe.Pointer(&i0), -// } { -// i2 := rv2i(reflect.ValueOf(i)) -// eq := reflect.DeepEqual(i, i2) -// fmt.Printf(">>>> %v == %v? %v\n", i, i2, eq) -// } -// // os.Exit(0) -// } - -// func init() { -// staticRv2iTest() -// } - -// func rv2i(rv reflect.Value) interface{} { -// if _USE_RV_INTERFACE || rv.Kind() == reflect.Interface || rv.CanAddr() { -// return rv.Interface() -// } -// // var i interface{} -// // ui := (*unsafeIntf)(unsafe.Pointer(&i)) -// var ui unsafeIntf -// urv := (*unsafeReflectValue)(unsafe.Pointer(&rv)) -// // fmt.Printf("urv: flag: %b, typ: %b, ptr: %b\n", urv.flag, uintptr(urv.typ), uintptr(urv.ptr)) -// if (urv.flag&unsafeRvFlagKindMask)&unsafeRvKindDirectIface == 0 { -// if urv.flag&unsafeRvFlagAddr != 0 { -// println("***** indirect and addressable! Needs typed move - delegate to rv.Interface()") -// return rv.Interface() -// } -// println("****** indirect type/kind") -// ui.word = urv.ptr -// } else if urv.flag&unsafeRvFlagIndir != 0 { -// println("****** unsafe rv flag indir") -// ui.word = *(*unsafe.Pointer)(urv.ptr) -// } else { -// println("****** default: assign prt to word directly") -// ui.word = urv.ptr -// } -// // ui.word = urv.ptr -// ui.typ = urv.typ -// // fmt.Printf("(pointers) ui.typ: %p, word: %p\n", ui.typ, ui.word) -// // fmt.Printf("(binary) ui.typ: %b, word: %b\n", uintptr(ui.typ), uintptr(ui.word)) -// return *(*interface{})(unsafe.Pointer(&ui)) -// // return i -// } diff --git a/vendor/github.com/ugorji/go/codec/json.go b/vendor/github.com/ugorji/go/codec/json.go index bdd199663..463cae3db 100644 --- a/vendor/github.com/ugorji/go/codec/json.go +++ b/vendor/github.com/ugorji/go/codec/json.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. package codec @@ -17,6 +17,16 @@ package codec // Note: // - we cannot use strconv.Quote and strconv.Unquote because json quotes/unquotes differently. // We implement it here. +// - Also, strconv.ParseXXX for floats and integers +// - only works on strings resulting in unnecessary allocation and []byte-string conversion. +// - it does a lot of redundant checks, because json numbers are simpler that what it supports. +// - We parse numbers (floats and integers) directly here. +// We only delegate parsing floats if it is a hairy float which could cause a loss of precision. +// In that case, we delegate to strconv.ParseFloat. +// +// Note: +// - encode does not beautify. There is no whitespace when encoding. +// - rpc calls which take single integer arguments or write single numeric arguments will need care. // Top-level methods of json(End|Dec)Driver (which are implementations of (en|de)cDriver // MUST not call one-another. @@ -24,41 +34,42 @@ package codec import ( "bytes" "encoding/base64" - "math" + "fmt" "reflect" "strconv" - "time" - "unicode" "unicode/utf16" "unicode/utf8" ) //-------------------------------- -var jsonLiterals = [...]byte{ - '"', 't', 'r', 'u', 'e', '"', - '"', 'f', 'a', 'l', 's', 'e', '"', - '"', 'n', 'u', 'l', 'l', '"', -} +var ( + jsonLiterals = [...]byte{'t', 'r', 'u', 'e', 'f', 'a', 'l', 's', 'e', 'n', 'u', 'l', 'l'} -const ( - jsonLitTrueQ = 0 - jsonLitTrue = 1 - jsonLitFalseQ = 6 - jsonLitFalse = 7 - jsonLitNullQ = 13 - jsonLitNull = 14 -) + jsonFloat64Pow10 = [...]float64{ + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22, + } -const ( - jsonU4Chk2 = '0' - jsonU4Chk1 = 'a' - 10 - jsonU4Chk0 = 'A' - 10 + jsonUint64Pow10 = [...]uint64{ + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + } - jsonScratchArrayLen = 64 + // jsonTabs and jsonSpaces are used as caches for indents + jsonTabs, jsonSpaces string ) const ( + // jsonUnreadAfterDecNum controls whether we unread after decoding a number. + // + // instead of unreading, just update d.tok (iff it's not a whitespace char) + // However, doing this means that we may HOLD onto some data which belongs to another stream. + // Thus, it is safest to unread the data when done. + // keep behind a constant flag for now. + jsonUnreadAfterDecNum = true + // If !jsonValidateSymbols, decoding will be faster, by skipping some checks: // - If we see first character of null, false or true, // do not validate subsequent characters. @@ -67,156 +78,48 @@ const ( // P.S. Do not expect a significant decoding boost from this. jsonValidateSymbols = true - jsonSpacesOrTabsLen = 128 + // if jsonTruncateMantissa, truncate mantissa if trailing 0's. + // This is important because it could allow some floats to be decoded without + // deferring to strconv.ParseFloat. + jsonTruncateMantissa = true - jsonAlwaysReturnInternString = false -) + // if mantissa >= jsonNumUintCutoff before multiplying by 10, this is an overflow + jsonNumUintCutoff = (1<<64-1)/uint64(10) + 1 // cutoff64(base) -var ( - // jsonTabs and jsonSpaces are used as caches for indents - jsonTabs, jsonSpaces [jsonSpacesOrTabsLen]byte + // if mantissa >= jsonNumUintMaxVal, this is an overflow + jsonNumUintMaxVal = 1< & - var i byte - for i = 32; i < utf8.RuneSelf; i++ { - switch i { - case '"', '\\': - case '<', '>', '&': - jsonCharSafeSet.set(i) // = true - default: - jsonCharSafeSet.set(i) - jsonCharHtmlSafeSet.set(i) - } - } - for i = 0; i <= utf8.RuneSelf; i++ { - switch i { - case ' ', '\t', '\r', '\n': - jsonCharWhitespaceSet.set(i) - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-': - jsonNumSet.set(i) - } - } -} - -// ---------------- - -type jsonEncDriverTypical struct { - w encWriter - // w *encWriterSwitch - b *[jsonScratchArrayLen]byte - tw bool // term white space - c containerState -} - -func (e *jsonEncDriverTypical) typical() {} - -func (e *jsonEncDriverTypical) reset(ee *jsonEncDriver) { - e.w = ee.ew - // e.w = &ee.e.encWriterSwitch - e.b = &ee.b - e.tw = ee.h.TermWhitespace - e.c = 0 -} - -func (e *jsonEncDriverTypical) WriteArrayStart(length int) { - e.w.writen1('[') - e.c = containerArrayStart -} - -func (e *jsonEncDriverTypical) WriteArrayElem() { - if e.c != containerArrayStart { - e.w.writen1(',') - } - e.c = containerArrayElem -} - -func (e *jsonEncDriverTypical) WriteArrayEnd() { - e.w.writen1(']') - e.c = containerArrayEnd -} - -func (e *jsonEncDriverTypical) WriteMapStart(length int) { - e.w.writen1('{') - e.c = containerMapStart -} - -func (e *jsonEncDriverTypical) WriteMapElemKey() { - if e.c != containerMapStart { - e.w.writen1(',') + bs[i] = ' ' } - e.c = containerMapKey -} - -func (e *jsonEncDriverTypical) WriteMapElemValue() { - e.w.writen1(':') - e.c = containerMapValue -} - -func (e *jsonEncDriverTypical) WriteMapEnd() { - e.w.writen1('}') - e.c = containerMapEnd -} - -func (e *jsonEncDriverTypical) EncodeBool(b bool) { - if b { - e.w.writeb(jsonLiterals[jsonLitTrue : jsonLitTrue+4]) - } else { - e.w.writeb(jsonLiterals[jsonLitFalse : jsonLitFalse+5]) - } -} - -func (e *jsonEncDriverTypical) EncodeFloat64(f float64) { - fmt, prec := jsonFloatStrconvFmtPrec(f) - e.w.writeb(strconv.AppendFloat(e.b[:0], f, fmt, prec, 64)) -} - -func (e *jsonEncDriverTypical) EncodeInt(v int64) { - e.w.writeb(strconv.AppendInt(e.b[:0], v, 10)) -} - -func (e *jsonEncDriverTypical) EncodeUint(v uint64) { - e.w.writeb(strconv.AppendUint(e.b[:0], v, 10)) -} - -func (e *jsonEncDriverTypical) EncodeFloat32(f float32) { - e.EncodeFloat64(float64(f)) -} + jsonSpaces = string(bs[:]) -func (e *jsonEncDriverTypical) atEndOfEncode() { - if e.tw { - e.w.writen1(' ') + for i := 0; i < jsonSpacesOrTabsLen; i++ { + bs[i] = '\t' } + jsonTabs = string(bs[:]) } -// ---------------- - -type jsonEncDriverGeneric struct { - w encWriter // encWriter // *encWriterSwitch - b *[jsonScratchArrayLen]byte - c containerState - // ds string // indent string - di int8 // indent per - d bool // indenting? - dt bool // indent using tabs - dl uint16 // indent level - ks bool // map key as string - is byte // integer as string - tw bool // term white space - _ [7]byte // padding +type jsonEncDriver struct { + e *Encoder + w encWriter + h *JsonHandle + b [64]byte // scratch + bs []byte // scratch + se setExtWrapper + ds string // indent string + dl uint16 // indent level + dt bool // indent using tabs + d bool // indent + c containerState + noBuiltInTypes } // indent is done as below: @@ -224,227 +127,115 @@ type jsonEncDriverGeneric struct { // - newline and indent are added before each ending, // except there was no entry (so we can have {} or []) -func (e *jsonEncDriverGeneric) reset(ee *jsonEncDriver) { - e.w = ee.ew - e.b = &ee.b - e.tw = ee.h.TermWhitespace - e.c = 0 - e.d, e.dt, e.dl, e.di = false, false, 0, 0 - h := ee.h - if h.Indent > 0 { - e.d = true - e.di = int8(h.Indent) - } else if h.Indent < 0 { - e.d = true - e.dt = true - e.di = int8(-h.Indent) - } - e.ks = h.MapKeyAsString - e.is = h.IntegerAsString -} - -func (e *jsonEncDriverGeneric) WriteArrayStart(length int) { - if e.d { - e.dl++ - } - e.w.writen1('[') - e.c = containerArrayStart -} - -func (e *jsonEncDriverGeneric) WriteArrayElem() { - if e.c != containerArrayStart { - e.w.writen1(',') - } - if e.d { - e.writeIndent() - } - e.c = containerArrayElem -} - -func (e *jsonEncDriverGeneric) WriteArrayEnd() { - if e.d { - e.dl-- - if e.c != containerArrayStart { - e.writeIndent() - } - } - e.w.writen1(']') - e.c = containerArrayEnd -} - -func (e *jsonEncDriverGeneric) WriteMapStart(length int) { - if e.d { - e.dl++ - } - e.w.writen1('{') - e.c = containerMapStart -} - -func (e *jsonEncDriverGeneric) WriteMapElemKey() { - if e.c != containerMapStart { - e.w.writen1(',') - } - if e.d { - e.writeIndent() - } - e.c = containerMapKey -} - -func (e *jsonEncDriverGeneric) WriteMapElemValue() { - if e.d { - e.w.writen2(':', ' ') - } else { - e.w.writen1(':') - } - e.c = containerMapValue -} - -func (e *jsonEncDriverGeneric) WriteMapEnd() { - if e.d { - e.dl-- +func (e *jsonEncDriver) sendContainerState(c containerState) { + // determine whether to output separators + if c == containerMapKey { if e.c != containerMapStart { + e.w.writen1(',') + } + if e.d { e.writeIndent() } - } - e.w.writen1('}') - e.c = containerMapEnd -} - -func (e *jsonEncDriverGeneric) writeIndent() { - e.w.writen1('\n') - x := int(e.di) * int(e.dl) - if e.dt { - for x > jsonSpacesOrTabsLen { - e.w.writeb(jsonTabs[:]) - x -= jsonSpacesOrTabsLen + } else if c == containerMapValue { + if e.d { + e.w.writen2(':', ' ') + } else { + e.w.writen1(':') } - e.w.writeb(jsonTabs[:x]) - } else { - for x > jsonSpacesOrTabsLen { - e.w.writeb(jsonSpaces[:]) - x -= jsonSpacesOrTabsLen + } else if c == containerMapEnd { + if e.d { + e.dl-- + if e.c != containerMapStart { + e.writeIndent() + } + } + e.w.writen1('}') + } else if c == containerArrayElem { + if e.c != containerArrayStart { + e.w.writen1(',') + } + if e.d { + e.writeIndent() + } + } else if c == containerArrayEnd { + if e.d { + e.dl-- + if e.c != containerArrayStart { + e.writeIndent() + } } - e.w.writeb(jsonSpaces[:x]) + e.w.writen1(']') } + e.c = c } -func (e *jsonEncDriverGeneric) EncodeBool(b bool) { - if e.ks && e.c == containerMapKey { - if b { - e.w.writeb(jsonLiterals[jsonLitTrueQ : jsonLitTrueQ+6]) +func (e *jsonEncDriver) writeIndent() { + e.w.writen1('\n') + if x := len(e.ds) * int(e.dl); x <= jsonSpacesOrTabsLen { + if e.dt { + e.w.writestr(jsonTabs[:x]) } else { - e.w.writeb(jsonLiterals[jsonLitFalseQ : jsonLitFalseQ+7]) + e.w.writestr(jsonSpaces[:x]) } } else { - if b { - e.w.writeb(jsonLiterals[jsonLitTrue : jsonLitTrue+4]) - } else { - e.w.writeb(jsonLiterals[jsonLitFalse : jsonLitFalse+5]) + for i := uint16(0); i < e.dl; i++ { + e.w.writestr(e.ds) } } } -func (e *jsonEncDriverGeneric) EncodeFloat64(f float64) { - // instead of using 'g', specify whether to use 'e' or 'f' - fmt, prec := jsonFloatStrconvFmtPrec(f) - - var blen int - if e.ks && e.c == containerMapKey { - blen = 2 + len(strconv.AppendFloat(e.b[1:1], f, fmt, prec, 64)) - e.b[0] = '"' - e.b[blen-1] = '"' - } else { - blen = len(strconv.AppendFloat(e.b[:0], f, fmt, prec, 64)) - } - e.w.writeb(e.b[:blen]) +func (e *jsonEncDriver) EncodeNil() { + e.w.writeb(jsonLiterals[9:13]) // null } -func (e *jsonEncDriverGeneric) EncodeInt(v int64) { - x := e.is - if x == 'A' || x == 'L' && (v > 1<<53 || v < -(1<<53)) || (e.ks && e.c == containerMapKey) { - blen := 2 + len(strconv.AppendInt(e.b[1:1], v, 10)) - e.b[0] = '"' - e.b[blen-1] = '"' - e.w.writeb(e.b[:blen]) - return +func (e *jsonEncDriver) EncodeBool(b bool) { + if b { + e.w.writeb(jsonLiterals[0:4]) // true + } else { + e.w.writeb(jsonLiterals[4:9]) // false } - e.w.writeb(strconv.AppendInt(e.b[:0], v, 10)) } -func (e *jsonEncDriverGeneric) EncodeUint(v uint64) { - x := e.is - if x == 'A' || x == 'L' && v > 1<<53 || (e.ks && e.c == containerMapKey) { - blen := 2 + len(strconv.AppendUint(e.b[1:1], v, 10)) - e.b[0] = '"' - e.b[blen-1] = '"' - e.w.writeb(e.b[:blen]) - return - } - e.w.writeb(strconv.AppendUint(e.b[:0], v, 10)) +func (e *jsonEncDriver) EncodeFloat32(f float32) { + e.encodeFloat(float64(f), 32) } -func (e *jsonEncDriverGeneric) EncodeFloat32(f float32) { - // e.encodeFloat(float64(f), 32) - // always encode all floats as IEEE 64-bit floating point. - // It also ensures that we can decode in full precision even if into a float32, - // as what is written is always to float64 precision. - e.EncodeFloat64(float64(f)) +func (e *jsonEncDriver) EncodeFloat64(f float64) { + // e.w.writestr(strconv.FormatFloat(f, 'E', -1, 64)) + e.encodeFloat(f, 64) } -func (e *jsonEncDriverGeneric) atEndOfEncode() { - if e.tw { - if e.d { - e.w.writen1('\n') - } else { - e.w.writen1(' ') - } +func (e *jsonEncDriver) encodeFloat(f float64, numbits int) { + x := strconv.AppendFloat(e.b[:0], f, 'G', -1, numbits) + e.w.writeb(x) + if bytes.IndexByte(x, 'E') == -1 && bytes.IndexByte(x, '.') == -1 { + e.w.writen2('.', '0') } } -// -------------------- - -type jsonEncDriver struct { - noBuiltInTypes - e *Encoder - h *JsonHandle - ew encWriter // encWriter // *encWriterSwitch - se extWrapper - // ---- cpu cache line boundary? - bs []byte // scratch - // ---- cpu cache line boundary? - b [jsonScratchArrayLen]byte // scratch (encode time, -} - -func (e *jsonEncDriver) EncodeNil() { - // We always encode nil as just null (never in quotes) - // This allows us to easily decode if a nil in the json stream - // ie if initial token is n. - e.ew.writeb(jsonLiterals[jsonLitNull : jsonLitNull+4]) - - // if e.h.MapKeyAsString && e.c == containerMapKey { - // e.ew.writeb(jsonLiterals[jsonLitNullQ : jsonLitNullQ+6]) - // } else { - // e.ew.writeb(jsonLiterals[jsonLitNull : jsonLitNull+4]) - // } +func (e *jsonEncDriver) EncodeInt(v int64) { + if x := e.h.IntegerAsString; x == 'A' || x == 'L' && (v > 1<<53 || v < -(1<<53)) { + e.w.writen1('"') + e.w.writeb(strconv.AppendInt(e.b[:0], v, 10)) + e.w.writen1('"') + return + } + e.w.writeb(strconv.AppendInt(e.b[:0], v, 10)) } -func (e *jsonEncDriver) EncodeTime(t time.Time) { - // Do NOT use MarshalJSON, as it allocates internally. - // instead, we call AppendFormat directly, using our scratch buffer (e.b) - if t.IsZero() { - e.EncodeNil() - } else { - e.b[0] = '"' - b := t.AppendFormat(e.b[1:1], time.RFC3339Nano) - e.b[len(b)+1] = '"' - e.ew.writeb(e.b[:len(b)+2]) +func (e *jsonEncDriver) EncodeUint(v uint64) { + if x := e.h.IntegerAsString; x == 'A' || x == 'L' && v > 1<<53 { + e.w.writen1('"') + e.w.writeb(strconv.AppendUint(e.b[:0], v, 10)) + e.w.writen1('"') + return } - // v, err := t.MarshalJSON(); if err != nil { e.e.error(err) } e.ew.writeb(v) + e.w.writeb(strconv.AppendUint(e.b[:0], v, 10)) } func (e *jsonEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en *Encoder) { if v := ext.ConvertExt(rv); v == nil { - e.EncodeNil() + e.w.writeb(jsonLiterals[9:13]) // null // e.EncodeNil() } else { en.encode(v) } @@ -453,61 +244,76 @@ func (e *jsonEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en *Enco func (e *jsonEncDriver) EncodeRawExt(re *RawExt, en *Encoder) { // only encodes re.Value (never re.Data) if re.Value == nil { - e.EncodeNil() + e.w.writeb(jsonLiterals[9:13]) // null // e.EncodeNil() } else { en.encode(re.Value) } } +func (e *jsonEncDriver) EncodeArrayStart(length int) { + if e.d { + e.dl++ + } + e.w.writen1('[') + e.c = containerArrayStart +} + +func (e *jsonEncDriver) EncodeMapStart(length int) { + if e.d { + e.dl++ + } + e.w.writen1('{') + e.c = containerMapStart +} + func (e *jsonEncDriver) EncodeString(c charEncoding, v string) { + // e.w.writestr(strconv.Quote(v)) + e.quoteStr(v) +} + +func (e *jsonEncDriver) EncodeSymbol(v string) { + // e.EncodeString(c_UTF8, v) e.quoteStr(v) } func (e *jsonEncDriver) EncodeStringBytes(c charEncoding, v []byte) { // if encoding raw bytes and RawBytesExt is configured, use it to encode - if v == nil { - e.EncodeNil() + if c == c_RAW && e.se.i != nil { + e.EncodeExt(v, 0, &e.se, e.e) return } - if c == cRAW { - if e.se.InterfaceExt != nil { - e.EncodeExt(v, 0, &e.se, e.e) - return - } - + if c == c_RAW { slen := base64.StdEncoding.EncodedLen(len(v)) - if cap(e.bs) >= slen+2 { - e.bs = e.bs[:slen+2] + if cap(e.bs) >= slen { + e.bs = e.bs[:slen] } else { - e.bs = make([]byte, slen+2) + e.bs = make([]byte, slen) } - e.bs[0] = '"' - base64.StdEncoding.Encode(e.bs[1:], v) - e.bs[slen+1] = '"' - e.ew.writeb(e.bs) + base64.StdEncoding.Encode(e.bs, v) + e.w.writen1('"') + e.w.writeb(e.bs) + e.w.writen1('"') } else { + // e.EncodeString(c, string(v)) e.quoteStr(stringView(v)) } } func (e *jsonEncDriver) EncodeAsis(v []byte) { - e.ew.writeb(v) + e.w.writeb(v) } func (e *jsonEncDriver) quoteStr(s string) { // adapted from std pkg encoding/json const hex = "0123456789abcdef" - w := e.ew - htmlasis := e.h.HTMLCharsAsIs + w := e.w w.writen1('"') - var start int - for i, slen := 0, len(s); i < slen; { + start := 0 + for i := 0; i < len(s); { // encode all bytes < 0x20 (except \r, \n). // also encode < > & to prevent security holes when served to some browsers. if b := s[i]; b < utf8.RuneSelf { - // if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { - // if (htmlasis && jsonCharSafeSet.isset(b)) || jsonCharHtmlSafeSet.isset(b) { - if jsonCharHtmlSafeSet.isset(b) || (htmlasis && jsonCharSafeSet.isset(b)) { + if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { i++ continue } @@ -527,6 +333,13 @@ func (e *jsonEncDriver) quoteStr(s string) { w.writen2('\\', 'f') case '\t': w.writen2('\\', 't') + case '<', '>', '&': + if e.h.HTMLCharsAsIs { + w.writen1(b) + } else { + w.writestr(`\u00`) + w.writen2(hex[b>>4], hex[b&0xF]) + } default: w.writestr(`\u00`) w.writen2(hex[b>>4], hex[b&0xF]) @@ -565,219 +378,267 @@ func (e *jsonEncDriver) quoteStr(s string) { w.writen1('"') } -type jsonDecDriver struct { - noBuiltInTypes - d *Decoder - h *JsonHandle - r decReader // *decReaderSwitch // decReader - se extWrapper - - // ---- writable fields during execution --- *try* to keep in sep cache line +//-------------------------------- - c containerState - // tok is used to store the token read right after skipWhiteSpace. - tok uint8 - fnull bool // found null from appendStringAsBytes - bs []byte // scratch. Initialized from b. Used for parsing strings or numbers. - bstr [8]byte // scratch used for string \UXXX parsing - // ---- cpu cache line boundary? - b [jsonScratchArrayLen]byte // scratch 1, used for parsing strings or numbers or time.Time - b2 [jsonScratchArrayLen]byte // scratch 2, used only for readUntil, decNumBytes - - _ [3]uint64 // padding - // n jsonNum +type jsonNum struct { + // bytes []byte // may have [+-.eE0-9] + mantissa uint64 // where mantissa ends, and maybe dot begins. + exponent int16 // exponent value. + manOverflow bool + neg bool // started with -. No initial sign in the bytes above. + dot bool // has dot + explicitExponent bool // explicit exponent +} + +func (x *jsonNum) reset() { + x.manOverflow = false + x.neg = false + x.dot = false + x.explicitExponent = false + x.mantissa = 0 + x.exponent = 0 +} + +// uintExp is called only if exponent > 0. +func (x *jsonNum) uintExp() (n uint64, overflow bool) { + n = x.mantissa + e := x.exponent + if e >= int16(len(jsonUint64Pow10)) { + overflow = true + return + } + n *= jsonUint64Pow10[e] + if n < x.mantissa || n > jsonNumUintMaxVal { + overflow = true + return + } + return + // for i := int16(0); i < e; i++ { + // if n >= jsonNumUintCutoff { + // overflow = true + // return + // } + // n *= 10 + // } + // return } -// func jsonIsWS(b byte) bool { -// // return b == ' ' || b == '\t' || b == '\r' || b == '\n' -// return jsonCharWhitespaceSet.isset(b) -// } +// these constants are only used withn floatVal. +// They are brought out, so that floatVal can be inlined. +const ( + jsonUint64MantissaBits = 52 + jsonMaxExponent = int16(len(jsonFloat64Pow10)) - 1 +) -func (d *jsonDecDriver) uncacheRead() { - if d.tok != 0 { - d.r.unreadn1() - d.tok = 0 +func (x *jsonNum) floatVal() (f float64, parseUsingStrConv bool) { + // We do not want to lose precision. + // Consequently, we will delegate to strconv.ParseFloat if any of the following happen: + // - There are more digits than in math.MaxUint64: 18446744073709551615 (20 digits) + // We expect up to 99.... (19 digits) + // - The mantissa cannot fit into a 52 bits of uint64 + // - The exponent is beyond our scope ie beyong 22. + parseUsingStrConv = x.manOverflow || + x.exponent > jsonMaxExponent || + (x.exponent < 0 && -(x.exponent) > jsonMaxExponent) || + x.mantissa>>jsonUint64MantissaBits != 0 + + if parseUsingStrConv { + return } -} -func (d *jsonDecDriver) ReadMapStart() int { - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + // all good. so handle parse here. + f = float64(x.mantissa) + // fmt.Printf(".Float: uint64 value: %v, float: %v\n", m, f) + if x.neg { + f = -f } - const xc uint8 = '{' - if d.tok != xc { - d.d.errorf("read map - expect char '%c' but got char '%c'", xc, d.tok) + if x.exponent > 0 { + f *= jsonFloat64Pow10[x.exponent] + } else if x.exponent < 0 { + f /= jsonFloat64Pow10[-x.exponent] } - d.tok = 0 - d.c = containerMapStart - return -1 + return } -func (d *jsonDecDriver) ReadArrayStart() int { - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) - } - const xc uint8 = '[' - if d.tok != xc { - d.d.errorf("read array - expect char '%c' but got char '%c'", xc, d.tok) - } - d.tok = 0 - d.c = containerArrayStart - return -1 +type jsonDecDriver struct { + noBuiltInTypes + d *Decoder + h *JsonHandle + r decReader + + c containerState + // tok is used to store the token read right after skipWhiteSpace. + tok uint8 + + bstr [8]byte // scratch used for string \UXXX parsing + b [64]byte // scratch, used for parsing strings or numbers + b2 [64]byte // scratch, used only for decodeBytes (after base64) + bs []byte // scratch. Initialized from b. Used for parsing strings or numbers. + + se setExtWrapper + + n jsonNum } -func (d *jsonDecDriver) CheckBreak() bool { - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) - } - return d.tok == '}' || d.tok == ']' +func jsonIsWS(b byte) bool { + return b == ' ' || b == '\t' || b == '\r' || b == '\n' } -// For the ReadXXX methods below, we could just delegate to helper functions -// readContainerState(c containerState, xc uint8, check bool) -// - ReadArrayElem would become: -// readContainerState(containerArrayElem, ',', d.c != containerArrayStart) -// -// However, until mid-stack inlining comes in go1.11 which supports inlining of -// one-liners, we explicitly write them all 5 out to elide the extra func call. -// -// TODO: For Go 1.11, if inlined, consider consolidating these. +// // This will skip whitespace characters and return the next byte to read. +// // The next byte determines what the value will be one of. +// func (d *jsonDecDriver) skipWhitespace() { +// // fast-path: do not enter loop. Just check first (in case no whitespace). +// b := d.r.readn1() +// if jsonIsWS(b) { +// r := d.r +// for b = r.readn1(); jsonIsWS(b); b = r.readn1() { +// } +// } +// d.tok = b +// } -func (d *jsonDecDriver) ReadArrayElem() { - const xc uint8 = ',' - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) - } - if d.c != containerArrayStart { - if d.tok != xc { - d.d.errorf("read array element - expect char '%c' but got char '%c'", xc, d.tok) - } +func (d *jsonDecDriver) uncacheRead() { + if d.tok != 0 { + d.r.unreadn1() d.tok = 0 } - d.c = containerArrayElem } -func (d *jsonDecDriver) ReadArrayEnd() { - const xc uint8 = ']' +func (d *jsonDecDriver) sendContainerState(c containerState) { if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) - } - if d.tok != xc { - d.d.errorf("read array end - expect char '%c' but got char '%c'", xc, d.tok) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - d.tok = 0 - d.c = containerArrayEnd -} - -func (d *jsonDecDriver) ReadMapElemKey() { - const xc uint8 = ',' - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var xc uint8 // char expected + if c == containerMapKey { + if d.c != containerMapStart { + xc = ',' + } + } else if c == containerMapValue { + xc = ':' + } else if c == containerMapEnd { + xc = '}' + } else if c == containerArrayElem { + if d.c != containerArrayStart { + xc = ',' + } + } else if c == containerArrayEnd { + xc = ']' } - if d.c != containerMapStart { + if xc != 0 { if d.tok != xc { - d.d.errorf("read map key - expect char '%c' but got char '%c'", xc, d.tok) + d.d.errorf("json: expect char '%c' but got char '%c'", xc, d.tok) } d.tok = 0 } - d.c = containerMapKey -} - -func (d *jsonDecDriver) ReadMapElemValue() { - const xc uint8 = ':' - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) - } - if d.tok != xc { - d.d.errorf("read map value - expect char '%c' but got char '%c'", xc, d.tok) - } - d.tok = 0 - d.c = containerMapValue + d.c = c } -func (d *jsonDecDriver) ReadMapEnd() { - const xc uint8 = '}' +func (d *jsonDecDriver) CheckBreak() bool { if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - if d.tok != xc { - d.d.errorf("read map end - expect char '%c' but got char '%c'", xc, d.tok) + if d.tok == '}' || d.tok == ']' { + // d.tok = 0 // only checking, not consuming + return true } - d.tok = 0 - d.c = containerMapEnd + return false } -func (d *jsonDecDriver) readLit(length, fromIdx uint8) { - bs := d.r.readx(int(length)) +func (d *jsonDecDriver) readStrIdx(fromIdx, toIdx uint8) { + bs := d.r.readx(int(toIdx - fromIdx)) d.tok = 0 - if jsonValidateSymbols && !bytes.Equal(bs, jsonLiterals[fromIdx:fromIdx+length]) { - d.d.errorf("expecting %s: got %s", jsonLiterals[fromIdx:fromIdx+length], bs) - return + if jsonValidateSymbols { + if !bytes.Equal(bs, jsonLiterals[fromIdx:toIdx]) { + d.d.errorf("json: expecting %s: got %s", jsonLiterals[fromIdx:toIdx], bs) + return + } } } func (d *jsonDecDriver) TryDecodeAsNil() bool { if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - // we shouldn't try to see if "null" was here, right? - // only the plain string: `null` denotes a nil (ie not quotes) if d.tok == 'n' { - d.readLit(3, jsonLitNull+1) // (n)ull + d.readStrIdx(10, 13) // ull return true } return false } -func (d *jsonDecDriver) DecodeBool() (v bool) { +func (d *jsonDecDriver) DecodeBool() bool { if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - fquot := d.c == containerMapKey && d.tok == '"' - if fquot { - d.tok = d.r.readn1() + if d.tok == 'f' { + d.readStrIdx(5, 9) // alse + return false } - switch d.tok { - case 'f': - d.readLit(4, jsonLitFalse+1) // (f)alse - // v = false - case 't': - d.readLit(3, jsonLitTrue+1) // (t)rue - v = true - default: - d.d.errorf("decode bool: got first char %c", d.tok) - // v = false // "unreachable" + if d.tok == 't' { + d.readStrIdx(1, 4) // rue + return true + } + d.d.errorf("json: decode bool: got first char %c", d.tok) + return false // "unreachable" +} + +func (d *jsonDecDriver) ReadMapStart() int { + if d.tok == 0 { + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - if fquot { - d.r.readn1() + if d.tok != '{' { + d.d.errorf("json: expect char '%c' but got char '%c'", '{', d.tok) } - return + d.tok = 0 + d.c = containerMapStart + return -1 } -func (d *jsonDecDriver) DecodeTime() (t time.Time) { - // read string, and pass the string into json.unmarshal - d.appendStringAsBytes() - if d.fnull { - return +func (d *jsonDecDriver) ReadArrayStart() int { + if d.tok == 0 { + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - t, err := time.Parse(time.RFC3339, stringView(d.bs)) - if err != nil { - d.d.errorv(err) + if d.tok != '[' { + d.d.errorf("json: expect char '%c' but got char '%c'", '[', d.tok) } - return + d.tok = 0 + d.c = containerArrayStart + return -1 } func (d *jsonDecDriver) ContainerType() (vt valueType) { // check container type by checking the first char if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - - // optimize this, so we don't do 4 checks but do one computation. - // return jsonContainerSet[d.tok] - - // ContainerType is mostly called for Map and Array, - // so this conditional is good enough (max 2 checks typically) if b := d.tok; b == '{' { return valueTypeMap } else if b == '[' { @@ -788,87 +649,265 @@ func (d *jsonDecDriver) ContainerType() (vt valueType) { return valueTypeString } return valueTypeUnset + // d.d.errorf("isContainerType: unsupported parameter: %v", vt) + // return false // "unreachable" } -func (d *jsonDecDriver) decNumBytes() (bs []byte) { - // stores num bytes in d.bs +func (d *jsonDecDriver) decNum(storeBytes bool) { + // If it is has a . or an e|E, decode as a float; else decode as an int. if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - if d.tok == '"' { - bs = d.r.readUntil(d.b2[:0], '"') - bs = bs[:len(bs)-1] - } else { - d.r.unreadn1() - bs = d.r.readTo(d.bs[:0], &jsonNumSet) + b := d.tok + var str bool + if b == '"' { + str = true + b = d.r.readn1() + } + if !(b == '+' || b == '-' || b == '.' || (b >= '0' && b <= '9')) { + d.d.errorf("json: decNum: got first char '%c'", b) + return } d.tok = 0 - return bs -} -func (d *jsonDecDriver) DecodeUint64() (u uint64) { - bs := d.decNumBytes() - n, neg, badsyntax, overflow := jsonParseInteger(bs) - if overflow { - d.d.errorf("overflow parsing unsigned integer: %s", bs) - } else if neg { - d.d.errorf("minus found parsing unsigned integer: %s", bs) - } else if badsyntax { - // fallback: try to decode as float, and cast - n = d.decUint64ViaFloat(stringView(bs)) - } - return n -} + const cutoff = (1<<64-1)/uint64(10) + 1 // cutoff64(base) + const jsonNumUintMaxVal = 1<= jsonNumUintCutoff { + n.manOverflow = true + break + } + v := uint64(b - '0') + n.mantissa *= 10 + if v != 0 { + n1 := n.mantissa + v + if n1 < n.mantissa || n1 > jsonNumUintMaxVal { + n.manOverflow = true // n+v overflows + break + } + n.mantissa = n1 + } + case 6: + state = 7 + fallthrough + case 7: + if !(b == '0' && e == 0) { + e = e*10 + int16(b-'0') + } + default: + break LOOP + } + case '"': + if str { + if storeBytes { + d.bs = append(d.bs, '"') + } + b, eof = r.readn1eof() + } + break LOOP + default: + break LOOP + } + if storeBytes { + d.bs = append(d.bs, b) + } + b, eof = r.readn1eof() + } -func (d *jsonDecDriver) DecodeInt64() (i int64) { - const cutoff = uint64(1 << uint(64-1)) - bs := d.decNumBytes() - n, neg, badsyntax, overflow := jsonParseInteger(bs) - if overflow { - d.d.errorf("overflow parsing integer: %s", bs) - } else if badsyntax { - // d.d.errorf("invalid syntax for integer: %s", bs) - // fallback: try to decode as float, and cast - if neg { - n = d.decUint64ViaFloat(stringView(bs[1:])) + if jsonTruncateMantissa && n.mantissa != 0 { + for n.mantissa%10 == 0 { + n.mantissa /= 10 + n.exponent++ + } + } + + if e != 0 { + if eNeg { + n.exponent -= e } else { - n = d.decUint64ViaFloat(stringView(bs)) + n.exponent += e } } - if neg { - if n > cutoff { - d.d.errorf("overflow parsing integer: %s", bs) + + // d.n = n + + if !eof { + if jsonUnreadAfterDecNum { + r.unreadn1() + } else { + if !jsonIsWS(b) { + d.tok = b + } } - i = -(int64(n)) - } else { - if n >= cutoff { - d.d.errorf("overflow parsing integer: %s", bs) + } + // fmt.Printf("1: n: bytes: %s, neg: %v, dot: %v, exponent: %v, mantissaEndIndex: %v\n", + // n.bytes, n.neg, n.dot, n.exponent, n.mantissaEndIndex) + return +} + +func (d *jsonDecDriver) DecodeInt(bitsize uint8) (i int64) { + d.decNum(false) + n := &d.n + if n.manOverflow { + d.d.errorf("json: overflow integer after: %v", n.mantissa) + return + } + var u uint64 + if n.exponent == 0 { + u = n.mantissa + } else if n.exponent < 0 { + d.d.errorf("json: fractional integer") + return + } else if n.exponent > 0 { + var overflow bool + if u, overflow = n.uintExp(); overflow { + d.d.errorf("json: overflow integer") + return } - i = int64(n) } + i = int64(u) + if n.neg { + i = -i + } + if chkOvf.Int(i, bitsize) { + d.d.errorf("json: overflow %v bits: %s", bitsize, d.bs) + return + } + // fmt.Printf("DecodeInt: %v\n", i) return } -func (d *jsonDecDriver) decUint64ViaFloat(s string) (u uint64) { - f, err := strconv.ParseFloat(s, 64) - if err != nil { - d.d.errorf("invalid syntax for integer: %s", s) - // d.d.errorv(err) +// floatVal MUST only be called after a decNum, as d.bs now contains the bytes of the number +func (d *jsonDecDriver) floatVal() (f float64) { + f, useStrConv := d.n.floatVal() + if useStrConv { + var err error + if f, err = strconv.ParseFloat(stringView(d.bs), 64); err != nil { + panic(fmt.Errorf("parse float: %s, %v", d.bs, err)) + } + if d.n.neg { + f = -f + } } - fi, ff := math.Modf(f) - if ff > 0 { - d.d.errorf("fractional part found parsing integer: %s", s) - } else if fi > float64(math.MaxUint64) { - d.d.errorf("overflow parsing integer: %s", s) + return +} + +func (d *jsonDecDriver) DecodeUint(bitsize uint8) (u uint64) { + d.decNum(false) + n := &d.n + if n.neg { + d.d.errorf("json: unsigned integer cannot be negative") + return } - return uint64(fi) + if n.manOverflow { + d.d.errorf("json: overflow integer after: %v", n.mantissa) + return + } + if n.exponent == 0 { + u = n.mantissa + } else if n.exponent < 0 { + d.d.errorf("json: fractional integer") + return + } else if n.exponent > 0 { + var overflow bool + if u, overflow = n.uintExp(); overflow { + d.d.errorf("json: overflow integer") + return + } + } + if chkOvf.Uint(u, bitsize) { + d.d.errorf("json: overflow %v bits: %s", bitsize, d.bs) + return + } + // fmt.Printf("DecodeUint: %v\n", u) + return } -func (d *jsonDecDriver) DecodeFloat64() (f float64) { - bs := d.decNumBytes() - f, err := strconv.ParseFloat(stringView(bs), 64) - if err != nil { - d.d.errorv(err) +func (d *jsonDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { + d.decNum(true) + f = d.floatVal() + if chkOverflow32 && chkOvf.Float32(f) { + d.d.errorf("json: overflow float32: %v, %s", f, d.bs) + return } return } @@ -886,31 +925,23 @@ func (d *jsonDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxta return } -func (d *jsonDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { +func (d *jsonDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { // if decoding into raw bytes, and the RawBytesExt is configured, use it to decode. - if d.se.InterfaceExt != nil { + if !isstring && d.se.i != nil { bsOut = bs d.DecodeExt(&bsOut, 0, &d.se) return } - if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) - } - // check if an "array" of uint8's (see ContainerType for how to infer if an array) - if d.tok == '[' { - bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d) - return - } d.appendStringAsBytes() - // base64 encodes []byte{} as "", and we encode nil []byte as null. - // Consequently, base64 should decode null as a nil []byte, and "" as an empty []byte{}. - // appendStringAsBytes returns a zero-len slice for both, so as not to reset d.bs. - // However, it sets a fnull field to true, so we can check if a null was found. + // if isstring, then just return the bytes, even if it is using the scratch buffer. + // the bytes will be converted to a string as needed. + if isstring { + return d.bs + } + // if appendStringAsBytes returned a zero-len slice, then treat as nil. + // This should only happen for null, and "". if len(d.bs) == 0 { - if d.fnull { - return nil - } - return []byte{} + return nil } bs0 := d.bs slen := base64.StdEncoding.DecodedLen(len(bs0)) @@ -923,7 +954,7 @@ func (d *jsonDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { } slen2, err := base64.StdEncoding.Decode(bsOut, bs0) if err != nil { - d.d.errorf("error decoding base64 binary '%s': %v", bs0, err) + d.d.errorf("json: error decoding base64 binary '%s': %v", bs0, err) return nil } if slen != slen2 { @@ -934,256 +965,172 @@ func (d *jsonDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { func (d *jsonDecDriver) DecodeString() (s string) { d.appendStringAsBytes() - return d.bsToString() -} - -func (d *jsonDecDriver) DecodeStringAsBytes() (s []byte) { - d.appendStringAsBytes() - return d.bs + // if x := d.s.sc; x != nil && x.so && x.st == '}' { // map key + if d.c == containerMapKey { + return d.d.string(d.bs) + } + return string(d.bs) } func (d *jsonDecDriver) appendStringAsBytes() { if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } - d.fnull = false - if d.tok != '"' { - // d.d.errorf("expect char '%c' but got char '%c'", '"', d.tok) - // handle non-string scalar: null, true, false or a number - switch d.tok { - case 'n': - d.readLit(3, jsonLitNull+1) // (n)ull - d.bs = d.bs[:0] - d.fnull = true - case 'f': - d.readLit(4, jsonLitFalse+1) // (f)alse - d.bs = d.bs[:5] - copy(d.bs, "false") - case 't': - d.readLit(3, jsonLitTrue+1) // (t)rue - d.bs = d.bs[:4] - copy(d.bs, "true") - default: - // try to parse a valid number - bs := d.decNumBytes() - if len(bs) <= cap(d.bs) { - d.bs = d.bs[:len(bs)] - } else { - d.bs = make([]byte, len(bs)) - } - copy(d.bs, bs) - } + // handle null as a string + if d.tok == 'n' { + d.readStrIdx(10, 13) // ull + d.bs = d.bs[:0] return } + if d.tok != '"' { + d.d.errorf("json: expect char '%c' but got char '%c'", '"', d.tok) + } d.tok = 0 - r := d.r - var cs = r.readUntil(d.b2[:0], '"') - var cslen = len(cs) - var c uint8 + v := d.bs[:0] - // append on each byte seen can be expensive, so we just - // keep track of where we last read a contiguous set of - // non-special bytes (using cursor variable), - // and when we see a special byte - // e.g. end-of-slice, " or \, - // we will append the full range into the v slice before proceeding - for i, cursor := 0, 0; ; { - if i == cslen { - v = append(v, cs[cursor:]...) - cs = r.readUntil(d.b2[:0], '"') - cslen = len(cs) - i, cursor = 0, 0 - } - c = cs[i] + var c uint8 + r := d.r + for { + c = r.readn1() if c == '"' { - v = append(v, cs[cursor:i]...) break - } - if c != '\\' { - i++ - continue - } - v = append(v, cs[cursor:i]...) - i++ - c = cs[i] - switch c { - case '"', '\\', '/', '\'': - v = append(v, c) - case 'b': - v = append(v, '\b') - case 'f': - v = append(v, '\f') - case 'n': - v = append(v, '\n') - case 'r': - v = append(v, '\r') - case 't': - v = append(v, '\t') - case 'u': - var r rune - var rr uint32 - if len(cs) < i+4 { // may help reduce bounds-checking - d.d.errorf("need at least 4 more bytes for unicode sequence") - } - // c = cs[i+4] // may help reduce bounds-checking - for j := 1; j < 5; j++ { - // best to use explicit if-else - // - not a table, etc which involve memory loads, array lookup with bounds checks, etc - c = cs[i+j] - if c >= '0' && c <= '9' { - rr = rr*16 + uint32(c-jsonU4Chk2) - } else if c >= 'a' && c <= 'f' { - rr = rr*16 + uint32(c-jsonU4Chk1) - } else if c >= 'A' && c <= 'F' { - rr = rr*16 + uint32(c-jsonU4Chk0) - } else { - r = unicode.ReplacementChar - i += 4 - goto encode_rune - } - } - r = rune(rr) - i += 4 - if utf16.IsSurrogate(r) { - if len(cs) >= i+6 && cs[i+2] == 'u' && cs[i+1] == '\\' { - i += 2 - // c = cs[i+4] // may help reduce bounds-checking - var rr1 uint32 - for j := 1; j < 5; j++ { - c = cs[i+j] - if c >= '0' && c <= '9' { - rr = rr*16 + uint32(c-jsonU4Chk2) - } else if c >= 'a' && c <= 'f' { - rr = rr*16 + uint32(c-jsonU4Chk1) - } else if c >= 'A' && c <= 'F' { - rr = rr*16 + uint32(c-jsonU4Chk0) - } else { - r = unicode.ReplacementChar - i += 4 - goto encode_rune - } - } - r = utf16.DecodeRune(r, rune(rr1)) - i += 4 - } else { - r = unicode.ReplacementChar - goto encode_rune + } else if c == '\\' { + c = r.readn1() + switch c { + case '"', '\\', '/', '\'': + v = append(v, c) + case 'b': + v = append(v, '\b') + case 'f': + v = append(v, '\f') + case 'n': + v = append(v, '\n') + case 'r': + v = append(v, '\r') + case 't': + v = append(v, '\t') + case 'u': + rr := d.jsonU4(false) + // fmt.Printf("$$$$$$$$$: is surrogate: %v\n", utf16.IsSurrogate(rr)) + if utf16.IsSurrogate(rr) { + rr = utf16.DecodeRune(rr, d.jsonU4(true)) } + w2 := utf8.EncodeRune(d.bstr[:], rr) + v = append(v, d.bstr[:w2]...) + default: + d.d.errorf("json: unsupported escaped value: %c", c) } - encode_rune: - w2 := utf8.EncodeRune(d.bstr[:], r) - v = append(v, d.bstr[:w2]...) - default: - d.d.errorf("unsupported escaped value: %c", c) + } else { + v = append(v, c) } - i++ - cursor = i } d.bs = v } -func (d *jsonDecDriver) nakedNum(z *decNaked, bs []byte) (err error) { - const cutoff = uint64(1 << uint(64-1)) - var n uint64 - var neg, badsyntax, overflow bool - - if d.h.PreferFloat { - goto F - } - n, neg, badsyntax, overflow = jsonParseInteger(bs) - if badsyntax || overflow { - goto F - } - if neg { - if n > cutoff { - goto F - } - z.v = valueTypeInt - z.i = -(int64(n)) - } else if d.h.SignedInteger { - if n >= cutoff { - goto F +func (d *jsonDecDriver) jsonU4(checkSlashU bool) rune { + r := d.r + if checkSlashU && !(r.readn1() == '\\' && r.readn1() == 'u') { + d.d.errorf(`json: unquoteStr: invalid unicode sequence. Expecting \u`) + return 0 + } + // u, _ := strconv.ParseUint(string(d.bstr[:4]), 16, 64) + var u uint32 + for i := 0; i < 4; i++ { + v := r.readn1() + if '0' <= v && v <= '9' { + v = v - '0' + } else if 'a' <= v && v <= 'z' { + v = v - 'a' + 10 + } else if 'A' <= v && v <= 'Z' { + v = v - 'A' + 10 + } else { + d.d.errorf(`json: unquoteStr: invalid hex char in \u unicode sequence: %q`, v) + return 0 } - z.v = valueTypeInt - z.i = int64(n) - } else { - z.v = valueTypeUint - z.u = n + u = u*16 + uint32(v) } - return -F: - z.v = valueTypeFloat - z.f, err = strconv.ParseFloat(stringView(bs), 64) - return -} - -func (d *jsonDecDriver) bsToString() string { - // if x := d.s.sc; x != nil && x.so && x.st == '}' { // map key - if jsonAlwaysReturnInternString || d.c == containerMapKey { - return d.d.string(d.bs) - } - return string(d.bs) + return rune(u) } func (d *jsonDecDriver) DecodeNaked() { - z := d.d.n + z := &d.d.n // var decodeFurther bool if d.tok == 0 { - d.tok = d.r.skip(&jsonCharWhitespaceSet) + var b byte + r := d.r + for b = r.readn1(); jsonIsWS(b); b = r.readn1() { + } + d.tok = b } switch d.tok { case 'n': - d.readLit(3, jsonLitNull+1) // (n)ull + d.readStrIdx(10, 13) // ull z.v = valueTypeNil case 'f': - d.readLit(4, jsonLitFalse+1) // (f)alse + d.readStrIdx(5, 9) // alse z.v = valueTypeBool z.b = false case 't': - d.readLit(3, jsonLitTrue+1) // (t)rue + d.readStrIdx(1, 4) // rue z.v = valueTypeBool z.b = true case '{': - z.v = valueTypeMap // don't consume. kInterfaceNaked will call ReadMapStart + z.v = valueTypeMap + // d.tok = 0 // don't consume. kInterfaceNaked will call ReadMapStart + // decodeFurther = true case '[': - z.v = valueTypeArray // don't consume. kInterfaceNaked will call ReadArrayStart + z.v = valueTypeArray + // d.tok = 0 // don't consume. kInterfaceNaked will call ReadArrayStart + // decodeFurther = true case '"': - // if a string, and MapKeyAsString, then try to decode it as a nil, bool or number first - d.appendStringAsBytes() - if len(d.bs) > 0 && d.c == containerMapKey && d.h.MapKeyAsString { - switch stringView(d.bs) { - case "null": - z.v = valueTypeNil - case "true": - z.v = valueTypeBool - z.b = true - case "false": - z.v = valueTypeBool - z.b = false + z.v = valueTypeString + z.s = d.DecodeString() + default: // number + d.decNum(true) + n := &d.n + // if the string had a any of [.eE], then decode as float. + switch { + case n.explicitExponent, n.dot, n.exponent < 0, n.manOverflow: + z.v = valueTypeFloat + z.f = d.floatVal() + case n.exponent == 0: + u := n.mantissa + switch { + case n.neg: + z.v = valueTypeInt + z.i = -int64(u) + case d.h.SignedInteger: + z.v = valueTypeInt + z.i = int64(u) default: - // check if a number: float, int or uint - if err := d.nakedNum(z, d.bs); err != nil { - z.v = valueTypeString - z.s = d.bsToString() - } + z.v = valueTypeUint + z.u = u + } + default: + u, overflow := n.uintExp() + switch { + case overflow: + z.v = valueTypeFloat + z.f = d.floatVal() + case n.neg: + z.v = valueTypeInt + z.i = -int64(u) + case d.h.SignedInteger: + z.v = valueTypeInt + z.i = int64(u) + default: + z.v = valueTypeUint + z.u = u } - } else { - z.v = valueTypeString - z.s = d.bsToString() - } - default: // number - bs := d.decNumBytes() - if len(bs) == 0 { - d.d.errorf("decode number from empty string") - return - } - if err := d.nakedNum(z, bs); err != nil { - d.d.errorf("decode number from %s: %v", bs, err) - return } + // fmt.Printf("DecodeNaked: Number: %T, %v\n", v, v) } // if decodeFurther { // d.s.sc.retryRead() @@ -1197,26 +1144,24 @@ func (d *jsonDecDriver) DecodeNaked() { // // Json is comprehensively supported: // - decodes numbers into interface{} as int, uint or float64 -// based on how the number looks and some config parameters e.g. PreferFloat, SignedInt, etc. -// - decode integers from float formatted numbers e.g. 1.27e+8 -// - decode any json value (numbers, bool, etc) from quoted strings // - configurable way to encode/decode []byte . // by default, encodes and decodes []byte using base64 Std Encoding // - UTF-8 support for encoding and decoding // // It has better performance than the json library in the standard library, -// by leveraging the performance improvements of the codec library. +// by leveraging the performance improvements of the codec library and +// minimizing allocations. // // In addition, it doesn't read more bytes than necessary during a decode, which allows // reading multiple values from a stream containing json and non-json content. // For example, a user can read a json value, then a cbor value, then a msgpack value, // all from the same stream in sequence. -// -// Note that, when decoding quoted strings, invalid UTF-8 or invalid UTF-16 surrogate pairs are -// not treated as an error. Instead, they are replaced by the Unicode replacement character U+FFFD. type JsonHandle struct { textEncodingType BasicHandle + // RawBytesExt, if configured, is used to encode and decode raw bytes in a custom way. + // If not configured, raw bytes are encoded to/from base64 text. + RawBytesExt InterfaceExt // Indent indicates how a value is encoded. // - If positive, indent by that number of spaces. @@ -1234,190 +1179,69 @@ type JsonHandle struct { // - if 'A', then encode all integers as a json string // containing the exact integer representation as a decimal. // - else encode all integers as a json number (default) - IntegerAsString byte + IntegerAsString uint8 // HTMLCharsAsIs controls how to encode some special characters to html: < > & // // By default, we encode them as \uXXX // to prevent security holes when served from some browsers. HTMLCharsAsIs bool - - // PreferFloat says that we will default to decoding a number as a float. - // If not set, we will examine the characters of the number and decode as an - // integer type if it doesn't have any of the characters [.eE]. - PreferFloat bool - - // TermWhitespace says that we add a whitespace character - // at the end of an encoding. - // - // The whitespace is important, especially if using numbers in a context - // where multiple items are written to a stream. - TermWhitespace bool - - // MapKeyAsString says to encode all map keys as strings. - // - // Use this to enforce strict json output. - // The only caveat is that nil value is ALWAYS written as null (never as "null") - MapKeyAsString bool - - // _ [2]byte // padding - - // Note: below, we store hardly-used items e.g. RawBytesExt is cached in the (en|de)cDriver. - - // RawBytesExt, if configured, is used to encode and decode raw bytes in a custom way. - // If not configured, raw bytes are encoded to/from base64 text. - RawBytesExt InterfaceExt - - _ [2]uint64 // padding -} - -// Name returns the name of the handle: json -func (h *JsonHandle) Name() string { return "json" } -func (h *JsonHandle) hasElemSeparators() bool { return true } -func (h *JsonHandle) typical() bool { - return h.Indent == 0 && !h.MapKeyAsString && h.IntegerAsString != 'A' && h.IntegerAsString != 'L' -} - -type jsonTypical interface { - typical() } -func (h *JsonHandle) recreateEncDriver(ed encDriver) (v bool) { - _, v = ed.(jsonTypical) - return v != h.typical() -} - -// SetInterfaceExt sets an extension func (h *JsonHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext InterfaceExt) (err error) { - return h.SetExt(rt, tag, &extWrapper{bytesExtFailer{}, ext}) -} - -type jsonEncDriverTypicalImpl struct { - jsonEncDriver - jsonEncDriverTypical - _ [1]uint64 // padding + return h.SetExt(rt, tag, &setExtWrapper{i: ext}) } -func (x *jsonEncDriverTypicalImpl) reset() { - x.jsonEncDriver.reset() - x.jsonEncDriverTypical.reset(&x.jsonEncDriver) -} - -type jsonEncDriverGenericImpl struct { - jsonEncDriver - jsonEncDriverGeneric -} +func (h *JsonHandle) newEncDriver(e *Encoder) encDriver { + hd := jsonEncDriver{e: e, h: h} + hd.bs = hd.b[:0] -func (x *jsonEncDriverGenericImpl) reset() { - x.jsonEncDriver.reset() - x.jsonEncDriverGeneric.reset(&x.jsonEncDriver) -} + hd.reset() -func (h *JsonHandle) newEncDriver(e *Encoder) (ee encDriver) { - var hd *jsonEncDriver - if h.typical() { - var v jsonEncDriverTypicalImpl - ee = &v - hd = &v.jsonEncDriver - } else { - var v jsonEncDriverGenericImpl - ee = &v - hd = &v.jsonEncDriver - } - hd.e, hd.h, hd.bs = e, h, hd.b[:0] - hd.se.BytesExt = bytesExtFailer{} - ee.reset() - return + return &hd } func (h *JsonHandle) newDecDriver(d *Decoder) decDriver { // d := jsonDecDriver{r: r.(*bytesDecReader), h: h} hd := jsonDecDriver{d: d, h: h} - hd.se.BytesExt = bytesExtFailer{} hd.bs = hd.b[:0] hd.reset() return &hd } func (e *jsonEncDriver) reset() { - e.ew = e.e.w // e.e.w // &e.e.encWriterSwitch - e.se.InterfaceExt = e.h.RawBytesExt + e.w = e.e.w + e.se.i = e.h.RawBytesExt if e.bs != nil { e.bs = e.bs[:0] } + e.d, e.dt, e.dl, e.ds = false, false, 0, "" + e.c = 0 + if e.h.Indent > 0 { + e.d = true + e.ds = jsonSpaces[:e.h.Indent] + } else if e.h.Indent < 0 { + e.d = true + e.dt = true + e.ds = jsonTabs[:-(e.h.Indent)] + } } func (d *jsonDecDriver) reset() { - d.r = d.d.r // &d.d.decReaderSwitch // d.d.r - d.se.InterfaceExt = d.h.RawBytesExt + d.r = d.d.r + d.se.i = d.h.RawBytesExt if d.bs != nil { d.bs = d.bs[:0] } d.c, d.tok = 0, 0 - // d.n.reset() -} - -func jsonFloatStrconvFmtPrec(f float64) (fmt byte, prec int) { - prec = -1 - var abs = math.Abs(f) - if abs != 0 && (abs < 1e-6 || abs >= 1e21) { - fmt = 'e' - } else { - fmt = 'f' - // set prec to 1 iff mod is 0. - // better than using jsonIsFloatBytesB2 to check if a . or E in the float bytes. - // this ensures that every float has an e or .0 in it. - if abs <= 1 { - if abs == 0 || abs == 1 { - prec = 1 - } - } else if _, mod := math.Modf(abs); mod == 0 { - prec = 1 - } - } - return + d.n.reset() } -// custom-fitted version of strconv.Parse(Ui|I)nt. -// Also ensures we don't have to search for .eE to determine if a float or not. -func jsonParseInteger(s []byte) (n uint64, neg, badSyntax, overflow bool) { - const maxUint64 = (1<<64 - 1) - const cutoff = maxUint64/10 + 1 +var jsonEncodeTerminate = []byte{' '} - if len(s) == 0 { - badSyntax = true - return - } - switch s[0] { - case '+': - s = s[1:] - case '-': - s = s[1:] - neg = true - } - for _, c := range s { - if c < '0' || c > '9' { - badSyntax = true - return - } - // unsigned integers don't overflow well on multiplication, so check cutoff here - // e.g. (maxUint64-5)*10 doesn't overflow well ... - if n >= cutoff { - overflow = true - return - } - n *= 10 - n1 := n + uint64(c-'0') - if n1 < n || n1 > maxUint64 { - overflow = true - return - } - n = n1 - } - return +func (h *JsonHandle) rpcEncodeTerminate() []byte { + return jsonEncodeTerminate } var _ decDriver = (*jsonDecDriver)(nil) -var _ encDriver = (*jsonEncDriverGenericImpl)(nil) -var _ encDriver = (*jsonEncDriverTypicalImpl)(nil) -var _ jsonTypical = (*jsonEncDriverTypical)(nil) +var _ encDriver = (*jsonEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/msgpack.go b/vendor/github.com/ugorji/go/codec/msgpack.go index 3271579a1..e09d5a04a 100644 --- a/vendor/github.com/ugorji/go/codec/msgpack.go +++ b/vendor/github.com/ugorji/go/codec/msgpack.go @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. // Use of this source code is governed by a MIT license found in the LICENSE file. /* @@ -15,8 +15,8 @@ For compatibility with behaviour of msgpack-c reference implementation: - Go intX (<0) IS ENCODED AS msgpack -ve fixnum, signed -*/ +*/ package codec import ( @@ -25,7 +25,6 @@ import ( "math" "net/rpc" "reflect" - "time" ) const ( @@ -79,89 +78,6 @@ const ( mpNegFixNumMax = 0xff ) -var mpTimeExtTag int8 = -1 -var mpTimeExtTagU = uint8(mpTimeExtTag) - -// var mpdesc = map[byte]string{ -// mpPosFixNumMin: "PosFixNumMin", -// mpPosFixNumMax: "PosFixNumMax", -// mpFixMapMin: "FixMapMin", -// mpFixMapMax: "FixMapMax", -// mpFixArrayMin: "FixArrayMin", -// mpFixArrayMax: "FixArrayMax", -// mpFixStrMin: "FixStrMin", -// mpFixStrMax: "FixStrMax", -// mpNil: "Nil", -// mpFalse: "False", -// mpTrue: "True", -// mpFloat: "Float", -// mpDouble: "Double", -// mpUint8: "Uint8", -// mpUint16: "Uint16", -// mpUint32: "Uint32", -// mpUint64: "Uint64", -// mpInt8: "Int8", -// mpInt16: "Int16", -// mpInt32: "Int32", -// mpInt64: "Int64", -// mpBin8: "Bin8", -// mpBin16: "Bin16", -// mpBin32: "Bin32", -// mpExt8: "Ext8", -// mpExt16: "Ext16", -// mpExt32: "Ext32", -// mpFixExt1: "FixExt1", -// mpFixExt2: "FixExt2", -// mpFixExt4: "FixExt4", -// mpFixExt8: "FixExt8", -// mpFixExt16: "FixExt16", -// mpStr8: "Str8", -// mpStr16: "Str16", -// mpStr32: "Str32", -// mpArray16: "Array16", -// mpArray32: "Array32", -// mpMap16: "Map16", -// mpMap32: "Map32", -// mpNegFixNumMin: "NegFixNumMin", -// mpNegFixNumMax: "NegFixNumMax", -// } - -func mpdesc(bd byte) string { - switch bd { - case mpNil: - return "nil" - case mpFalse: - return "false" - case mpTrue: - return "true" - case mpFloat, mpDouble: - return "float" - case mpUint8, mpUint16, mpUint32, mpUint64: - return "uint" - case mpInt8, mpInt16, mpInt32, mpInt64: - return "int" - default: - switch { - case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax: - return "int" - case bd >= mpNegFixNumMin && bd <= mpNegFixNumMax: - return "int" - case bd == mpStr8, bd == mpStr16, bd == mpStr32, bd >= mpFixStrMin && bd <= mpFixStrMax: - return "string|bytes" - case bd == mpBin8, bd == mpBin16, bd == mpBin32: - return "bytes" - case bd == mpArray16, bd == mpArray32, bd >= mpFixArrayMin && bd <= mpFixArrayMax: - return "array" - case bd == mpMap16, bd == mpMap32, bd >= mpFixMapMin && bd <= mpFixMapMax: - return "map" - case bd >= mpFixExt1 && bd <= mpFixExt16, bd >= mpExt8 && bd <= mpExt32: - return "ext" - default: - return "unknown" - } - } -} - // MsgpackSpecRpcMultiArgs is a special type which signifies to the MsgpackSpecRpcCodec // that the backend RPC service takes multiple arguments, which have been arranged // in sequence in the slice. @@ -178,31 +94,21 @@ type msgpackContainerType struct { } var ( - msgpackContainerStr = msgpackContainerType{ - 32, mpFixStrMin, mpStr8, mpStr16, mpStr32, true, true, false, - } - msgpackContainerBin = msgpackContainerType{ - 0, 0, mpBin8, mpBin16, mpBin32, false, true, true, - } - msgpackContainerList = msgpackContainerType{ - 16, mpFixArrayMin, 0, mpArray16, mpArray32, true, false, false, - } - msgpackContainerMap = msgpackContainerType{ - 16, mpFixMapMin, 0, mpMap16, mpMap32, true, false, false, - } + msgpackContainerStr = msgpackContainerType{32, mpFixStrMin, mpStr8, mpStr16, mpStr32, true, true, false} + msgpackContainerBin = msgpackContainerType{0, 0, mpBin8, mpBin16, mpBin32, false, true, true} + msgpackContainerList = msgpackContainerType{16, mpFixArrayMin, 0, mpArray16, mpArray32, true, false, false} + msgpackContainerMap = msgpackContainerType{16, mpFixMapMin, 0, mpMap16, mpMap32, true, false, false} ) //--------------------------------------------- type msgpackEncDriver struct { noBuiltInTypes - encDriverNoopContainerWriter - // encNoSeparator + encNoSeparator e *Encoder w encWriter h *MsgpackHandle x [8]byte - _ [3]uint64 // padding } func (e *msgpackEncDriver) EncodeNil() { @@ -210,26 +116,10 @@ func (e *msgpackEncDriver) EncodeNil() { } func (e *msgpackEncDriver) EncodeInt(i int64) { - // if i >= 0 { - // e.EncodeUint(uint64(i)) - // } else if false && - if i > math.MaxInt8 { - if i <= math.MaxInt16 { - e.w.writen1(mpInt16) - bigenHelper{e.x[:2], e.w}.writeUint16(uint16(i)) - } else if i <= math.MaxInt32 { - e.w.writen1(mpInt32) - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(i)) - } else { - e.w.writen1(mpInt64) - bigenHelper{e.x[:8], e.w}.writeUint64(uint64(i)) - } + if i >= 0 { + e.EncodeUint(uint64(i)) } else if i >= -32 { - if e.h.NoFixedNum { - e.w.writen2(mpInt8, byte(i)) - } else { - e.w.writen1(byte(i)) - } + e.w.writen1(byte(i)) } else if i >= math.MinInt8 { e.w.writen2(mpInt8, byte(i)) } else if i >= math.MinInt16 { @@ -246,11 +136,7 @@ func (e *msgpackEncDriver) EncodeInt(i int64) { func (e *msgpackEncDriver) EncodeUint(i uint64) { if i <= math.MaxInt8 { - if e.h.NoFixedNum { - e.w.writen2(mpUint8, byte(i)) - } else { - e.w.writen1(byte(i)) - } + e.w.writen1(byte(i)) } else if i <= math.MaxUint8 { e.w.writen2(mpUint8, byte(i)) } else if i <= math.MaxUint16 { @@ -283,39 +169,6 @@ func (e *msgpackEncDriver) EncodeFloat64(f float64) { bigenHelper{e.x[:8], e.w}.writeUint64(math.Float64bits(f)) } -func (e *msgpackEncDriver) EncodeTime(t time.Time) { - if t.IsZero() { - e.EncodeNil() - return - } - t = t.UTC() - sec, nsec := t.Unix(), uint64(t.Nanosecond()) - var data64 uint64 - var l = 4 - if sec >= 0 && sec>>34 == 0 { - data64 = (nsec << 34) | uint64(sec) - if data64&0xffffffff00000000 != 0 { - l = 8 - } - } else { - l = 12 - } - if e.h.WriteExt { - e.encodeExtPreamble(mpTimeExtTagU, l) - } else { - e.writeContainerLen(msgpackContainerStr, l) - } - switch l { - case 4: - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(data64)) - case 8: - bigenHelper{e.x[:8], e.w}.writeUint64(data64) - case 12: - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(nsec)) - bigenHelper{e.x[:8], e.w}.writeUint64(uint64(sec)) - } -} - func (e *msgpackEncDriver) EncodeExt(v interface{}, xtag uint64, ext Ext, _ *Encoder) { bs := ext.WriteExt(v) if bs == nil { @@ -326,7 +179,7 @@ func (e *msgpackEncDriver) EncodeExt(v interface{}, xtag uint64, ext Ext, _ *Enc e.encodeExtPreamble(uint8(xtag), len(bs)) e.w.writeb(bs) } else { - e.EncodeStringBytes(cRAW, bs) + e.EncodeStringBytes(c_RAW, bs) } } @@ -360,38 +213,36 @@ func (e *msgpackEncDriver) encodeExtPreamble(xtag byte, l int) { } } -func (e *msgpackEncDriver) WriteArrayStart(length int) { +func (e *msgpackEncDriver) EncodeArrayStart(length int) { e.writeContainerLen(msgpackContainerList, length) } -func (e *msgpackEncDriver) WriteMapStart(length int) { +func (e *msgpackEncDriver) EncodeMapStart(length int) { e.writeContainerLen(msgpackContainerMap, length) } func (e *msgpackEncDriver) EncodeString(c charEncoding, s string) { - slen := len(s) - if c == cRAW && e.h.WriteExt { - e.writeContainerLen(msgpackContainerBin, slen) + if c == c_RAW && e.h.WriteExt { + e.writeContainerLen(msgpackContainerBin, len(s)) } else { - e.writeContainerLen(msgpackContainerStr, slen) + e.writeContainerLen(msgpackContainerStr, len(s)) } - if slen > 0 { + if len(s) > 0 { e.w.writestr(s) } } +func (e *msgpackEncDriver) EncodeSymbol(v string) { + e.EncodeString(c_UTF8, v) +} + func (e *msgpackEncDriver) EncodeStringBytes(c charEncoding, bs []byte) { - if bs == nil { - e.EncodeNil() - return - } - slen := len(bs) - if c == cRAW && e.h.WriteExt { - e.writeContainerLen(msgpackContainerBin, slen) + if c == c_RAW && e.h.WriteExt { + e.writeContainerLen(msgpackContainerBin, len(bs)) } else { - e.writeContainerLen(msgpackContainerStr, slen) + e.writeContainerLen(msgpackContainerStr, len(bs)) } - if slen > 0 { + if len(bs) > 0 { e.w.writeb(bs) } } @@ -413,18 +264,16 @@ func (e *msgpackEncDriver) writeContainerLen(ct msgpackContainerType, l int) { //--------------------------------------------- type msgpackDecDriver struct { - d *Decoder - r decReader // *Decoder decReader decReaderT - h *MsgpackHandle - // b [scratchByteArrayLen]byte + d *Decoder + r decReader // *Decoder decReader decReaderT + h *MsgpackHandle + b [scratchByteArrayLen]byte bd byte bdRead bool br bool // bytes reader noBuiltInTypes - // noStreamingCodec - // decNoSeparator - decDriverNoopContainerReader - _ [3]uint64 // padding + noStreamingCodec + decNoSeparator } // Note: This returns either a primitive (int, bool, etc) for non-containers, @@ -437,7 +286,7 @@ func (d *msgpackDecDriver) DecodeNaked() { d.readNextBd() } bd := d.bd - n := d.d.n + n := &d.d.n var decodeFurther bool switch bd { @@ -500,11 +349,11 @@ func (d *msgpackDecDriver) DecodeNaked() { n.s = d.DecodeString() } else { n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false) + n.l = d.DecodeBytes(nil, false, false) } case bd == mpBin8, bd == mpBin16, bd == mpBin32: n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false) + n.l = d.DecodeBytes(nil, false, false) case bd == mpArray16, bd == mpArray32, bd >= mpFixArrayMin && bd <= mpFixArrayMax: n.v = valueTypeArray decodeFurther = true @@ -515,14 +364,9 @@ func (d *msgpackDecDriver) DecodeNaked() { n.v = valueTypeExt clen := d.readExtLen() n.u = uint64(d.r.readn1()) - if n.u == uint64(mpTimeExtTagU) { - n.v = valueTypeTime - n.t = d.decodeTime(clen) - } else { - n.l = d.r.readx(clen) - } + n.l = d.r.readx(clen) default: - d.d.errorf("cannot infer value: %s: Ox%x/%d/%s", msgBadDesc, bd, bd, mpdesc(bd)) + d.d.errorf("Nil-Deciphered DecodeValue: %s: hex: %x, dec: %d", msgBadDesc, bd, bd) } } if !decodeFurther { @@ -536,7 +380,7 @@ func (d *msgpackDecDriver) DecodeNaked() { } // int can be decoded from msgpack type: intXXX or uintXXX -func (d *msgpackDecDriver) DecodeInt64() (i int64) { +func (d *msgpackDecDriver) DecodeInt(bitsize uint8) (i int64) { if !d.bdRead { d.readNextBd() } @@ -564,7 +408,14 @@ func (d *msgpackDecDriver) DecodeInt64() (i int64) { case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax: i = int64(int8(d.bd)) default: - d.d.errorf("cannot decode signed integer: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd)) + d.d.errorf("Unhandled single-byte unsigned integer value: %s: %x", msgBadDesc, d.bd) + return + } + } + // check overflow (logic adapted from std pkg reflect/value.go OverflowUint() + if bitsize > 0 { + if trunc := (i << (64 - bitsize)) >> (64 - bitsize); i != trunc { + d.d.errorf("Overflow int value: %v", i) return } } @@ -573,7 +424,7 @@ func (d *msgpackDecDriver) DecodeInt64() (i int64) { } // uint can be decoded from msgpack type: intXXX or uintXXX -func (d *msgpackDecDriver) DecodeUint64() (ui uint64) { +func (d *msgpackDecDriver) DecodeUint(bitsize uint8) (ui uint64) { if !d.bdRead { d.readNextBd() } @@ -590,28 +441,28 @@ func (d *msgpackDecDriver) DecodeUint64() (ui uint64) { if i := int64(int8(d.r.readn1())); i >= 0 { ui = uint64(i) } else { - d.d.errorf("assigning negative signed value: %v, to unsigned type", i) + d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) return } case mpInt16: if i := int64(int16(bigen.Uint16(d.r.readx(2)))); i >= 0 { ui = uint64(i) } else { - d.d.errorf("assigning negative signed value: %v, to unsigned type", i) + d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) return } case mpInt32: if i := int64(int32(bigen.Uint32(d.r.readx(4)))); i >= 0 { ui = uint64(i) } else { - d.d.errorf("assigning negative signed value: %v, to unsigned type", i) + d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) return } case mpInt64: if i := int64(bigen.Uint64(d.r.readx(8))); i >= 0 { ui = uint64(i) } else { - d.d.errorf("assigning negative signed value: %v, to unsigned type", i) + d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) return } default: @@ -619,10 +470,17 @@ func (d *msgpackDecDriver) DecodeUint64() (ui uint64) { case d.bd >= mpPosFixNumMin && d.bd <= mpPosFixNumMax: ui = uint64(d.bd) case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax: - d.d.errorf("assigning negative signed value: %v, to unsigned type", int(d.bd)) + d.d.errorf("Assigning negative signed value: %v, to unsigned type", int(d.bd)) return default: - d.d.errorf("cannot decode unsigned integer: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd)) + d.d.errorf("Unhandled single-byte unsigned integer value: %s: %x", msgBadDesc, d.bd) + return + } + } + // check overflow (logic adapted from std pkg reflect/value.go OverflowUint() + if bitsize > 0 { + if trunc := (ui << (64 - bitsize)) >> (64 - bitsize); ui != trunc { + d.d.errorf("Overflow uint value: %v", ui) return } } @@ -631,7 +489,7 @@ func (d *msgpackDecDriver) DecodeUint64() (ui uint64) { } // float can either be decoded from msgpack type: float, double or intX -func (d *msgpackDecDriver) DecodeFloat64() (f float64) { +func (d *msgpackDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { if !d.bdRead { d.readNextBd() } @@ -640,7 +498,11 @@ func (d *msgpackDecDriver) DecodeFloat64() (f float64) { } else if d.bd == mpDouble { f = math.Float64frombits(bigen.Uint64(d.r.readx(8))) } else { - f = float64(d.DecodeInt64()) + f = float64(d.DecodeInt(0)) + } + if chkOverflow32 && chkOvf.Float32(f) { + d.d.errorf("msgpack: float32 overflow: %v", f) + return } d.bdRead = false return @@ -656,45 +518,25 @@ func (d *msgpackDecDriver) DecodeBool() (b bool) { } else if d.bd == mpTrue || d.bd == 1 { b = true } else { - d.d.errorf("cannot decode bool: %s: %x/%s", msgBadDesc, d.bd, mpdesc(d.bd)) + d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) return } d.bdRead = false return } -func (d *msgpackDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { +func (d *msgpackDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { if !d.bdRead { d.readNextBd() } - - // check if an "array" of uint8's (see ContainerType for how to infer if an array) - bd := d.bd - // DecodeBytes could be from: bin str fixstr fixarray array ... var clen int - vt := d.ContainerType() - switch vt { - case valueTypeBytes: - // valueTypeBytes may be a mpBin or an mpStr container - if bd == mpBin8 || bd == mpBin16 || bd == mpBin32 { - clen = d.readContainerLen(msgpackContainerBin) - } else { - clen = d.readContainerLen(msgpackContainerStr) - } - case valueTypeString: + // ignore isstring. Expect that the bytes may be found from msgpackContainerStr or msgpackContainerBin + if bd := d.bd; bd == mpBin8 || bd == mpBin16 || bd == mpBin32 { + clen = d.readContainerLen(msgpackContainerBin) + } else { clen = d.readContainerLen(msgpackContainerStr) - case valueTypeArray: - if zerocopy && len(bs) == 0 { - bs = d.d.b[:] - } - bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d) - return - default: - d.d.errorf("invalid container type: expecting bin|str|array, got: 0x%x", uint8(vt)) - return } - - // these are (bin|str)(8|16|32) + // println("DecodeBytes: clen: ", clen) d.bdRead = false // bytes may be nil, so handle it. if nil, clen=-1. if clen < 0 { @@ -704,18 +546,14 @@ func (d *msgpackDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) if d.br { return d.r.readx(clen) } else if len(bs) == 0 { - bs = d.d.b[:] + bs = d.b[:] } } - return decByteSlice(d.r, clen, d.h.MaxInitLen, bs) + return decByteSlice(d.r, clen, d.d.h.MaxInitLen, bs) } func (d *msgpackDecDriver) DecodeString() (s string) { - return string(d.DecodeBytes(d.d.b[:], true)) -} - -func (d *msgpackDecDriver) DecodeStringAsBytes() (s []byte) { - return d.DecodeBytes(d.d.b[:], true) + return string(d.DecodeBytes(d.b[:], true, true)) } func (d *msgpackDecDriver) readNextBd() { @@ -731,9 +569,6 @@ func (d *msgpackDecDriver) uncacheRead() { } func (d *msgpackDecDriver) ContainerType() (vt valueType) { - if !d.bdRead { - d.readNextBd() - } bd := d.bd if bd == mpNil { return valueTypeNil @@ -748,10 +583,9 @@ func (d *msgpackDecDriver) ContainerType() (vt valueType) { return valueTypeArray } else if bd == mpMap16 || bd == mpMap32 || (bd >= mpFixMapMin && bd <= mpFixMapMax) { return valueTypeMap + } else { + // d.d.errorf("isContainerType: unsupported parameter: %v", vt) } - // else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - // } return valueTypeUnset } @@ -761,7 +595,7 @@ func (d *msgpackDecDriver) TryDecodeAsNil() (v bool) { } if d.bd == mpNil { d.bdRead = false - return true + v = true } return } @@ -779,7 +613,7 @@ func (d *msgpackDecDriver) readContainerLen(ct msgpackContainerType) (clen int) } else if (ct.bFixMin & bd) == ct.bFixMin { clen = int(ct.bFixMin ^ bd) } else { - d.d.errorf("cannot read container length: %s: hex: %x, decimal: %d", msgBadDesc, bd, bd) + d.d.errorf("readContainerLen: %s: hex: %x, decimal: %d", msgBadDesc, bd, bd) return } d.bdRead = false @@ -787,16 +621,10 @@ func (d *msgpackDecDriver) readContainerLen(ct msgpackContainerType) (clen int) } func (d *msgpackDecDriver) ReadMapStart() int { - if !d.bdRead { - d.readNextBd() - } return d.readContainerLen(msgpackContainerMap) } func (d *msgpackDecDriver) ReadArrayStart() int { - if !d.bdRead { - d.readNextBd() - } return d.readContainerLen(msgpackContainerList) } @@ -827,60 +655,9 @@ func (d *msgpackDecDriver) readExtLen() (clen int) { return } -func (d *msgpackDecDriver) DecodeTime() (t time.Time) { - // decode time from string bytes or ext - if !d.bdRead { - d.readNextBd() - } - if d.bd == mpNil { - d.bdRead = false - return - } - var clen int - switch d.ContainerType() { - case valueTypeBytes, valueTypeString: - clen = d.readContainerLen(msgpackContainerStr) - default: - // expect to see mpFixExt4,-1 OR mpFixExt8,-1 OR mpExt8,12,-1 - d.bdRead = false - b2 := d.r.readn1() - if d.bd == mpFixExt4 && b2 == mpTimeExtTagU { - clen = 4 - } else if d.bd == mpFixExt8 && b2 == mpTimeExtTagU { - clen = 8 - } else if d.bd == mpExt8 && b2 == 12 && d.r.readn1() == mpTimeExtTagU { - clen = 12 - } else { - d.d.errorf("invalid bytes for decoding time as extension: got 0x%x, 0x%x", d.bd, b2) - return - } - } - return d.decodeTime(clen) -} - -func (d *msgpackDecDriver) decodeTime(clen int) (t time.Time) { - // bs = d.r.readx(clen) - d.bdRead = false - switch clen { - case 4: - t = time.Unix(int64(bigen.Uint32(d.r.readx(4))), 0).UTC() - case 8: - tv := bigen.Uint64(d.r.readx(8)) - t = time.Unix(int64(tv&0x00000003ffffffff), int64(tv>>34)).UTC() - case 12: - nsec := bigen.Uint32(d.r.readx(4)) - sec := bigen.Uint64(d.r.readx(8)) - t = time.Unix(int64(sec), int64(nsec)).UTC() - default: - d.d.errorf("invalid length of bytes for decoding time - expecting 4 or 8 or 12, got %d", clen) - return - } - return -} - func (d *msgpackDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { if xtag > 0xff { - d.d.errorf("ext: tag must be <= 0xff; got: %v", xtag) + d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag) return } realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag)) @@ -901,15 +678,15 @@ func (d *msgpackDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs } xbd := d.bd if xbd == mpBin8 || xbd == mpBin16 || xbd == mpBin32 { - xbs = d.DecodeBytes(nil, true) + xbs = d.DecodeBytes(nil, false, true) } else if xbd == mpStr8 || xbd == mpStr16 || xbd == mpStr32 || (xbd >= mpFixStrMin && xbd <= mpFixStrMax) { - xbs = d.DecodeStringAsBytes() + xbs = d.DecodeBytes(nil, true, true) } else { clen := d.readExtLen() xtag = d.r.readn1() if verifyTag && xtag != tag { - d.d.errorf("wrong extension tag - got %b, expecting %v", xtag, tag) + d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", xtag, tag) return } xbs = d.r.readx(clen) @@ -927,9 +704,6 @@ type MsgpackHandle struct { // RawToString controls how raw bytes are decoded into a nil interface{}. RawToString bool - // NoFixedNum says to output all signed integers as 2-bytes, never as 1-byte fixednum. - NoFixedNum bool - // WriteExt flag supports encoding configured extensions with extension tags. // It also controls whether other elements of the new spec are encoded (ie Str8). // @@ -941,19 +715,11 @@ type MsgpackHandle struct { // type is provided (e.g. decoding into a nil interface{}), you get back // a []byte or string based on the setting of RawToString. WriteExt bool - binaryEncodingType - noElemSeparators - - // _ [1]uint64 // padding } -// Name returns the name of the handle: msgpack -func (h *MsgpackHandle) Name() string { return "msgpack" } - -// SetBytesExt sets an extension func (h *MsgpackHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) { - return h.SetExt(rt, tag, &extWrapper{ext, interfaceExtFailer{}}) + return h.SetExt(rt, tag, &setExtWrapper{b: ext}) } func (h *MsgpackHandle) newEncDriver(e *Encoder) encDriver { @@ -961,7 +727,7 @@ func (h *MsgpackHandle) newEncDriver(e *Encoder) encDriver { } func (h *MsgpackHandle) newDecDriver(d *Decoder) decDriver { - return &msgpackDecDriver{d: d, h: h, r: d.r, br: d.bytes} + return &msgpackDecDriver{d: d, r: d.r, h: h, br: d.bytes} } func (e *msgpackEncDriver) reset() { @@ -969,7 +735,7 @@ func (e *msgpackEncDriver) reset() { } func (d *msgpackDecDriver) reset() { - d.r, d.br = d.d.r, d.d.bytes + d.r = d.d.r d.bd, d.bdRead = 0, false } @@ -991,7 +757,7 @@ func (c *msgpackSpecRpcCodec) WriteRequest(r *rpc.Request, body interface{}) err bodyArr = []interface{}{body} } r2 := []interface{}{0, uint32(r.Seq), r.ServiceMethod, bodyArr} - return c.write(r2, nil, false) + return c.write(r2, nil, false, true) } func (c *msgpackSpecRpcCodec) WriteResponse(r *rpc.Response, body interface{}) error { @@ -1003,7 +769,7 @@ func (c *msgpackSpecRpcCodec) WriteResponse(r *rpc.Response, body interface{}) e body = nil } r2 := []interface{}{1, uint32(r.Seq), moe, body} - return c.write(r2, nil, false) + return c.write(r2, nil, false, true) } func (c *msgpackSpecRpcCodec) ReadResponseHeader(r *rpc.Response) error { @@ -1023,6 +789,7 @@ func (c *msgpackSpecRpcCodec) ReadRequestBody(body interface{}) error { } func (c *msgpackSpecRpcCodec) parseCustomHeader(expectTypeByte byte, msgid *uint64, methodOrError *string) (err error) { + if c.isClosed() { return io.EOF } @@ -1036,34 +803,28 @@ func (c *msgpackSpecRpcCodec) parseCustomHeader(expectTypeByte byte, msgid *uint // err = fmt.Errorf("Unexpected value for array descriptor: Expecting %v. Received %v", fia, bs1) // return // } - var ba [1]byte - var n int - for { - n, err = c.r.Read(ba[:]) - if err != nil { - return - } - if n == 1 { - break - } + var b byte + b, err = c.br.ReadByte() + if err != nil { + return } - - var b = ba[0] if b != fia { - err = fmt.Errorf("not array - %s %x/%s", msgBadDesc, b, mpdesc(b)) - } else { - err = c.read(&b) - if err == nil { - if b != expectTypeByte { - err = fmt.Errorf("%s - expecting %v but got %x/%s", - msgBadDesc, expectTypeByte, b, mpdesc(b)) - } else { - err = c.read(msgid) - if err == nil { - err = c.read(methodOrError) - } - } - } + err = fmt.Errorf("Unexpected value for array descriptor: Expecting %v. Received %v", fia, b) + return + } + + if err = c.read(&b); err != nil { + return + } + if b != expectTypeByte { + err = fmt.Errorf("Unexpected byte descriptor in header. Expecting %v. Received %v", expectTypeByte, b) + return + } + if err = c.read(msgid); err != nil { + return + } + if err = c.read(methodOrError); err != nil { + return } return } @@ -1076,8 +837,7 @@ type msgpackSpecRpc struct{} // MsgpackSpecRpc implements Rpc using the communication protocol defined in // the msgpack spec at https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md . -// -// See GoRpc documentation, for information on buffering for better performance. +// Its methods (ServerCodec and ClientCodec) return values that implement RpcCodecBuffered. var MsgpackSpecRpc msgpackSpecRpc func (x msgpackSpecRpc) ServerCodec(conn io.ReadWriteCloser, h Handle) rpc.ServerCodec { diff --git a/vendor/github.com/ugorji/go/codec/noop.go b/vendor/github.com/ugorji/go/codec/noop.go new file mode 100644 index 000000000..cfee3d084 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/noop.go @@ -0,0 +1,213 @@ +// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. +// Use of this source code is governed by a MIT license found in the LICENSE file. + +package codec + +import ( + "math/rand" + "time" +) + +// NoopHandle returns a no-op handle. It basically does nothing. +// It is only useful for benchmarking, as it gives an idea of the +// overhead from the codec framework. +// +// LIBRARY USERS: *** DO NOT USE *** +func NoopHandle(slen int) *noopHandle { + h := noopHandle{} + h.rand = rand.New(rand.NewSource(time.Now().UnixNano())) + h.B = make([][]byte, slen) + h.S = make([]string, slen) + for i := 0; i < len(h.S); i++ { + b := make([]byte, i+1) + for j := 0; j < len(b); j++ { + b[j] = 'a' + byte(i) + } + h.B[i] = b + h.S[i] = string(b) + } + return &h +} + +// noopHandle does nothing. +// It is used to simulate the overhead of the codec framework. +type noopHandle struct { + BasicHandle + binaryEncodingType + noopDrv // noopDrv is unexported here, so we can get a copy of it when needed. +} + +type noopDrv struct { + d *Decoder + e *Encoder + i int + S []string + B [][]byte + mks []bool // stack. if map (true), else if array (false) + mk bool // top of stack. what container are we on? map or array? + ct valueType // last response for IsContainerType. + cb int // counter for ContainerType + rand *rand.Rand +} + +func (h *noopDrv) r(v int) int { return h.rand.Intn(v) } +func (h *noopDrv) m(v int) int { h.i++; return h.i % v } + +func (h *noopDrv) newEncDriver(e *Encoder) encDriver { h.e = e; return h } +func (h *noopDrv) newDecDriver(d *Decoder) decDriver { h.d = d; return h } + +func (h *noopDrv) reset() {} +func (h *noopDrv) uncacheRead() {} + +// --- encDriver + +// stack functions (for map and array) +func (h *noopDrv) start(b bool) { + // println("start", len(h.mks)+1) + h.mks = append(h.mks, b) + h.mk = b +} +func (h *noopDrv) end() { + // println("end: ", len(h.mks)-1) + h.mks = h.mks[:len(h.mks)-1] + if len(h.mks) > 0 { + h.mk = h.mks[len(h.mks)-1] + } else { + h.mk = false + } +} + +func (h *noopDrv) EncodeBuiltin(rt uintptr, v interface{}) {} +func (h *noopDrv) EncodeNil() {} +func (h *noopDrv) EncodeInt(i int64) {} +func (h *noopDrv) EncodeUint(i uint64) {} +func (h *noopDrv) EncodeBool(b bool) {} +func (h *noopDrv) EncodeFloat32(f float32) {} +func (h *noopDrv) EncodeFloat64(f float64) {} +func (h *noopDrv) EncodeRawExt(re *RawExt, e *Encoder) {} +func (h *noopDrv) EncodeArrayStart(length int) { h.start(true) } +func (h *noopDrv) EncodeMapStart(length int) { h.start(false) } +func (h *noopDrv) EncodeEnd() { h.end() } + +func (h *noopDrv) EncodeString(c charEncoding, v string) {} +func (h *noopDrv) EncodeSymbol(v string) {} +func (h *noopDrv) EncodeStringBytes(c charEncoding, v []byte) {} + +func (h *noopDrv) EncodeExt(rv interface{}, xtag uint64, ext Ext, e *Encoder) {} + +// ---- decDriver +func (h *noopDrv) initReadNext() {} +func (h *noopDrv) CheckBreak() bool { return false } +func (h *noopDrv) IsBuiltinType(rt uintptr) bool { return false } +func (h *noopDrv) DecodeBuiltin(rt uintptr, v interface{}) {} +func (h *noopDrv) DecodeInt(bitsize uint8) (i int64) { return int64(h.m(15)) } +func (h *noopDrv) DecodeUint(bitsize uint8) (ui uint64) { return uint64(h.m(35)) } +func (h *noopDrv) DecodeFloat(chkOverflow32 bool) (f float64) { return float64(h.m(95)) } +func (h *noopDrv) DecodeBool() (b bool) { return h.m(2) == 0 } +func (h *noopDrv) DecodeString() (s string) { return h.S[h.m(8)] } + +// func (h *noopDrv) DecodeStringAsBytes(bs []byte) []byte { return h.DecodeBytes(bs) } + +func (h *noopDrv) DecodeBytes(bs []byte, isstring, zerocopy bool) []byte { return h.B[h.m(len(h.B))] } + +func (h *noopDrv) ReadEnd() { h.end() } + +// toggle map/slice +func (h *noopDrv) ReadMapStart() int { h.start(true); return h.m(10) } +func (h *noopDrv) ReadArrayStart() int { h.start(false); return h.m(10) } + +func (h *noopDrv) ContainerType() (vt valueType) { + // return h.m(2) == 0 + // handle kStruct, which will bomb is it calls this and doesn't get back a map or array. + // consequently, if the return value is not map or array, reset it to one of them based on h.m(7) % 2 + // for kstruct: at least one out of every 2 times, return one of valueTypeMap or Array (else kstruct bombs) + // however, every 10th time it is called, we just return something else. + var vals = [...]valueType{valueTypeArray, valueTypeMap} + // ------------ TAKE ------------ + // if h.cb%2 == 0 { + // if h.ct == valueTypeMap || h.ct == valueTypeArray { + // } else { + // h.ct = vals[h.m(2)] + // } + // } else if h.cb%5 == 0 { + // h.ct = valueType(h.m(8)) + // } else { + // h.ct = vals[h.m(2)] + // } + // ------------ TAKE ------------ + // if h.cb%16 == 0 { + // h.ct = valueType(h.cb % 8) + // } else { + // h.ct = vals[h.cb%2] + // } + h.ct = vals[h.cb%2] + h.cb++ + return h.ct + + // if h.ct == valueTypeNil || h.ct == valueTypeString || h.ct == valueTypeBytes { + // return h.ct + // } + // return valueTypeUnset + // TODO: may need to tweak this so it works. + // if h.ct == valueTypeMap && vt == valueTypeArray || h.ct == valueTypeArray && vt == valueTypeMap { + // h.cb = !h.cb + // h.ct = vt + // return h.cb + // } + // // go in a loop and check it. + // h.ct = vt + // h.cb = h.m(7) == 0 + // return h.cb +} +func (h *noopDrv) TryDecodeAsNil() bool { + if h.mk { + return false + } else { + return h.m(8) == 0 + } +} +func (h *noopDrv) DecodeExt(rv interface{}, xtag uint64, ext Ext) uint64 { + return 0 +} + +func (h *noopDrv) DecodeNaked() { + // use h.r (random) not h.m() because h.m() could cause the same value to be given. + var sk int + if h.mk { + // if mapkey, do not support values of nil OR bytes, array, map or rawext + sk = h.r(7) + 1 + } else { + sk = h.r(12) + } + n := &h.d.n + switch sk { + case 0: + n.v = valueTypeNil + case 1: + n.v, n.b = valueTypeBool, false + case 2: + n.v, n.b = valueTypeBool, true + case 3: + n.v, n.i = valueTypeInt, h.DecodeInt(64) + case 4: + n.v, n.u = valueTypeUint, h.DecodeUint(64) + case 5: + n.v, n.f = valueTypeFloat, h.DecodeFloat(true) + case 6: + n.v, n.f = valueTypeFloat, h.DecodeFloat(false) + case 7: + n.v, n.s = valueTypeString, h.DecodeString() + case 8: + n.v, n.l = valueTypeBytes, h.B[h.m(len(h.B))] + case 9: + n.v = valueTypeArray + case 10: + n.v = valueTypeMap + default: + n.v = valueTypeExt + n.u = h.DecodeUint(64) + n.l = h.B[h.m(len(h.B))] + } + h.ct = n.v + return +} diff --git a/vendor/github.com/ugorji/go/codec/prebuild.go b/vendor/github.com/ugorji/go/codec/prebuild.go new file mode 100644 index 000000000..2353263e8 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/prebuild.go @@ -0,0 +1,3 @@ +package codec + +//go:generate bash prebuild.sh diff --git a/vendor/github.com/ugorji/go/codec/prebuild.sh b/vendor/github.com/ugorji/go/codec/prebuild.sh new file mode 100755 index 000000000..909f4bb0f --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/prebuild.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# _needgen is a helper function to tell if we need to generate files for msgp, codecgen. +_needgen() { + local a="$1" + zneedgen=0 + if [[ ! -e "$a" ]] + then + zneedgen=1 + echo 1 + return 0 + fi + for i in `ls -1 *.go.tmpl gen.go values_test.go` + do + if [[ "$a" -ot "$i" ]] + then + zneedgen=1 + echo 1 + return 0 + fi + done + echo 0 +} + +# _build generates fast-path.go and gen-helper.go. +# +# It is needed because there is some dependency between the generated code +# and the other classes. Consequently, we have to totally remove the +# generated files and put stubs in place, before calling "go run" again +# to recreate them. +_build() { + if ! [[ "${zforce}" == "1" || + "1" == $( _needgen "fast-path.generated.go" ) || + "1" == $( _needgen "gen-helper.generated.go" ) || + "1" == $( _needgen "gen.generated.go" ) || + 1 == 0 ]] + then + return 0 + fi + + # echo "Running prebuild" + if [ "${zbak}" == "1" ] + then + # echo "Backing up old generated files" + _zts=`date '+%m%d%Y_%H%M%S'` + _gg=".generated.go" + [ -e "gen-helper${_gg}" ] && mv gen-helper${_gg} gen-helper${_gg}__${_zts}.bak + [ -e "fast-path${_gg}" ] && mv fast-path${_gg} fast-path${_gg}__${_zts}.bak + # [ -e "safe${_gg}" ] && mv safe${_gg} safe${_gg}__${_zts}.bak + # [ -e "unsafe${_gg}" ] && mv unsafe${_gg} unsafe${_gg}__${_zts}.bak + else + rm -f fast-path.generated.go gen.generated.go gen-helper.generated.go \ + *safe.generated.go *_generated_test.go *.generated_ffjson_expose.go + fi + + cat > gen.generated.go <> gen.generated.go < gen-dec-map.go.tmpl + + cat >> gen.generated.go <> gen.generated.go < gen-dec-array.go.tmpl + + cat >> gen.generated.go < gen-from-tmpl.codec.generated.go < gen-from-tmpl.generated.go <= simpleVdPosInt && d.bd <= simpleVdNegInt+3 { - f = float64(d.DecodeInt64()) + f = float64(d.DecodeInt(64)) } else { - d.d.errorf("float only valid from float32/64: Invalid descriptor: %v", d.bd) + d.d.errorf("Float only valid from float32/64: Invalid descriptor: %v", d.bd) return } } + if chkOverflow32 && chkOvf.Float32(f) { + d.d.errorf("msgpack: float32 overflow: %v", f) + return + } d.bdRead = false return } @@ -350,7 +307,7 @@ func (d *simpleDecDriver) DecodeBool() (b bool) { b = true } else if d.bd == simpleVdFalse { } else { - d.d.errorf("cannot decode bool - %s: %x", msgBadDesc, d.bd) + d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) return } d.bdRead = false @@ -358,43 +315,15 @@ func (d *simpleDecDriver) DecodeBool() (b bool) { } func (d *simpleDecDriver) ReadMapStart() (length int) { - if !d.bdRead { - d.readNextBd() - } d.bdRead = false - d.c = containerMapStart return d.decLen() } func (d *simpleDecDriver) ReadArrayStart() (length int) { - if !d.bdRead { - d.readNextBd() - } d.bdRead = false - d.c = containerArrayStart return d.decLen() } -func (d *simpleDecDriver) ReadArrayElem() { - d.c = containerArrayElem -} - -func (d *simpleDecDriver) ReadArrayEnd() { - d.c = containerArrayEnd -} - -func (d *simpleDecDriver) ReadMapElemKey() { - d.c = containerMapKey -} - -func (d *simpleDecDriver) ReadMapElemValue() { - d.c = containerMapValue -} - -func (d *simpleDecDriver) ReadMapEnd() { - d.c = containerMapEnd -} - func (d *simpleDecDriver) decLen() int { switch d.bd % 8 { case 0: @@ -406,31 +335,27 @@ func (d *simpleDecDriver) decLen() int { case 3: ui := uint64(bigen.Uint32(d.r.readx(4))) if chkOvf.Uint(ui, intBitsize) { - d.d.errorf("overflow integer: %v", ui) + d.d.errorf("simple: overflow integer: %v", ui) return 0 } return int(ui) case 4: ui := bigen.Uint64(d.r.readx(8)) if chkOvf.Uint(ui, intBitsize) { - d.d.errorf("overflow integer: %v", ui) + d.d.errorf("simple: overflow integer: %v", ui) return 0 } return int(ui) } - d.d.errorf("cannot read length: bd%%8 must be in range 0..4. Got: %d", d.bd%8) + d.d.errorf("decLen: Cannot read length: bd%%8 must be in range 0..4. Got: %d", d.bd%8) return -1 } func (d *simpleDecDriver) DecodeString() (s string) { - return string(d.DecodeBytes(d.d.b[:], true)) + return string(d.DecodeBytes(d.b[:], true, true)) } -func (d *simpleDecDriver) DecodeStringAsBytes() (s []byte) { - return d.DecodeBytes(d.d.b[:], true) -} - -func (d *simpleDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { +func (d *simpleDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { if !d.bdRead { d.readNextBd() } @@ -438,51 +363,21 @@ func (d *simpleDecDriver) DecodeBytes(bs []byte, zerocopy bool) (bsOut []byte) { d.bdRead = false return } - // check if an "array" of uint8's (see ContainerType for how to infer if an array) - if d.bd >= simpleVdArray && d.bd <= simpleVdMap+4 { - if len(bs) == 0 && zerocopy { - bs = d.d.b[:] - } - bsOut, _ = fastpathTV.DecSliceUint8V(bs, true, d.d) - return - } - clen := d.decLen() d.bdRead = false if zerocopy { if d.br { return d.r.readx(clen) } else if len(bs) == 0 { - bs = d.d.b[:] + bs = d.b[:] } } return decByteSlice(d.r, clen, d.d.h.MaxInitLen, bs) } -func (d *simpleDecDriver) DecodeTime() (t time.Time) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == simpleVdNil { - d.bdRead = false - return - } - if d.bd != simpleVdTime { - d.d.errorf("invalid descriptor for time.Time - expect 0x%x, received 0x%x", simpleVdTime, d.bd) - return - } - d.bdRead = false - clen := int(d.r.readn1()) - b := d.r.readx(clen) - if err := (&t).UnmarshalBinary(b); err != nil { - d.d.errorv(err) - } - return -} - func (d *simpleDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { if xtag > 0xff { - d.d.errorf("ext: tag must be <= 0xff; got: %v", xtag) + d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag) return } realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag)) @@ -506,15 +401,14 @@ func (d *simpleDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs [ l := d.decLen() xtag = d.r.readn1() if verifyTag && xtag != tag { - d.d.errorf("wrong extension tag. Got %b. Expecting: %v", xtag, tag) + d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", xtag, tag) return } xbs = d.r.readx(l) - case simpleVdByteArray, simpleVdByteArray + 1, - simpleVdByteArray + 2, simpleVdByteArray + 3, simpleVdByteArray + 4: - xbs = d.DecodeBytes(nil, true) + case simpleVdByteArray, simpleVdByteArray + 1, simpleVdByteArray + 2, simpleVdByteArray + 3, simpleVdByteArray + 4: + xbs = d.DecodeBytes(nil, false, true) default: - d.d.errorf("ext - %s - expecting extensions/bytearray, got: 0x%x", msgBadDesc, d.bd) + d.d.errorf("Invalid d.bd for extensions (Expecting extensions or byte array). Got: 0x%x", d.bd) return } d.bdRead = false @@ -526,7 +420,7 @@ func (d *simpleDecDriver) DecodeNaked() { d.readNextBd() } - n := d.d.n + n := &d.d.n var decodeFurther bool switch d.bd { @@ -541,45 +435,39 @@ func (d *simpleDecDriver) DecodeNaked() { case simpleVdPosInt, simpleVdPosInt + 1, simpleVdPosInt + 2, simpleVdPosInt + 3: if d.h.SignedInteger { n.v = valueTypeInt - n.i = d.DecodeInt64() + n.i = d.DecodeInt(64) } else { n.v = valueTypeUint - n.u = d.DecodeUint64() + n.u = d.DecodeUint(64) } case simpleVdNegInt, simpleVdNegInt + 1, simpleVdNegInt + 2, simpleVdNegInt + 3: n.v = valueTypeInt - n.i = d.DecodeInt64() + n.i = d.DecodeInt(64) case simpleVdFloat32: n.v = valueTypeFloat - n.f = d.DecodeFloat64() + n.f = d.DecodeFloat(true) case simpleVdFloat64: n.v = valueTypeFloat - n.f = d.DecodeFloat64() - case simpleVdTime: - n.v = valueTypeTime - n.t = d.DecodeTime() - case simpleVdString, simpleVdString + 1, - simpleVdString + 2, simpleVdString + 3, simpleVdString + 4: + n.f = d.DecodeFloat(false) + case simpleVdString, simpleVdString + 1, simpleVdString + 2, simpleVdString + 3, simpleVdString + 4: n.v = valueTypeString n.s = d.DecodeString() - case simpleVdByteArray, simpleVdByteArray + 1, - simpleVdByteArray + 2, simpleVdByteArray + 3, simpleVdByteArray + 4: + case simpleVdByteArray, simpleVdByteArray + 1, simpleVdByteArray + 2, simpleVdByteArray + 3, simpleVdByteArray + 4: n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false) + n.l = d.DecodeBytes(nil, false, false) case simpleVdExt, simpleVdExt + 1, simpleVdExt + 2, simpleVdExt + 3, simpleVdExt + 4: n.v = valueTypeExt l := d.decLen() n.u = uint64(d.r.readn1()) n.l = d.r.readx(l) - case simpleVdArray, simpleVdArray + 1, simpleVdArray + 2, - simpleVdArray + 3, simpleVdArray + 4: + case simpleVdArray, simpleVdArray + 1, simpleVdArray + 2, simpleVdArray + 3, simpleVdArray + 4: n.v = valueTypeArray decodeFurther = true case simpleVdMap, simpleVdMap + 1, simpleVdMap + 2, simpleVdMap + 3, simpleVdMap + 4: n.v = valueTypeMap decodeFurther = true default: - d.d.errorf("cannot infer value - %s 0x%x", msgBadDesc, d.bd) + d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd) } if !decodeFurther { @@ -598,7 +486,7 @@ func (d *simpleDecDriver) DecodeNaked() { // - Integers (intXXX, uintXXX) are encoded in 1, 2, 4 or 8 bytes (plus a descriptor byte). // There are positive (uintXXX and intXXX >= 0) and negative (intXXX < 0) integers. // - Floats are encoded in 4 or 8 bytes (plus a descriptor byte) -// - Length of containers (strings, bytes, array, map, extensions) +// - Lenght of containers (strings, bytes, array, map, extensions) // are encoded in 0, 1, 2, 4 or 8 bytes. // Zero-length containers have no length encoded. // For others, the number of bytes is given by pow(2, bd%3) @@ -606,45 +494,31 @@ func (d *simpleDecDriver) DecodeNaked() { // - arrays are encoded as [bd] [length] [value]... // - extensions are encoded as [bd] [length] [tag] [byte]... // - strings/bytearrays are encoded as [bd] [length] [byte]... -// - time.Time are encoded as [bd] [length] [byte]... // // The full spec will be published soon. type SimpleHandle struct { BasicHandle binaryEncodingType - noElemSeparators - // EncZeroValuesAsNil says to encode zero values for numbers, bool, string, etc as nil - EncZeroValuesAsNil bool - - // _ [1]uint64 // padding } -// Name returns the name of the handle: simple -func (h *SimpleHandle) Name() string { return "simple" } - -// SetBytesExt sets an extension func (h *SimpleHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) { - return h.SetExt(rt, tag, &extWrapper{ext, interfaceExtFailer{}}) + return h.SetExt(rt, tag, &setExtWrapper{b: ext}) } -func (h *SimpleHandle) hasElemSeparators() bool { return true } // as it implements Write(Map|Array)XXX - func (h *SimpleHandle) newEncDriver(e *Encoder) encDriver { return &simpleEncDriver{e: e, w: e.w, h: h} } func (h *SimpleHandle) newDecDriver(d *Decoder) decDriver { - return &simpleDecDriver{d: d, h: h, r: d.r, br: d.bytes} + return &simpleDecDriver{d: d, r: d.r, h: h, br: d.bytes} } func (e *simpleEncDriver) reset() { - e.c = 0 e.w = e.e.w } func (d *simpleDecDriver) reset() { - d.c = 0 - d.r, d.br = d.d.r, d.d.bytes + d.r = d.d.r d.bd, d.bdRead = 0, false } diff --git a/vendor/github.com/ugorji/go/codec/test-cbor-goldens.json b/vendor/github.com/ugorji/go/codec/test-cbor-goldens.json new file mode 100644 index 000000000..902858671 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/test-cbor-goldens.json @@ -0,0 +1,639 @@ +[ + { + "cbor": "AA==", + "hex": "00", + "roundtrip": true, + "decoded": 0 + }, + { + "cbor": "AQ==", + "hex": "01", + "roundtrip": true, + "decoded": 1 + }, + { + "cbor": "Cg==", + "hex": "0a", + "roundtrip": true, + "decoded": 10 + }, + { + "cbor": "Fw==", + "hex": "17", + "roundtrip": true, + "decoded": 23 + }, + { + "cbor": "GBg=", + "hex": "1818", + "roundtrip": true, + "decoded": 24 + }, + { + "cbor": "GBk=", + "hex": "1819", + "roundtrip": true, + "decoded": 25 + }, + { + "cbor": "GGQ=", + "hex": "1864", + "roundtrip": true, + "decoded": 100 + }, + { + "cbor": "GQPo", + "hex": "1903e8", + "roundtrip": true, + "decoded": 1000 + }, + { + "cbor": "GgAPQkA=", + "hex": "1a000f4240", + "roundtrip": true, + "decoded": 1000000 + }, + { + "cbor": "GwAAAOjUpRAA", + "hex": "1b000000e8d4a51000", + "roundtrip": true, + "decoded": 1000000000000 + }, + { + "cbor": "G///////////", + "hex": "1bffffffffffffffff", + "roundtrip": true, + "decoded": 18446744073709551615 + }, + { + "cbor": "wkkBAAAAAAAAAAA=", + "hex": "c249010000000000000000", + "roundtrip": true, + "decoded": 18446744073709551616 + }, + { + "cbor": "O///////////", + "hex": "3bffffffffffffffff", + "roundtrip": true, + "decoded": -18446744073709551616, + "skip": true + }, + { + "cbor": "w0kBAAAAAAAAAAA=", + "hex": "c349010000000000000000", + "roundtrip": true, + "decoded": -18446744073709551617 + }, + { + "cbor": "IA==", + "hex": "20", + "roundtrip": true, + "decoded": -1 + }, + { + "cbor": "KQ==", + "hex": "29", + "roundtrip": true, + "decoded": -10 + }, + { + "cbor": "OGM=", + "hex": "3863", + "roundtrip": true, + "decoded": -100 + }, + { + "cbor": "OQPn", + "hex": "3903e7", + "roundtrip": true, + "decoded": -1000 + }, + { + "cbor": "+QAA", + "hex": "f90000", + "roundtrip": true, + "decoded": 0.0 + }, + { + "cbor": "+YAA", + "hex": "f98000", + "roundtrip": true, + "decoded": -0.0 + }, + { + "cbor": "+TwA", + "hex": "f93c00", + "roundtrip": true, + "decoded": 1.0 + }, + { + "cbor": "+z/xmZmZmZma", + "hex": "fb3ff199999999999a", + "roundtrip": true, + "decoded": 1.1 + }, + { + "cbor": "+T4A", + "hex": "f93e00", + "roundtrip": true, + "decoded": 1.5 + }, + { + "cbor": "+Xv/", + "hex": "f97bff", + "roundtrip": true, + "decoded": 65504.0 + }, + { + "cbor": "+kfDUAA=", + "hex": "fa47c35000", + "roundtrip": true, + "decoded": 100000.0 + }, + { + "cbor": "+n9///8=", + "hex": "fa7f7fffff", + "roundtrip": true, + "decoded": 3.4028234663852886e+38 + }, + { + "cbor": "+3435DyIAHWc", + "hex": "fb7e37e43c8800759c", + "roundtrip": true, + "decoded": 1.0e+300 + }, + { + "cbor": "+QAB", + "hex": "f90001", + "roundtrip": true, + "decoded": 5.960464477539063e-08 + }, + { + "cbor": "+QQA", + "hex": "f90400", + "roundtrip": true, + "decoded": 6.103515625e-05 + }, + { + "cbor": "+cQA", + "hex": "f9c400", + "roundtrip": true, + "decoded": -4.0 + }, + { + "cbor": "+8AQZmZmZmZm", + "hex": "fbc010666666666666", + "roundtrip": true, + "decoded": -4.1 + }, + { + "cbor": "+XwA", + "hex": "f97c00", + "roundtrip": true, + "diagnostic": "Infinity" + }, + { + "cbor": "+X4A", + "hex": "f97e00", + "roundtrip": true, + "diagnostic": "NaN" + }, + { + "cbor": "+fwA", + "hex": "f9fc00", + "roundtrip": true, + "diagnostic": "-Infinity" + }, + { + "cbor": "+n+AAAA=", + "hex": "fa7f800000", + "roundtrip": false, + "diagnostic": "Infinity" + }, + { + "cbor": "+n/AAAA=", + "hex": "fa7fc00000", + "roundtrip": false, + "diagnostic": "NaN" + }, + { + "cbor": "+v+AAAA=", + "hex": "faff800000", + "roundtrip": false, + "diagnostic": "-Infinity" + }, + { + "cbor": "+3/wAAAAAAAA", + "hex": "fb7ff0000000000000", + "roundtrip": false, + "diagnostic": "Infinity" + }, + { + "cbor": "+3/4AAAAAAAA", + "hex": "fb7ff8000000000000", + "roundtrip": false, + "diagnostic": "NaN" + }, + { + "cbor": "+//wAAAAAAAA", + "hex": "fbfff0000000000000", + "roundtrip": false, + "diagnostic": "-Infinity" + }, + { + "cbor": "9A==", + "hex": "f4", + "roundtrip": true, + "decoded": false + }, + { + "cbor": "9Q==", + "hex": "f5", + "roundtrip": true, + "decoded": true + }, + { + "cbor": "9g==", + "hex": "f6", + "roundtrip": true, + "decoded": null + }, + { + "cbor": "9w==", + "hex": "f7", + "roundtrip": true, + "diagnostic": "undefined" + }, + { + "cbor": "8A==", + "hex": "f0", + "roundtrip": true, + "diagnostic": "simple(16)" + }, + { + "cbor": "+Bg=", + "hex": "f818", + "roundtrip": true, + "diagnostic": "simple(24)" + }, + { + "cbor": "+P8=", + "hex": "f8ff", + "roundtrip": true, + "diagnostic": "simple(255)" + }, + { + "cbor": "wHQyMDEzLTAzLTIxVDIwOjA0OjAwWg==", + "hex": "c074323031332d30332d32315432303a30343a30305a", + "roundtrip": true, + "diagnostic": "0(\"2013-03-21T20:04:00Z\")" + }, + { + "cbor": "wRpRS2ew", + "hex": "c11a514b67b0", + "roundtrip": true, + "diagnostic": "1(1363896240)" + }, + { + "cbor": "wftB1FLZ7CAAAA==", + "hex": "c1fb41d452d9ec200000", + "roundtrip": true, + "diagnostic": "1(1363896240.5)" + }, + { + "cbor": "10QBAgME", + "hex": "d74401020304", + "roundtrip": true, + "diagnostic": "23(h'01020304')" + }, + { + "cbor": "2BhFZElFVEY=", + "hex": "d818456449455446", + "roundtrip": true, + "diagnostic": "24(h'6449455446')" + }, + { + "cbor": "2CB2aHR0cDovL3d3dy5leGFtcGxlLmNvbQ==", + "hex": "d82076687474703a2f2f7777772e6578616d706c652e636f6d", + "roundtrip": true, + "diagnostic": "32(\"http://www.example.com\")" + }, + { + "cbor": "QA==", + "hex": "40", + "roundtrip": true, + "diagnostic": "h''" + }, + { + "cbor": "RAECAwQ=", + "hex": "4401020304", + "roundtrip": true, + "diagnostic": "h'01020304'" + }, + { + "cbor": "YA==", + "hex": "60", + "roundtrip": true, + "decoded": "" + }, + { + "cbor": "YWE=", + "hex": "6161", + "roundtrip": true, + "decoded": "a" + }, + { + "cbor": "ZElFVEY=", + "hex": "6449455446", + "roundtrip": true, + "decoded": "IETF" + }, + { + "cbor": "YiJc", + "hex": "62225c", + "roundtrip": true, + "decoded": "\"\\" + }, + { + "cbor": "YsO8", + "hex": "62c3bc", + "roundtrip": true, + "decoded": "ü" + }, + { + "cbor": "Y+awtA==", + "hex": "63e6b0b4", + "roundtrip": true, + "decoded": "水" + }, + { + "cbor": "ZPCQhZE=", + "hex": "64f0908591", + "roundtrip": true, + "decoded": "𐅑" + }, + { + "cbor": "gA==", + "hex": "80", + "roundtrip": true, + "decoded": [ + + ] + }, + { + "cbor": "gwECAw==", + "hex": "83010203", + "roundtrip": true, + "decoded": [ + 1, + 2, + 3 + ] + }, + { + "cbor": "gwGCAgOCBAU=", + "hex": "8301820203820405", + "roundtrip": true, + "decoded": [ + 1, + [ + 2, + 3 + ], + [ + 4, + 5 + ] + ] + }, + { + "cbor": "mBkBAgMEBQYHCAkKCwwNDg8QERITFBUWFxgYGBk=", + "hex": "98190102030405060708090a0b0c0d0e0f101112131415161718181819", + "roundtrip": true, + "decoded": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ] + }, + { + "cbor": "oA==", + "hex": "a0", + "roundtrip": true, + "decoded": { + } + }, + { + "cbor": "ogECAwQ=", + "hex": "a201020304", + "roundtrip": true, + "skip": true, + "diagnostic": "{1: 2, 3: 4}" + }, + { + "cbor": "omFhAWFiggID", + "hex": "a26161016162820203", + "roundtrip": true, + "decoded": { + "a": 1, + "b": [ + 2, + 3 + ] + } + }, + { + "cbor": "gmFhoWFiYWM=", + "hex": "826161a161626163", + "roundtrip": true, + "decoded": [ + "a", + { + "b": "c" + } + ] + }, + { + "cbor": "pWFhYUFhYmFCYWNhQ2FkYURhZWFF", + "hex": "a56161614161626142616361436164614461656145", + "roundtrip": true, + "decoded": { + "a": "A", + "b": "B", + "c": "C", + "d": "D", + "e": "E" + } + }, + { + "cbor": "X0IBAkMDBAX/", + "hex": "5f42010243030405ff", + "roundtrip": false, + "skip": true, + "diagnostic": "(_ h'0102', h'030405')" + }, + { + "cbor": "f2VzdHJlYWRtaW5n/w==", + "hex": "7f657374726561646d696e67ff", + "roundtrip": false, + "decoded": "streaming" + }, + { + "cbor": "n/8=", + "hex": "9fff", + "roundtrip": false, + "decoded": [ + + ] + }, + { + "cbor": "nwGCAgOfBAX//w==", + "hex": "9f018202039f0405ffff", + "roundtrip": false, + "decoded": [ + 1, + [ + 2, + 3 + ], + [ + 4, + 5 + ] + ] + }, + { + "cbor": "nwGCAgOCBAX/", + "hex": "9f01820203820405ff", + "roundtrip": false, + "decoded": [ + 1, + [ + 2, + 3 + ], + [ + 4, + 5 + ] + ] + }, + { + "cbor": "gwGCAgOfBAX/", + "hex": "83018202039f0405ff", + "roundtrip": false, + "decoded": [ + 1, + [ + 2, + 3 + ], + [ + 4, + 5 + ] + ] + }, + { + "cbor": "gwGfAgP/ggQF", + "hex": "83019f0203ff820405", + "roundtrip": false, + "decoded": [ + 1, + [ + 2, + 3 + ], + [ + 4, + 5 + ] + ] + }, + { + "cbor": "nwECAwQFBgcICQoLDA0ODxAREhMUFRYXGBgYGf8=", + "hex": "9f0102030405060708090a0b0c0d0e0f101112131415161718181819ff", + "roundtrip": false, + "decoded": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25 + ] + }, + { + "cbor": "v2FhAWFinwID//8=", + "hex": "bf61610161629f0203ffff", + "roundtrip": false, + "decoded": { + "a": 1, + "b": [ + 2, + 3 + ] + } + }, + { + "cbor": "gmFhv2FiYWP/", + "hex": "826161bf61626163ff", + "roundtrip": false, + "decoded": [ + "a", + { + "b": "c" + } + ] + }, + { + "cbor": "v2NGdW71Y0FtdCH/", + "hex": "bf6346756ef563416d7421ff", + "roundtrip": false, + "decoded": { + "Fun": true, + "Amt": -2 + } + } +] diff --git a/vendor/github.com/ugorji/go/codec/test.py b/vendor/github.com/ugorji/go/codec/test.py new file mode 100755 index 000000000..f983d9d9e --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/test.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python + +# This will create golden files in a directory passed to it. +# A Test calls this internally to create the golden files +# So it can process them (so we don't have to checkin the files). + +# Ensure msgpack-python and cbor are installed first, using: +# sudo apt-get install python-dev +# sudo apt-get install python-pip +# pip install --user msgpack-python msgpack-rpc-python cbor + +# Ensure all "string" keys are utf strings (else encoded as bytes) + +import cbor, msgpack, msgpackrpc, sys, os, threading + +def get_test_data_list(): + # get list with all primitive types, and a combo type + l0 = [ + -8, + -1616, + -32323232, + -6464646464646464, + 192, + 1616, + 32323232, + 6464646464646464, + 192, + -3232.0, + -6464646464.0, + 3232.0, + 6464.0, + 6464646464.0, + False, + True, + u"null", + None, + u"some&day>some 0 + if stopTimeSec > 0: + def myStopRpcServer(): + server.stop() + t = threading.Timer(stopTimeSec, myStopRpcServer) + t.start() + server.start() + +def doRpcClientToPythonSvc(port): + address = msgpackrpc.Address('localhost', port) + client = msgpackrpc.Client(address, unpack_encoding='utf-8') + print client.call("Echo123", "A1", "B2", "C3") + print client.call("EchoStruct", {"A" :"Aa", "B":"Bb", "C":"Cc"}) + +def doRpcClientToGoSvc(port): + # print ">>>> port: ", port, " <<<<<" + address = msgpackrpc.Address('localhost', port) + client = msgpackrpc.Client(address, unpack_encoding='utf-8') + print client.call("TestRpcInt.Echo123", ["A1", "B2", "C3"]) + print client.call("TestRpcInt.EchoStruct", {"A" :"Aa", "B":"Bb", "C":"Cc"}) + +def doMain(args): + if len(args) == 2 and args[0] == "testdata": + build_test_data(args[1]) + elif len(args) == 3 and args[0] == "rpc-server": + doRpcServer(int(args[1]), int(args[2])) + elif len(args) == 2 and args[0] == "rpc-client-python-service": + doRpcClientToPythonSvc(int(args[1])) + elif len(args) == 2 and args[0] == "rpc-client-go-service": + doRpcClientToGoSvc(int(args[1])) + else: + print("Usage: test.py " + + "[testdata|rpc-server|rpc-client-python-service|rpc-client-go-service] ...") + +if __name__ == "__main__": + doMain(sys.argv[1:]) + diff --git a/vendor/github.com/ugorji/go/codec/tests.sh b/vendor/github.com/ugorji/go/codec/tests.sh new file mode 100755 index 000000000..fc9f5dee3 --- /dev/null +++ b/vendor/github.com/ugorji/go/codec/tests.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +# Run all the different permutations of all the tests. +# This helps ensure that nothing gets broken. + +_run() { + # 1. VARIATIONS: regular (t), canonical (c), IO R/W (i), + # binc-nosymbols (n), struct2array (s), intern string (e), + # json-indent (d), circular (l) + # 2. MODE: reflection (r), external (x), codecgen (g), unsafe (u), notfastpath (f) + # 3. OPTIONS: verbose (v), reset (z), must (m), + # + # Use combinations of mode to get exactly what you want, + # and then pass the variations you need. + + ztags="" + zargs="" + local OPTIND + OPTIND=1 + # "_xurtcinsvgzmefdl" === "_cdefgilmnrtsuvxz" + while getopts "_cdefgilmnrtsuvwxz" flag + do + case "x$flag" in + 'xr') ;; + 'xf') ztags="$ztags notfastpath" ;; + 'xg') ztags="$ztags codecgen" ;; + 'xx') ztags="$ztags x" ;; + 'xu') ztags="$ztags unsafe" ;; + 'xv') zargs="$zargs -tv" ;; + 'xz') zargs="$zargs -tr" ;; + 'xm') zargs="$zargs -tm" ;; + 'xl') zargs="$zargs -tl" ;; + 'xw') zargs="$zargs -tx=10" ;; + *) ;; + esac + done + # shift $((OPTIND-1)) + printf '............. TAGS: %s .............\n' "$ztags" + # echo ">>>>>>> TAGS: $ztags" + + OPTIND=1 + while getopts "_cdefgilmnrtsuvwxz" flag + do + case "x$flag" in + 'xt') printf ">>>>>>> REGULAR : "; go test "-tags=$ztags" $zargs ; sleep 2 ;; + 'xc') printf ">>>>>>> CANONICAL : "; go test "-tags=$ztags" $zargs -tc; sleep 2 ;; + 'xi') printf ">>>>>>> I/O : "; go test "-tags=$ztags" $zargs -ti; sleep 2 ;; + 'xn') printf ">>>>>>> NO_SYMBOLS : "; go test "-tags=$ztags" -run=Binc $zargs -tn; sleep 2 ;; + 'xs') printf ">>>>>>> TO_ARRAY : "; go test "-tags=$ztags" $zargs -ts; sleep 2 ;; + 'xe') printf ">>>>>>> INTERN : "; go test "-tags=$ztags" $zargs -te; sleep 2 ;; + 'xd') printf ">>>>>>> INDENT : "; + go test "-tags=$ztags" -run=JsonCodecsTable -td=-1 $zargs; + go test "-tags=$ztags" -run=JsonCodecsTable -td=8 $zargs; + sleep 2 ;; + *) ;; + esac + done + shift $((OPTIND-1)) + + OPTIND=1 +} + +# echo ">>>>>>> RUNNING VARIATIONS OF TESTS" +if [[ "x$@" = "x" || "x$@" = "x-A" ]]; then + # All: r, x, g, gu + _run "-_tcinsed_ml" # regular + _run "-_tcinsed_ml_z" # regular with reset + _run "-w_tcinsed_ml" # regular with max init len + _run "-_tcinsed_ml_f" # regular with no fastpath (notfastpath) + _run "-x_tcinsed_ml" # external + _run "-gx_tcinsed_ml" # codecgen: requires external + _run "-gxu_tcinsed_ml" # codecgen + unsafe +elif [[ "x$@" = "x-Z" ]]; then + # Regular + _run "-_tcinsed_ml" # regular + _run "-_tcinsed_ml_z" # regular with reset +elif [[ "x$@" = "x-F" ]]; then + # regular with notfastpath + _run "-_tcinsed_ml_f" # regular + _run "-_tcinsed_ml_zf" # regular with reset +elif [[ "x$@" = "x-C" ]]; then + # codecgen + _run "-gx_tcinsed_ml" # codecgen: requires external + _run "-gxu_tcinsed_ml" # codecgen + unsafe + _run "-gxuw_tcinsed_ml" # codecgen + unsafe + maxinitlen +elif [[ "x$@" = "x-X" ]]; then + # external + _run "-x_tcinsed_ml" # external +elif [[ "x$@" = "x-h" || "x$@" = "x-?" ]]; then + cat <= 0) + bd = bd | (byte(7-f) << 2) + copy(bs[i:], btmp[f:]) + i = i + (8 - f) + } + if tnsecs != 0 { + bd = bd | 0x40 + bigen.PutUint32(btmp[:4], uint32(tnsecs)) + f := pruneSignExt(btmp[:4], true) + bd = bd | byte(3-f) + copy(bs[i:], btmp[f:4]) + i = i + (4 - f) + } + if l != nil { + bd = bd | 0x20 + // Note that Go Libs do not give access to dst flag. + _, zoneOffset := t.Zone() + //zoneName, zoneOffset := t.Zone() + zoneOffset /= 60 + z := uint16(zoneOffset) + bigen.PutUint16(btmp[:2], z) + // clear dst flags + bs[i] = btmp[0] & 0x3f + bs[i+1] = btmp[1] + i = i + 2 + } + bs[0] = bd + return bs[0:i] +} + +// DecodeTime decodes a []byte into a time.Time. +func decodeTime(bs []byte) (tt time.Time, err error) { + bd := bs[0] + var ( + tsec int64 + tnsec uint32 + tz uint16 + i byte = 1 + i2 byte + n byte + ) + if bd&(1<<7) != 0 { + var btmp [8]byte + n = ((bd >> 2) & 0x7) + 1 + i2 = i + n + copy(btmp[8-n:], bs[i:i2]) + //if first bit of bs[i] is set, then fill btmp[0..8-n] with 0xff (ie sign extend it) + if bs[i]&(1<<7) != 0 { + copy(btmp[0:8-n], bsAll0xff) + //for j,k := byte(0), 8-n; j < k; j++ { btmp[j] = 0xff } + } + i = i2 + tsec = int64(bigen.Uint64(btmp[:])) + } + if bd&(1<<6) != 0 { + var btmp [4]byte + n = (bd & 0x3) + 1 + i2 = i + n + copy(btmp[4-n:], bs[i:i2]) + i = i2 + tnsec = bigen.Uint32(btmp[:]) + } + if bd&(1<<5) == 0 { + tt = time.Unix(tsec, int64(tnsec)).UTC() + return + } + // In stdlib time.Parse, when a date is parsed without a zone name, it uses "" as zone name. + // However, we need name here, so it can be shown when time is printed. + // Zone name is in form: UTC-08:00. + // Note that Go Libs do not give access to dst flag, so we ignore dst bits + + i2 = i + 2 + tz = bigen.Uint16(bs[i:i2]) + i = i2 + // sign extend sign bit into top 2 MSB (which were dst bits): + if tz&(1<<13) == 0 { // positive + tz = tz & 0x3fff //clear 2 MSBs: dst bits + } else { // negative + tz = tz | 0xc000 //set 2 MSBs: dst bits + //tzname[3] = '-' (TODO: verify. this works here) + } + tzint := int16(tz) + if tzint == 0 { + tt = time.Unix(tsec, int64(tnsec)).UTC() + } else { + // For Go Time, do not use a descriptive timezone. + // It's unnecessary, and makes it harder to do a reflect.DeepEqual. + // The Offset already tells what the offset should be, if not on UTC and unknown zone name. + // var zoneName = timeLocUTCName(tzint) + tt = time.Unix(tsec, int64(tnsec)).In(time.FixedZone("", int(tzint)*60)) + } + return +} + +func timeLocUTCName(tzint int16) string { + if tzint == 0 { + return "UTC" + } + var tzname = []byte("UTC+00:00") + //tzname := fmt.Sprintf("UTC%s%02d:%02d", tzsign, tz/60, tz%60) //perf issue using Sprintf. inline below. + //tzhr, tzmin := tz/60, tz%60 //faster if u convert to int first + var tzhr, tzmin int16 + if tzint < 0 { + tzname[3] = '-' // (TODO: verify. this works here) + tzhr, tzmin = -tzint/60, (-tzint)%60 + } else { + tzhr, tzmin = tzint/60, tzint%60 + } + tzname[4] = timeDigits[tzhr/10] + tzname[5] = timeDigits[tzhr%10] + tzname[7] = timeDigits[tzmin/10] + tzname[8] = timeDigits[tzmin%10] + return string(tzname) + //return time.FixedZone(string(tzname), int(tzint)*60) +} diff --git a/vendor/github.com/ugorji/go/codec/xml.go b/vendor/github.com/ugorji/go/codec/xml.go deleted file mode 100644 index 19fc36caf..000000000 --- a/vendor/github.com/ugorji/go/codec/xml.go +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build ignore - -package codec - -import "reflect" - -/* - -A strict Non-validating namespace-aware XML 1.0 parser and (en|de)coder. - -We are attempting this due to perceived issues with encoding/xml: - - Complicated. It tried to do too much, and is not as simple to use as json. - - Due to over-engineering, reflection is over-used AND performance suffers: - java is 6X faster:http://fabsk.eu/blog/category/informatique/dev/golang/ - even PYTHON performs better: http://outgoing.typepad.com/outgoing/2014/07/exploring-golang.html - -codec framework will offer the following benefits - - VASTLY improved performance (when using reflection-mode or codecgen) - - simplicity and consistency: with the rest of the supported formats - - all other benefits of codec framework (streaming, codegeneration, etc) - -codec is not a drop-in replacement for encoding/xml. -It is a replacement, based on the simplicity and performance of codec. -Look at it like JAXB for Go. - -Challenges: - - Need to output XML preamble, with all namespaces at the right location in the output. - - Each "end" block is dynamic, so we need to maintain a context-aware stack - - How to decide when to use an attribute VS an element - - How to handle chardata, attr, comment EXPLICITLY. - - Should it output fragments? - e.g. encoding a bool should just output true OR false, which is not well-formed XML. - -Extend the struct tag. See representative example: - type X struct { - ID uint8 `codec:"http://ugorji.net/x-namespace xid id,omitempty,toarray,attr,cdata"` - // format: [namespace-uri ][namespace-prefix ]local-name, ... - } - -Based on this, we encode - - fields as elements, BUT - encode as attributes if struct tag contains ",attr" and is a scalar (bool, number or string) - - text as entity-escaped text, BUT encode as CDATA if struct tag contains ",cdata". - -To handle namespaces: - - XMLHandle is denoted as being namespace-aware. - Consequently, we WILL use the ns:name pair to encode and decode if defined, else use the plain name. - - *Encoder and *Decoder know whether the Handle "prefers" namespaces. - - add *Encoder.getEncName(*structFieldInfo). - No one calls *structFieldInfo.indexForEncName directly anymore - - OR better yet: indexForEncName is namespace-aware, and helper.go is all namespace-aware - indexForEncName takes a parameter of the form namespace:local-name OR local-name - - add *Decoder.getStructFieldInfo(encName string) // encName here is either like abc, or h1:nsabc - by being a method on *Decoder, or maybe a method on the Handle itself. - No one accesses .encName anymore - - let encode.go and decode.go use these (for consistency) - - only problem exists for gen.go, where we create a big switch on encName. - Now, we also have to add a switch on strings.endsWith(kName, encNsName) - - gen.go will need to have many more methods, and then double-on the 2 switch loops like: - switch k { - case "abc" : x.abc() - case "def" : x.def() - default { - switch { - case !nsAware: panic(...) - case strings.endsWith(":abc"): x.abc() - case strings.endsWith(":def"): x.def() - default: panic(...) - } - } - } - -The structure below accommodates this: - - type typeInfo struct { - sfi []*structFieldInfo // sorted by encName - sfins // sorted by namespace - sfia // sorted, to have those with attributes at the top. Needed to write XML appropriately. - sfip // unsorted - } - type structFieldInfo struct { - encName - nsEncName - ns string - attr bool - cdata bool - } - -indexForEncName is now an internal helper function that takes a sorted array -(one of ti.sfins or ti.sfi). It is only used by *Encoder.getStructFieldInfo(...) - -There will be a separate parser from the builder. -The parser will have a method: next() xmlToken method. It has lookahead support, -so you can pop multiple tokens, make a determination, and push them back in the order popped. -This will be needed to determine whether we are "nakedly" decoding a container or not. -The stack will be implemented using a slice and push/pop happens at the [0] element. - -xmlToken has fields: - - type uint8: 0 | ElementStart | ElementEnd | AttrKey | AttrVal | Text - - value string - - ns string - -SEE: http://www.xml.com/pub/a/98/10/guide0.html?page=3#ENTDECL - -The following are skipped when parsing: - - External Entities (from external file) - - Notation Declaration e.g. - - Entity Declarations & References - - XML Declaration (assume UTF-8) - - XML Directive i.e. - - Other Declarations: Notation, etc. - - Comment - - Processing Instruction - - schema / DTD for validation: - We are not a VALIDATING parser. Validation is done elsewhere. - However, some parts of the DTD internal subset are used (SEE BELOW). - For Attribute List Declarations e.g. - - We considered using the ATTLIST to get "default" value, but not to validate the contents. (VETOED) - -The following XML features are supported - - Namespace - - Element - - Attribute - - cdata - - Unicode escape - -The following DTD (when as an internal sub-set) features are supported: - - Internal Entities e.g. - AND entities for the set: [<>&"'] - - Parameter entities e.g. - - -At decode time, a structure containing the following is kept - - namespace mapping - - default attribute values - - all internal entities (<>&"' and others written in the document) - -When decode starts, it parses XML namespace declarations and creates a map in the -xmlDecDriver. While parsing, that map continuously gets updated. -The only problem happens when a namespace declaration happens on the node that it defines. -e.g. -To handle this, each Element must be fully parsed at a time, -even if it amounts to multiple tokens which are returned one at a time on request. - -xmlns is a special attribute name. - - It is used to define namespaces, including the default - - It is never returned as an AttrKey or AttrVal. - *We may decide later to allow user to use it e.g. you want to parse the xmlns mappings into a field.* - -Number, bool, null, mapKey, etc can all be decoded from any xmlToken. -This accommodates map[int]string for example. - -It should be possible to create a schema from the types, -or vice versa (generate types from schema with appropriate tags). -This is however out-of-scope from this parsing project. - -We should write all namespace information at the first point that it is referenced in the tree, -and use the mapping for all child nodes and attributes. This means that state is maintained -at a point in the tree. This also means that calls to Decode or MustDecode will reset some state. - -When decoding, it is important to keep track of entity references and default attribute values. -It seems these can only be stored in the DTD components. We should honor them when decoding. - -Configuration for XMLHandle will look like this: - - XMLHandle - DefaultNS string - // Encoding: - NS map[string]string // ns URI to key, used for encoding - // Decoding: in case ENTITY declared in external schema or dtd, store info needed here - Entities map[string]string // map of entity rep to character - - -During encode, if a namespace mapping is not defined for a namespace found on a struct, -then we create a mapping for it using nsN (where N is 1..1000000, and doesn't conflict -with any other namespace mapping). - -Note that different fields in a struct can have different namespaces. -However, all fields will default to the namespace on the _struct field (if defined). - -An XML document is a name, a map of attributes and a list of children. -Consequently, we cannot "DecodeNaked" into a map[string]interface{} (for example). -We have to "DecodeNaked" into something that resembles XML data. - -To support DecodeNaked (decode into nil interface{}), we have to define some "supporting" types: - type Name struct { // Preferred. Less allocations due to conversions. - Local string - Space string - } - type Element struct { - Name Name - Attrs map[Name]string - Children []interface{} // each child is either *Element or string - } -Only two "supporting" types are exposed for XML: Name and Element. - -// ------------------ - -We considered 'type Name string' where Name is like "Space Local" (space-separated). -We decided against it, because each creation of a name would lead to -double allocation (first convert []byte to string, then concatenate them into a string). -The benefit is that it is faster to read Attrs from a map. But given that Element is a value -object, we want to eschew methods and have public exposed variables. - -We also considered the following, where xml types were not value objects, and we used -intelligent accessor methods to extract information and for performance. -*** WE DECIDED AGAINST THIS. *** - type Attr struct { - Name Name - Value string - } - // Element is a ValueObject: There are no accessor methods. - // Make element self-contained. - type Element struct { - Name Name - attrsMap map[string]string // where key is "Space Local" - attrs []Attr - childrenT []string - childrenE []Element - childrenI []int // each child is a index into T or E. - } - func (x *Element) child(i) interface{} // returns string or *Element - -// ------------------ - -Per XML spec and our default handling, white space is always treated as -insignificant between elements, except in a text node. The xml:space='preserve' -attribute is ignored. - -**Note: there is no xml: namespace. The xml: attributes were defined before namespaces.** -**So treat them as just "directives" that should be interpreted to mean something**. - -On encoding, we support indenting aka prettifying markup in the same way we support it for json. - -A document or element can only be encoded/decoded from/to a struct. In this mode: - - struct name maps to element name (or tag-info from _struct field) - - fields are mapped to child elements or attributes - -A map is either encoded as attributes on current element, or as a set of child elements. -Maps are encoded as attributes iff their keys and values are primitives (number, bool, string). - -A list is encoded as a set of child elements. - -Primitives (number, bool, string) are encoded as an element, attribute or text -depending on the context. - -Extensions must encode themselves as a text string. - -Encoding is tough, specifically when encoding mappings, because we need to encode -as either attribute or element. To do this, we need to default to encoding as attributes, -and then let Encoder inform the Handle when to start encoding as nodes. -i.e. Encoder does something like: - - h.EncodeMapStart() - h.Encode(), h.Encode(), ... - h.EncodeMapNotAttrSignal() // this is not a bool, because it's a signal - h.Encode(), h.Encode(), ... - h.EncodeEnd() - -Only XMLHandle understands this, and will set itself to start encoding as elements. - -This support extends to maps. For example, if a struct field is a map, and it has -the struct tag signifying it should be attr, then all its fields are encoded as attributes. -e.g. - - type X struct { - M map[string]int `codec:"m,attr"` // encode keys as attributes named - } - -Question: - - if encoding a map, what if map keys have spaces in them??? - Then they cannot be attributes or child elements. Error. - -Options to consider adding later: - - For attribute values, normalize by trimming beginning and ending white space, - and converting every white space sequence to a single space. - - ATTLIST restrictions are enforced. - e.g. default value of xml:space, skipping xml:XYZ style attributes, etc. - - Consider supporting NON-STRICT mode (e.g. to handle HTML parsing). - Some elements e.g. br, hr, etc need not close and should be auto-closed - ... (see http://www.w3.org/TR/html4/loose.dtd) - An expansive set of entities are pre-defined. - - Have easy way to create a HTML parser: - add a HTML() method to XMLHandle, that will set Strict=false, specify AutoClose, - and add HTML Entities to the list. - - Support validating element/attribute XMLName before writing it. - Keep this behind a flag, which is set to false by default (for performance). - type XMLHandle struct { - CheckName bool - } - -Misc: - -ROADMAP (1 weeks): - - build encoder (1 day) - - build decoder (based off xmlParser) (1 day) - - implement xmlParser (2 days). - Look at encoding/xml for inspiration. - - integrate and TEST (1 days) - - write article and post it (1 day) - -// ---------- MORE NOTES FROM 2017-11-30 ------------ - -when parsing -- parse the attributes first -- then parse the nodes - -basically: -- if encoding a field: we use the field name for the wrapper -- if encoding a non-field, then just use the element type name - - map[string]string ==> abcval... or - val... OR - val1val2... <- PREFERED - []string ==> v1v2... - string v1 ==> v1 - bool true ==> true - float 1.0 ==> 1.0 - ... - - F1 map[string]string ==> abcval... OR - val... OR - val... <- PREFERED - F2 []string ==> v1v2... - F3 bool ==> true - ... - -- a scalar is encoded as: - (value) of type T ==> - (value) of field F ==> -- A kv-pair is encoded as: - (key,value) ==> OR - (key,value) of field F ==> OR -- A map or struct is just a list of kv-pairs -- A list is encoded as sequences of same node e.g. - - - value21 - value22 -- we may have to singularize the field name, when entering into xml, - and pluralize them when encoding. -- bi-directional encode->decode->encode is not a MUST. - even encoding/xml cannot decode correctly what was encoded: - - see https://play.golang.org/p/224V_nyhMS - func main() { - fmt.Println("Hello, playground") - v := []interface{}{"hello", 1, true, nil, time.Now()} - s, err := xml.Marshal(v) - fmt.Printf("err: %v, \ns: %s\n", err, s) - var v2 []interface{} - err = xml.Unmarshal(s, &v2) - fmt.Printf("err: %v, \nv2: %v\n", err, v2) - type T struct { - V []interface{} - } - v3 := T{V: v} - s, err = xml.Marshal(v3) - fmt.Printf("err: %v, \ns: %s\n", err, s) - var v4 T - err = xml.Unmarshal(s, &v4) - fmt.Printf("err: %v, \nv4: %v\n", err, v4) - } - Output: - err: , - s: hello1true - err: , - v2: [] - err: , - s: hello1true2009-11-10T23:00:00Z - err: , - v4: {[ ]} -- -*/ - -// ----------- PARSER ------------------- - -type xmlTokenType uint8 - -const ( - _ xmlTokenType = iota << 1 - xmlTokenElemStart - xmlTokenElemEnd - xmlTokenAttrKey - xmlTokenAttrVal - xmlTokenText -) - -type xmlToken struct { - Type xmlTokenType - Value string - Namespace string // blank for AttrVal and Text -} - -type xmlParser struct { - r decReader - toks []xmlToken // list of tokens. - ptr int // ptr into the toks slice - done bool // nothing else to parse. r now returns EOF. -} - -func (x *xmlParser) next() (t *xmlToken) { - // once x.done, or x.ptr == len(x.toks) == 0, then return nil (to signify finish) - if !x.done && len(x.toks) == 0 { - x.nextTag() - } - // parses one element at a time (into possible many tokens) - if x.ptr < len(x.toks) { - t = &(x.toks[x.ptr]) - x.ptr++ - if x.ptr == len(x.toks) { - x.ptr = 0 - x.toks = x.toks[:0] - } - } - return -} - -// nextTag will parses the next element and fill up toks. -// It set done flag if/once EOF is reached. -func (x *xmlParser) nextTag() { - // TODO: implement. -} - -// ----------- ENCODER ------------------- - -type xmlEncDriver struct { - e *Encoder - w encWriter - h *XMLHandle - b [64]byte // scratch - bs []byte // scratch - // s jsonStack - noBuiltInTypes -} - -// ----------- DECODER ------------------- - -type xmlDecDriver struct { - d *Decoder - h *XMLHandle - r decReader // *bytesDecReader decReader - ct valueType // container type. one of unset, array or map. - bstr [8]byte // scratch used for string \UXXX parsing - b [64]byte // scratch - - // wsSkipped bool // whitespace skipped - - // s jsonStack - - noBuiltInTypes -} - -// DecodeNaked will decode into an XMLNode - -// XMLName is a value object representing a namespace-aware NAME -type XMLName struct { - Local string - Space string -} - -// XMLNode represents a "union" of the different types of XML Nodes. -// Only one of fields (Text or *Element) is set. -type XMLNode struct { - Element *Element - Text string -} - -// XMLElement is a value object representing an fully-parsed XML element. -type XMLElement struct { - Name Name - Attrs map[XMLName]string - // Children is a list of child nodes, each being a *XMLElement or string - Children []XMLNode -} - -// ----------- HANDLE ------------------- - -type XMLHandle struct { - BasicHandle - textEncodingType - - DefaultNS string - NS map[string]string // ns URI to key, for encoding - Entities map[string]string // entity representation to string, for encoding. -} - -func (h *XMLHandle) newEncDriver(e *Encoder) encDriver { - return &xmlEncDriver{e: e, w: e.w, h: h} -} - -func (h *XMLHandle) newDecDriver(d *Decoder) decDriver { - // d := xmlDecDriver{r: r.(*bytesDecReader), h: h} - hd := xmlDecDriver{d: d, r: d.r, h: h} - hd.n.bytes = d.b[:] - return &hd -} - -func (h *XMLHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext InterfaceExt) (err error) { - return h.SetExt(rt, tag, &extWrapper{bytesExtFailer{}, ext}) -} - -var _ decDriver = (*xmlDecDriver)(nil) -var _ encDriver = (*xmlEncDriver)(nil) diff --git a/vendor/github.com/xrash/smetrics/.travis.yml b/vendor/github.com/xrash/smetrics/.travis.yml new file mode 100644 index 000000000..ec3a9c0ce --- /dev/null +++ b/vendor/github.com/xrash/smetrics/.travis.yml @@ -0,0 +1,8 @@ +language: go +go: + - 1.x + - 1.6 + - 1.7 + - master +script: + - cd tests && make diff --git a/vendor/github.com/xrash/smetrics/InfCont85.PDF b/vendor/github.com/xrash/smetrics/InfCont85.PDF new file mode 100644 index 0000000000000000000000000000000000000000..87eb4dc57b9d10afd74c44ad4b6e66d9d6964f3b GIT binary patch literal 1989666 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�rmJFaGWB;e>ME4s(9WIZ))Ch|>A=EyF$U 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 =@qO%~ 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

Bi1bL2m}&{6*q}gKj6K=!{gn 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%0D{Q@l1 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 z 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

( zm-(W3rkh?b4X3nJM6eLqE{hQ8@#&L_ew*sxSTM8ZI9Xsofg9AkW+#+Y6>o=c!xIP}o5Y~*F>RA$~S>cs}=@u3Npm#SO z=DfmvR&1y%p}q%@#LB+T$Q)!}NuhnY{-(GNN^yBOFuL^+`j0O|@EfxPQ}u4bQi64P zi)dB7G3)M4UtZ$XL3xK&aH|J=d*xk^r3d$^melK0*}&MWKb8933O+B?s-|GRUOtpW zSAou)9hpkex(I`Q;OSW3A+t+a_YnCz=hs7G=QGk70*2wDJy8n1>%ZBD*eQ>Ak1Rn9 zO|Kk#VVd;tmAHwQ`wF=0e?n8jO}}#EJMATsft??U!*P)tj#|B$#N+Lh6Lm{{k0^T4 zTq`#dGq>j)RV@w7BZ03)h&nvoL!%_3klEt5pUYfp40wVC`jFfc`y3OI&#y{td*8BP zXpZlT0l-;P3a`2klvLKSX>r$Cpe2UF&vuj7ENtedAV-hASp|VUmh<5^!T1$dS&h&rgEYAx*OXMg%mo)8LNv zWo7bGA9YGf1!;=z|x#`_FwHH{jk;jPK>JaGF7Z zzb%nMZjXMMNxwq03I*R6?{odB{61Tzb$aZ{wOBt3E8nz0jM`ZLpynBK=f9+5xahNR zkyG?38GPF;0u9?Ob=FU4Us^zZ%H&2=_As+fV8~Exb>b^c&|ClF_ONx)>2x!N)8<(K zwxo82Nqx27lZ}5l82`lf`#%a&(+Y$hRqwFw?w-lr7Y($;84}*&(elTcc#n^{eEEa0 zq{GF;L9iZ`G_I2ue>q|ptHL4L5?4UDxI8M{96oMd8aD&F4^bhD@+Rs}fx#XST8=Ge_JIxW1LIMb*nd0&E|3S8=s)PkkHgJ$_=;fZYbx3KfPb;J#;4WsaWP}JE&zitEh*~TNCRk z>pzE2DDfH*Z14sN_VoFZXD_qqH~yW<^UG|p-Fn0F?EAht~)_j z>hsvZcKb#X+CD=EPG7nTk)K294=l7fLgXR!Y~)f2mX0om-eNxI5Y;A})nD-nKr%5J zsHBKLU&`1%>18z1HhSFlGKb+BK3!AEj#I}T2y<>#9<0E#7}5|QGgv3`Juvqa=^}u$ z=mpFkPG9YsZF{T52l~!ubUdvF^Zf*h<9z8)`cJ$CE_Vk3{^OUD3%|@`7jp3JKt%@m z;njfRHz&jxZRjbh%tEI$LS=A*OQU$XC?l5M5JlvA70uqDV`mul+LXyPglG8fgt zcKQcH`i;#b3!!1ebemVRUlO)~5_>y=rTUsal-{ztsII(A_{v_ccw5)&d06Tk4AWs{ zVlQ>dej^cjwHBhIUA3YKM=2XUHD=gNr#%%Se(t5nMgyb0pG>t-M74e>jxSB>#olq) zf^-YEwgvvrfxbWPyxUCmgWRuL)@v1mZw&bWdDh7qlt|qy; z(JB^x`LFPX9;+ho&n$RL!TU2i)Mo58hvEpFIvNw*m`Nk{%U>oT2ycL`6-~=Y>M->u zJj%pBzYH9k@+f0{i7Sv;=aqLAja*~p-GRfkQ~`E5AGY>%Oz+(~|Cp-3o41kda_+IV zo3!-Z#lMRN-Ec7^L2IeQkfsuCAaME8w0s?0Zs{|C_jizTjFeL1R+r07bNCi-_UXBB zGSfp{<2UT~Q2xpZx7^>gT5ZS167lCm6$De~${q~6&l|XnxC2b4%LKALc8dH7l42n? z5BR{`yfD7Zk~V1gckyv6Dvjs#pG*KUm=_WzD|Le$IGXXVwec!^_whGjq!DK2>O~k* z&h)V8%NY=?CQZP}IMZfQIm5wH@JrBAS{-E}RlLb-&p;pxC3ROzYtvh&Vl4+)>O~cq zD6L3V$6qbgWE!)u+9@nKnC#f;KM2yVhN8f{FHNc>sG#1I*{$g8txyGFGf$TCdV@dz z>~C*dL`uP_3^2)gZ6p$>#P63uP7LWpQ|EoU|G+>8EMxdt$IPuDUUbTN6Kq~uXS>*L zMelNw??d+ZfRqu?l%jz?F}LUUwazgCI>Fx$ulo-D6{cdhP$B9TnR!>duXhHOYA zt1YL)F(2e%GRa@Ag6gY~z~c9o?1t|fEn?CG?s~tFhlkw1uf-C*nU1oN4NaA}w1UI1 z%T8rc89nMi+q%zNQ|S0kIG7=W2$6j0k9Wr=$FCT(FLs{1GO$me6~U?FDeJUDm0#=A--z0-cs; z49_(~6L?OO54)*aK-m&DCX^N9Os=t*9{<|%;IGH7z+w9`EO9j=c22c~A*09Tm*qTi zaV2H^XG5^4zs^5US94zGI?+4nk4`WZuc(qh`rpTyGo6ZxwZholSqYn|P`%FSx-B4( zn&R;(gRA$KOCpyss0lWw?tUzC+4{z&p6F@qVLy5IdJC{0df@i`&m%~Y20bHyZmLsB zlfIJ($FFa5r{v^jslzpCoLVHVMZqx5FqMuu{IL2(H)BFSMZ45*yztXpCD+UqR=BFg z(1s6kTP7OzVlQk4kikC-%6x$crUolmiQELC09dcctOy#Yje{c&8q9>N0V1xps?7Bl4 zg%)gb3vy`KW z++`41vQnLV!Ct$e2kqr{*}=2)7jyB^BcV=m5eNnu1EJq;$a&b2Sf0wK({MQYCLU}S z&xew*A7J|hbCA=F88_D%El+30B6a}4SlvdN$uj~H%A$a_0ef~m zPw(Z|e}Koo+xet89X=+bV z5h~eUW>s2)2#h9wgWapNu?m~3T-?)kC0^?1<89w)^hTFbf?qiH5hy$4k~>`w(v%HG zkif!?FVSb%&SrY9zb)PNH|Se=js4xG;Yu4q)HeCCvBio^ex2JajLPMOwpAbq^@4HP?BI|uFce{Ba@4{M+m)iWvS?CWyWmOCL<$~;2bbh{Sl2pd|x&=KpXZ>9tq`|uz z?TL^}WW}q;bcICWJyf{;Mt>5*)NRMYW>A-!0v&{Us!b0@XZZ+t3j0INl1e&I_xPQ4 z!p_ni1Dw|Gev|%GoG?Emf8QQQ8%GF#+3=F-7OdhOgn^wl&_xa$tTgT-h(qt=9HSja zrgjx`kveg2F)7YIHEjKB&I20$87W@yQk30UQUg#nOY=l5$5g7jPOOdIDdSn?SGNE` z49fp(TimxXrJ;*;A)&YVGhF@Kg+XE9^PM5F^?V$?LdQ2Yi(3DiT$N8I>M?QqHEf*v zkVYPfoZJV{d=P)nnKI$cGlB<2;CI##Nwbx$f-nu_CbJGEj-9D>SDYfXxNa)g%50mnz#~t>c zljM_l?7v|f?){{V29BAn(`pz!M^=K7V1(i}Nc7S^LbXGJ~j z8&;j+w>Kb;hKZS(7xJ}6ZZuCSlLg7ONm2lE*$HCO7Dhrso=Ee(3(#-ShYc$G^gVcP z;9=_52G1f_6`IVz!`l_o-wKT1y}6NPCfWVX{sAj03W-Au_03BMUkZHT-5Nk1j(-hI1CbaeNN&daEu z_lx=ab0G%(0f!>T=wu#S`JnaHqVWPS4a@zOJCwseZLie-tL|3Vb``(3jaO?3jtFl! ze~e41W$;xg*llHhMX|RWBMwuj7GYKGp1|j;-Fru_xq%Q3myVXT0_AG84s7iTd-bng zbD|}AOuqv&S_Y@QWN*E~K3m0}LV)zI4S_JcNBRhY7%X`%tK?^vzv9jMy{&INe35b& z^ZJm75+8iFIR-!?grD#Ldyt=$mES}0G(4gRq{xrz?cSaLbW?YG4Z#W_U=~xHzSIWa zB^7Zf_-r7z2z>Ez5C>G1MRzk)RcH7MvliHU0qvsRL=<@^qGom(|G-t>DN)ap)Of#u z^AtVZb75C+-BX92ZOBPa?CPL4uy<0l2zKueei$`?aU2hqZRd%AbC^xvfgDtg+|rEF zB6@Sw=XC=NGu!HGc?`ZBoD8(BUXSj<gBXdlfgEtM*;u&6>DiB4aSz73O!MaD#5Y3OAr_WozAfIpnCZk}gxpDC6o!AQ``{(MwXyx?f5%&oV3IXj4)lQ-Ijd#S=LUIuvr+H2H|x$^g{l-7F( z774XHavNE3%N*uTsp*)eO*S?|8B3uV2?-uR>?u@OW$Alb4z3(WO9 z+SFEGtPM=#t9=scc~wNzQl+jXmCfn^Omb1fsvowpn(duJaTlgTLTI#&0A8B5eA#ZFFab!`=cMftmwom@? z+D*QlII|vZdy54T{26(yLt{D~nS|O*11jjTZzLP?iR=p9!Wvsw%U8@YepsO806R17 zw#M+~CIz4#<(?EeVcf{I^0=K{qW5%e$fW;Pd37ngpVOp#TbRfnBL#!~JDX{5QbPFL zevdUM#(Z*(?oVS2CWskqs~bbeezWG2iJ#d3{?-1qw-WVkR55f7IFAmAh?2_!jA-0e zAqB)T(+9<336ciW?ejUT`>I#${t@oB)#1EYf##)B`ukUh6e>OT#%$&_wQ{j$$jkIs zVXM3jiZI?UUsjr>6zvXPHbF7^G2sNc8v1puU|{nQexXRL!GU|wwhepSYfGYjobNBa zmy2+BZv9cAqkF>>!KJiQIPIin=m-qP!~(DwPv)ae^5YMDy1hZ5Y?Z4wY;T_!AZRR7 zTro~Xo7}HRp~=iDK-#EwfZYOy54Z|u@27EuH&T^Kpft4yBc~naArEAf9EYU@jF$T^ z+Glh33M^Pt$7o-G>`}~#<>CI>K+g`udA~fYpIV_)`Q%!|%@G~Md3_DY7X>Up%3Ou_ zM~Z9J%YAy9f^eG@@DT=}^Q4P_hiKbC=34#rZziUjE5!u~w<|n$ zJ64=6T-a7H90gFKRqd_axDunFJ->tCtsOH5Ue#hYz*=*9I9_i#H}EV!PV| z1Ldc~?|*x0%Um-VJ>2!;NUrp$F|J>>OJ&X*Pc!$UfMYTrb2kWfsZN&pZLQ=yZSV{@ ztx-vZtuuU$*`Z#mkJn@(Z1uv93_vE?v<{ikx9?+(Tj#z7y-lw_EPz6wmvKVZKccK28Vyvwy&`K}Wy9`uIfDW0@OXg?KM^T=K5=tj z`YL7AX7!;|mlq}M`>kGgai4)r)Kn#8{_QY#Roa6Tz6%;ovR}2#{$m(}nxPFseGn5P z(oGS2e}OjrS7okds(7_n>m4x=!op|v_+u4IFm6M~&0=TIgYb9+vzgG+Ti54YiR@#V z0@^|h@n;jObc6oQr!t%2xp*9*LU~`mhxMG);m#KDh8iYnog7;r#v2H#eEp;cB-;w+ zaMy%{w8f%Ws&2*zjN=$>oFPi7LbG#;9Uy)$SDTV^R?;=)OMN~=OjRM6RaLlOI`3r2 z>R~%sD$7g}if7S2Dd@4*>LFczK3v6}4I@o@kVZRVKz`;_N7dpn_hh;=`MmNTfq&4{ z30rrnorl^M8FW6(4u3rr@E3()<2iz&4RisHQQUw>ej=4J__cbpLB)9MJb>KEIRqn4 zZ`6U}U&h%^Wu4PKy+5U9KZ$Fu$!M|4fIo)p;Q>O52UQ(2=z{)ZsCvwyqkPwsX>Sq; zRQ$BAj=NSXz0tLx+~@s%2&@pW#DYHh(gndp$=$gy5E=9k=woWvY-U#h4WLE`^9PaA z^Q70{V%T%9XSJVhEacHLnNLallytecwZYo~3vDKN@2(F++BMzU5V3>Fd1Km5%FVSK zvrCvc5b~10R)@lH+&-XKfMr0!ESPc^0;5sP_t6b3gVz%%t;|owV@no^GfaBT3gk~RFblBnn5B0#1R(3 zDqLTR>US(F`pyvaZuXOvD)ydeQ7sIBvlz;(AggG{jrt}G%U98;2u`VtGDweRSNr%t zHhIDilyajP8`f;aNxQ)vFo8+xK#+6)6=u?{DthRT&YM8WkK&>^*$?-J0_?nNrR27} z!S5uG78cx^rSW*xDzAhEk^6k{pN_wY>qYLG+1_#iO{O<+syFD4samMbCN=8?A(0Q3 zeJoC6^MP+da^yF^$hdhnvx}%d7=cjd{25+H{ExYGGZ?hG&T^B!O=h)9s!u~>_Z)Yp z7sk>~@<%uf2bv($V zKS0NYp(_IWuD>%s*!)P?-2`=gHMXko4HwQp3g}nc?yW!{p4G>^k;g`7aoGO6k*n9d zrkxWD$*jitu~002vM;*B z#MXrkflSulBh_>$IMFE@WNt&|SprWV4tM{tp8(%mL1pgcPEv2>G@}EXE z-M#Grr|}@S7m=)5>j?4ZqW*0TVLJgJyUFow&dLb{F2j_TjL15+MZ0Y$2^I&_=*U9h z&AoqIw;@!9(k!i6Gq;ircu+PWxp^_wH*;T1Y4(r#B0RP6ayVGPK8)!14x)~Ml?uWMxZ+GKRg!TcvGoh(S8yoN|$f9rreeoe8wMpk>4@M{>LgHDBkdKjW9 zJeTc8-V~rnZt$IAT)T|h+eXK{nP<4!7*ru)jx?113fg5Q+qnA&D1;g`Y_mJP1>r9* zd6YP#`$^*g_G)|lXI2rvP<$PL32y6$r-6sCN?zVy4QZY!Awa4r^Ls0rB%4N9qJ+9>pJ@YHpL z5%Sz#v*N-Hw*s5#1rh z(EzCEAPqqNd_H#-h?+%k_k*~omfW;PaI=~a1v6_v?<71xzh*ryX{T}r=*eiwnCZTO zEAFWYo4we_XZO}rm`r+F7)VdbzO;*ci z`POep*^xfymo0{e0=8ovsMH-ltgPM9QA1VeRB9L za5_vAeuGii->+&*XC%XX;Czu>V&7uDZp&`{fI-bwHE0skZYsuyj$Gi4$1lv{wZay= zF3s+nHf;dir%M?#C{%GS7D=lQa^PP1-EFjh&pN)pBzO2rVOx$`BmC>q2rgKWK!;U3 zWSf#*dSmS8^<_7m&al3I-O-hc(Iu)r$t6vVV9C7GQ~mIHc}10*M@}EdvAIWt53zx7 zL;npbB>R9DXxSP-aAoaq6~rKdhLAk_PJLUX$arkH4OnBG*qKv4l`0_J$ckERvg}$P zuzeO~)om_QxADWrx&`q%= znw?o`R2f0bT4Li)OCReWcv!RUN~Va6X!in;O@{9>6!t-$gAj{2u4@oGdo5dNbS!KR z-43;h(wi|?O-eiC0sos9ygtqWBdtQI)~m<3{J!Ix`4oZFnacB=-e&klX41NlFyenSEvi*d=j3pfmP9;6$!w)a z!C71YnL+J-_oVnir}yXetwT}F5RF=pN)21%tx|v$Ln$M$c~a`XZh?w|qjZz&_b9lP z@jL10o5Lx&loOtiVJP=K-V|SgfS%cwbf^qa=w3)VNKRo4$pvL*Sh`%zo&&+)9aQF1 zkmJ1YvcH;LJTC_!{m8#d_ed)_Y@n?Nl9jl}$X5Tf%1E{)AU(6_mtc&F^u z2=OL--|DlTO%=pVq5c=AQVDzap<1}AgFa{ufT~awZ(aLw|?oG4|1q>y_C+OWk0K={<6{v zJB)y13$1&d=vQDA30?UHE7?Ti)nue4$-y$ zgDkkcG&2j2MmLkY9hWW?L68mct|5?E6Rtq5w>6?&k2K)=USx~j8la93$M9Q3QS^!% z^ivn)S?){kXr`BTCY-@?_=Tai1;2fU$0(`Mh=B)6>8bI27)*p77MicEoX^N z=<3(yv-pON_#utS+ETj$ws~pySmC&xiOZOsv`mNIR`YfA;(w9+{#mM!$93%Dzh4`0 zY;7$I^8#k-Z>zJBs@5~x%)64CWHCtl_>@b4J@d-66_x{sbx$vdd#50l3yEo~L1U0G zT&vhcW|q0D?eH)q@KXIuyge!}QyDlqMJaXUK0Q~yw|WG;F&v06dh2*cH8e>w;uryb zOoRTHIuy3}W&K5MvMoqGE}C(VVX*n?lCSa$s3DknhU-{QT@W=}eHM%ks>!`tt#Zi| z@4^64I&UfxC_F4Ii*9jD4s+8RNPCPzJG5mAFrKB|X>?yCkeeMGZoL(6gI#=Ij)mPa zsAj6(poGbygUFTjt-IBppSj&?i8ziHii z_duifXCYMU2X}?LPVoqM&D>B2{dwT8|Iz{) zZgptO!;GvPzbh4<`>p*3QN(?Mt$pUNpK5=#K)b9rn5ztWf7kH&R+z7E)wL zx&Ve|h%1PIw;K_-(-1GD4y$}!ZiD}P-P0gOeKoSiJ1=iJ|P`>q4dgm=BSf zkLt zj~tU-`XjrIWUm<(a=#WNK*}KYqfuc!0WPXx1^gKxR*a?GdP*KD+v>#ssvxlFKIIPw z1`xDXx)k1|gmU{^y@Ob2>$q-AIIBymxgz!N75l5ADlW8D&D?w9Fn6^Ae;K6Nt!N3z+S)YcXY)gZDfjpLxFX+T`QvjiJRN68QcFViK|5{RI{b4+=;sLCqm+%7EGHC?~?^q##|Q(goD;1!D$8V&30|@W;nd_ z`fi#><8i-1{+d)h!s#dc4DYVqK^}3a#}^{|N})x2D`>(*0TbQpi%|UCZC^I4&@ZBw z=Q!McDEJ7-S+xNfFgqAAqCj1}FM|Tt>jyz_S~6bVAAcs3X2T{W|2?*HC7wj8O`raa z^X*cKPY>4nSEbk)i<^_5q&nk!k$Zl6SH(Map>cS1H{*5ReLz$nxyp9Z1lZzg`Ck*F z(jUlHE;e3Z3afOp(&_#F6l&bBSSs(k)rZDMn`Wwj*G}!@Fj_nIX$c-1^^;jF8^9h@ zMiBg7?VtKN|A)j7plJzIDkXGwn1yAhAhM2rbaNSFb-ltSN{%~4I zGo_%H83oN`(=Ey#kV`Y}nEs`3=YBd?5#R5o;2n#IQH$zte34uFzrRhzl69`>KAINO z;%YD}WE=@Ze-M`E8nJ{;wG6`~py(eJPN0Q0*GQ{g*gob3@%E{mF~0}r5Y~=*#K3EhDv0OCrA9| zr?%2}J|fz|w+kSjbSsyx%IGLR$UL6*F*~chNA!#PWV4p`Q8dVgAxl>IyPG40hD&t+ zh3WpES-SttwC&Ytp_zkVor34pt|b2dhn3`lLv!da>T9zEnJVHG*7(Mu*355wR4PC| zr&SvH+U=0vbP6v;liF(7L>@;%w7OGzFfH1|Y)$BpvKm8rT*19<#zn}t6+X+lv41c| zfi5j{D^*_b>@>b}WJam0{lgJ1$Vm!$wS<<^IU0Fy*G{g$qcxWWSma0)I7-6+(74CX zs(EjKGySLgO@qs3W4ph&2fp0MoA-R(o(QP3L9o-#0M*95aUzR!G?UIw!dUq7gDtF= zocFK`Z$X@Vb??4{r3sYR=&mHhI6MFZYu}qP{toabfs6>CalZo;twAv^4GaiMovbzV z()m$){#XoL{s^S`tn{pLUeHeO(4u9gsx*u`2BRF$QFJzf*dL5*>}{9aM)54uj>|P;MBQGA4|u%C+4L?9fg4$^EDe^i$^6VF$hnLW zBkn_MiAuw9UqsR{+g5q1hsvw6y`mW4QI>vokOpYIDs3v;9R-T%o(pBUNe zF*UNctDB8_<3}PfSD98l3DhOa@it5!4_8YB4#xHfYUd_Miy_+Jk5bvD>Gm}eoHa-N z`xuHOK+=+zHEY2V^jty!;6P63OQ#0$^&#I2=#KpSJ49QCzT7MFJe*=?3X+`R4!0+} zY<0fe77q|+Jju#jq9)Y7c1)isMD7*qD*PD=Lf-%=tvMCDN`6lb3C`=bT`l*zJ#KFd z9&n~kN0|o35M;I>2dh0WpS%vn>?>jt)0WW{M0K;c(i=5D3^c1qM{kxhZiRGot=)|eyKdL=fhS*|&S z-`+5jJ~v;pI}Xhm9F?^JB9y*M4{sqhoYuhl@ZBhT(f5ktH8R#flAU1)=`GR=x&4Nk zD*5+mRuCZ(ICXGe74ev>-_`<=DckPpwgcU5d%JB>v`2^Unnn^{>KFiouND-2{Xz8hjx`eO+n%n>mdD| zEkJY(IT*D7Vr9a@xH#bD=?qBGZ`DotGH3w5>_l1RCJMKz7NH$-O1Hk)g%E6tc+9`O zehs*=F|5v&V!)#Z^Mk-Fg}lL&xPJzvNCQQ~Zl^zo-Ant=McsmQ>1Pv0w<9MT!y7m6{FA&}I@N|mxq}MJv(cFS!`ZSvn7hcjsMZg~Q27K%558`De+YS6+>9ZTcJevJ+U+(UAz~uc8 zQ;+iG!huH#G6BkO5Z4~&CwdX$c>SKOFYnhj%17|}-H|^Y?~mjKjxbT1K9^4AW<#q( zKQj|1tunjL36p0Yf5^vZjAMI8T>bh5e;+e9D8Xyj~C(OKy)X24*!Ce?OcQKK7^8TKx-Af?Skzc|BS) zZSj|e;P(BpsUXItqJOiy*J*M+_fjJ@n&-~F#nQk@<@})=D!xftze-$NRa*VuKX$Zr zoGP|rY8_wQ1S5P8F|8{EYW4krY&qQ2nvTfL_?-3r?gP3WpaR!3iMf9TMf~lEtv^f1 zW%f&i#q9U}a)~!aQluOYptYmwh&6xK)Yi0fDVI_(!b?A(F#yLbVLLB;!K%q=xIfK5 z&&?2W6O(o}J%dMPwafg;lA_ong_KxHE^sr5=)MH}0-+QOUjqVczbL>*8m4`93UK!a z^J>sgROZ&xfjiO9(j4m1l3RHzQ+J~)SE1{CEPjHl1h?OdyS=~*Qle^Sl^Lkse;ApE zg=g(%mi%8K9)v|8E>3d!KVEvOMMj-9#kETz9WIzx>3D&#S?=&rPS!jrLZ`qt+prB@ zys1L9JZu)P9``)CzxN-9dR!x`4%`vvPJR{czds=Tbt(PbDgZW3P)f2M#%c1---x{bG5a=lDSp{$hMxdw^$Un#c$ANFQk+K;kXa#UxwNPR%$ zvxgCfO%ybvbwDNG6ju0ovH{1^kx#J|5%?-HSY=Z8NgVeLyZwirfP3pQJxIOu^3=rJ z437{ep4j~jR1)~5*fqP4{2TmhL8>l5sT~ivXOO)GW<7i4iTOY7BscKx8Vruo{HiG$ zCK`#Q9`d@;>V6V8?_COX(ITgm}{e7Qj3v0p; z)T~ok`$?vPqM|TKeiz%_B>p){9pf#TOZz7WqtAfP2jmC#%0r8eJ}F5vVb$1`K>krOtkfaqC$Eu5vLHS+kWR6xn~3#-s3h*;b5oXT&u$rb>Z(S+IL{(^a_ z+;p@0jMbmmLxb}hH6p?8#Gbe;_R)>P*DNCSQk1&-trN*h$^o}vv%@kmnErsH8 zhe`~AoNKdK2;-*ncUPYE;C zVpI)TAy`@C7^V%S;{4lKsUlkF9RHc|BmXhvM{ne`{&Zk<)xS5W!t+_}vSKMq4rj-{ zA@SEr=bdZ{>5Q-#Y$Q)j23p&i_(f|wiC`w4)R232-dfP5b?&3I=4p+53&mOP&?R3L zh&D}6Z+i@ZaqB*gM@@bDp3W{kwQ14Iw!rjKKnfVz=ThGLB0zVjMeL0_TyugQ?8C#e zm9fj8<%g`d9u~aJ29|Jy)%95A!TE=wFkWU&x%Y)Yy8HY@&?8G-tn^#{r6+dfP}K69V~v|#r(#Te~QXEdDK`;;9| zJ4hSg^*h5-meW#Iry%!O{MO`Va3PxPA8Tbh%7rzwotMc}I}aL;+HPw|&%-R5OT!M= zj@CB3Aa^GS73C?$#2<}4FP~_fD>l|`kuMLb=k(;u@6x`B)0#25l1gpoV{ZL7-@`|t zQZ0XeSFUrs1O$J&;m9OfJHn#Ok6Kau5}xjiktfL*O9u6dO%u72bQzq|>n)(SGs)BN z*$oG1>;xA7>Jq(MFi?HJp5HGb(T&2OTBuN+a4qeI%sO+3cf+mJdlnCcM4Xzd=JVC4 z0)T9NtXx@EUG~J%tFFVphjc!@ z{n9U(!_OQ{T>C}z$k$jqJ8eI+G^gyXK7#+w1ZXeC`c9_g-Tica{t8>xt|N4^ zZxT?VFvd41bMG2V4d0a>*sC-Mb5?8zZ?SHv{Pt+8Aizn4`u$<=<4ff3ns`jOfEaQTyMz}|m;B>LOb zjc9JW`BU;tyTC85s3TZDGMM5zv&g$ou-}KSajLE@fj}7usT#aBFD*Dv50$}v-IxI@ zn8FOB!tR+Kej~4?)M|wQEvG(}gI)6kTIF~!XMcQ##O;fsqex1_elMrz>sMa zcRw;5+1j{NNu@*o&nde4=o5tbReY8>xy_=0ByyJI8`P z3a(dE6g3tZ`&GN`_N^;xI~*r8KyLvvouGv0uDO9&8apa_D{f^zw;+L_`gI>GlB4a7?4GW7L#5z&vHBh25gW& z>o@o$EwCDVIJLD2$Lq;n2CA=tE~dLm!aBNHsZM`f37Bk`ZX4sD(--gi73);nNomKY z3ajZ;9I=n1eTO`R1cvTkdy6a~Z8lWa_(83{=aa|Wa>{x(m7R_SOX}o4^nLZEua{#P z5e3E~Wh>x82S)FF3@j~ji{{@@ zOsajM-C6FPpMcU|N~a2=3`aPu3b0;Tp_5HT$zDV0mGUGSo;M&8AjC@PQYn4Qjm>D* z*pEZq$O3AhoaU59JQAe_Lp$X#w_JL{=IALs`~f0nsdi3aYdm;{iUVQ=X!c(6z=(wy zesld~XtS#%b!e|coC#uzS5BjSH{4~!!)2?zs(S96{7%ryVvLF@;zJFeSqi=B zr?QI)IA`r-7yWbr{I+YvGuz3?yqsyDA}1otETPW z*Kc)?K}=19yQiD4c$XiY{EP+#K$vVDkuO1cX6A}lzg?JQ zADkC#h(kDiN~1eGvyJ1E7vmW;NCqWL>{s4#ZTp5dNaoywujZ`*__yzV^Jm%qlN*09 zF!Y5ABn|f$EB79#c<0xu!tJ!u)yd?~ujenREgldI#3Ok5N1q3+)95?_F%|_5H_KYOc^Vo9mlIB@Oae zKx$fW8gqWrEaZ^4$R13J*~x9JER9L)aA$OJlOy}_oQIMdPQ~@E(|-N%P$l}W3JII4 z)q=iih3Y`p3^=T#lP+-At{SqpH+_|LBC!1|VHXR)21=q`Y+VQbT4=Ecm~rc;+qVjN z(&hCYO%4!Gd18mm;v$%k9`c4haAfjG^zp9X?JQc_)f?qEcRUUCfXPS?8a0q)!l)~H z?0UiNHz`-Uz(jhZzj60&_MvU+yMn>x!}&&fLoMQVzYP6R1uN~NYa_lDm?*K+FYs}W z^_G0Z{cBX~NRtVSNzP!#_QozV+YBB!N^#rP2aYqCbIDN%FNmnRLV=(s=7}9Yd%6p9 z9}VW&5aK%-G^+2?c>BK`c-N{K9tX4$A=Z*=bW3Z zM*#)X!2-JdS01Y*9ty>O-?t6(w7Gh7_!<(0n-Qjc8e zGupT$yL&r(PXb*3W5X-GR9rfc#m=}7JVtueUIjOM7IkIv zA=wkNEG%4kD4k|Rmhapq$obdeaoXONbk3;XG(CK#MTj7NG!%7`f~GZS6!J0(VUH^i zt)c>R0jK!}?9KtfbkZ}G)_qo-(GdOL?~mnrbqReIp+}s?_-cwDSJ^8Rlj|Cmx}2bF z*gE#OxYXY`{7WboS6D5IvT5s)Uz>*qR1H}lc}G-8!NmRm0G}{;E>7Q615WivX?y(; z5YJ171K>rGU0fKSq!k=Y?85rIoHB(mZ%FbcAWZb}1GG5pt+&3C%}S9klIbe`OKRzY z160bbn-1WC9D81AQo!M&1&GqjDrIu}fd0Z;j0=<~>XK}~V?7aN@jF6aPIDeW-pCCk zMsSPrwLg>M_F{oC29Z~3i+?Cp^!RP;4=rWmk@e0AzOzmG-u$+DulG!{ka4$U-$%{g zd(wAb(=6>N^BPQ-&15v`pYIKdWPrecqs#MEGJ{ieSSlty4t{Y_W6X z>6?}Z{~kKQwj*3R6y}8xuI^F*&1$9M4EFL-fe9aped!LQtIZUjxqyrL$uIn z+Ze={jG8U=a-06WpEa*^&y|r>DL;j^K_xo7EM-=5rtls-#F6M!3pKPhWOMscfvywp zM4KoPNmjIS%#KXemsX?S$i9SqIH%?qSOLxoi&4en%hh4oIgJ}mF4jkr^uQnO-srI1 zYwoQQ+_^EQ3opIXD@}1TGJSu?f&QEO^=;2AKAym7>r~|FET73bK^25|_Ns5lx55PI zo0s2JWS`HsudK5LDwg^t4m&Fg($jjK_S9#-r>iw<2x46FiHyl|_wXN^v36S4UN_$(_`HE(E}JZ<{;hFNsiif#MBS?7Oyw*kwyZ@n->)sHU@O8bJ)o7QzOJzWnm5| z&S%@&4Gw^|x5P9QbXlN^8_kk-y~!@^Thz$vL!jZ|7amvZd@Ju)E_KbWTwjH=Uf~fT z@X`xpGuI3?21p5k9xV9=G(P=3jMk<5F{_$6Wk1i|zySMYG8*S|HGbe0UrchKaUDgDadROX0fmZUWwX=QQ9Xkc`P%r&t^2 z#n>Nrs-dDxA`dCNza+pc_$^C5BKHV4lm6gO^qHILb4!6e(*{EEpsfEpM;;d@kXgb( z@>)Z7EK#HT<_;6;&?1oro38_lhRL{~9vOh;UOnPwinyX|@{%fM-k(H=me*K44{ZPb$c+z~s{^yG=y|+(`Y4subN_}1i|r>_Xy&~f`QQq#W;+gvg(uWxOW1r3`_+QtEy&z zjQX4QId0GxB~c5N|B1K8p1a9|{brxD)fZ#$<+bbkk~9+mRL}^lQ875*_n^c;6nT^> z{9)W?wza9O(z9VwQpSsEcH;e%r>}zB=4haP)pyQoXjdeDAMmnFD(O|%Vq4}r1Ncl> zTZBC`D-V{N#OR(Y&>Xg13iBl52Ui7n34*@4uHl3swYSPCB9%^g4OlzacVnnAk5P6c z+8y|zHF2a`#0wCX{C$*R|9rh4#WhY?hP8SES#H%hVbdV4q&qTj3+f#&pMFNcqmVk^ zCQJN;QrS$kQ+U1b6vA$|rmbyd2e#R81fI<9oW!!yHyf!>8D@6Fd@b#ixGh|Dqh6=` zkpm%edk27GmSva)`8WDx-d)5zHLe5z@KZ1+$;zfRR+o}LKJc?=?tGmYX|*KZyIz#W+_`C*_)$P)m1!c~VGSf8FuT6T^B*(De#g;%TT>X) zjh;UY8W`L>m0jEd;#wYOiH+7j9(2|~i4L3hA!7yt1GCeHgNgIZU!Fy~mfLT80iKX- z*C`h!PNg*%{bG;kV)@p2$26Il%18ADDb?8Lb#JC)VpUmzlgQZX3GqY3@{YXkyEDZc z0(1x47WWdzj=PV|U^CvVX*-@D3Q z2)vM{xBAKl&9G5h8C8(~C$*L>s^l}3`4{N+-#NGc5v2P+=IH)o2lIdTM>5SDALv!L z2nZLhwwelFfMn<6*P{gO$L9L(%~Oj2zFU3}km%_w`6~L}XijThhO46eot<*E1AB>k z4c?3by}Us&zve5jPPC8?F|58h%iO2Y`?axO3hBnwK4m%~w$=;qYP*PTf5D7oXH`kz zrC`_Ln-l5xWv9Lx%sYohg)y<34=i~F_A_04SCU~ztlp3E-9T%!#yw6CcAlVxpp-tf z?wmP2z#Nh4E(uO~XrP#ZGf4SIe9r3`{d&VYJlR+2_pbkb*Hbfvif^m=Xvf~@^uGAR z;;#I)nn1pLm+PFOjXcJTdIv#y+pivKaiaJgJ9X zqS7FZ?9qj%wEr}?RSb}oReXn)xfv3pRtdC#*~6!PqCL1rQ_2n*Htb(0ocq_FW#p-( zP-np5i?;c+#MZ#nayZiS@LQQG%oIsM!{%LsjY zbzT|Pd;b285StWztz&Y+r3bBnPMBZ|=(KEedv^;-nU3y2fq?fjL%m}4<$oL8IyaPl zQ~8H1ZMyM-Sab&(Gx6^|LNVB0?e1yb<kx4Ytp}7zul;HB!U}Ep*h=;EX_+u1StP+OpR{Vcx=ODV!sgkEKvX+*bxh39hPo-aMpFGtYR+#y@0hV_5jSpNf!zvJ?+O^%>a=8M8aaj!MJcaEHuEhzUMBuMu1_pIW!Ftkglc z;h!b`7S&joat_}Kw1!UMvd3$g@7}3_+%m`p#cCfy^aYrOf%GMfaBZhDX@+qGXXhvS z0fNfMIOo#lcpa_O`>mXB?;wC>@o25qcuury>xePtrj+vcb`!o`vmfIShZR!k@l}z; zg#PixUvzeE{w5RjIBMnLg`0t&y1PT}Ck^|yM^a#sx`Z}N2<7LCJd^?e+X4YOY6xZ2Dx)lKJN z0QHOmM{PW>+@IgpVYP3_)ekWg)cJdm&a@Ys*7HU^`aeNDy{o(M?gB%t(GDO-u}OYz zW(V$qgJ$c4GVk4Z_Z8tzQS}9L=Q{3CWqnosOlA-w9y=l14xM!A``O6-0UT~~*5W22 zt9g%@GEu1yJC;%^U7UUwm8EHBho}O=aHZRe#7SEfHca=jg|0hMN*|~U_F-^9^M$+kRN4F7cN-tFn5xxgA4UmyDX9|Jq9@7 zMvILO%xW!eldoNq7+Aqo6`Ay#b_qHOr65~zFUA>=k_+1V!TF5Jw+ToHod;g_^c`B@ zDix?K>JrWDi(W$OZ%jd*VFrher~yR1>Vk2%>g0LmbMvSVSaxSW{F*A1sDzRN64Nsj z^Jjx|a_|PW#bta14*AMPi02(<&djTeWo&&FuIwCB2~sN^8Bhf%P_ecOShiGGLRzy@T^DVDJRp z>1ldzBn2=ZP2v9b%U^=hY>_T{saG(0_GeduDxb>n@2kFR4ioSA&N_l{wPC{$y#1CZ zrQ2&?`+YkU{iNoA@SByI`)xgxA*#4ocl;EWBrX0iK($|`T+KrtY1ps!J<=W@HMoH< z83fYB7`eF|=SNWL7*noo)%NgX;r^hx0b4l*ngG}9TXizemernm4B}-K8u@ym=KRF- zFwg!IUqfK^9*RQ_^5-5oywsIW9a~zhK`h{Hz$rr47|;Dl!pivaseYk#uByu3v8sTE zN!?>{lDQ^22VpdSw8u-aSk1jNY<)%lU1)$K>GipBup)k zOS<`YPh1?pnv;7i;a=WdKRDrW#D{5NOWoTmgg&HY0^D}b;x*+tuUk2HodHEK&pUVj z$pEjQy7@yyTLG8dLQedhWdmtZ8RPQ-xXr57a#QF~qrWZd<#~quO?;1gzhjC#2=?ZY z1+Q7_eQAzX1|(KIve2HVlV3Dj?MAday=cljAgSri8mEtvHlx{pj89_%E_(GXyBUrM z7?xLnDt&6_gT5|t2H6;_B6l!_D-r(QZm&rl&b9$T|Ixn&+T#sh7605{Awaw<0vTyO zdcC=#nysAA24@Wu>y4GQ39~vHrKWIXs4ZkIuTrP?(f@`EwUZ}g+2ZON3}!EBwvmyZ z6-Pi+`q(^Blb1!MeRo$_QvHr!lV2kR29|59ej<7XoW*PyD~vyR=s%h%{Z(7OtHyRU zCZrbHL(sy$rL$E~$~73#E>PgL0kYtITukRXrO9yyto*<0bzj#shswNU`*ZAE+7+lk zE>3?b#X|JxojVAiz3$b&-_M{iX@Y|~Xz9bhpH0W!oQ~|UjY(BkES|H&j;bV!1zjk> z$al8*hm>r(Kk-P9O)f^DDb@p3jl_IUgM%Xfg-0)-6K&amzubOQJU+E~&Xrlk-KF0l zyF1~^)r(F#^~sfDY8aGzRNn?0R$}64R)j=f7E-OV{`(R(J7 z_wb;7U%=D4v<*fAP#U$QJ4k+(;4Q>+d_q+i(~7;5!)|$i9dv_t8DBjuh%Swc%$! zqJ(x*Bt?RMyy@$dULf#^ZB&%T5aP_ek(&C4pu-I#YDsT~hPfHGtFeS$mq9yAuQbo< zNVvAN<1>6r;V7;)kFcYP6%o;{K6N^%a^SOoyX*kiTNvrA!wHnPT|DxgWG~j^7;4n@825?TC}TV zKlibZZRf}SVs!W{ckXB58Tr^T;StX1e}=pra%-*#VeDT%$~ZLY5ix=<0Wj5x$=}B> zp|8V}(cn4&rOk>D3St83zCU1M2_jB8%Ckl`AEl!5yPbKc zMPy@6*)K<~KKga3D%#8R{<$B*q~N;=gpsXdNzm%W-d(5z!530q;qf=sJCk(rPo=nr zTvK`q3xZP-Y*od1^6vhUZ&0g@Vb(d@6#s$bvX>TlhiAkSG|HXYoju=!v7efjrb@Wk z0Z@iModGeX@&HL)_2gQ3J+e%SerNv@-g-Wskr=$dm=_TQ&=-xG*LBci3+?e$OK{SX z!&kYwpf&7MPM+;EXEVt9r+0=YH{aB0c^#exPB?=9^K}E!p~85)-W12b9fJb!c?S<9 zxo(Wl#C0E0X>?@%6lT@N;2n-Hk>v)IVk579fMDDvz>T+AMKd*57^e>}^bGLD?)NMf z?7UDzaRLnLi;NE! zVRkp}R@CvKa(OzdqgA0Y zQdh;Ki8(v?(Wk`svUp6o-?^tSX!uXD21XC1275ryf0unCg2TRfETWa^NaVjwM!yg^ z(}|eu5~%j%?{_4C#u#xPeXaTJnQ;&ZqP7|kG!RA{ zoBp&K+u4`34C4|>=IwDh?JqlA)U){-Iox?u*uiEjx>bB-n!T}8jSJoYkR`|J8(Fpa zDuDOHLO!&zMNS-@#`0Y55P7A)*Zlf(l_@{#OWs@$#db+zCKVFx5wH1iH`oeG83Q$s zsg5uNO%ci%rhSlG343qqzuy`4nw!hP20Ghr-oeP=6=tC{Ijm7=ith$&`SbwQEKxlp z^Iclh+?30z+phdRif*@JYE#zR~^qnHK5OPiEO-73Epuh}+m9mGfV1GKCI!wwIp z(!g=>Ix@b%O5jnPfjI9w1KU#rcZtR-Q<~6+!>nC0@Y#zkjq00GvD8kQi+NqMKbMUy zTidD&sA3Va0?$x|Bczl)OG@ELy>Gj9u7Aaz9Q!D+U)M=-{_XB~X0NOAfPfzR?{hS73<=yRT;pvc7GFct%QDqjyD!gt zpR)!=a@c$*U}tF8?G4+#R#dywP0f+s1NSKCp4WBY!1z!7^Hu{lDKJ7Ny={Q~p>Poz zvmET=7C9p8o!*noZJCTyEf%FwdTPb1Q01;L+Z6Y zLa?$ricT6?sRAP#`ebYFQ-hVJxdt#6sm;lrH6UNv;S1?M>E_9Xz}x&-mOl~`oQloK zyklnddd<#QW#asygqeSEQjKQ5NWI+fm~BbvV-pzLwO~4Ejl}meLWVHN-)FS%t4bL9 zxC`Co=kE_B;xIK~Y6AOI!#k~ILs_Nrhl`tpCcHtU=)Ll#GLy;X@}-9iXAML|V|@y~ zp7AXQj;(vq?vS3Y_ObIeJ;#(H6sWQuRhfc#ub9%kP`>^;vtD|(u-eiJY6Dns#23#V zQa^5=d&zUEJ0}&rDxh*yg29cd0WYTA`E?IHT#VcKFZag~xyh}iTOvl8-PJY$avYtovwBnR8NB2 zj;C@?F>@+uYPMEJR!2Ki_oXGpndMu01ncpOeY>a9-I24(Es4=CTcKb3Elh~GVI}Sr z+|8jb;B(lpBdGx<>mx< zP=I~f%w~5v=u|e^Z(o}hCaX%aQ7>gV1J%X|2ciYv13hX*ZF{NX{TBzXP*A&eq}(Pb ztrw1=)+sN!<>F5gWml4U!_alS_fp`a{Q?~%lx z`|#Jh;2^w}j7IXU?Vzm+pUb{#1n~TPp5g=a$=ds4uA+3A)M$C&M9)OGSP!ur`;u;! zBSxvmG%X0F4(A=AHv)U$)RTq-4W>NY+$uYiib)gdZulvso#nfqo;hs*Z|FnzFyka7 z#}$pcrKNs3J9CJRu+hu#(qi%>q2Kn*Vovq5oF8MV=o$RICYvEVBX{{?%i7>^Wb3Os z7Ay$#`=|JV?_4#93AO#=tu5s|sTZsjuDV=)9uKdL99XB0W~ruKMHOyQeTiLBV%dra zPE3SPTAD6>@CX5+ zKfRAhGuskg1MU~pR(oX_9H<_U@gfq|ui!iZNTNx>W2^PSD%&6I(9?1a5vqwp8z zxb`f+DNuA6M!8uP&^JMtdTH5P`|?Gd)SPMO&eph3rSLR}8lm>N+n3u-`rH^_AV%&C zH;WvMeAn0L4s9=K_C&AmdXTgl6>ADOAd3YhhaQ;_vvUP)iczYIYHu$Xp z3ZACBhEq*O1msI&0yh|s@F%xl(Yj*cB^}(f#?Icv*Yf+?&@8}}^AJVGfmfxd^gge*_l zfCu&AL0|d4h`eA@e}IMiboEeV>J6e~sBy>I_qW<#hFL(fYa#H(T}s)gmR(#=9MR~Y zgACtT`?}}gRJHSJpB&`X|Kv7*Qe>f%4O?rlqotcrovM^nLP$6NY8OSl$ZMW2wUv-| zp*NPe`9SW?Y?lHAWTL*P;66hh$+U&J<;&taE@j(8`Ym05aCYA8wAotETz6uvtdBG| zx<-V~I{t9xGI%(UAHC0x&^MR1Zp4HB9$|@Edf~xqGM~)oQigsjc1-jJ{OD6|)-W(b z92@ZMJ=Oo|pAIt1K35#*C*P!TurBT$Mt`O3MHQjCMW=a~eqQTz5VSIroTfa;cSU6N zNh;x)RJsj}`&*_$5L%5~R|=)Ul7!TaNA_Dj@U&+YJWQFU+A*ze}ONTT*a*U+08OoeSQbul#;xz9r}p4~;bvZL;t0qRn)@ zjK}}vwiKo9uIBa(p7G04g6(kSQd$x`wqqHmd(!X%qRh&4rUh#<_Ek@ zLL5^FDWdYM@V1>N3p8MOXV!(`^5CN&h3N|q$#=3QjE^a{P&1=~eBV}0H}!-{>?_&s zv0WhR!x3E`|7kkYo!pbOgRI+WKc^G|@>TvD2v-Hs**4=W+8nOmI=w{;#WQ@TP z+l{VeylMZ=M`B{OtUV$Uf(a@vu_TeH7ujXb-ChgCfeq_9fAfo_*vNTF^c7K1U+dQ8jhN1kjj*Y4^G+2ge%Mn;K!nP-w4K=EK6w%l!lR?$3TXX}3M7`D#6P{4Y4h|D9a$!fx`9QTLyq!9182 z$_iU`ZzV{+T|qb*j5B=g4i}R{qg=#(+4ZGdoPrgV8LE|Z|6n3f?(%MX?fT7Iq0qvt z_TB9{g?_?-Jnp2z{RN+C+KIGOU5ES$>wi=rHxg|?>4#fz={8c(hZ&tjWUtAUp4)D4 z0eCTnM00Guf1+LjM9ZbH|K&sbT9{TwPI^XILTQ$P&Bp~+$Wp0~zJBB7xiCtn_T3V) z&V8Q+snJk?K=qd--@P&ud%0=Lv#Gojjb<|;Q)tv!+vCP(BV~Z#d`h4UrSGKQ#HeK|XrS;DWpJUvq@dW?2x%DZ_8=FpkbGci(sy{6&PeE63%eLTzg! za56|m*ZMp>cT#Gt5Z_sHC5Z5e8AXudKGdsBEl1d*V@hXhKusjjNO$`9Yi3=DIX*_! z_sQmUF1G9vh$@U-syc`~+bF%@;Yd_F6@Hg1FQ#9$ zmA-stvbsU=P|@nTM+oXY?acdtm4jVMYn?$8op9Es+T7di1&q}y`9fpFV zM|6S}*KhndZhdUdRHNdh)epADSO*L#KP`=y?^f%%IdQScLE65@&u5~y26c0wBTmO% zaZp*#9g@HGuN{3W&kV(RRN-wz&o5Aa zk6y@7X?jC~`*f%5^#{*}tTY&5zn?rDJ$`Zo7XV49W`dfj2!;7GZWog6hoUi%@Zmbq z3GKbQ?WZURcmnUQVJ+yOR==;A69_LWdjK^C#lOj3$v~;02xHV2Gk2#PtYa?6%2AXD zsZRHL0NUO;fgT5x(~$VO@)jPcGaL}G62|#DIu3^kCpm$I?g?RsZ)v_gM%HoWU}-({ zP>7e@|0xsK698h{3W`J24`j1~*k%ubLfp93$~Nb^@q+9_{~nZ3`5f)@se`iK|Ej{| zx5uDuH|DrxJ}g;Ar`)`5nOP2EW_1*CTG9vbyQ%hgGQbWC42axMZbWtZTvrfRit}4Z zAH3Q)!X@W;92zU(Qx6pe%+aY&eNO7Nm1o!82!SW0oq<$G@y^~Gxli{SSV9Xj3J;ix zYK5@=SJ`xpD+jC3?h&-jf?&<$^%|I|^AyqXd9U0Bz#J?Hl#c^}-_sV4+VgHa38%pjcIc{)vE5W%;-J@OyIIn2J`BhV1vtT zdukc;qM4%2_vi+W*0_YRjq7+~4is4&y@}?s{eJ8gbX`_`WeU8#S;wPRa~FnL=;df_}RJZ6>|cuj~t^!sqY(x`q8@qZ0X>HvIZ=4Qg`Ma1OV$s>GjGG2iXwS%2qlN{cl!&HpKdT68YHweK?yvP8>K{HW z6nE*p%SO{#JlE?(L}I$=mA-f6*Wa_599HHB8&`OMOrO+614KK8`imt>PIIQUhDy8E z4g@2i=1?3SflB>O-s^dWgl^fd`jn=->|O)M(y{$+K@kx~9h;9uiQn}|DfSO=Q3;{1 zUAJbwWQ#s*w7%8~NG%|F`RKswlU_K&9kQP%oS3)m=Me1K;q%N*DrcDez=8f!Un{(#2vmve%~n`O&eIA-#W788qL|Kk|qDHTT`2@?T2KM z!0Rnvo-NbpIOsIPjre)S(yEhR8S?n0>wGUo=Q!QN)@S>GISq4%Go$0d>yJ|IkW$9*dCT_}dqNEqDKJDr&jfE4C-8Q&KeJ%3nF2gTww(OvL69 z<>~9VHzGQn()MV;@)?E~{P^!*wv^$xY{%qr%`re&JZ4IbdFPLJgXsrYeE#hjWhA|x zlstdsV#-s)pnhDG`F6t$Mx ziOKRCX>oY7TjT&#^0ayMrrd-p4nfOSzN)}Y!{u9NJji0K(szU$*89>spi@1sQ4*9U z@#8xzQ8Wclu^UnN&WP3DC9z6(di?TMm8f>N`25{EFxKk#+l7x>07!t>1>K?y8~@)9 zWQJN+hU-W~0B<_!g1tGlu2-n+55^Pi41GONf!ZLGSm03qS*O>|4<;WGJ+ z2c=P&xr&U|SWM(Sy)9^wOdB+01)|M?Fjh6R6$q z_8;ba^8iW#&+k_?Nx{Kx58LJ^hbMX?+Tm#7qa4c)dx}Sx+<@oVZP4I}y^Y8!1gcs3 zH+EH`JNVrVNS+6c!x#uxQVE9CeZJVM&~yeCc$re`9Xb8Mm{~}Lq!ePHNZ!^h>TI_V z0Ofw`T_YucoHFPwlSR64X4x5h{!A|^6{y0o|8AWN?^>2u`B6H}O3>88R{!j^qaAw5 z1vkaNA=7hq@&VD`Z1i4y+z%97nN2OO)SL3MxE{n$y?5%npFuRCW*>L3DQw=&ufh)D zC!GqzYrB(%qgm~T9P!oecdfd8cUc2R&R#20RBAwq6Jfi+-8{NKmByr8P44~e$pv`h zH0`IF000(@eUZIJ$JN<-(GPXpnO^LgRVqBK$_6=7@En$6{! ziAV^NU#oyp(aHNkUpx=NqWy%!p_bhr(;)qm`kl+_=8{TzQvR4EB<$Rt^{+s7Ix`C9 ze}541-?5=hFu5P}f8&luTxGj}nR6Y_77<8XqZS-1wA8`p3NDpwp$>jG4`e55%y zT9M108nVmmChF;>bQ|l(>%=ZC-s4z;buV!=zRUe>kp!@rgJejPp)p_1E_Hj@o$Nh^k=x`cQg996Pk=}!Rh`JTz`!>Mxi zg9>{n_E2;{oY#oJG*|_sJ(>G-9mW;QZSJshD2amA{9Mpp^y?@@*Q(0!SJ?GX!bpf0 znk&YHOC{xSAkeSA1{w*y8SI{KRrvSqPg`Xo^~dyTdG})4T=yXDy7YxrEsK?WfLBO7 z0L5_kFSVSL;p2BYwTW(102=Tr#$O@PU5C!`T;dHbi^MgVHyY7Io4FJ6OaVS6e56(? zal%^uh37vR4DuogShicfRlHCweYLDM>iJCW?G9U;mWOe@;JiT=zoE>!lLbR=#7+*p ze}1-EITtI36ZBA+QwnkQ|GX%#Z z-)p~MwpBUICq0FZD%&~q!oMZ>9(*lRGO1xr`AqMYUS4eBMnFO^c%@ zQhQO=>GabKSG^c3sqIPV@wbwd##E-m+qr2wdwuk7w~FvP@;u)azu8Qy{vCI(-LF83 zUlv90G-)89bL&3@sklMkEf?mU@Q>@m_}iVl&-YEbv7K1A91ygxF96ybduKrv#fE07 z9crIFl>PED1HJE8`p_JG?LV7-48Up_3!is!dDT1TPme0YoYcbJdahq5WdPx_<{giWqu=X1 z;OnFhlOwI`Q!o86VLCUfry%-dHV3_?f~=3N%WPT*8oxS!BF(>t$t$g;iFCDG5Z0RvnVklB})_Wz>p&DK>_ z*DcL+u3~~<0ZJi?VvPk>C@2aFR;Y-Ah-GBNNnU$?_A%C+bFIC0H;jl2kN3uM=Pf}IynbS`24)t8J{4oH8G81$S$0q9@)`>mYA z_~kF+@=vb@9NHGd*AMcAslM8se@mXT!~8#QSO4^`L$L2{l;^*8d_7ls{LR3!ZE=0P z*7oGzefGWd6pKo6|;6Z6jO!)@M14(;+O-z^ujZB^qkZR~g%oNesvbImSk zz0t5kCd|h6naxkpG5Ac3qC0K3w;F=x$oLYqhg32@S<|a>?|QL|MVNsMpVKyV=LBFv z&JXET5)7O&)n2r1-DStRr4|MpVIQP?{MhMx2o=;!QlEYz(Ykl7Y?5oIGvsap?7(ZS zFni!n0E@W(%UFr5HCd$SXAe#(d#hZ^6BWcXj{jw@Xh@Hq6}G{!14@Ia3*tA|*lfX= zsvIm>Ep)+ZfKl_ty58wh9joatLBj>|_CjtQOBlZ1!U0i?m7FQER5+Ny>=hV(hz07S z-AbjqFhx{gOMtBq^79kboE{*~!+Z$O$EN?%prb=IRmxxxuAP`alwms z(kLYj^^V4xKLamnE{4n)NpMV*l+Lv#4NK&11(=NHS={GNCM*M`CS{~D-7B45yW(z{ zdrzKrW^%hcXeD$*?3V9U9_-j3WJTl>Wr?8L$X923%WmeWmT|9yTzYTk%e8S5B#tCX zRswgS?W_)o>rU>v8@;3?CW?Hoa=Wj16pCwIq&x`UT2Z?ZHA@@CSgAS6WMQDK_NSks z(MQpe)E6O=xiK7EPS(#Pd~n3cV4{vldn?x*&{g`Cmn+knB!#bA!5Msbki z*ngtfdw+E;rNAF1f4M7u_bq=-e=?^S^a4M|H-`OgjNE^Equ3VmjDP$XGcDsk%TDXl z{|9X_v%LTFiD0vXBXK_liJxiM;TEC;TKd&vjq~U^QSA*fjU()w%hOkD-EXBq`VZ0a zNz%?_nh%RIV$qK7k@kK z-;Vm7iRN!3YiKC@&hBrXL`PZ&e?KbRitkL6VPV$JwEy`I-;S|WA@#3E^_F`0YkvEy zoBt+^evgX$%VGapNB#8>e6Q<2JvZMm>DSW;xl;e(cInpUuRHvYq=928JsFBe0-?biI6Z}1d(^z*aGph9{BlY$ln(# z=Y)odCHsOVyphBG^F{o3*YN+YA@1$?dOuw!{QeZ}eT2{b!T$06LCmuP`{!@-zkge) zAk6H4-Q7PJ&GB4>8M()c(~SP-A2$2}`$t|B{s5uWA8Q0&f4aB#AB6(^dWtYp_Z5Af z2lw^I_Yezp??Xuue*ObeaK%4({`*&d)N1g)XLQirHyn`B+Vb~h_@E{n@%v&cy1n73 zFL;#~e%|u)`+uDK_gCL@{~lIxZ{GV1XY@Vl@9+5do*>N$Ec^2{+3&g1BK$X-{ez|1 zpMQV-a0q{$Ts!(>@^3EG_ly1duzy^V-`@&hbYO`6T%@0qN0_k_!WHX>9E&jW<@$D? z->)a>t$x3lhuUg%gqK^b{%j^Y|MU0%;S!pcBYXo+$P0fkAk^^A??19Ud~c?CdA~IG z*^0t@bo*Xq?t5vj(Nn)W2RKyQ{U4Wu+kHC!3;D-&;EUhOg}_VSPlKBielOzfbG`oD zgdx28J;W!xy?%eeH3$q@gSh^3(fJ07+%u;UyQJmudnQsRJdI%+|LRF;ZqT2`8 z(HfuMhVuTI@!IGFG-#SFe2Slm-pWHdeFNjt6gzXuaS4)Z2hHO30<-~2k%vHB-;fD-6<%J}mHDBL{Fb87v}=_Gr(m7qy=1wgYULmhtHts>;fO=6Hw(0Jn_L}dyl zG05!F4LX#ThB`e#uFhC*2(iIW@(%kYb^4BuBNN0uT%lx3VVX5rsk2r4@}%4nuulsX z8|i%Mwo1(qGh6TWPT1+3#cdTtT}yI%uuAxDG`tTizv6$y)HUax6m5RmEfTNRQ%`X5 z>R@Ur&%dvJ=IKkh_jUM`fkZx)nBei6fHI#E>mA~yPpg;C` zyEd+z2yT|k^S62b5VQM(%#8QN-ZI^Ogqh< z=+6D(4idAMF=k@RWrWY@ie0~t+0HOXXCB*-unTyhHul}jsupv@Yr2qG`(Ty`!4Gi7 zNhG$|0qk~~shFUeIP>R!^~)uu0p&DRPtBi3}o0oF>y%$ttcqGb2lBp37ktf9Esdbw8a34TQzE%Ub0 zsnR1!J_bN};-3XBtG?R=gKkEN79a@ka^6Nt*Sj_X%j6r)Ea*91%kAC{Bt9e`>!*^H0-WlR zt0Gj_QG@^th^@-_G(*#S;Vsv;!M#7})8jV8`^@Fc6UHlQ=Fk8?l6iBb%ricbm@1skjgUnMU18GM0G9#r*O#L3tOo7u>$_srbyo0 zp6cc@5tV0tNV%!QE=or2(|n6{`yEo~DC-az&5OyzNML>43|HkNvnp76F_#dlDI<=x zha7}?PuH2KX=DdA$hBLpHH+`fgX2D>6xU8^S67bRQxhS$CVQH$mwa>JB||Oks2QiJ zok~5MnDZQjcAoikJjp)_DMmevDq6aOSs52RRz$9CIyEg$ znqxElxpK$KxKPg}4)G+hQVFuWz+J6aX{hI1+*mw^<2FPV7sBcFlA(zGeYDDywV__+ z76{G7-gfn!4Y>mrZE0F5nJ1{KeCn;qxYBElFt(rYThCXzynhxlM*BT0o`|I9THT%4 z>>aN+*bfSaFf(IkMNl5qlC_$DkDFaRLlw^JMqb1V$@NaD)J8El{QI;Z}6W`iRr1oiF{* zWxoQ&XSo8Z^N|7BGaL?KM9oRx{fy$E3D8!@&U_hMC8AA>yXhPPsXFRYaMI;Dl#@D5 zWI;rcCOymcAPkFiIoYhGX0kMEMf1Znr?OX68SgsE5|vmb$ba=lV`XIwv|N$xvxj53 z*}onimo?HU-&+!CLjnk-d@=lh9H#2-xjWci4EJ~?u}uCj6fNrsBZ@{weM*p(SzIv7 z^*S`Rt-i6!MA{FK8b}Q)l9umhnkq3X=Wo`u2SLFieO=MFVU1<4}#St&tjELR>=9DvV+bJul&h4k!=!H&$AUiZbh_z7b% zznT3cw};N`gjPq85a?x6IM)0yb#c&W<>bg2B-CCD3 zwvJc!n{)NBW>qR@Ok-B-oWn(8)ab?UbnBh2c0e&XN;-2p;qJ0v_uj9v!1tin*IG+2 zQ-zMTk*CEnIP`|O@q+Tu%@>orI%PFirF*RoyKVOGLwT-2D7F&w9HF85J%k^%v;!7* z1aQ4*Yo6EJXB=3|Z5O(-!brp0e#%}evNEm6QZ5O(RC{CXPwgYS%6-7)81`Wj)D4hQ zF1Qz~Y1nG)JWE9TsMKm3#Sa+P#Y&eBbnaj#z~-pNZ=4$^ui8ZeznGNc)XnCRbpRxn z>F8iSUW?=h&^l8b|OdQc)g!e0$+qe2%k$tZhqb zZxwuMT}bU*#D{v8^J!4>lZco@y@Lqqc0nDpBzf&n=uXBf3$GZzeP++NIyHD}mQ&UA ztwNEbVR}Td^uegL8LitJ&KvROW_~k}&^V*SgDzX>knfgLV>Z5e47|i!a4pVwMpLc3 zMiZ~qYPe{q2ZbUtgKTC>C&>}jk*2$5$^jhQjYp=Wx?J^kqdYBaURTPE*%#i-pP?*T z-`@so>-Z=SZeGB3ugq?j?tUdUv?CmDz^?FNjxFs+y{LSK;Py>x+;;}@#VdBPGBwvW z6zAORQffY{#g##^xTtgo5WhBM4JjC?%;IV8?hk)nQi=6YM3<7~bRDlvY15o3HdgMSb*^6{rgh+fni?gFjY`wGj(sS`K!zsU zbh!l=)Mq7+3ex)l*A%Ldf}Jd}W02-HvJu)^RHuwO1mwi*Zh+NI36d8jHJGQ^@$G9d zHIW+`aYu-`;4{L~DR5$?ffZV#zfcgLMbz3?^5zwyZv)vQ6601j-DfQrZ#o zwNGm3zGABoiP$Zhx3<$!w(F=PJTdljt0Z9%SY!vRSCVWQI6Xcu!i?L228K3BkP z-oeyEPkIPBKQ#oFRjC%AcZ*pCOdNt3%;wgk z^s%$48MRpu!VvgXg=3;rJgK93JfkNr`lV`iw@y_=f_6}O(NZm~KU0<2nd}XdmOt60 zGWi%yA1m*2n>#tyq*$@PNVa-2wmZcZwIS$uW(OdDL1J)E>;uk50rqlr{W+)Sse=ei z(oi1fo*jeOZd(1+Bu`iBqgW%m)_Q$WFO?HYaVGGpGk&*J2zetG?G2If8;I(apeO4+ZyxGsb&$O%8d_Jdq^FkBs);WR=V zWwy2z*JABsLiWybXLa3xA~=TGH32^@w#SMKNtyk-jcL7_F=aL*-ck>*!sQbGC^)r4 z`-@)lfk2yAGHuOF&gYATMmSPAppz5@+b$^~P7g13y+a7?PDBWjQ2{FJ=LIe_`OTh8 zN!fKDV|lyLD<5c6by0a1@aYuCs(5x@!3W7Xnd=kH%dGbtOgPkX2kZHAI9l;arcih< znEI%=_42Rf+B#n*DF_UrG2BDv{@P?x zlZHi9*~3%W9LK9d5ucIP{o(V|t_8FK2y-56rDMVkqR*gmti=YRdrHK~_W3H;o{HZd zTmUjZh8XO<@3+ENhpyo{p(JH={2B)x%3Qc-cP@g0^(0eKU(FHTxT_){$=FnIVc#Rz z2HPmDar=ENgnlA9huTD|XrEJ*s%T}@F(^#>3mb*}SqWZoOh$ zKOh4CzbHokpQEdgzuW}>X;JTQHN6~_YBmUadVx}SPL7A8>eYOXqY+#!XX zKO=K|qZTV%=AdD2Y%$(DASHzqs&`mnO{TM}`pXg8EvzHkkR1Ra+vvOQ)FJq27SHE7 zuX`d}=!&2br@l{?j9#L6kv?QEwC?HJxLv%Qw{3oPC{$0K18GI(V?sQY+Wo3;_kB33 zT2K~R{oS05g3M|2fOuXY2sJPeOyw~L%-qk%8MJ@j-we~%bQr{orMUpLCD$_O!u+qp&f9a1K#Opf9WDjA7 za9Yi%193N530OU#jJ>q2;z(9!)*N#2Ae?;pK0(%zqs-k)zTPH2j|8CAfBd$v#&13V zI%Glkb_a4rIzLeq#E*zu=`05EtoKoxrNVMbB-d6N;-oHKeluK$D&zzg@9j>4>gRq| zcM|F0Ca7>8nZ$S=mE_6M%aGW3I4F-5fOS>UZGnzbi_UOZ<*P{UbEH{q<7bG*xZd7@ zD0y51fka-&63uxT0?=?e`?*8bsprU5UcQ^?_bVTSRZN3u)A6(lCtR5z1Dd6Jqpr~N z@R_mi{}%B+4ONYc`%vu}b zsD~-nXj8|4dV(S%f780%MbqKS0CQYs`pIto33tkAEcWL~r82@IK2=g}0uuhfxI_scmCabGHxPC2&15Xr&f4=X-JxbmU923qv z5icA0U++5%I7lmT4;shL78@#I9qca*5h5YFt=_n_9=DLo=g~hXYl+X=S|m|kFULG- zlwNME=doItlwvg@w*Iu0@R>-~nC0Bue6Nj^y0CWV*n=8a+d#7@&`p*N*UDRLntO10 zzOlN`V)yn^cfL1d*~XW`sD0@Wv&zIBB~lOoJA8W4ki*7=}uXqRXZI3J> z3t6$NlDCnMQ@;70oYt$1QA@h7MY~jMY(Pc%k%t?6I6APi`K!o$F1smgfEaK}R>FmJ z^VPkz0tBX}UxXO+?ztYcyIiz?T<99JYm++h8`$v%GboT%0|0L5VXfI?gK1IMs(Rhcr%6z16Sa1;zy8(3cOKIlyBIA* zMx_$k_d(}RJo6D5v+8URxDm4DX#D8D7^b(}0eCj@lX}+c-{wRSz!H$!`E5&Y(j)Bk z_a+cOCccmE+s#gU1!R&uMlwJ_3;8VWut?`|E{-^u7&feaISa<`o z%5;9 z7Jf`=#z}6qe8()LNe|^TNN(l_lg{1NOdPaw-v7R~}MD@-QG)U2CURutQ;t_kE4(0d0IP%UZ;(LLvNLi^?M=7c5 zZQ(pGNsj2|^s{3Ege3Dm74do5J__xwR^#I9XDG2~;`D9O^!Rn(ogdgnX_B|~3Pbqq z6jt}swBJq8(-d^HJPTn(b*{##(;25MMjL&yM3v;8%wA2%tuAk+1>oaME5Fsea>sbL zqM?N&2mO^0D@-Z7yY)xC$D~m5pVL(nO1m9qP2?J!;V#ZSAEJ?C4B1#6?NHc}Fp6}m zi%u7o&Rd_T7hwUNX7EB?WZ7ErFf%70v2#ISo@yA2E0hRF$@VG@2ectWVthUV<03(w z^K@%e;U_IIx9c?RIF%(>!-M-ass0_a>O$2of z<*uimA?0aYQ|a$W%_*5o3ca`5>JiyD>=De1H_i*5LBSg8S7~+bG^*$$AKn*6Y<}IP zuu}39r#S51i)FDCC&RX-n2L72{cAZ<$On)ikz=m8$I6QPXk^hrq1SG`?wi&DtMG$J|yR*9M@A6kQ?S7_}@l`1i+^O|oR*O;`;UbcAo#ffC5LZrsV8Ss9 zNIaTDi}$@Z$vg*w4ibyQXe2<~H>C58_idF?rAZ9$CY&+85f#ig=7>IS__ytKf^94q z>nwiS`|u?}rLM%eloFJAEaz+BFsKBJ14z-fcS1|#-`oTqbj3`TPFFX$&%_S0Cp)pF zzh#^WRB=Pa=)SUNXw3!mbcxN*pe?U}6zCsKtWqR1bdoQSF7U@Q^H7){jh{b3{`NPZ zncKkMG+MxGo3@t}Qf1b#fC^EHZ`-=H6ux7=7^C3E7CR+8g_I9T7U!PJw5FfcoH-TpW z?e6HZ*e=?qIX?%@&P~K7nz=GZm-y!AM1IZ#`E??;qx||RzdN1ZUu6n=f{q8r*Xh_f zex4N2>dA^#$Z;la4&qCq>;6m%BJZrBdKvH^S%~iwwQM!t z0~#4P5>3&*!he5J(f58Tst5)F(^qa)e zc3R&YmPv?mOqe{xPCOEhW3UbJomPla-UHT0i3ZDulR_FvEj>A1&{|TjwKw?bnMEO*Q`FXNcH#^= z-p+5q&<6eop5TCacb_szKEL&UnizT{fUT*+shhH5`?o`?vuwT{Cyb46M z`uCrnfg1oBvPlcPJW~soUU^3?OgN>pge2FSTYCQz;{(0cG0<<{(lTS|F}xob56~)m zDJ;6@#NS8web%sF3((m;(J1TRQ+OjoSVh%~r}aMg+Y$EtQ|CMN=p>8BfeKgTo(|UJ z=Vt;#CX+xH&tQ;)RkroW@Q0u}g&>}8a{Rr+6X6a->D`BY-xPnpnE$+4A4KnaP3UVJ zIB$-JYt7K6$0lCMpZQFdO5^43o3OoDfM76@m*N1kNWd!hqqbz(tYpIK+xlts_b!^B z782^mb1Mdq3DH4)Nm}Yr>0d8;s@Dxr9_$a2gV+t=Cy>>{4N^pJ%Oa7y`fFYvNd+;{ zzXotr4gGnFkLD3CK{VibZA~_iAPX`E$CF#y$U0WKSws!btB;s9j)_T)C8O`uP%X!? zC*E_skyN`c3-1XwXFz`X+1BJdS>AeczIfuDG$DPPa3_UoVh(yg_jzA6vY(I>TVp`> z_v>j|^Mzj6Z2;DI%VrDK=2+;8$8fM&iNQMfJ)Fj!Wn+d7dS`y(lL$e@@$V#L6;b3M zl^7cHVPcbE@%v%%eC&RDzb@Nwu+%(M9q(?d@m92X$cJSlM1kEoLQz(>5dS|y>C zmMrRVzfZNY*XvR7t3gJ*HI6_viQ#WyP?1ATv}d|>`u%?bETgI*~C z`cNUee->SD&<2W)+HMsFR^Ny#c({lmF?=~ zVGRMbaNEKH+Lgp%6j-tEO=7d#U~<~F3$JfW3O}7ajZ)BRidm=`RJOkx&F@y(_|<6c zrnLM{ueZckRc$KOy1`d3?`S{BP*~{Ys{0M!)>GeSyu16=QoAi4M&SAM{L{{IahN1F z=?q;!@@}Zz=2@&R{n-^1rnbsE|9S*M&{J>(FKWe4UXN%d$+oq=vCHq^>mn^K)IYwF zoGhS&@s#P1+{}d~5Qmu#1d-(@umkbysIATqe~ z0*GEL-4Eq@cm8ebys5l|_b5CmdHCLorJ?d&*;)~T0t)zQe4YtwV*UJ4D5(xHpY5w9r_Vv= zAg&SW_-ZG`<>s73U!s%f(#+^#%z>i3ysU~DgDXD1*m43rNE|9=bItVx0(lz5uyU?U z@i{jtHO}v28u9n;@lfuq2AFp$=$#p3`@(xR`8C6=e+)yeT8}b^!94Al$ulJq*c_Qk za0^+Y(4Ov3Yg>9{;=@$r0lcz^d|zQe6Hs}dw^O3-=W|K*=U9jS&@-=@`*8$I;^n7z zxX-=sZ2OpwUsn6%(#z)7Ovzce&s`RnUM}HW zmCh%jQg~-L?Q@HfJf4LL1G9&P19PC7x=RQL$6cBf-1vA@|p z)fTrfdwks!)wJ1k@a6fF8@}$JIsncei^Kt&RUaeulK*_9oZaA)F5;Q#&Gx(UO`Q7t zd^6g1PTX3+JLR8MK~n9FBa)glMr6UumpgTc3HUyo^)%|x8V4Sg!|13B;1~JM z(sMA&J)NRIy$7Qof9F4Z1z!gMDL{@<5Rd<-mFfS2+*DsIa>VYRE0YObp%$&beuuQB z;~LBERfc|9&3;@{_j4J6~Ea(+u_~=jAitHx>Z6Ux=Jn+OJ3X-o0D3 zBW{ee?i=m45;&gd#!+ho2+&rqLp00FMrqe9VIYy5U^9K=w}`~YB-i_epd}WG>K)W> zALy~>U^Y)QwunkSWj&LsRDpyKop}B|twC)AX4S;}-BY!h9S58eI;O_?(=4^W_heW* zli5Q5!6{>0G7D?xlLm7ZwFYt8WejV5eCo?>F@&_;T>Gd#)}DHc^J}k{x!6Xv+;iJ4 z6gzg--isYHHkZ_}v4t$gC+fs5%N}wnPNS|^fDNlJYHoHMi#-sLHt7;}l6R-osV4#n zp>4G|tWej*iP_6ks>}Cev1s%eut?)|xHj)Oa`P7H+~qzP_^+H}9>+~7E!6wBC&Qr* zId)P?wm3)cIuF>r@p+$4)0a7*7HbK2>&xW9&S^L5VuKfX6xI^xeRa1ly<&d1g<$jC zzD(o3+l57|PUw z&7343v;D(pp6*VncQ(U+~FA@P;%ih z-s!bwY_eI0{A0h2GgC=quH16|9@dzldMcN~HQXPzWCp_GieH)G%`u$)ICz^O=hwpV z8fj)rh0Zk-*`Iu_F0XfO>X3B1cX6;o>0@~Ukn`vc zLaZdj&~AA*?9}UvRz(U^&+qeG6!J=xKx8nDP8IOxHS~eHJYDCd*b_(~%LE-l;d~}>5L~u z(=D;jy@YN%niWnfp?$$|(hWF(z*q)p+2&& zPX+dKv>U+n{OXgExl**) zU4md&gEStaA4O%>>TAQc_6(W05=g=GeJ!Skt0lhiql-i~%F3j;2kF(LlsSpxUfC?G z6-H63@e9(;Vf-aL-@6b|6cCVFaBlX4F+k#1NP75C0AOMM(43+q{)k}@kO%8@3 zkt+!z2)dMye>(Nq18KwO+k{QeQSUUfh0Bw6ApJPrC_Axgenu%dLwR{sBQ|dXN=kp(5fc0%nR0BDr}bBJp=m|7bKamrtxemsN+x9g@8q>-(jf# z*64@)ll4i%|F$vvH!Q(_$cg^fggY2~td)JS<>uYKL_oMs& zZgBrEZSp@1Rk2PWUG0RYy*!Lx=xKRu38zV7n|W_%G)EN}w$n?Tw3-PD)=y#XBPa>D zxCd^n>xYz{)fng{8zVV=+LTe{+Lfv=%%W$`>f^WUet|uKDhs!36q>#_jHSWk5>$3< zzZ=ME$>uq;Gn=30`)Wn%9Ca7~1COE@ER&%&FL{*WH~y+PPwoBv`T9zigjzz0C$VgA zy?e>8{mo$0F0xRlSS`7l4}udhFfW(`%D|_v6hP=$^TJ_ot?Sx2&}%SN*LkT?QHCpX zT?tX%m~M5F(O1Kl3u5~)@!<%b$2NPreX`ulK7nS^1e{wEfHh{YifNfU5w`i0Uu=VXpnh}-UEyoWv($2V7$#~8mS*nF)ijHnA( zgg&|3p$4$@4-YUV6y#_-j|><623HAz&5hgjLs08hvf-qiO0UgzJNrpf#-JB(zJ$dy zYfQragjxBqWMi6pxH-`#*2ZU<8zj3BmdLQ>_;Mo-09eKD9N-w%wvc}lO&eo1m2*>a zA9oV^D-bTmkmj{E)=LH8i^%sZ^|~uPEpVg^S2+;h?Cmo>f0hwJzwnpkC8pozC7uJ4 zcg%s^;09>Y@4L~u7F`AgeQT8aVg68{%d_NmdXiYyzsxmY4x8>Kis{#03|XN278IBU z+S!lsvN&m>RJ`UXbq=BeVT5>fHv#Z*O0-;#of6OW?96I@pBMF3O*OyB83;W|h0quG z>F52Kd2bqmHfYT*mPjU8ao4QQoY3$I81pW}@#$Rzd&qe#98>Swl3bXmd}bW*^7#6} z!ENUWG^Mpy^zn1$5NwP`a^bH^F})A*XOGuVZ3Bt+S{kH}#CdRYh0Z)?k@&=dH0sM| zJi$&+;+g|0(j!1tQo6R5IB7q1A2)rR#K1}4uO|x6w3rAlnN;#!0L#5=fp*|_fIKN; ze59{lj}KGU3)occ&qgAW6@-&)c?E$^+Te1h*U1ryA3bfrWKij`H+LW}qjNK2S|{SW zEO~e=sG49Ta{Zd&#m=_g<&O~pAC+s)X8GdoswYKomy0b06zD^&2h+`Is(=0tjx~n!DMjL50efSVYXp~{o zZ8@Qg%kyz)9%S-(iA|6BX`|=ON_p2~_=a1m-Oh)NKl)gey`abgAq!lw!AKu>9xFrV(~0#bFvkKHa=>37&LZo)V#CHNAd1&ll+% zO7t{jIZPb3PJGm?Jl^5sn&DxB4yUdlL~kw&JoU_`Y#+iI$UTA>w{ABK z0#EPyrC6wecwn3kWbAz!U{gVKkcmFrWp}&9sq~j+*+wQwNm%;?NWLkL#1+pM~nI(;}APKwO~RoYId{tDOXDJwkP$hBtUE? z9QG;d2eJIDx=~#_OV8!{ICv$V#O{8es}#SEnpa`Xh8jYauxfkG+FtxiZ(et$d4Ij` zr>zpzYp-=swtExd-1HWpt9q`V`$v4)6N)+nY_U_r=Ej9CQ1r`?po8Ovbe8z^RkFIgLNuz zVH>xT_F4M*3@_?$2?;AgI;f@1+ks~)J%)oWzh@JTAMY&8qUrqCUQqggpv8y&kR zBakJlVDoOQ)7=plwXm?SH>pH(>%sM1y^vI(&AX3goOzy)yNmhE?6#m@-o@lg9dahX zZa_KPy&>fg$%IW_MtU()?V8^Jc}^~>#CE&3HqE47vV-a_f~gQ1hl8+88ZU2B3Mz)bWJ!P5*Y z;<}fwsUm=N&oS_`P&qCyv`h?1p_Y|DO)}ijLN>!@GYKbjm~*?eQ7c%~EL|V4%Mo2;+dbqR2`Y%dvgbKjn*q?4l2; zZWET+G}u8^OigY~mkxpZ8?if|w(|C_8*R!`%qO2!=6C3u8F7eUbSfwxZLt!@t$L63!KAOedn<_dl?bd>gb!B0^o4bWaA@@jwcfI_oY7&02?$#!z@a%$6SqZ|L36zf(9$tgoyJPkd@_eraY+4M(Ja&78frrJcMN%&#&WCtzQC&W;VObu%vyfwo;$*R zdEXVqmvCVB5cxY!_-+@T(;W@TO=26-_i3pCsSJfQ8=3wIVu3aWFi?b9A~%?@nf$w9 zAG}-cETo&0Y-2?N=WjG4V>p)>p4O9SeC2no{Tne3I=e5Sz2)x7)Q;YjA^7_}NHt1& z;OU-#zV=);$Y5?Q-*zB==BYs`gsUofv3q+1Gwx9O6nANxquczK;vY(LfLEHm^0S+0;2;u&G`2uLt5p^J0?}<0GU!^M+4zy0VB0 zh>dFb_@i1^e?O;KEpWwQ}S#hQybt z{R+z-1IbG*JMsKD3~v3)EcSWML4<#03qrz2ulfG??DABm`}{oP0%;6y>9*f;`;YWH zX6i``At1=eBoj%=Z$Iz7!nIBk1c?4l0|IB6BDL99w^J(-!)0eD_*=7y&8__7-pP&m zPbT+_9-yfVGzZDe%_5d?Wq%HhNJ+L9YrJ)eUEi?|K2N=ce&bva_ic?Ol9gNEw$jXMzWo{`d{N_B`v`%C$gsV3*rN)wyMsh;<3AMOesX=o0c>TBA(SRTWbiOQt=XJRCV@VvFnw%>Z7M!A3eZ z;j6c8axldvDR)*{k1p%Xi|F)mm;tZn?PfI&ats0N(m2kSP)>#U*IoC9)tD$GO+GtE z>5>r|vre2iWY>_!Jj7SCdy;R1=l$LkR5Vt3G`ef0At0Mt`>-RcA(UXHBfU;x22DdX z>ntqv*3#9t^UJ%D+*|ZkeANW;*1tY$-r%wdd=vn$^DG~aPDi(k@Q2ut!-xCo;*>L% zqkRcNrq|Bv$ZNgQQiS5HQLM>}h`!0G->kTww4!c2YPY+n#F<)TB$ zIh;mhaxx%LR9wHlNo-^O##f^sYObNK1Q;%g>4w*AOqQz!F>A{1be+Btx*H#l4>=2A zVofhq^}R$)aBHp8eMu~jTT;Rj;QTzzl%@y4xmxT&O;69mZDmg19I+XsMY8hDcAbO< zk_h~D01@Nvmc4&3A}}g_hz1!FmGhnwkMySWWN)qQ#5V#g0lQPrLBAbP4*prKN?pzc ztb7ZiHZjVaUo&U$!4w4^N|=QjS*!-p&((#vpYkTq+>iCF3TiH@Gjv6~HAhO#gUz^+ zBYxA^Qq#&k!=Khby8T2*3-XF?-_MI>3EuwE4rSqg06G~=Y^hUMfxz3;2*ghiR-4K{NxnIr zTwc>;y?g5`wbwi^5#aqMMRpHIR`u1&f2S04#1O~O$t53% zN2BEo@P}(nxxKfu@)qzM;~snK6+gxER+eB6gj+N56jZMH(`~_whmUvaQI8INQL5eQ z*T*A2ZYyv$i!0-tfg}>#$T)1oAEj}+z2J1R_~;~tF#7uRUJ6H(N=_q{;b+XF#Fb@_ zblA>5DiA&qtj8}8x!d8rpxBRVfozrb!>@PNY}H4V<&=yV_c)*7BVNDloX4|yq6jnJ z6h}&@^A2%{Q3)~^`Ff$Rt(tXw zjhWC4_)$eQJ#pJKK9Fl_(dhtrn28n6Z=MB<5(%&J7(rPlkILX# z#G7)x!bJpe+b8Kpda==F?Jf#HaM!guM|)wcW@Qe*lf=~DArc`pp3fuI$*Sh-h^LQjDAUCjwP$y zL+M_E&0ud&HbumPXqp)s!OVqtU7GvVZiE_8PS?f_Z)S%YtzSk^199tmC*J~il5+QPM-?n!dUfdZ9!k{+f%`THpC$b3nHcEStH*&uN0>D$!RUB*x4yMh1= zRnzX-^RPZ9q;tq%RH7-+5r40MJfg4J&9FDE3M)&`@=utL2C(>NZ#5)Y71;HaT+_=d z5&E0>Zg)-RiAn!iD}ycR0TYm{aF(2?>UH(TxC;vKdVIyxiakH z5|PoNP=JtCD;z3qzSS2rAlwd75<&$-y8<0u(;I~|HkUV$a8IH+4)si?^yKuA3 z>u?G&!r5x_SoAK^#1Bg@APaU1l9tGGmqh^^rY$v!l92A3K|i`UtuZoa^RVyyN#b` ziEU^2>&#-z&2hlt=fp2T#=1h7=kuLpSGMt5O~ecf_Ll*^z9ZDnAcf%}FDHJsk+NGw zAShZrhR=JLPP_?~^{*fguN66B*E9PdzJy84XPwpF`7p%|yIdW;q)`p=_PKrs=edRl zhqrof+p{)xpdac-Ym1GNS&|g$DQ8-H1O7W0Jj7bWezH^j#NY)bKgt9Wl$fk(Ows?*<{lPeu5ELkDui!L7DiJWP2Nnziei+pLI&A$^8vap2EclQsgS?{R-_f zSaD-Z_vr+kmR}?c{9Iz9`|4+o%pdpi_v}{3+Nf}L(?wyI|FT_KC1=$W*B7eGR#sQb z?dcR4QujvJxIvDI%}xM0djhexZeNeYVXyT%wFm*EhX<@BS-|gQn&THN42VSDbtb&{V5f1w>Y3o6N$i>-HZxYQgUx3p6Hzqx4|G6+yRkW_3jU2xojWSTZ`J&rdgzd(kB}dY8;ix=U_z|Tn#?nS}FA~bzVX>{kz`Lt#ai&kKnN)F2?rHC{zr0w+kUQ2o3rcT1_Zr z)#D1>wU{f5S#47&R|41k^4ru=`t&y5`SF6Rn>RrX3C|y#4rArQHVhg>VvgAdqKE{f zN0TeE+8u)=?=;DHKhqaY)JZ=cdZfGcq(bhpmD5D;DxHbWnul}&7z5b|F8G=B{ZgI% z{c8>)v|796?cUhhoeJG9oj$j|voxw-S`I2E|94AE$}1FR51cvOQxNfuQMuV|zo&ZujyW`$mZ)~3lmwClRtg@vK2AZGqJGJS7Ska70uyxm`Ocmm{q|5|-lOQ^jDK_Kku z%%y&0*4MqgKYQVD=cH@=?zEVW24-`SUq1>+;-d=^JeziaT;nJA>d1vq_6aV z-Q;x9CFgNi$@VWIXa_E z@Y)xRwY>=81AjPeNW7EZbD5qZ?b6P`PaBm9Z|V>UzKHWeW4<*Xa?%vqVfp?vlJe^@ zMn)??H)gBOGD}Qmdz3TjEdWbY6j9X~%m5?Ye+J zW>-FxX;(yqoWbhKs5wq;vg@0n={Kv!p9IBe*kug!sP~V&>1~k-)LsAG&uIP1qZG2j zJHL&8BC(woc+w-41>Gs(JY9%YxZ;IggzwXUdEeq@D!bI4|a&w^&C`DT;TNvvI?tB&^nR z*yUE`b-{)7Nlf4F>A}!7q}(o7v7W7GT`SXIt*Idg?%b#WbU#(o=-P4kzKy($d^OtX z4cY50HqS}BoZG*?wK#0_RDPrvCAEyR?09TnADczrjb-(mh{zMD^8y=y&9g;(6d@eO zuhNK4AJXM%QC)(wW^>+bdvJH|+xgEYKUE9E%l#ZbE!5brWZ`At@>z<39hXI*d3;2msM-n^AdfdZI zJ6lD{JuX$J&G^eTgmRI!a(n0LD$saK1)fIxkm-tF1QbD}g0sN3rD!{xn%OyAx$Ig@ z2PyF0WIoRkH2I&D*I#&>Ry27Qc>p5}EnyE%Q4wG5%Jof}y4G?q8iTPmGmOT5*v?8{ ztOB}*7{J(0z4@HtaP#fo-OHrh7$%FO>p_}|7x^!nQ?omB|4MK5Y9J z`S}cJp$=2x2kIVZ~gSP9}Fl?xgNV%^Qm zO6zQyQ(#9rPajtc2kCls<;g&!iolWT?SbrkV^9K|8HiXk`um zABBpp+)mGE@R|y6&dUxJgY3a5IOhU*a(5pu^22@y@!`yr)!@wjk*LxR;%*cUaf=U2 z3;|1hCCV8n>y>RHOt-qBi&h&AW4&^(LhpBYsD4`S-;}(_mLX$8-vAhN!M|3pMj<$O zl}cfmBupc`%b-^Yzm(WBb6)bKi)N-Z&@F5LsX^ z=ABOC^phz`-p#m!_90wPDc;?dU-TI*?2 zHZA3D%gHVW@~m>lyePNxSnZ#mNH>svW_P$N465SxWJ9O5?ZkpOY0}%rGR$evq+PE2 zG&XBv9pFxit(QJ4a=AG!uATq>bVw}EH%;*1Ra98KujK`a`rHn$*=toCTNV5VH`K`1k~ zN^cKCQNCt!KYBa#M%3vyUcCE^WrkMJ!~` zaM$b<3})!WE2yFAXzyAr3B=*NRE2R?T8iw{s`{%`nMuWY5ZWyG-RB|XD?@8_Oal2L ztdG#}TckpSrhyeyMB6%3%{H+o46_@s=6u77LvjgC0ou$1cQ#{eMd!2ku-ut`R`tD6 zO#A6pL|sqeM^l2R4OfpVxed#3@J1mY*+1heaDQBqp>(=bnB@Y>3(wpp<*uugqRjsS&Aoshp%D{$NWNWEjyNL`Y*0FZuu!@4#d95(( zPi+IBJ{&${Zp>1DkuUI0j>4LdA>ai}0E-eVm2XpyF#d!_9eXqCPlzAF?kW24>TaXp z4V&QGEi27GSiG=b+gRcD1N!j5ySgWi33dp`an6wSI z96sNjt!Dh1OvE5Bw)Txv>A+tJ*7Me)@>!0*$t~XON;La-zPx6ynTuk7GlTH&obNHy zMvF%zu}MBk#rwz5*w*WNBj?@pS;R83j#3HaV;7N*qN^0Kezn<|@12{{rMR!|_{*b2 zNxy5V(Z1l|*BGdazI{%HsDj1v7NjTQcG#J$=8GreO8XhZ&WrtMr~?~X-g7;t%Hn^o zs30`%bdhdukGb)Az;uCQ(uzn3RxgPXb=t$h;7yi#`+QF{s}ucTFDkn)PJ|BWKuLcP zKXVnz+j(cHBTN5B6DMuAC{L_OuR4a@#kVFaX9&Qsyn=flYvu+6f;JAz62rXMaEQ9kJbq zS`3{Vj(*C)-Ys}^syT&L4<@{)cJZ9+nHMw9jkG=w z0@hY$WIbnQP&2*rc-!2=aIxfYw`C7G=sxS1^Hxp+uC@Y zD{jJaF^tfMWfYyx6%xkHLhiX=WK$p<)xR?EqDV?!yjoK_o((q~{XDpMuiUG`c+GH- zKQv9d+KSwPDHLvP<{KIkTm#80W;fp(?i*{%Tmk!*itna*%{kedQcg#~jC<9E z$_iZtdn5unq1hFJJclLZqf$1Ha;zy~`MW0PHtjSX45JOa?1+}|jYF`q=V!FMVe`04 z)W)M9+oMdi4vwrSzTTcd)osn27l@8^DrJx|Emf8KsyFS)cP|F!D!(P4DjG1C)fdj7 ztXK@txG-`?@Sh)gTT)jfKl#ozc@Z&=J$Et+`=a#L+B*%x$cVy*)Dp;eDb3eR>~!P4 zZIv%TW4>RVrxERC8a~Rt-KuLhMEq7!Eo`OO3LGv;Nvz)e?3<7M@_w$?nI!X=yL3L; z7ov1&2?w9jvc5Liw}T&xuUuBf7C-U}uU14}v8y~vSqE~r+4+wg(@kxc{T^E>R$x6$?0oFyx* z3gR+2a7G)S1%%@6y23}oNxSSfKWej@mD!&s=Jjb(TRRzoUBWNCb{4(c^RD1rlse6` zOC0C)^r*>=8>=tT@7+y$yT+p0oZE@fP@yaCb-sfDoKo$jeeBs|h<+|cvdv|KgRos# zNki9w|BLmlCiMXiy`X;U^_ZC2t*3_>W8a*7eg%L&UP`rFM_>vLtxOKR0>8K@@f6ud z`S)#h6u#!Cl^?7NWpX*_#tiCqBP_?P@nZhY z?I6g5)O|oUc51xP%wMFuf2~cC}R5#7|5cZpWgz`FefeUzC0> zFjtsX@(qj6`)Ie*HlNS=fmm9x{$Zb+0Vi+h*}QjFx((V$6`PA&wF&T>L2G_lVtq6y z&Uet7{QHOZQ~!3s2XJS4VP%7V%0UUK1hahCekHj_#-znww*By+xL&FU|5MtE%ZvWd z-`NG{xr{M4B}AFc@+(op;QE9D=rw=ee@i^l?T zxcMy2;s)RnhqSW;)qqBBm7T7wJ1k54+_rp&pp5 z%s2Qb6ZU2u*voiw^S!K!_o0@(DWW^*?k(VRD7&YMqCu~Avns$rs(mj!gTS^ictZuF z(l|th=ngSjon3wdR7>CCbR@ex^&U6pCMN_Ry<0nv*+F`t!?5j=A;<5h9^4;;PCJ8~ zyZfbc_ePy#?SAPCg|u@!R~)tFx9i*HlAkZatf*{;+TV{abBU&l!g&XGN)Te#BhY19 zpzIdfIV8x;a7O41Eh3*3S3w6nqpVpl$dsd>T?XnXLbhDZd&8Tj5XU)zHOUp8Qn`Fs zKo8y1KH+e=bAZ>~UVCY$o6TOR^E{=Twg*}{E7Hu4BBNEy_brZZ+&WrAd`H9f#Cw%; z@cJ&gf)vP2I3v!#_);FUkgWx!8K9aA5Bg|6;PBRlbfEBQQ47e<`J=O=p(}dde!=76 z>4n{47WR1ccfP;OeZC%ApcX_)RJsV2oGl&O(wQr~aIP7zSa)X8W8Ge?ub(mj`@N&O z08ln>K1)6nB0ue3>V1>6^O|E$f{M@Q*B`h`E#dVx(3y5{q@>ahszkr{71ntCOQhK((Zhsyr) z032eMn~bQ=xYKRYgIpO1J>Ma|oNA}3DCWmoyCDhJ*Q|+kms8qnA)v)gUc*xJ{use2 zCx%#(1D`>&SYhVBQnfXX^tqYkY`WqM-UDt;bbk42Y#t!Q2*Se7qt+OYVUmROms_$_ zL<{;>gUK7i0a3WODepSPTw%xarQz^FH&DPK_m?U22Uflr+Oy-si=nMkNWy5qYqbZW zhrpjskHj9br^#`3*^f_c=Ekc*T*<)1RXog^ z6sUtEV4Yn;BZeN{KXdk7xl${deV-U*`tx7-{_B2(uw2Ma!3Ou*gZ1D}pNG&XzYx$&ch z6U#@BO8-JBUTFLLmnwvrbOx1#1HVSv>|rN*WancA65Y>WUXM5|rxF>2GTP?gJ8bcG z0Rz>=mJRaxY8L$BN&1wMOB7|uO>L%7XQ_WgfG_=CPqw|0b=v**akdos`BG_+zH~2; z_=J9Zzm!*IuU7phV5y0;A3cinJZ{}FH|xY7O4`(0mF*j$@V*a!RnWO)AATh{h-iWj zO(xapSNU}F=>Y9)^Z{tYBFJg*VqDGBfARSfk)EBN*0`{0Yg#$?LXI0h0L%FWW?exR zo@c`+@w+Q?YTMBG)@ixm4Cdw;d4_!Grd@QlE?a(n4zdSw+REXgru(JSdhkZ({naiv zb-T-4dRzHqhO-rG9>wlLcD+Xh=-neD0Y&s^Wa+ydj8)yFPVFr_PdVg@xcm69R}=ZM zfQV?o9e_htp1}YY&}@g0TA7bYRaR{KGwQe_Ql}j=-Qly}$wC{?QMg&_#`fP&Ja@^3 z61{t|Bx0^_c_3(?@YE%$@l)lP&-RPC_)}hpMk3tfU<*5Mn?m`TRS{8rRf73$fKGCGPBHEuP zRyA{(OlL`YVsP5$iRjSoAVL-|oR;ER91Eo^98fem_X-Kle07#qU)B5|35z?&@gcs@ z4d~tXair|ATDZ7WOVJejco@RQ=7oU4Z#x_PUg8A>av=k0ai1=3sr9@LmHVN;Cfn;o z1H>&j$oVoc^{)I?*c6Mmd#ixL@;nN#my7O^m1ek9wUqmAhd1Zp#rcJoGzflGillkE z{SvNmK7I%LrvL5bR$Z70RgOXzu42lRl;6f4fEz>ad_dmk&Vcvp4A9+9_sR(TI~$Lt zyM;<)RO)VI&)lfQNDnnA6Xzd#D~EV*hy3-C;(l#koTLW=Ze%^ak`Fc&V9d1udlW;npuq zkX38>&fGTHQjUU5$Lz1w+N>-U@L~5#tsccKON(-~S`htBQ+i`w9RkM!=zT7e=d#gM zzZT;KBUDEEa}~65o8f$*D8JuH8&6tEZ_XWH6Q=X;6uQ?f%R9Tf=C=_5eY#s5rNUaa z|C+tgIH{h>0th7a9`brsMnl}I57N=e70b}Bh_jZlT+IcH&tEXS;4Of5*dCIyylGjJ zN|Lw5uP?@Yo1IUB%7`d%Oy__UhDT}D2u+PmvBW-07dDTKb^{r!x@j5j$96Pt1epL2 zcaR}MTMZD}$i!4RvXt4VT&W+{bmKhkAbBDqlB@K0IS?-~|DZO*f^jeUztc1?PY!Q1 z%D?2h@(JyJdpU8xRLS<6@V_W~mbjC?ITco^?2v%Froy&C!_cWw{vkD80w1~v-FdXA zko@DsY_<*$I#RnK$BQ#GBCx?LW_0!GaL}2!u|k6-+FuN|9>#q-$Isk7`0wA!f#W-` zV!7TcOeCG$Mr?U;5!>7P8x-U5h-R>6+GocX?dA30uRc|tGiJF!AWjK}4)o)>w-h-} z$pD1F*hBmG9TkMYo-XuyDUyF0H3*4rqq01!^BExKWerXf5Km^a1)kR&z@bpD;M#kx zcYPk7#l>^AnxhBcr_i_#v2V93+z$urqyW=9SXbSJ!ueY&eei{LBp2BoQ69z#PcRdW86>G&KL4_3#4)w*z=P@liV6sbg8ualSM+R2 zY3;9vBD}kPN_pjs%8qtRn@F=W4O`@P1T1m*f|RzAcLFf%sF@bzlJn{Ij;DTMjKvVS zJ?#*BYFL)_PH{8u zdlOnV( zyx2svfsD?e8o!$!(`R|C#knzLFAsFr1Vu9A_qWQj424H#%}J`bBl#K(Xi&y#-(y zygoEMGzLwA5Mo5PnY=)VVMp+5*~a5OnyZghGz~hAMGWa-SUg5xtnmihNKq#<5nV>E zU^halB?4{`-oXCcP8Z3Y<}#frNEGpdzbelA5UYOeyS>_YH{N?@Zth8HeLqIYecSCa zpMZv8W9|~##^T~=uR?#}yRX3u)D_*|@fRaw3NFY!L&2Cl+dOl##^7M+hJHGOwY(Bf z>oBwhurU{#+dRg`AU{=u{P6~p%Eo2Y#-{y;xNtWGB)0pLx_YT>%jA4@XlLchx|V~C zD&PTOsa|#lAjH~`U@j`xD(3w-3=ik#!ydsvu)wVIdE14hYj=wj$xMN#vR(JZe&^>~ z=MI5Id1Kn#hiVFoN^CNoKg&WE8>vnESckuW*-7gQBw#6}>U1Be8yUNwVtpK8k zdeU_M>^BS6ybOmd(&@~C<=^l}2J^(gXc?$`-IrMKL8E6g1gXxpN4HWFyNGq)LtJjQ z=bK}5(n%c(lVtPG+gC0C4hq5%GbL?R&f|J<`lKY19P#g=nUlIW4?l_siAY0S9_oc*ogP)Mzwoqr)1MYQhe*N>w7$1pQk8}E3N zpda#sU)Ay3EH{J7KBIc}q70{M#cMRcedhfLjS0`&u8kj%R^gk=m+Hw2k|oKggLn1| zeVvf}sxgcRJ{~=m6Q)zOiT1u>YphoknlZa?mq&iN@_H}MYVOYH0~?7BjoVwNxJ#}A z;MwW*?O({6c-KwXMJ{Lc)d2$Yg#|2_m-r)i$bu*DOq)S~&x$-ViUmreY7x@Xnk z(hcVgFiOrpaAm#bM6dp?Me@7xs)o*B2FshL zXOh$w5GMkQNs#V!>5xH+SnC9C5$-~`o^s}G`{15Yxy8?IxoBdsAnU#my=37f+HBLw zsCX2(ySZV4OKSC=I^4e+h6E*1$J;v55_a$iD z=`;JAKgVHn{^qGYy|4lxcyrw>(-@tEk3K%WAT z*w_4P-%}cU?3FW#BO6!B6)lYLooot1s1p$~fpYa%tlX1(GzPcUk=QFP94pf!_f-j1pr6~*p&+LYH^P5sqSae5^ z46?X=FCmO=?=qK0?`1c(xtmM-uE^AE{8>Fy?FGCr#mnIM5x0Zosj2_%LrY%EyshM| zQ9rhl^HxCYEZxd36Ms2RJi@@S1QAYl|yoi$@fmZR+y{VT2&TSu|XvZ>y2`tSo&&fptTi*(P`;O zty}Sk)|p1uYIbsK*-9?Z6(o)qM8P`I6quko?B?ildKJ{3M;GvKxnT9eR30l*v9n>(_a%07G+xJX!m)ngcH2= z@5{iwxXg7gU#QcdYY3S4$F=tP5<>s_%;HHjte$sW^6_9{nxr04;C|eHpdTm|a<);` z-|FZqClpOcY9%9Q3h3!qf9-eFeDYqY6(_At9r#QPNjFDUe&1UyEYh-mP+}Cv~U%v=r7zqYn))R9bt=2|g8d6a<^4#@oB~4;!bS1i2e2 z1z!XXb^%BWJC$2=QW{J{ZSUFh>4V+IYpveJIZsX$a|&+F4TIOh)Tz%cRR;@e)+8a> zgU)73ZnY~S?{CY{K~&cp%7xDzygixKXnTDm`*CSVI(~P#lmTIAdA=8gZOYDf-V}Q6 zdg82|+vMuID>ox5x`Q;dwm`go%!WIP&F1h>+E2h-v*1dC0@zp-?>vK5w)@UltHSYA zt`$CVsa$Cg`A0~f?)a$#Wb*LnfNHwYe`0R2lEbIW1)Ds{Mg*PyfX{Ykx^f5^nk>xq z#=ft89_^(2$ZupdjSl=q`H=>2K#u`Pq!b`UAS+oxcCehJ*ZXh_7nN6w=LcI=LHoNs zu%Wgb#FbG2eui7_h2@~ZGp%qpleUV{@Y=mDb^mb6An`E)QRH|sFi4!`u<6EV^&0u^ z`e@aTCxhj;wZxkDn-RSq~)gVeyai+Tj62PjMF# zCX4|_kB!}!Rl!OIb$5`5y!R63CCj{!W^Xonn*^=8Wa&cFF&^uQKH%>IZrZTd-4*m3lN9zFC_MY|mb{I$17SWGO$xD1#gRP|X0kaGL z*cB#a_q}(!9iZ_*Ny5~RU19y!3-LQvsOGe%PF;3!4jSj@w$wBB7ids)gzO1k6irjp zs8h26O~+jpxOcz!)X%(;zN9uF*f;AYbmY=O1yA{{2k4~v_25(2Uj4d2_g}jg4Ude^ zwN+mjLtC0VXJ~KaOz$|$Cm=*71+b{SstLHJ$o@KG)?Z<{46N2McUA$G@a~RQWol=a zTU~hLe*26pSu)F9sHJ;Y*!3FF2NJ)MJ$~!Rk?{9npp&B0@N4cBMr$}Ibod;3nY<`@ zbxFRE8zA|?;qpRqjRT+?xe?Og%>p;VCa zsbI;;M(rUn9fm)?brJ)3Jom^bv zUi}hxMP6QogK*UQHt$G`jg`Pu4iUWOq5N~8_NKS>oCx^0uZ&CWt=j2Z(F~%EeJ797 zZQaP_rH+8z1aGX5wtPLHkSH#`Id{ma{q1LLnmYsF@sIpD$jUC!Xu_94zw3Ol`CZBL zkLRS7&yEM9Bpx&dsTEyZIF`{S@I2DbnIv?mQ_zyjgA!x%{6dHZTQo6nj4#N(46@k; z-|03cDHf+-crhjB>1bG+0EYhW%=X&9|brp}8=)Zf!1eXXl|lG?tE=Uq8)f%F?s6<(XXTdIVYI z7J9d!R&~w8OP2e&(f4we@2};0g)LeyRvlcJR(qLKAe3G6`U>UO5X0iK;lD5AjPBMH zDxTdMl!QlU=l7`Ag%2twzSr48iI@3tLUPyIPIj}n&X3=Xou^+tNT=4-8DiFVetN%} z8kJ@B%)SA`z=r=htPT0!Afx{ghU_1#4f#LussGWp^hZXUa|wm(3*kN12ddEJ;JABS z=TPi$%bdz?v2-Y0PEay9QE=`VB)94iTH(!_y&B=F|2P*0jrglS1lDD3c4lg_OFou~Z6uXB_ zrIt1H1Ox5h!H-v6aImA*bBPd`%)T!*gmxQ6s{r)V=gR0={l$Ppz~=3AMxDta`WjQV zXfF`9oqJ&2)f^5qSw~Pc1uWt0QIs8AagJr4E#M-5ai)2$bLH*JG80i$5{-!>9o_h< zm}0K~FbT*T=5R)p>wNOPMI`Ys=&b`em&+SM1^wM!wNaRpQ`5bKN4hahMK`4{A4j9b z8f@s9V17xx*>~tcd$cj%ceYZ|CgCfzOOsBUb#LBRQD`~#W!Dl*Erw{%X!yll>Z?@g z(vAT|<;SCQ*~<=r@J44!T@Rjq>#GW1p>^-{ZiCQ)#~QC z&H?N9#w=A|whz4jvf%_B18?c@^-nkgS&^Z>ZoCHX>1DMpbw$(mMMHs0vb~Wz%j@y( zc9hpVVxyb-xGOL+wZ}V7u(mp@z>kId-G_eJM5@(smbgw?Ki+Nc-6&6%Ae0LBgW}nc z=;D;DsyZ<~bzyfx1sd$9{U4eZ1N;@hK(a;;-;$G|8g(Q+t8ehXkYS@Wxyw)e?BB1-EI@dQkN)<*3Ub%g$HE2rI{y$8{ z{~v7--@D%3-z~Dpd_i^fF}9ES1^z0+m7>Faw~bGUhU4QcAMll7(5`nA1zZ9zMbpCY zkmtaJnCA(zR63yJC9H+31H`H>C5Z3}?>VnEBeA#_pV+9t7VCsJO^RSO%e!2ELd6nM zPRKTxo{p*`Z_j1|_lF)i^YhgO+6w+U&?z&t>(W!aRLQSbJFP=GC84L!5OlzOwE9B|6S2y~^Ex?%)%lVO z6C|Ahb?8-)uu-vrZJlb(>ux*GH`^=!Uf&;2I5ALRFmvJRK#AfQB%C;Y2Yx`!1m899 zeAK-(LO2S@FMPcsJY1%O)>6(ll&lqOMlGDfHWYiVKnf}Z6lzW|>>vk^htHw7 zIi+ZN`)bXs^5O;8^30^2J7vAFw4bfsEw7RHm7UsO0{24~QYl4#f7aNH+U&RhZ*(pT zgnE{Y+Ky2RD1lCB(c;bL zFF-VM*(dZF4$pItuaj>Xl8x6Ob9S;$%YT0d!_z4ApI|PgZZ0~Yw&`k|J)Y~Q$2grf zuH7-#=wf28n(a=l6>Q5!Aqi~+J7Nl*{E*90t9k8kKHYCmBKOwG^fe-~9j_Smzp&&d zyAjEW;b)Wf^KTe?q|b@W+hhl{dBHX_J}+wtl)UJ6@m5drVqI=Mw})!jePWNGVMAq$ zc^NZqhuOUmsMrnJ#V~11Wj4wS(8kldimZsHI3XwNO$z3ICIn%B58QIR>XACVa=UWq z)sI$ihIrU{U>89Pi(hA^f0*3cyL?ATo!gCRImdzPcyfPTu#`Hv6`c9S6Q*!fH9m{` zR0r=!J?C?42LCM&VAnnmsw;F$Pp6fje~yZQFmETDJ&J#W$VVQ#{At5lW)#4+;(H1U ztLPjiHCG!9oKi0;6=dg=(`y!l4OxF12~+2rf}@TKq;9?s*45D37a$j$CWMR)@!Ad{|w|HIX6kf$oC^ ziq_a|znTVdWqD5p!~wikj-p$LG$P-_Ti1*syS`MlB6*^|@9VQW^>}F&97>{xYBx8l zc3$maR-YZ{&%c<^ZL5Bse;K3Z-H+Z4WIe^tO(C6cGw+5Om@w46)eeKremPq_C)iW9 zv3YiErP0}S&CF=M+f8*MSt~Hw#NB_fS{Jg)BXYJ&_!qjCu=!%f!zP0H-G zl3b4uCcKc5Hp;M2TWgj_bQg@icrJCia=-Ni(kw?|?02y8-``7pG-zlRQgqtX3adh< zx{LN|`>dQt``K?u-!p-l?R|1xaQ#T6H?5^s*T!SK@cC6n(XhujYhLrxtF8kC=`=&+ zhgAL*Gnn}xq>~{FRc*_#VEP@vE2AnJHX~c!2;}hlq&3{iJ`)Q!Z}R>M@aN5;u+Yu~ zX;AGTl#@ou?Y4=H-`dJ>%^MLD#Vj*UdDq8{&1P?IgZPdP(5kSFLjvB>5#FI)HQG@} z`@95I`hEMg!N79e^QzvSL8WcEuQNElLuZms55!rObjhnwHLL>W-O z-|WfBOCKmSKEOAaW8MeIM#I6QjYN3$ZQAyWB zsbhySI&f(SAmmk1?IB&y$sRN~kXX7r*JlpeGG^8tZ5m_#xxfcjEv3_?-dUQtjQ7}D z$&&T}2Q;(R>-)1XZ2bV`F!nuE8Za_>A`6H=8wOw5D25?q7#gFfonX+<}JgooW0Us~EeROC5v0ni{fuJ`&G zXs|`K-g`mFN+(Oq+}!QFRY-KYsGO1$dUJavDZG+tqxf3?a(x6gUYjE3)??W+On$a` ztiH$Tl)wStSIDzu$`8S^`uJ|3dgxa%ZyXc2LR2!SSDt+@&D8mA*j}-OXkxYiJTx)Y zTe%`37(#1xiuLYW1t`8oH4Z{)aEIPlVj^?( z^eJ_})9yQ*wA6WVX7kCrl$@kl7L1o2*1s6GCwWmGQpng{i*=+Lg_Duj6O{Jfr@KVk_Dwlu3SpyJ5Ku>;mVVL>e>h#9KG_6rhCLK8sZubu6 zuX3W4o8|hmD3Ayd?_z(uf%T$ve2qh;`pzvi^3y1sdvJs-`MnBCHj5-P{&0+{nEI{^ zI!0=??W;M)JM}d6N24A1ob~aMRP7bpgya7agC)##yR-MaWLA)RdnL0y2?A8S>0q_) z0wUdae`S_e&-PcjRn)rlx1TCFgN|5!PUYE<;0G!gi9ascB5q0Uf}C`}QVCvni}97vCW1asUvkG@KsxVN&xch6n7iOU z)lCPZ<5pCSTMN!Vx!|?E&*uJK-tv+>q8s9Hy#j-f(n;Lvxp;e8)RXApuW@njHA$N> z-R+665k}Y?h`%MGuLpq8MHA{goAs#G$jIg6z*qS@ncl8fmCDcT6pASLLb7eiLQ}$K zn@|@4O9Qf7=8!j=+J;W7lkz>M@qL^#PU=0wW@zBc-Yd|q;pa7Y+Eg-Cw_;ARi|n>| z!-*nxAYQNCfc~)$zLBhuo3E+ywx7~#R-p;zjol4!$BWIWS{WX%N|cR5f6*IP2#ZU_ zugzWDIq-*keqFvbxmKK5&uyAo|E`F7>P#K=n=6rx!FtFKwf)XgOT-6jOd8!dVpe%( zncmy;AhY?dUJ%>==SXe?BQNmrrLt)q-p{du(B;#56b|M(3$IRg+KqX}*<56L&(Xc+ zp^EZt-&8G36;H460(UTS+T?y-|CX2Kk&TQwZHlQ`lw4}6@E1k`9#nNW5=~8?B_7)+#q8SorT{A(* z*Olw$R;3(sL}H`u@P{P+fFGYf(_^Wa-e&3bR99YidN0#$FO;4cjvkzH<9&dZS=wEQ&Fk5pWZXBxBp6gbn8NRvgtpfpw-5x;Aqa*Vg9qXg)t?)!%_EDgLQl@mcRtD#y z`Jl&_@fod%zxy#Qlpf{1>T##ldPZg42dJ#YjeTKcHF)gGiPR!DI`;m;`DX9W(8tSj z4YPQ0o3TCs(VDO8&`n#6+b{s*A>lh(d?EZe`ZO9Hbvv2vW;MXGSM%L^ZwS@nz_Srq z@ZvA?F|@h1iu%dJl;AoD;L^JvMT4kzUNrsQ77s)2lx=UOp%RTYBy()vwwEmS zo%f!5su<%t3`bU1(?@HOzR`L?#ol8~ZRU8D2T@Y?3vMKq7Jvd6o2XoGVJE2>vg|s1 z_FfGBw5oFm>edQWl*{`Fpp}<v*^vB0!2m`E8|<(@>`-++9lm1W~Udq4})_A zz!)k?FPPGsx1)X-I_3bvT8xD}X!8Q%$wXskmRnx)M76J0xS_W7AI?^`Vc%LNs~_r) z9=Ut(Ml%OMhRaIP8N7b08hDd|i?>1t-6miHkM(*%`!u=g!hDhYR%q=)q0}!BWPN)F z^rlMHwVPZ9>EC;^q@UGHg%OM~#+lCIt;v()-!;ZVFaSRX_+~uidi)x@dTUjz!F689 zsA#D?s5Y+iiPco4x4K>B3->+fyjl5|Yl}+1QUiqItp1dm$r1r*Ef#PcICD~qYpZzw zS#d)#Hn|FA8LyPOA->pijDGxe=37hGn5^aZyUou{shohTdAa2}!Pko3?01H#)d2>?66^Y=lSpHrVkWDFu0w6WKgrEvbgw z%apXk*{)!Gu!QWa$36A-DC8UZ#BI@=R5clIt$SB!T=Y}!lF?dM3znjj-e0l^e~wLQ z=o244K^omzj!ih*a2Ctps4vUhiYYmFbOujxW4xh=U*%o#E{E20T!D1{a~d*k*1Xlx z^Z?%5NqGWkdJdwv*7Uj4#)ahTwVfnSd9^-UymM){D=1%6G zU{W}7r48QPja$F3owe8vibx%qXhDZ{vba3O&%6BQ-}+|Y)!^U|K2-*E99pZEx^(hK zZ3KgZ32YLJc5|SOKF!jU!qx^rk18`HiSjJYP+f}8TKV_7E~g7KMSp(3^0Biy7|Hck z27I(kSWmk?ekEC>j2+-q>F*Dh7q;q+YhzTM_7OI5$-G;5-_Z^flU2VZDX+93bh8Iy zL5(y;pdpwtYCUfceXwpD#$S}^OAl!NRp>sv@6yH^)c1iD(={K%C!Wp%I;xymT_JZq z^Ob_6jb8y%9cjz=S-Uo$)V*GqdZq5-fT>D#{i&m^O@Otwldw42c}O$}@tu%ao@3T* z@siYjIg7YEd{iI2DL2CBR>>)$bTrkG{w-40+G3P8`0rNd;w}AnSSxM6=4vKvS-&rr z?g6!w_@slUr#tsV-iy`g-$`diMT0Dk_MX4dg{Iv-SvY#BKhonX6Q!8yDp;~F>=yx^ zKwb~BmcFDivZ`MJQ}K0O%Bx$%EqxyhB~&aHC59pS2l_i^ByBd~lGwdq8?19u>8T^# zw@?gOzYrEi==gi-iRR%sYsJeRfpxc?@C(vRjSs5VcXzYEs9DYC5irqN9760b} z@AO)*R*=7#c8X0zpGEbU(cJbmtnXUH^0V8}moa;%-MkK!gGV7uAjN-Kr^>AQ6$+4P zIzWOno58%T+67EW{eA?NE<&(hj8Jn@<}73#UBXo7r{-Ur&wBu_K>QwHVp*vymw@@j*FH&5HPM+3l zHC($^=hp!W67g3#SozIwefB(d`ul+vLn5T-!rO24bJN^TdP&vHdgK>Q2QwN$ zlypx_BPB^`S0!w^xd)y)j2qV*gf%LB6#WWYzxS(83)Nd%r#zGu5ZFV!hinSoSHoMt zJS(CP2i=j&)6}~zmCciQdaYNBWXy7X;>6`4?bo=+&;d9E%>wAz=mZj6ihzixOzxF- z-uN3TSHl%{d_RgB;A%5NdS4=zx1#7bpPka7L;;4)sz+btbtG53Q%&6)f3F&&7TiBB zG7O63tz8s{Dmz)_;H#>?*}|%|y24jfQx&S+WA|@_IRn|5No9ND8vQF6O*m)S_Jytv zrDDo0`-q!+37U!aifh-rck`>DkvwW#{BUm3pO(~rHecr-bP$G`zw|N?TPb{U z)Tf}d|5^)C8}OJ3eBz7;GVGk%eQk9Ps#JI=vw-88Yy`Z0=u6g6c1F3_y-`Uq=qIHd z5o5z}Oc$!K#DGTG#0c-#lfHV*CI_VPt8qnE4Vt{xe3#~4S+YT7Nc!92IwQi+eRaRJ zqQr-Do_{Q0lloKwcw(uqSzE0N|Hx_Nl?RtRlIWh{uY6}6Pa|s~d*|=DyK?k&xmsKg z9EYoIYgK7QePORfiCNp~8OMBz1n1s#$aivchUicbrG}Ykz4oS_7h@F7lC!y9?barD zF1Po8A9(k*dsPS7U*=FH#=>5Y=k4Jqv)llH??khOqC6)0hVXGEYyy9sRza3$%=-^je_Pl{os#Rm0zdIdZWx>LWU0N#6%0o_vT zBQS$GIBm{rw;q>`^%+SeUEN~kdD_y)^_^!)WV3r_y{{7wK1buz*svi{+2Bs;nCwC3 z-7vAg2-K)kaezSa?)VlN+lG&Zm!N?-&LjfoK;1 zjQy-8uj6+W_ubijuxdXYm_}#RFCO#|tZS&X+i!Qw$^qGH`bK##K^Qx8>2AFr)W)%yEK_D5?QWRSsSHuDYnwmnaNo6TXjC~ny9=)Ewp zxOsxna+nfeM(-?|fMKXBRF`-#!70vxAGf0dEd?V|PgN54H?cltMN zx@tJJvQ4Iphb~{w8Q`-5jM%i#0QqzZo!JsxKHg+s|#vXqV&t z@8ct%%4O3%A1$p-XEf zjjkLVO6D2&Eka;;#t;Zp{HOwKjTW9gE)pSEQm?DhR0;3vNvRZqOA{=EQqQ@qt*(CK z^1`+TUk^!Os_AbSZSs91o*8Cz#HP3+v^ye1%*AchE8>QCwcE_wKOV&zJnF zZpLIVdnUULY_Mt;`v8J~EqEJsd<&rvSwMWD^c3sHxL(Br*35`_Ki|j1>2=}#YW}ZC zU1|&d#)F7-vYCHJPomlHpeDI=v-tNA8>TBVhsj}pO!T&C*SU2U5)e|uG|`-KocW;4 zpwY@DPM)6Cf?{t-lPSRbTtc+A*5uuK*KrcD0KN?JXMFWr9ieREGkP5Pr`_dntO`*~ zxo#F7{p#vxkSRC=osz+1QrW`; z*V0$_26O9|6^a@zb#2tor01pW`pq6inw{%r^JI(TT&t~o9@wey@*;|V?qG6N#o>Gd zPFhl}Jbb8;jZUX3dV84FcQ#pM_Y+?Op=aR_m44}FuJW+wocZNDhjP}9 zySf6KE@%1PhR-<_=X6l)$JS3!!eza(2-(|qrMhJf$Ja}iO)WeE0BiY9%j(!@oT($yEHxii=iV6kz>gu( z88fWE*7Hqvt2y=YAnuZx0z7I!$BFBj-F%*F2`%jxGk4=jyFyR|c%?dSi0=!OD-TZeAowQ@|ICiOY;s9eLyy z5kpDsgCKNugpc&mjfW4nMa3GE^=ju-o~yKsnA(thC&^8T?wam=jugHfI@hO8tu=N1%K{kPIHmD#3 z{jlS?|(tjSa!t$3JD&hHmucQd>=D?XeaL_5`zz z^vO((+M9fFj`@khLF~1a4bDZB<%;h9B+d|$AbXOu82@M?6;v!(8y_1};An#ueP*AM z4t->>dDmS424F`}5cde>rk5d|dRt4! zeWyRlDxUC@aGOhd%MN}Wh~3v{@N%V?Tq%9M1O!E3ONOO33pK2loan**eJ{}D4~VDv zMWxts^!;fgRvBq}aZ5@0c{q=wRv4?d)g^h?zvGV5DBHgP-i@va_38iup8Wxyf2^h9 zJg_nAXJ)?xn7MB<0s#5R+&;%k#z_a~ReM)ApEwyEx6P&?0!MXReGQNP?j#e&T0okE zxZGX%zXWiJMRu6fnJ#!AuH)> zr#eH3F%4UF<|N)5{WQhr_fn=vAWmbM?&e-6H9AL06DmTaV>=*8*1 z%0T73lIe$0bsB87;4w+wCvUtpQNGIW2`SW)lzS;M!*IrqP{F8pX!DkO?73U|GPuoT z1Xj*`r0&{HL%du|)?x-k*>m^)X>i|H_5h{JAAV=0BV6Lz@eLm8NRs9g=gHhJeh%wI z(qkY-*(#zexNQX!wOr|?bY3O63wEZbY%m(>)XSnYOjQF}JwExVuPIemYGu0D;-(?B zwy%e#T=1VcR5w-=iKbm)f@1Ta+#G!%cZCW1Lge#e z(!0K!$qv6ed@7@8{rMMO1s&9_LRA;Ikdf86mJZrJIFF4y!BnVsfkGQmx&BV`#2WZ< zq;$V&kZaHZHO`hJj$WR6-Fz{*VV#oINgoc=4FZdEbqSmP)FR)mg6!;%&;s#xb^-h9 zHjrP%;@q2%`FMQ!1_snhm)$9$zob6!$48bber8diU@XFS?x)lZ962s{2HAGRy7~0; zYxWYl-rr_MzKQ+ZD!mF)%Vm4btRps1nog*lwCNsTdave3Sm4<$GTl*{E#ieP49bBW z4J-7JUx61Kn49k43=mel9yPH=R>b-d+d&I|ZQ7^#f?95~MW%X^sxay{i$pq@nT%Z? z4W`k2Tdy~#wOH^<*~&mULbmYtIm*pbo)iuXZ5*@5MOcJW>!d_Wt2D4JvI{ZgR&Th@GAv5S!M}n zWYk_ov8U85o>CXhE`Ppl9>H-~7Bc_@-jWSD_Da3CBCoU>J+b^ossTb1P-SRbf;#lLpBuG`s5LZzbWaQ`{Musu#KDy9V#?t=ZYj$ChuJm=hECtF)* zx-VZdbbJUdR7Ig~tusF}xg}n>4l!x0H*@t*dbGM6o0VNuJ%6iHdDaIGOuO&CHNB0n z@^p3DB$*_EH`Z2s6m#oAODuNP`(^f6#kZK@S58<*+vFtmdx+B|#?Vh@Tqv5rDz;rY zY3COU7b#)G05V$J(({~rvHiYXPp$5BrWpLYbJbhTW;rCv#Y??OWarOf`j-!X`>ykz z0ib6;8u#9t_UUv+G#mTWuRT3gpNZ*raWb1|zx@To=WsFRu6ZCX6)AR+H!RrD!Mzl7*iCD};Oah-tprWSDvj;Z;vQL9Mx+YJC35_s>Fa{mP#}3O@HC z(XAiwPL;!9szJ*6;pO^sh@d`POrofbTz=HraHaNqN4?ok6SFqyiJ7|XzH#^2mCiFM zH+wHKzy0#*A9*Dd7O(VLT#g|XpOC@X%$M?OvZx_(X`gYlLwc8i!N|O(p-#ID1E|SG z2-?3Vv|y=0c7N1qr9`o9y zSQN+lh#oFp%suD~YWj%y8q7;3u||7Gzznin5&wQODJupQ2a+J^HS(!uZ;D5LOQztl z4ZGWEO~*6oj|vcewOH;o&~L&OdMXWa=86FY%;%FYw#3t;?cDu=){iEbcrGL1d7K*v zTe846nvG|XjesIOJ_9tf*uxep3jdk}NTTg!J%c#1w3roVD{&9}bcJ4<~>-PMm zBA#qC+HiQOoaXNBk-yb!SZvYXwZ}Xoi8E77lE?k*RfL_zyr08&h3os?yw9;Np^M_| zxU6mpFWAl-)%ymwa^H-i957k)TS4L2p6<;)UOiypva4SQKypTDAR}-Cw%jJ&hTgBEAOZMFw7K7ataV z*z}>CqJ^dw=WxNQM5Rq7X9);|(96$%x1o*9PkB(Qjof&}z-B@#@D~O$@uCW|I$Rm< z?Jh1^yXMWX=T;9)-jitFZ;-FWis&G@Qi12r3;Uxn*PDg*)4z{^+mZD*ae86uwf~iw z!w7H0UHnYzi&4>wgFLHa4aQj>q#0!TQ75qTcS8I@2G%uSQ=3zWMqi?W`+3 zX%P>mze=mKd31b==zXnvs5X^@?fY2}!>n15#sI~SlnhvN$+=E$NMBdOqfn}r&foY^ zY52Q5Onbf)E;>8EU|zJa!+UyR-ZWufWWCw0%GT%C1bUfSf3~Xh%m*;EB{IMy%mKH7TlLQ&uiFBF7PWgHmP&7dt&-P9~aS8 zXP%!6wZhJ`Z_=&06#(opndDQyIYN}tE;@ld#EFUd)HPk{d`-<;vIV(AFzcY7IvE*q zo|n`7Zd{W4+1z)%usnUW5m}U<3iT8An>;u~Tqro)Q$MB;;nxm0Th&@|UD>rCd1rZU zDV6$QYDOFL4*nQ;je;k0&n$KDJk;dkJiIrx9f6aDCPF->%(_vA%n7hM>KoZIPrtk9`0j^oPp$;Mtcy4!!qGz z^I8ecqM#@ECN2h}gLNr{>#M#GLMgqC7xWBzrz1cI zQ@85tjKE*5dvb|r_$XT4fw%Q~=O6QJv*(=S!b5SNr#o5#V zhg3s*Ff7sfKJ8dXJ8n~;PC38Rnq25#AG(urYwI<=X*F5Fz-mW0GGUTlf8Q%|U$0}V zq1lZ#XztJ3)uE!Nq1Y6?81|ThcE5e@ zB~qmvt~I_o=##ffXFj)$3p%W&&$%Kypgf8|m(1gFuYf_f+Ms26RsyQ*u!jkpBIGjL z$`*`D&$^2~!ADnyL7do4Zx2!{(DHFL_f0R~9p&AR1{ulbGU;Lnc!IwDx-L3}AKQ%l zW-&dXC->F;W9`aV?I7c#$ARsYNX^&t%52gdSGMx}v*Z%Al!Ivg5UV`iGi!wGupCsY zw_Q$XSLtreoc9$ACm=}QAcfe6drK$XuiU6p;1X)mV?Fg)t98DIYt%Tr{;FoR(=-LG zoGT=oiM!g*ZZ5=#@bl7uzs}dL;?8bWdBOSl@`K`|3KuGk*Wi+7YOTOe?ku2M$eBPa z^5@vgRY+*7x2uI*bIbh1urPmgyTGd|mOI&v{@WG?8I9gxkG)(=sE7Hev>w! z2Iojb{0Wt3kyy@Xl#*%ngk^~Md(YoK$4l$zoZ8I7WrhqiBV@2L2r20=wU)vjP??56 z&!v`{U#^#TdDV-+^n2^5*GABM{oxNZ#2QXFxjR zd^u~&{g>;GiRDmq&29VVHp+Xe`+yYVt7IQ3JS3I zrVq^XiPv#l# zxYB025E^v4$;LAR&N5NGgVeD&#`9*1ZW?c% zPoF_YRUabf52IYw-x-wWQ6pKr7b6S>dUrb!$Yv@FEFLL|MJOj#Ms_%)-hqXGnw8TZLerlp^GL#}fu1EklDFYuPKA+tKQ-r=;-J1=dJEheZ; zr;VkUqfzBD1n%r^4ts)eX}Eaqimz*=4vMXlqu08~#Sui`_;jiDY69OJYE{C)Ce}V4 z4v}&kRWr>yqbWL>o0suVqkeT-UHOJnkIZ)X^2lfX@&)2reuKa@x~WnR=>>lgs_=%9 zOqTi!hk%{tLC1K+ZiQ8<#?A1=AmaNOY zKdb6;;b)eU@j&}YX1TqvK`RT(xb$SWlWcEnrjOZlJ_|lNx|$-rjV}z$2>_CG35gn- zX=8v&kquLXg7t(6x+v=Ao5%4aa=dxQ4a5$EtP|F@wB*5nY0js!>99dvqK^Smx8*u zbRYek+M0eZaM;(!i^eANe8F-f@gVH-jlGdH-ZX_{x~2x%1Yg!!E8C+F^`7tC&;!w# z{21nWU-C@a#*_E+_MSo!VKcPfN(zNW9`6EDRCw!Qn@f1uK%J6SOZK%`{ogb78IbNzi=9Z4!#P&)*+b87w7G^64DHv(_(pA*J^v?ixw z5_a!@uMEJ_E$2QnCg~7oR)k_!F$m)&SZbCnW`+_ zbmR1M=JM-et5L8XYvit4cJd*H(e2LesPBif6q_>77o)1yZ7fjRDO=k(xrcyl0s4EB_^=}2_1%l`5 z@mPIx&mFA&=M$zIWGFr~6=&{WFq}*FyL|E+v`*cV z62ecV7I(KbWg;o7CFSgIL$YxX-k*L_X*j(!X&2F`J9-v^ubMji1t-m1qX{3Zwx5cy z&X0tE%_{}LV4Q-i%}rp(zBJu)+39-Pr_!ygSM6Wl`JGi(m;C+L`bEp{tHgu$@D}x%kM2KYl9mLHz6=`*uO6-rL@Db+x&?IS(0*hIP+g&jI5t z`$O~MdYMYPFu~xuOw#VwK+BbfSoV}=k!Q<2-Fxed_l&F8*DLegO<*ZTycHmx+1D%D zq%^l~6BD)SY)&`d=c^``d(2C2+uy@a^w`pwD2pLH8k&vlh}+Te^^~47L%?8Dmdo?T z>(f00fLpDBk3v;VwDnDv1C57|y|OK7TBfn%w(nw9ou73cxjDzQddy&>fWq64)kLpd zzU$87u}}8;`Lped&|ZG`(dI>gu$jmkSGTp6mwQx%>VUbpj%HrEoi8Jp*b`-gr=3rnkj=^5xo<76JTxSoZnRXQvoz5*%7np_^JRo(q_@y_Y(sDa+A1>9Uwb z+bZ%%jrK)CN*zn(16f$ceBl|dSHDglN5?3D&2Ck?vC&EC?<&;)b=C6@ z9ygatlLg3^3zXg%Y!{Tiq<9eTDsJ zd-K$@Rid@b?u3#W@l@`!5B44fec+7u$pWSTRe`X$e>>l@dC$5K*KWAq0nrKh> zYe)hwf18uBM1Np4{4pNl&B9ZpybtV<_Fv?EP@67OV`xDez2*bvaOG!Fw{U@{Q`_8) z_ooJ+)lT~kw2!gnLQqE~$TTM07V2c%Snr)vudfb=NU>Mkow4DG+eXgdjC(_1?yMKv z8}|SsW&Um{{>}K!;IFa3cT{UAE_;eXZ92Kir>QIXZtjUH=~4k%6|=y&}-E{j;E9C&!3^hG-X>t%gbu}A+bZF_M$zaygu zKFtDe>6r$7F%D*+&v-zjZkOldFkg*c*HJi3CTOqvuHeuXv+wy|Pu|ZmkY6R#5D=+$ z(!2T)n%?WI#sqCGA31zCi>WF4mlCVx?O%=p>nP(s>|oE19JyyA4-d*xfKEu`_2tO#wdApL3bhBL=%Dfu;wcGwi}PfA=gspxxvZh>b=@wj&BRy(?ojaQF`lXTQZqI zRqtNoo?@sx_G&-%B#wlZj7dyG7UcC6LS3-#{4E&%Hc;zNe(jWc&$~k4z%G2&RhTQh zUc0kQY3iZZfbtkdkzQZLxu@COFvpKOMFPz#St#8+v@c!s@cCwd(seH*ZV{FinN8d?Vfi$b~(!>x&)Oa7@}( z;IvP@G4XAdy|7@NQ;T=faoM1Bp=?JtOOto%@ zf>kfMulY(V@0$#QzpaMfc+^>WPILECpW6sYDTVsScWhS4?qh4S@!09Kpj8I4P?s7j zqZ;pfooRT=}9OM?CDM)863?!~Dp9RISiZI4H!sF|`+;;>` zwNTI~J5X-*T*R&4)UmcB8nlt>oWS=v_to0*J`>{3uk?Ls{qz%wmr$%-OxA;v(wxP* zf7^SvIktM^51$;(v&6hNhc}4x*nC2C#Lh3ZRne3OxMTt>0dB~BkqWv(32^}K>}M^j zJ$?5^L{9yEP)}diz2K3WW*XG0A@! z=*{X?0kjy?19yYFxDJ{~=2}$s^p@v6Sba?~c`#EeT~~d~giDA0v5z-@kFSt(kbb>V z4STc2E3&rB7RRNAt{er=^x*IzpL-B9za}re*lbI`-++$zmXv9wc5Ga~;jI$b5v5^q z8L4Fc^3!s;E3_s-jM?BMoqb)NP{^{0%Z_{jpK8WU+O;iFksl~1XXWnfa`9$Mj=FKt zFs59i*V}b&{CqmT!F29?A(2STOt@pte%NDtN>#$oejO;qoMNr=Vwz|gBjRDzMkPW6 z@$0RCRx;D4tv4TkgXB-GsP>kBSwYwcQC7wSY4~ltsZN(|7tKMmh^byaSoc8JJ!wj% z93Odl&S$gZr7 zrMv(lC@^?OyXEG@-sLst7eT6KzKWLGGD{V-z-|5T#5WItFMZEJdd29bKHNm z_yj)yV`P_=*u16B4mmPiNEh+Sh1mE>Mwx0AVV@4694pJXeckWCNwKNae#HZMI}K+a zWE#A#r8@4WG+VOk_W39854(nV0_U8!=d-qQIjoP%;~B1RU3|5uC>Ye8uu)-QvN|!C z;Z18iVL~Kq!HH;tL04D%H^Ke+TvKDZXLW-e7v0H`!{3< zD>&j$&QW+)RUU2gS{oj`MlO?Iw_=-e%&ZJW-2 zYBTyF?zS4uSbeC{{|UN-%}2ADe9F?UR5exqcwIzAug93K^xKp1qPRW2W&;_3fr{Lh ze=8U_Z9~2k(&N%27<#ic^#*mu@`+9H!9&hoAylNp)HD4H;ILoKcB8H3o~Ro!;gw}} zIfZH?sbKu?=>L`d9QrdU=ysu=cBvTEBD0rf|qWfOPe|q>ZqWxpR+m=O}q4nie0zR_;vUt9jw0K>r#- zDEd%SH*npmALdqB@6_A-dtNThToE8E#c>Tik>D(1Hq&Dsmv!bY&PYspW|O5A3DaPN zLBJD2nP)yOFXalzlq0avMU~FA`0DgcpbrGvG!TZE3~Mb2kMMKvms6nIn$hwzr~I+A zsg~M6pN*}E?9qa`v`VO!pvQ*?_}GtXE7cGAnkFG}NVs@m$0Oo(^t-8A8(^f1)~0qL zGSHZ(hX0Jv_V7C}5wNCopSNonPYD@x&VpVzZ9Iy!Eb6bz8{&IHt~s$Q!Sp5-IwJcy zH%5P1F?w-1-8#i6E==gY%W?1p)6;9?rMlS9Z>!zGt1_$r4X+@>UdHLeX?vcv{!WT~ zL3+Wfkm}uR=v{d}qr`6TB-hRi`W~w*&3N>x{S}RCxyAY-O{%1O7D%}xNMvPZ_DIc}W zTnE=%R~TjiGFc#xKf8MeTWqbw9NaoDq>U0KWZFd28$pmBsYrZEy0}x}4g8pPLg&ku z0{%1#=|t>hz%-&89gTT=ZF)G&<4o?6I<7nb3Fzs|@F=dyYYvO=PY&5T$7!ah2pQ+H zeNB$jc>5#Vd`H~2v~9NwF?FE;#)4fOJ9b;}E9k1AjZ+m+*vvMs{D7x(tTN9*{EH8@ z*%MU(7J<&y*qVNw5negz61tD>&U6b~K~Gh#)Md#|-piV`&&aEi$W0#wb zccKbhx^x@Ebnorsl?8jQTX(*N+_s;3WXojB9E`tO(OW=va46+L#h^Vj(6Kg6z~hW) zSVcIE{QKM|eHiL57*pN)|+#3pK8`YBjn zsxS%~aK>Uf%%4W!Q;q&A*q}i=^K;07=yB;iF`zr&1L|d|2|3ghV+b5mZw|b*S14?# zWcymm+bBL}Es%aSCiwX~?0vZ9<04KWjsFU3;k|D$w#y^x? zMt5snuJY}URzB9>ul&6Q+PUL3kz60nk+cO<0crwq>Xc>QMvtOedChDDPFCq+c1w~n zOwe`ZuQ+HFg(77X`^k9^I})J)|LL~4iRJ>ZwA0=ohV|=}al2_cECuZfRZm|+1gI#x z_6WZFLn+Phli8 zaCxGq_mhsi{duXQX;8z1Tc>kTXTwb!zF?k>t2%pJTBN%EX3@Toa&u$8H)=Wc5e%wA z@jW{#mVeswj(Uz$UxWpPi$5XwLAx_(UXwq$18B~#;x@;b#ceXK8G9(!y6`l58>v;f zX4)5e2gsGzayP<6C+~FH*_(w}wdUNIhZvWueO}5jG5fi9%AX%a&;`jT)aHl)z%}uG zl$>rrX&$Y_8<_6)fM3J(?EcN?q$4}&AP|~bls$A)PO=(T?E=Kon`4g-{wjU*{;0vV z2WY>tKft*2SJu*dOkcEXy+t99<<7UlNiJ?Px9*HYR_lBq+T*A<ic*X3P{0SU zDPBnR3|sm|hCOOWF#3%@r$4pkjpapsd3lh(@Vb|Y%jA(?KoT6rzS=pHftRzjPX^uV z*1Q2kKLdFz$eeTsPimSKmfMH9HOZ|feiH_IS6S<+Iwd>++v#{5`4TD#E+Q|7Y2t04)ko~qO+lgsa}ODg7)_h7q|hTPuKN`Ai2k0;d~BeT4Jt))e3@4S>2BbibIPX&5)W4DJmuk7y>9 z!&@BmLG`6?rUZOaGy1D%A_UE*{i9F(l6cyU!{!jykaKBpObvgp+3FC>7qI*YFRZH> z5aP-S)~h3lqv@y&HT7w!na|$q-fRKqppS}&-)IIeu(i7_xbz%>pIta<>bv}hzR`?^ zB$_OgxhL65x>nI2b7{c_f%Yyz$Xun)xU}e+Suq9;ETeQ>iJ^j!Al*W$i|!g1jn(FZv> zrPZM-WjevzAucE7RDK@;o!2_S60GV|`RA+yHpW46xJGP)AD*z;f z^3yCNbNI~}2D1|{a^d-GMehMPd?4Ti_3^j~L$GnCn!kTfuk^@@h!K@vvXl^ zDAEVPhMZP;mO+B;saGv*4$F!Rc)Rbav#anROUowA7skI(a9-A0tDf_MGil)s-t=kl z?{bMZ?j%_pm`!OFi>Fi*fgInWlC=P^f^}xK%1K@M$pXWc`J}VFeqdf5>+EYo>kYpbO;LhnI>+2gkTq>FFgofo);<>*Rqc z)8eL4dIJ=VA0En9y}7=BDl2ZZ?VB?$J2?S41Wuyiqj&&1Yv2?r7bWgu30K+A@b|~5 zw@SS)b2wnbyqyNZokzZUKq$fM)uupNVI5j{s+_U`%q-V}53vJsxYGnCILV ze)bcbI957KsyJ@U2) z$Nm3^I@@kz*|iOS?_Y>Wc}pbkuO*@gB`T33r3n9j9rL=MF`jR0jj`5!&uOCbJdSdv&)%Tm!9C4Equ_Npm|%|S+CbkNSxhP6~nXE#7kgZS~EY` zt5f1?kiRM89q6{tK-OVSOBUlD3;x?IZ&Uaj1xPFmb#IO+XiE?aJ_On?-!pa@ZSKNW z3ovpRoT4%P%2|liVrVAcONCJEj{AFyla@UIo(TMDRehB5rj_rs7HMVE`y~ZH2`)Kd zWZ8B2;N8lj5#w%GyO{#cT3%|TGmmnQNf`SlPE>y1SMSpv3ijTJIlq)NvRo7lg zHazQbK(Zc6wmf&eF)=YZMF@RjeT261#zNtDkh z=`6q2s@}Uvj7u_hLkK!ii`Xo76)tQ#IRSoo=U}{QhjL9CJ2q_E79w(7?j2vfF7+RM zP!tsam1JjwHZGV7mulRd-lNtVOF6}3(!fWl?KXVwxDr=L5!a8k>tX=2?Pn)LXTnfMQEDMEW0AzisW(n zsO6BX?ne4~xkWoLC}fe6Xab9lW3C zyfhYv*R(X*a$R)FwDITExJ^{pSrW5Nji6N-Xs{~4ybt9k@CnH6H^SIynU5u{wae~% zP@E({CKkFTvsoZdYVh7{dhrC=87-lV$LZ|QFr0cfUHg`~IK^CR?&(ojK zNpxF8<%rU?VF|u+?`IHnZ7pZKU~jo8yGbXhbBUGi!W*w&=9L6b;WFSdm6FEvr?3JP zwK-W6Ex2@1ot^XztXYk6FHabvE$B$ul;A~NBoIkSTiL2I>ns8Ot+B1u@nN z@I<^9k;SzIXG}OIX$>krt*4x!^;ZC0poK<`oU(cKz@gzy|CrK{OAoWN{;6ia%G=G3 zEML-G8#BYvLT@1M+n$meX}T0^yu&e_nz4T|1twDm!I=be(m`V)AAlR2qBfh6Qk#gQ zixb0;#{%3@fy?d8v}DQ`RhG`s!Jv)*6i&qT)ltGq@5 zJh5*~^&jAy!*vEsI9gVPKKS+vm9%>XR^x$mchYD9ku%?cmzokDzf0CxZdE93cfgm9 z+r$*RuDT*9UNaFUXJm%G%aFKMStl*Oa)(km6T$c@_0p=D#tZ?(z=9yJsZ!bJAZrhTZhz=Mv0@2%Xdj*Dusz zI_;QfS)e_8HrQ1c*iN`qzL(xWl*X`&tVd1SJ9MY{c$#4BdS-Z#4xc{8GxhH^d?USx z_W7g)7-@yw6uj;UZF7L4s=_uKohFUqJv4kb?`E-meAO$>lD2=@=K6GMv5n0?Ee2#} zi2<@)&$l#-Z;T6MPBzeD2z?&36NPtDD6Fy?W*58SR%|tomFHPF3Mg7ol3?o6hY;1o zj)8y3kyVJ0jE3=`nr-x-5%59=bd)9r&^kUYmPVms0{wniygrZnsk?YKBanO8{Ah}| zbdEg~X+Q9)0uc#??i_s-J0O`onqkL9XG0W5rSNTs_u zgL$1D3db2LiPuS;ZRRFeqcP5< zNBC?5yF8g|ctCH@o|laMsERK^P?JuP=-4m)qI79}LQ_BpRDkbxoaDkw&oh*wVoOZv z6nkXwe#Le?q8jz({&Yra)A|K6hd8=DaI<4$kKgE#=Q$xHk=Ypvm@8%bQmghPT8VB2 zJJ|^bWhi}bH+8q^>9^Fh#@+>@ZuWNabzDK@}UWMdVBZz8#zIc{Gzvel2t@l^t zth$+09%cMWjogN{-9*q9dt#Wu6aA7Q9wc<2Yli@s3;qYDN$Ud7Q#Fzh+_^$Et})D| z);GBHcHD4{>TKGTs*z4z^IY@(GNeQFv4ZW*QLPY>9sB6bnzO@{fLeE>1-tcp`K)o? zYJA+ty!!m<^Fs0lpWeP@0bLH4pFRL4cW7O0^F79F2uzCAk=^n2SZVgLUEX0u*g3wM zJ>tAO<-GVbrE98FJ^PFK{s1g+Ep>%HkQNZ!EXgzvTF!e~R1h>+)M40WWzF z*6-%qB614(luyc6J~0e8L5b;ZP=Z7!KFV&o*TX3W#!q>vJE;Nju`Keu6%y-pB8P#R zsl5KiKy$!OTt4C_lYK51V%C_$8>JYl%Oqczt!GRK87*SlRey6-WUJQ!5EVD4ztAsr zUpY+5gb@W(mP<_3|}_O z@X^kjfZ6e$&?jy3DR5ULja{csy2FuQF&6?;L#F^u&+rXtLk#7a!TYlUS=sMypDyG{ zoSN?jsr!n#b%8ZG^hR@& zgj;PDpnpNm#f{R1itgYlAen%stT_-j;)9L^2LWu;fru0S{+I=)4O92*j;g$Y?9C|U zwtCKK-MQqpC#eJ3-NEP^klx|=NY?txBR%gu`#InYb@hp?pszDR+|fMLhUTcrMWZW( zJ;}{1DZCWMm2$oH?UCQ%TE6r+KWD?W52vkpwEPt2z0GX2U13&a^kh^zd=Z$X?3qNt zEBnn^zilh&H{gsf@Vy5Y;dKGN85R||+YX(-v}-}H!~2w@}_E7j+23#(8L)_Xzao8=o;0Zy50km!R4?2vM~ z@-CC{I7Ekl@FU%Ds-Tiyn1EUJP9uH}<(T!gcVY^0df-gc_lqI>S!~vCrnQ4V|9m=s zoJJ3lnYsw0G^jS-t0u!QW?jQNIS0lsO#`%Uap*dF^QmzU0^jL05ZJFZ3yKpopht{Pxk}EnKQu8N*GSNn zd*4yDp1Q!-!xczfgRZfb3$J84tz#fZ!sPMsoKs~9tZkzrvzx#(Ve*4=t)3)jxHvph zf2&py9oM5hR4A`cc>0<9z`s^@#K-vnN%9yBk@Dc}uVwZ)zJ{lnSKTykx$2wgQw(Ii znIivm-7i%6bX{@ZKW13iIA212U7HTGK{fO)O-hYd_g6szz}8o!5bB*Za$@%1F^>Y3 zatTjkNK-a>RjNVw$?lC=r#Hk4Ou%;Px!-;Ed~(iX5M*~F?ZR{q-*VW z!x|?u%d^9!%a@)E0s^&Pt;Sq<6e#vay;GwyV?sDrbN8V40Cs=3&bQd1f|pOM-X5)g zpLD|>eJ_u?*`GT7dC}=^TEH=3nBg{`C3^7?!qAp?evAh2iHU@B;MISpWct>@c-o53 zuu1g17OR})KRs#HeIL=cvTn~RC}s$~jX3Fna(LWNb7$&;)~>~Vn)sA9*&`AhU`+u-cjGmX z`nT86L4ALRMLY3gZY$61J8ar;+!b>x_c&v2OFMNj*1Mh?FU)(Kag>PX&4oNhhPeO4 z{v>#OpO0_47Uz3e*IE!NG2_)9{Z2+B=bhcv*=#2FT&KV~8|=sJg(!CKR$#ZU7nYOi z5dx1Dqq#2=fM+;S*)b7yGV6}GXALq~)V|kZQ(6Xt<32gX-|YRColN4$67x6#y6GKv z^gCcp`euI!;H!oc=ajkM!foFBooDXv1mSLn$aYE-Z1=Jn+sjQ&^Brcy$n_zB)$Z7* zkw2VzmkOM8dxD`=r{W*^)#JC7@2LQ5_3Y&D(WdVjiC(=If7tmw>hihX$=MHB0R43% zOCbm0rC$vf`$@6QtXkwuPqQ-|!5Qr1ET_j-idAe#vq5S;^d3upJ?-h(L_KHZ5=3u$ ztqfLDH@Dv>AvMBF2oNwiB8@dZK4uSz-IFzw*Y zk_90lTe~qle6!g6O#%?9c(%4-^j4?1`Zk9oPu!Jq>#GkmqrPoG+3e990FLW}z;K0w z(pp9?V=B+Uyi?fnDdIqnx?k^oR7>X%JyPp~MqYZaWQf6PpuJx-nq}uGc9qL|%PyHl z=7f}u*#1IFpx}%fs|T%I7vs79v73ALS@~H|V0u-qe;aLPY zVJ}`9*SJ5l5ua4(8QY?nHrt0*)RA~WbuLvA1UPk_J?yUUD&r-Jx&2oET?e9xp<_Q{ zU<{;QatDE;esI2vl!a)#6<@-iZUY;4?7OfJwH|jYwK@h38e)UH``F0A(&G9^s_T&4 z6o?jF>4(B3J*qs{o2}Bf%)zOToQX!g6P{AFf$HMwJTpo#Fy`#uTL^vL0}0nMg99CX z$7hj9E}K;)4fI=LPr(RQuGI$p_8gGxK^p;jdZPlLv0Hz;&e0cIdrpGsA*2qp^&Ezb zIw}2tUSqtZd+x9UY{XrGco_)c%G_FmGYC<*5T_+THo_BjBqNB^gTi-7raR-(^p6my zhgxO~Lw&Bf@|I|@Ce?KRrPT+=3#>H7fa~1m24;58`S3McULFx$(`Vs&L zvS-`m;Oa?B^@RGsutzpG&UAvM(sJaauesG+Jd{BUAp&W@{JkSPS+^llIqcz3I%FOs zmR6nBbgqseo~2Fc1EKY{N1?VZj*j8)1BvLR8)q8Sc6O=qqqQ!f10sk#5sD2!n%*!! zgB?h-`@aOSwy6hb>sX6cjW1e+=q#M&PIo-WU{K2r-tFB9g966y&JQr$Z~HZ8mwv|k z5>ghYLt!9|Mw%E0!m8WMb3m?=JFt2zxO0MQHyO|&S6p~nT!P0o{xGsL9Z=_i(<&~G za?=BiOtXYE)|(5|b0^DZ0YfiXt(BM3Hg^X3vsA;^_^4M6=_7%+{*HKZcn~V`V&FRN^S0^y=zAd-4fh#+-dQi#ry(&Sod%B1 zI?9t8)p$VKh>F}eLdJ$`E-DBhthin)Ox2S-1t93m6K$W4*;@UvwQd_XvFdT0$3P2F zz|E=zZn8pu$nPr}cFIW@35&ByZ#}q6h{I!N6KG>fc~4~C?afSMvU&|Rwb^>(+yT>8 zsx7v+G=ws1SzO(G8=XH6pfPe94>IKH-|_RZ7p91mmLZebG<$eD{wyK2`76Jb>0qUG zs+vrTAy^B*vV1xv=l*;$dw9>nvGV;A!7hz`mb2(7A9KC)0NPyl={v!T10}ZJx6k$k z2JOlnFtWwhw_h7<%DH8{8(;1jaZ?5$sl{V(HczrwUYrM&X7BWaMt(aDf2jp{@=o)i z2k9f72ZZ-JfMYD-cDEppeow;wjDkn87vS*x09yC58N52f@j0`0R1LBgebdfHPedta zc8+-Nt>exBd3J!?>1FO^wEgyjZqf{~zvnl}t$Cwv zNO(7oxliGmr)V9xGVKGdk)x+A&I|3MhC{T8q)J>*b=>K*ws-Vzsj@?Hlmn}BA~5Ho zkfBZO@di@SEXNVXaX>rQawvwSJ5xtjH}Z6dH8syoe#N3A;zMW2Kdydn}N%1)vCF1dZEcyJ|FNn7dRB6~~oP^JBxl-iPew1f7b z#AXFN7C|<9@1;5n*4)&`L)s$&vzcK9FOQJ}Vce<>KEv!9cOR$Qp_D8Epy9NE{8`Eq zQ~US+FyG>@Wo&CbB(4-{P~9ng3)kv-(pt>)UZ1I-rHF+(Y-Q+cEUsg;sT}T?7DcPdN$tEcCtp~MgXbzjP#D7>^H0aSreSritX;;`)2zxnam(|=XHov z7Rv{40Bd=X@4-sjk#AGmgU?ZLiN^M--P8s8iS_w zk=|{~F0p)lpT)OWGHCP~E$(2wCtvH#9v2(ydXYuePn`9+QNFI_gWxsiRgW8ds+gUP zrDu2f$FDB%!{>g|o@`pTL1xsBYlC}Svx|+VMR!~I{8FqFJ!J2T{6rp1W><>>Eld{v z%%`A-l?$m_{&uj73yuw6!zA15N4Ci8`bTQdJ_G$!kYB{zTh{MD3NWe&phCtn{D=c7 zz$5YorC+K6v9nj2J_I@EERp>SyV;bscfu)_7pu$$;=GpuTb9pUbwew-4D91Ai7-9z z4rGW!Z;(npsjYKwHK5xMO; zjH5Wjt@l~$wfR6KtyK`j%>pVjcP`f|j$$rTj20bR>+8iT(2%^^cD@??4ym~PA?f{i zL2fhH=^1uJLPXfvy_y5^-x;F7Z#IfgUBxdEs6$*v`A^@zHpj19NyvmiUnzOe@cY0D zMg=dUIeg9cJBtLTs0yJf!_wqNi5Jpr0YYsP9Re9_v7UonCqL>-@GvnS(~T zn`>K(nLp^id*fRx8+w!Eab`LTA8fk8dCol${%A;Q@RaEm%n(2eZ?$LXeDXSPHVxZy zh2ML^!5CpFR*Y@2HsY#e?FGod1ss8LpLV561Kj64_#*ICkjF3Pdg3zSV*0A*+Mn@s z!XJFxH;$*r`c|7MS{B^w1G&&*d|l=uuUXKHnZYH66$8k^*`#tp09W`U&OjVcjL&H~ zpyg0#F=wF*Ah)PM{i!?2F%ge$@Oq7oofmYWEG{KzpE5j;plClZJMQD4AYcZt=Zv4( zL+?f^*L!<%E)AC0d9-qFZc34AhFDI|FB|yB9QpQl<<~x#oN8f5R#v0*M1-yT$YK$L zTuK5Q!QrFef#~p`?KQb_1kRPq@-SIHW*o7^s@nDQcCRW_cy6sW!!-&JnYlm8atm$- zX*7@Yr6WKN&Q>#ZuG;Y%o;R!A!CFE|*w|D!fU~IOu-Xu^VLtbfx;c6=V)-NGwT4l@ zMUuZ@F-FDQ64_qS$}USF`e3sv8wIP z@Aw9*6fYUNm3pMYsvxu=3z-d+oZS;wA@q?TnMs}Yu(PWVu8ipZn7q zI@hkcwM(z@=n(In8Ra-&X4(0!2U+rq2!a{A2~Xhrr9eNFY&ggR*UeiWx0S1vG7;v| ze^k!w=rDv-Ao=<6Eg90vB|3V(mja3Mf^&zGj5mxd3*uuRS zWVqOvU0B7FuvQH0+k?7r@teLbE~=Y1PgNWk>^PM1^9;E9^kYE))_%<<3+^;nRK@$B zc4PZu;&*0P!sH#uSvT|K8|C}Rp}b;vx@YW0&_rDaW0bm-;92aPlnD!|Y0V=${AmgS z8tVg*Ri#nyxj+w6nalL*{Jo)k^-Hcr0A+2#Z5n&K8bw=9Tv2BGF9?9Hjr~a%edx+k zy*HF%uZ6-O^DYhHCu_Pb4;uv~dc?Y;-a?f=GYO$y3PGuvh23Za2fm?fw`%@sw>f9E zb&T}?|6l%;2LU;Jq1$Gh*yo#lGV7T~-oJU(@0dVRaiO5TZpGB4=3Y*fW%_8{8;t~N zvd7}Eo)qHAQagw6x{dqxpkr$O{HXD3vLpfhu?noPa^|3|yU3D^f(B{lgKj7L-5kVh z-*VVzA06|PW_Eo04$I+$uzsn@=$k5!4t6>FDk|e!y?L$zNC?=|2X!p25c|o!4Zd3* z0d}G@6h__7yw^<47GJ_+8ka?FB!FvIhmJ|qu62s94+PhFoUJkT6U$=84{B>gvNS`S zJ#()#Q~kD$rMfb-bOW5)G&*D&dRlQGN+S&su!PKWBZJH!O|s+yy>}+dedBulJ;Pz? z<=i~E4w%5_EDo9ljAwH&_J3C_0h+BKWh&W^~g)cgM?Yc=Sp|-2XXdH|c;pU^Xc;(fS zxuv~QdKLH%gj?BDG__9b7Sa2iM*kYd9s?g=AncNva(W@EhScJBnw1};)+ASyLD6!D zl4%DN)fQwoOa}zlUsxjLX8vMP7IH94Z{%7rNY;98n#14%nwxC9_gb|~UE6gO*17g) zd=-ll`;~=_hbH@T5N-?W?R&!GRsX_5EVJ|r5VBETv~d-_Kh-5a|AE!r>0f4he-clQ z9<6>p=>ll%=BCOiB=P8-hiT|CKN<{?8g9XAfxY>@K;Vd&^M)gy3!?V^_=t=AyzWoI zPSUmpWyB1@4H1ZHkYeDU?0RCiW%RID)(2rKG^_PWD~rs z{PU8w{?6uOz&^!LHc$Lqk9t%!I0dAy67d?{U``&nWC|G0AwJ)81)>bMJsrtFQ1x$F@UajA% z({|Ar1|giS^g_zyuhqEWvsO8k=GT`$)KW&f2R9VoY=;t5%7v|7P^PAH-R#QKRCAzh zCpoEb#|67JYs z<8ItAT<4!p^N-Bydks#9k;PYQtZK}$JVYw}MmEcRmjTvJ#qFeA)oYimdbAg!8}bA4*j3{C|)AieH5% ziVSx5>BuDG{Ubljzy#)g5zpj|sSoL8SbmRLYwf~0DfN|*X1o--am8$}47b9RVLRLO z?)iOT3}?+wMmlqWh$;E(cD}}8_iLG5lHi*2Ap}rCF>R>d;j%Y6m%w+|1N6mJ`sK+o zli1gJuiJd@&}A4F^w%cob6qaTsa>=rJW5$ucyH^Ziu;-IT5(eJ^IF1vrK`xuI2E*? zqf5QX$m^tG3B5+4`6(&MGb?mn62#PDH1wK%CL8)&_55zT_}F)*27kt|u`0-W?$c^< z*AmiM&sFd5Eps(qRmjhP*7hf}L$P9;qw`VOqnq@H?3gt4X<>vNXC8EaJ*JQJ9oPm* zO^MkgfVKq!eY92XSgd}o_sqjd{e|?8wozk%tTAuq8sF+xoz5r4fh(Eu&&)Sla!^&% z1-k7kgEJKkTsj(zQpi%@m@+(TMYPK^v zmD9WXvIa`wH<&g5t?4TL+VO&)^6E097NvYVzP3HqStvpU(Y1@$)jz(+tyYHcoQ=xf}tyUqLr!kXIW*p z>L#W9W=!(3<=TRci%;E(1*FnyW&i@FirGL2)HdSu*G7W`-l6!ttj{JL+cP#hhm;oDx5*cDK5Vbc|*`5bZ6 zYaz!t^=IUYPPcPqbDh_=e6*=^y3ar9*Y%B&Pa#y_ty95IoN1AaR%W3ym}Um2S!!1; zTjPsULkLxTt&VAPsm!A7xR3;FU8ZlpxHn9fx2hhIaUqp&HMudW^QJ)WS9U1y;;Tks z^%$-@N{vV+iGf@zkaZjHmrl+HuU!M~EyJqzTx4K`5L8%*#*}ZlcB`JJu139V-gILi z{@hVS-!pmYozdbFbV33HS+=zJ=Pngg-DS0I4Uz?iljO6H4O~=q1-VAGia@cl9P)7q z=evv4)-&V*rXxeppB!INbJ(g63d_Hjcr|{fF!<#aos?#J(^=G>4Y(mJxCOd6nE5a% zyld0NLvw5Nk`I^T>bCfq=L2$dUXuI}!V^v(fhQdpp8yRU!M%bwLYn5#_`63`AsSO! z|MixCYAPR1FrCTPpf2pl$8L;v$bdxqHoN-5$x^Iu5&YU=W($uwPO9gt)Bwy$zYj0* z!+jOS`QGKuew&y?fH5@J{4txZ>yzoczZ7j^zkJ66CsZS^gQcJ@Jb%wh^XyLegL_9K z`H(A>*9Cc=V|u?pUSIo}Yx^-ALt=38p;xED;?V?fb=0LgGWk@dz0IVD9uW*;vNd?3 zgnRWv8moBGNI?`RyDArVdRAixMwm!%oD1PD<2ipAM?i(7hTwhTQrQQDiJe@n>Um+M+v-P9V!@B$JEWW*4&HG#b%6W%bLE{Ke^n!jDmx*Si2STk> z__N1BE}dIfv+sE@ZeICAF`aAc8~|FHXbJ8lzSB6R%6q+wHCyn4(yxxm@1XZd{-D!8 zS9Cc*3trNlw{?VV^7miT9#p|^GAITA;(zl)Zy7`QKt5~LS-4bzHp&9X9Ucv%%&xYJ zu0O~edfQe>BgL-vsJunQUNTg!WBUP2Fr6P{NiY z(DU&LBZ?zXL2ZxyEBn$PrD5s*UO+u~v8a5;eYdLGVey%FSN^(I2$t2X-YTXWYN0$0tM z3YqNS`eJsO?jvkvTNDH&QWGU-o@L5!`i>tzXXs?dVQV;v^}nv|{p{lLwBiHKc2D=3{mOUG*GV*F2WGvejSB78rs-z&%LCgA@K2?$rb6CAWrLQs z{JlP1ME!SY2zC68LlwL;0vbXESQ5iqX)Hhqx?x>mKOY;|&O08Y=o^J-5Z`hTt5>-(%Wmez-phi170r$T zEbr&ARl2xaEtD%<0Qf39g2~Fb@)u5m#l?usuHNtM7?EH%(_T5Bpt6O4Q>~B z3h-@A8)lym#=nsKO-DDTRs+a48$$Z_Xjt|#HLgFBjeGB4r_&mY!)IB61MSAc8Wq3Y zp;AW{qJH;ZkP9Ay^<o@@YB_zk;!lPvB^FH`XAzO+E5Op3uaQ4S z*6mMO#WG&sx74%9b`QILTr5H@K3`6)MpecRZv-~5>3n8ERan|jzD)Ms?xb8ky#vO_ z$EhMb=itS@dL6gWfjEQ*&$qh|uW z@CSJh{mc)qDd)4ljk+QxsJrV>qh8^^pZ&c$WC#yR1-#Kh6}S*HKr|X0 zckd;|r{}jXPJYUjA{M43qJW%ho6YpKI4vBT+bXi(U6*pBT6p$YM!0`*sXJZlIgZHDew+l|G5C8!dgFG%9%1unuw zgCZ$dW_)rh`xsf_wntsNXU_(3>RRZ#`|qe9{Nhs>ctd4BVoXn>)OM-fd5aKxK2-iN zff-#p_dwrOP93RZJ%fkM%yY&(N@di8khwe{`aDZrt!<@pUDCdH&W)B+{N7|&{KI}9 z$Y8bmA>r@XOP;TmJ5akdVFtV0+81N0&L4p2&+3;RpD)y{7Cg6}%mb9S?8YYiiLEykuIz_r<2_B6`=T~Au= z^3wo=QELN#21=&Y2PB(-caS9}$_^T=iy1dgea`AG4OlK-yMf5KEth?3s=LEH>nKYkxdo# z`Xb#8bx`KE)%$IJKGj#XK!F)RC)w{F;RK>LFt_5-du{sQ)o9T@?)r(Zzpv06dDjz* z(YFZrOsZcxcVro2@bqex-C684ic5T8XTdNe$L?hZmeJ2L+Q^e0946;;t8i@^B&(`d zsHp_Cx9p7S2>cW0aYibno-iuF5APwbFTG*Ad0!AQz_k1CiNqa%W(VI9?6|#qm0CLeV3Xv@nyrOwgo`wmy`_|-oi^1nh8 zIM;I&a)bP{lH9B;be;KYjoV3qO0Rd>%pyk0(x%@`x^=r{8^g@8e|Su5?1IHY`OUX& zK5{ei5WNL7mI9jtY!Vx-IZbT{S#%E~o)7xtg9+;mv6=$K9R$-GUU5&-~&WV9x$;uIHt1FE@OA*U28?)Y-2B_rr>+Q_Hw6B(JG9i6jxasnecHfNa8bO_n&Lnm!@r*&7&8-TSy1v zGlls<$sWG6(qrRN6v)yJUZgCz(G;S%>bC&3lyqT9+$EoK!}_-hYr8rnWtv?q%1|Ol zYn&1Q_Ofi9_(Fy#_EJSvBOfc+=Lg>T@B0OWV~Tp1N>ng??b7$WR1RxUKb)w*RDq%8 z`^=|CK$tM#>1iocc9W}KX;9290GGVI5O45Ve56vHgl!qOy7TSu3-y{_6$i69p}5JiT`q{&0RIpUb_a7{~~tQ!ix2^ z8+aVJmOkfr$ZCk9qM}Rf&Apu{Lswd*@zJwvoTH#q%#X z#Pt1WsJ@_156IprXH^df)|7@SbM3BoJgqH%a;;P97M)JDZoD34# z&dDmf_w2kRaC}(2r_!T%`xbteuY`}UJCpowdh9|7z-si=H$!C>_6L+RN+d0JRjy|< z+Zdm*LuqlfpfL`2*C^u;!1UbnNk@B-g{&XO$>Q+J zEbqsj@+%DvyWM*=-3_(NR$pIt+4*$dE}_@kq`7}p{w`y7Ntv#T!wfkrW{CXAGHZe@ zAnDVK{Bf2ZobYQ@&0?n`_pztV+9#1dV-hYZKn|_s%gTTF&#+YoE!_5%k&RveO|$UOL}g93AgoA>%i3Sn6q4;`a^tzgUG_c@=9s z+>oj4s7ni|+6?>|Le2O|+4$~Tu~0q^MfYaoV>m+iz!4X72L}CK%ax7oM|-@HDI5B+ zhEk*Uy9_^nhLyKvWsqof!9`}}^dS(6!4nS@@>I_%6GMP0{>EHiaXs@F-biajTzrCQ zZz(cf^x>ED_{R96?uJfFy%w_BvtjLgy)Y|cj(FQ>Tsn)T z<^mZ&PcZ~pU@)cn;ihOVo$xb1C0!?DFVo5N490F>2vPyO*J=#g_39Y;ga1_K@frHn zJjiy_ztv6TL^CSi;{o?uh;eNQvTPBL-mrpq>=yj+}jaFC(49h@WqqazKMF?GE-P^!+A zZPbF#lp;Oac!Wwdkw;F+N>E=an$R@ z>(OAsXeIdVi`O`A>_z**)^AwX^@K&B9G2C6x;Y#O*%1--_C}c)l*RzZdGd;JzFh#a zfrAg(qf7c_kfWbeX#_O&T7Lgs5uzy;*EMW7r!{-Y+RL0#OyJ&M(JC9SpAimWraU_x z-H@MpkjyMJh9^BAfto@;?9buo%ya=ce(V94Nkpx^i7DVyYOC)>^}XD7gbYR>mbGrJ z^y412>TSD#9%(a1@~`A`vq5YY(EcrgMjnI)0HQs=?4@<-1@^6ZlC%89P%b_{{$h_G z3~cN-AN^Ig)n8E&wFP#{i$b6XnMY^ua=OPqwK;gQwsI3ZN3A&@%QDm+(~r`VTU$-K zYnQ6+kFBHm%w4?wu|f}kGr%4iS|4VR_5_Zt@V=3akplc<>$Bu~u-sB^06lnHjWs~0 z_i&}$!huWzGReWh4Xe3LT2Uh<61~B0*c^z*BXXU0RQ7+2z1h05ShuZt&Q%1Z3RZ|< zfuf?KC>E%Qf)xT*pom50-Y0qO+5IB^^{=(|-uYx4#52D+EvN>J(R*uegV^q_pxoIi z-6-fzik2Zqp05j_z7=I7rcMBqOhfaOu_1onQ5_$_cF=h&5&t>nV{R zVVz#-fO*}`EJ(@dI7aH23Zk?zDZ|pHevsJiswHciW(GL^(-x9KC#o6d7oQ6V_XN0w zEd?-FUL?3ER#MQNDcl9BYbH zk{Zk#GY~bdS}SHcse$ong>iSkhqbQzq_Ui!K+C0W0E9ZU`3@8+?QLeOS^M2sOy&v>5RiG6T{L4ibRm}%f`jMVt1Ss&Mh>O zD5%r&qle2ha-0=~DfCesR5(l3K9oqn-{a-tGtN>F5|J)cKu6ic^B9wea{vbhQAW#!%4hEL0-_)Fcmg+`$ps8TpzIC(; zSrxoys@a)wGFn30WdBykXAN*Hl@B#|3N)T~;q7nQpm|Pd13W&&8kDo<`xY&K|wo;M##SttCVzgUYW0!IJ0N)NV>HNFE8u z1=8EnB$H@Iw_5RCBxWeSgLq#v1B;LX4;6JgGaZe<8J(U>McP}=N{G@@uvB)94odFQ zj_Up5w$|@qS2YXwIzsQ=dMxVoZ$c8ZLOUj1g|zEf3_Kh(pxP4dJnJuHxASde*UuHb z@WAvxU=2h!Klq#hMcq!Px?Mv(Az3Ah)J`dwO{A`erM~hw?=~LoARkB+ zPT&HJi%Y&S-qBPYnhT~4_50u1!^yq#>9)p;Mt>PfTj4Tlhy@NNT#%`;@1}n(%$Bf+ zhe_Qv@-zbDmF@zT>=*%}t=Ct~P&ZL}I5@-HJ*k6!cU={tz9R{l`DFodV)UNsMoET) zz$b3mO@~lTv?nqGfit1E?$Txd{#wdgcl+sZk>os!m1osFZg_{#sH8ZRxo4r)FH~>1 z22YgZkL|oCKwKo4D3*UJ2sk;~kk^N<#bq)J>4gbzoD|MQkfEQ$Zyoy67Xy+|!>%@% zsU!TU`h$#Fdll9iN}Y}&+y6)i=&6bJX4Q*{C`J+Z#- zLEv^r^Hxichl; z-;%?Hy(xzvahS7Di;`q8O{6Bzj~v`!d@j$gZxqoLr*}P!pzy@>g|3%_1QFIkgi0-i zQ~t`sKpc>BV2RiMDo$~_C9f#iuqU&G&O9FwNDr~Ns6101jh}^l32|tXscMWt`m9Bj z0l}tqu;7Ut*(8*Sb%B+9cLHZ z)9UXH3e|C>Vb4m({*=IvzdK}JJl^nCcjP3M^>TFf<_)A`XUT|BgQDlR>` zA1J|uQ{{Tifok=9K0;_{hoUET<>e)Fn*=CyuhqU($&?!KM3D>gVirTK%Y0GP1}_tk zux4{q%}z!!6l0_CR$+@e(2aUCgwVaJ5aM0SRhIAi#o10nfZ7u;uv?us;o@Yn?Z+Oa z25Gz{PI9I1K5w=9sW&rt%B{O%tzez9?spN$axUn?G`r~9DdVHC7zCQ*jXOA#qAS#7 z833rXx9VDiKiFyDTB%^Kt}ccsR!nM;0*a#2vp1R}usBbDW;0w$3UPUV2B$*1%#)+_ zwBCLVO8RxOwA`$~v;(wz;#!qt4;y58Q-89ZW_PQ+s*3wO#mf&tvLM)0X9|`RK!l|?fZlUF2(1^?L>~iTKy2^{ z_msqKY21%z4~T`;v_oR54yS4CKsww^Q|V4^7kCedaD@g((w`4=pmu16g5RDg?I{BO zA+jH(G7F#JSYcWO+FO#tn;)g*e(+i_0+(Yr7)~2IQ<~t%R*HhbP{(cceNR7&H?Eu* zt@vRYQ8U_o##tw+nCLIW6bB*PFbW@hmkAPb6`tJC;MLG&`B&w7{3P}1J5)y%ZW>4$ zSU8jr45ZW+f$q-(XLlhF6z0qVs_KdI0n94QQC)*Fx{;-Zm!G=C45<{Nx|wMWMM<&UQ~-*EDv&>GEO0XXZvoo)a6!;|LLl*iDx+1ANEb*eDKT_JsQJ6n4 zp^+WRr^~$mdD0ZQb%58z`2?9t^2)bPAa`;OBsYLSS3s_f)w!2Mq*B%CrcKx5FX+kc zHJg4x3qYQ)hcRgj(I{IU;{*nZl3hp&-g55YgUrxkyNoP_^M~l6=rk zM&i;d>j%1F>~1jMh>9s$PEt?Eh}0B+S4ere#aSv>Aio9*=sOa*vy9CgN`%@~Gt%W~)$qg3q^`*8-WGO?cYZNd zdggHV#)@I5xysNZOE>*3xNEXA&b#aY2x&!S~6T|nS6rJLNXzIX$-|*{YHXA za=VZesvOtq)bt(m6Dp{9y*?8&90v>r%d}WvV-(7zS>iEQ(WLMM3ECvn`}iJc*r>Mv zLR#NJeg`%^d2Oz@c#yiAx7wqYh46W%2r_*!1xfD%VnsM89#^)E^r!bAJo?x!ZUuPH z{92d1us5=R7XKK!O{?qVWLfLt%jhIklIGlo%)HgunQhLHT>gu!YeGbgUi_mSjh}VM zXZGc7JX`Em?61xfBUEoaYGqpxXJKkVgO~wfiMKht?c3E8b^pLl5n{Sp{lTF|je7Ts^mI ze(EP7=FRV)!(fbmY_@H#hTDUx8T8yhdP~OKPIUiL>5CdA zQ=QB=#3zJoVOYzhi@k!n=99I~rxUSM4s?slyHD_Lf8!DpfSo%r_rZr_a~V z^eEF-?*TNjoxlYR$akOY^$J1i`%Z%jx8r?Jm^K@@DQ5iIZBK6sh6QeiC;pYFKx~^p zEC$||J39FbY;bFg%+~(tFbD4~aU(c8$ddg2g!$!M;LG7XsL~O1I?8 zh4OyeGP@ezM4+*jG`0Ak+6$+;O)Dhc5t)v8FO^SCyDhW#FT2tUF$0A{Kdiv8glN{z z;d!6SMOht(Ix$~-5&c=i@CjQI zhdYk5lKJ_5Rn}M4C(LJZ62XvIkGo;(34)ioWjgbm?x2>f79OD5VV2W0(Xpp`0e=}} zW$fm*U`c&*l9kY)sAAnrq2<>R9lr_Ss~Bs~&2ljtx2f!Lx159mWZ{t)l$P_2B@ z{B}6&tg(*F*6zupgr+KJG%lfw#Hsi7^YfKJ;gpiKc@JOCc?e^Z*UfxGVr%}}&|t42 zX-Pc-wU-h2A*4QrjUAY{{c3yvIC~npbry8i;}4;79XwB+xJ@ekZ)uHW2bDIwu>7II zRZYS&vFMGNyRqKU1vG253h?3(PUv#{Zej_Z~W0(G5vThc)Sj2cnw&JWZm)Jv>0z5RK2dUYo>!E zGk}B~^`}1k31qi4WP==jifEX+t*=oaQK`{0;hakc>w>n~duM(KHdN!h2YlmBZg7pN za)G=MSXmjKLk&tV#Qk_rY8TqaJq5-%fYkt5xFvKd85AHYa*t@&AO@)A9DXFepiYgh zEBiGG8iZSDm$bnJt*!`HSRybgyOxqmihZE(QLkTrl2?|D77(_Aixc2kZ)`1hDWVW=ZISkmz zr_Xt@F~>P3EE!}VoeuypAJ+&%U(9c}!*-ZMguMktu-M!-rfV@_bAkJwJI}t1`rp;e zU7UTRnQEPDrCP+dyGM{54HlJ#J0%=l^k##j|_ZrOST9ZVhf<8572NLk>=#QF8+55x9TWVE#`Yw|rO7lP3i2H#cbg zjkifdX${V$eBiHXSZEL0#b>-rLt79Uw|Fm)hk@kI(2o*Mu(&^#IDJ0Iqxbt9w$d|^ z;4NLkdfcz@PTWjESEBcLfeWy^D)2{U)%);VIW(-?SM6Hfyn#)35cuFUlS?!`E(>@q zLy+73=ZRDN$T>dl`RD0g zDjiW+Jwa&waDundv2Py+na$3rieIm~K&JerN7(Ar$$8=#ro>VD17L*yzMg9i@KQ?< zIZ&|(m$aj=!Xux^uf1#Lvd`S?{rzLCg{n7!Htq`{jJG_5DQnfGoB2ru4e51Xk!@Fn zMB(Xkki{T*S-KQQFfmOT)A70U=nkLKmRSeOJ3KH47WAT@C1iEX*SZk$dHGSP3oHg=!w?x4s->ncC-LW{^|p$Oid^0ffeR@XbBEy*SoF3u4}aRIs59ZhL`gS@f_=g zr7LAT0ouC>A(C=NB+om(BnZVU9v@#u4lPdSj%JSKn~$}_Nnj4IPdfXeNud%fAS?jL zO9+55Mt3mjZ*d@6fCkN~(#7nXhnl!~NOTw4VgIUps@}(-@Yo6)#&Oan^Al^E$?r(+ zu?=y_xVzNldziH;RT=$ZT;vGBD&sr_`0MWZU19M(WhKG)X zN1}X(Ng8&8*6Jd^K>B@_+*pB3El@enLe4=n%9Oz~dlb$E-Fh6mx3p}{i=U>_gk$B@ zbsA26uLILOznulwY(us4$0cIj=Xop`Jel+0&>g4bi{O^Y8yx@^AOD)P4C+U2*xEO+ z@9<*Xa+T-1`q-K?IKj>6E-IL(1hW#*+ihYp!Bd@XePuo)mC0(?cA?v48zq$Jwn|^x z9SC7Y>Ndsixd!F-9&Mpi7Fub`yAAC9+|P7Ryb;I~y!!`YgLORZ5u8p}jNrh)R0bF9 za&5Hy#_ho4TIGFs?IH^UFxm^kq_i0r5a$&haVTiT7RDT7~yI>^yN-t$wnq_BhAUrnSq01FH z1S+`a{P;|;dDXj5v*lsLZ-EP&V8K%S=((-@p$71|^kE^S4<)6Zb8U23{HlxjYH_!{4W`FMDQ{hygZ|E}KAzX_ zAq1#KmNqD9`n_&iR|?_Q>A_IFHTu0jBZOG@pD+`j$t8#AcZ19_v)qIIfH=td?sQJ| zi>aYz(_50;-%|M)WveLManBfnKe|loQF`{epi-J-$Yr~;S2x?-CI}|aJm>VH8SCe4 z67Kp1ynVfR$#J>eQ_+uH2?Kg2*;z?<1x>Zq`dPv;}dG$%?qga%@rQc6F5Urxbdt zXO?R6HmwxK8A__;{9{JqY?6W~w!?gOqDpl1s+R{1L`b1hk9p*|yS^A44;RBMSEat> zSG-&@XZveREmw|oxmnL7!ChtwgEHM{K4nF8d6p9A{mZgkADW2pz0GFH#2%ZT|QeZ50cpouvU*-0%-dT#B^3m+as};#;4)BrJ3HMoYv-Y4EGY*&mW=pgk9Q= zvm}jmAMw>$Ctdu0vk{f9d?(AD+dJQ7yfK(R$X>v|Yq>MpNfVU^5FA`HN4f*RnM0Q0 zzQ9EHOy* zSMO9^k&5`9wC+V0l6_GKOQZrwLX9_7ggm&5xKxH{rc(B_f#5H>43dNQ1nXAgdd5?d zWG^xk``tq%`Yk~q$C5+lz4J|a)bxobyoqJs} zvB^EHX{f!MiT*b+t>sZmHdDq)h0xGFcFXFe&l=rkJiC;44tj8YypZyU_V}e+k9gc3 zRFey}le#U^=kCk@e7u2|D|MaKG6H4<;Q^~RWs5a@Ww@)(yKvX7XCW>=sTaFO_DsIq z3VMn3`2>L}1z)Lkm&xE@#dxB5zwD`ZsKVtPv-~=PTHH#ke*=I}G&Rpyoj5;Xh{KC+ zdIB*>VRlSS9EaAV8Sr=6M>L=gN=;P$DcCLG8*yM-J{{G4wl@VHfRvaVt}m zsR7vyl$Nl{YrDEWM>0l(OaKAdI`HVNVK@o}aXGK4qH8AIU$Pi{f<#Lv$C9_%@hF4u zd8oJL2L6^z<_PoaQ;j(@77(Huy}ON#%UO!}x@E0 zegpo#{=TwV@&ZVPdj-E7r`UeFSn@@rYz`C>2(`H=QJXRe*G$lW^uoT+dA}dg+G`1? zu-h}n(9%AaYnQ&C*qkD*lP*OdlhpO9$ywLl0@1X%-L79s8SBBN`IPwN)_KlW zn@K@cDz~?KqYD%p2U!{@!UEpCo*=F%(_yQ`Gn_v8Wj*yon%Nr2)If??;MTSD`0*$= zSce$auS&C+u7>$4z=X4ZEXhxRd(QD(Cp_i@{HMxteHdMf~??Wbuq zpt!Ij%?>m-6qE7MVg8miw%~$?HIoF4zjkACxm7Zg^lI8WGQIP(*Ofk5XH_z-HZ3Nb zfq&jM)KU~6U&9pCsB(^=1Vuk*wN>s&g+w4j&8I zqgnCRfS3wA0X6J%T?{2u&ITq@NnX{ihn>cE=hm_sv*%rQ`r~E23>gBL-bp|a4-BB= zZ+|=^Qrd>$-?laB<0zhB-z%5jg?{{yFNmGHYjdgx)KbaW)!(RFb9?P;3c_jao2{Su z#Fe9oN(9k~r4%C{sY}TtCTFT?VEK+tA@$J$%o>_4W zY>gm4>1>D6HNVo6{c4zeOzdrN5&JD{5s|kVUY1v8YCsQlzK@8z{4)!in1fnfIgUB= z%>-s{nv0uS_9;~(Bb)bF(aYsN-JvDbgn(2U$xHV%`&Jn++wEYo7diHmHOnV{(9?V`s78@LS$XYrr4$T+ai1?pRba~$h+F2z zNWyt4cwBdCcQj-rj0YJD|L z>q=v?wy*a+V#)nh3kpoHy)_EY(=L%2$5rD%E6Jm3t}_3L;^)-|!39iO(Ojf}*Y26^jAs(WU0+u~lt>J2l~ zt-XA^=)>G^WFEAA2{%cb*}YGWXE_#N?5A*bPg6f+``JJpi$%P0Cz$`4Svy@e$wKyT zB3A0nkpwc1I?%=&o|wFhCVE(V3afbDAJt}_LK&1|6qI*jhZcUw?$!$k zK#eEDF9%-;nNU_PP!IYAjjn%|;a(cW$3!tuA_&muGQ`dc;a zfNX((Sd<|HdJct@F$RJq&@)#=20jtBMbqyC^A?Gn}5$!KJ z=5-CUJvy8izMBK!AHG2zjS*klsjJ6RTZW;k0f;cmurKqx4`DH-o+#%Vo`=;{qadx% zvOYP#CcVM=d|?t{g>Ix1Gboz?k77C9M9M1J-V6?oTae5JHV?qAkvZ?D*@1Q>nsz?B zjT5y*jpGBVd(-=L#}y-h+2}v?9fMlCcj16QffYh?$;`BCG{71R-Nwv;b0f9^D_TLU zzb>mO{gyn4A3d8_FOx+dpdH<1g~#rh7$r^^Ti_SXGwMFe!dGu=;!)qJ1fV5AOSDKfY%I zoBHc$faYEg#+*b-1YihI5CXFuIh zd>7?<+1Jl4Ai0r5@lya{)9;8^k`|hF@doW84S8+WqIrHw<9liWr^I_HWF>jZ14G0r zfe%gA`}aom z!E&G_K6{^^BdD^0ExSPd!2)?1w~~B_sX|aJ>TMm0l5taUXca8Im7#}h^_IZUy$;+} zK4jnDI+tFR9g$}fCDXU#S_AZUJIDwc@I4hseJ~!4W!4ZOwybc!Tv^D5{_#$5WOS!G zGQN$`+;3rYNEP+&E+I@yC-1g7lqdMAKg-`=ryCHi3S@7R@3jqd?lelJ3Y(t7G41tE zo6+SrX_G=BdVG&RD>V~rwdG=Dp6G7xmKguy2db4{F&qB3m8ZX0(*vBx1_auTMy7_Y zAKMuKEk#7{4rY){gv}l_^`bWOg=CcvZo;j0TA3xr1i4%<*9yYw0KHF|zw>caaK833 zC6_xhm3rqh^RS_X{720<{kwo$7>Nt>zv+B6Vq5;TG!=NsuM3(yJfR6XO+u@n)^DYw z$@@2bVafrX4u7mG2w_xCj1HT5awzeKHVP!jyuComo z*3i3Ia|iCQkj$;8hh?c~2LSga_NVh4*_g+jb_}12gGNj)S=LI4Xt=r?LM12X(nPEF zG)+@o-met89T2f zLt0v~tG(m$44Y)p;uxRyPMxhap3xlf*lw;5*pv0~Je*WRM10<98wyD`fAF!YXZ!Hz z$@qE=w6{1&P~_JsJ@%hL$S_Qa^f%lKZdCK>F-7j~T?0&xnpMbrGdIMCa6>)3tsZYc zgO=Op9ix6jO6xXG5c4|oD~m>fd%4jzWa(@z1f$#XlJu%7mn}oMu{A$u0OxbfA)?C= zYtVA=+=AR(*X1A;&`b!jpzN@d0M%93_(Gs!2DIc0s=>N9dX8t)Q?>{dKyHz47#vr< z0F4LaRqrkXa}ub*d0)=?EGnm}2E%c4iit`gS*2g~co$Bt$sBqb4l7^C7Z|Luh#M73 z)gc!iiI=nG5SX9v7O0!@D2(ChNtK?)>5y_AA-wgNzhVZryN~ zY^E{5z7j`OGW!b3*yM>xiS0w@S9Y%3!e!7+h(v2DL%tekC4d??P|jI<3}^+umfPG1 z-0$w%At^A77$<8Dkx<9c~$5UhAmA?JEa}kdS1P81=3Zi z+ergm>X>D5$cY}`##n({rTLU{DRo~&wLSP4%0;*!hHh-@b}(Kn_D)+kKr~P_$89&| zyIFY{8HYG#iov(jvosBx-}hPsj0JsL=hY(2(jV{y2157S1GM;lQ0f3_a?Bk7!0XaA zpXtPats}$X+!JoRpab7c7=A=YR>Wk_r0b* zj>jb-J``_`#QXWa469J-6WlNi7Y4abA*TwDdT`jMj=$n!WztEIh2!;B2&hXrDgF4k zw6GtYf+bLss(!NS{tX_sCj;AWj6eCpXYqJ7vm!bcFRAXc*b(ma{idI7ikIhL4+PIq zi|OBN{#D3Km+!V(d&vn{I94(M$p1i@zlT>kwNB7apy(nBYOwgemzmk&OJS434OTEz z3Fs8tymoc;n#Zz!351OTq%Z0vuKY>&KZv7G&@bK1!wx~ph<~f`*aNOXH#56ZAj-A( z9UdeB=T{R%zNhL&*s(>E$R#gm?)u73utpKnojl~-HG0DaJ0IssHZgVWq}tI6=S#cq zY0bKwt{E~MWVY=0O7Rc?XSID*EHz@Fk@i!;w!gh6`{VsJA-=)`Qf(|ID>lIu zzcA^QgC#i&3&c`wHXukG7q9_b1iu;I3YsAMx^Pi46Y%Epx<9DzP^d?Vga=WOT&qK!QZu6$a44vZIV4;i1yghGyYVCKt~etqv0y-I?z1 z_d{8lnth`S;boV&jrF#}(izoOAy6LI!n0MdljQ2zt;4cROPSr{Ii6O#lTZ3Qr_og; zN)U{f=h$>=I>*I+Mekk&Mfn`p4eJ;syK%M|iyJV@Tk z=0$_&pSHbYukT@@!(~ORUe#Rt1VJ0sg|TKWyV1EC%So>joP^%z5hq;&{JVkC=UO`;-hx)Mm;I>Xnhr3g1p?PLRWPm##KtrlMG0;5(f}?w3 z3M^DC2}>L89-8sJ_t-J$7-6z9b)xG>>lD@>*N5Mh`0~p-oN5%aKGk6=*lwSdDh>9Y z)V0udLi71;C|7GMgvRc;3sYt^!df3K(63K8CJ@_8K906zAOmC0>6ZLwG*(GMFP zqW;6kuTQO1PFbVLLEtvM=FKad1Y9@(bP6DuO7uH6W6zvzG$mZiC8PvF84s%8%N5GDHZ|dn!*(B?8IbYHgEJ#C`Io$LlXYW3jGR$>v))K$OC7)>JO@m(Q$K8nv_DU`aTz zNiiPjyw~Aue$`_pF?mL=qw3jTI%AT8)~<4yjk(EoTgkFJD1CRg;p#wy*<}zr>>}n9eJMbHZtro2RajEXGA` z=%w;uDYwSM<~4@!>{`6?cEB4Sp2W2px6(W&z0s4v1}j2DOV8ciK!(F6S=;H8wnTRz zmbiXWzQr1VbCh-}`;`EAHt5oc&pH0l}n?L zrM3l4^N~Rz(FXb}p@+e`+vgD&=-d0GLQ&zL#rfag{6qLJoMQj^kM23h>Hp}SOZWvQ zxs~hh9oye3ovAP6+#VUKjkC5ae0I}6)4rMZ=Pm!KuT_W_-Q-REQ+oJqYYXZMQ-Z0e zUuU?UIRlV56qd*zL3T+gbzss<&?~evWnu#O6pi1;ezU`N6#n<4bUaC?f7Kd%{?G0p zzpZnG4$~g~ANEIR{*>V6pF{9_%T+r;P4v&P|1%ByQ=LHm%fTN+)$I!UJ^!)K2jb&Y z{_HZoT9NI4T6x*H`7edtKf8?l$38a&KHm|%RH-feeSRDzS^1B0iv|rS_46yYJSizp z;GG5{Cw?;QSn2mU^CzZiyp$}6=Hppt)=VE(yy z5V(5Y%S5+zjsE)%{7Gu~d*e!Y=bu_o;%)Q#8y&&LvrwzsN!S0Kvmr7(^ZxhGN&9oo zglQ)KT8=Im@}G0|_c#A@LjJes;}Nb0Fc_dZ_pib5??cDGmS1x_`1h6F91Q~VPmIK{ zZ_c;>J}e1)eENUorht7xa!}N| zI&$nj|NZ-aHvZ4A zejES$T+M%+KbOCR{O?o$*~$2~g;`d}=egpa4Tg=)R^Xq7!e9Ap{?C8^{=vQfvvr;5 zFa3W#R7Dm(;_q+!*FpJbzmVJ<$U=V()1R#ez?*Z2V+Om*B01$6e*D*O|6235s+ReV z??xW{x!qP53&r^#|NI*cA~b|x7g&K8{>t_J>-qBetH5#a5Bd6ePyJUrx<8}G?>NKf z!rd-<&7Y17AJy^yuPa0nzMTJw{OdpzVHbaA;_pv~({ukF#m6@c|D1*){Pp({-}~eJ z&o|DZ|NH&V_jMoMV0C^myG z@OIaD1#v>c(!F#xT5PKbQSW}5rwm3OD=UMQY(LgD-B7TbFC zKBt|8D>oqx5hs?aarCO~8}0IiZPa52)J*IG9lMUoGt(R7crXb7%^*@L>?y=_Rj18NKXklXpWi{r)PG z-0n=k>F}Q;6K_zL((^}f)z-%ckQ%F3vo}dX+RnDoCz6fW=nXsfGy=Yq_i@r`aW9R*Ir*I-M)J{z zw_H^PCGLas=s9rN=ql7mf#pWIg0yXnWufog`U`dLV$0b}3xpvP23D`50K z21qjJC(HTy)P76Z{;WGx-|3TyP63?Grvnzt2i5UVEd-rZ$9a9r^VqBlQuisyeg6=& zQ#exxO_re}XybGgso*iX0z&Dfj*4MnXqU3RzHg=SniiPjx>0X09eJI~B$L%%9Jc+k z4h#*=CEfp!1F7@}~DzVNP!_+C)wR9=l^rm`oSpWp=Vv{~J#3Zt!HUrGh z=dE&r&1z`5*?P;l0W>j%s&mFx?i_dln`64WqEFgLlKf4k9eGQ&c3amA02t{Q`yPMl zBZbV|^*637a8}%4C#8xp@fIE{QSN83vFyownmsRCbp{v~``z&CecB6mz~+;Zc_9;p zb89#4sUsa(Tx+8do-#jS;*wEM1_%t>`1;fkM6cLv4*RP+1}mc{X5m}jp#HU#k1|AmlxXsL@!jz^H<`cUDz)dDYa5lbKkffym~@y3J>N-1t0eBxu&zEw$PJZ=KJii-kW&&aS|}@ z^m3p6w1XksI;+D1Q)}#NUEqk9x#zpEc)Z_@)j^?G$ixkmlhk0Kh}evxhaBwdsv$qK z8z_!1UI$VYFN`*>pV7G%k1_jru5Hdn&hrwl5|bQqcExyn5-~DpL*L{uS$;H0nIwly zpMYAuKVLiMnHLitV_c-NXFra1HHurcUjuD4ldT!rX|Qz@@)z&fqL=t05X6e&P0=#> z?3y;5+I5?uYdNA{yad&n4EB%OmT~j$_;d!A!nxeTYxR{5h@|i3IxyH%$zP((GeU+} zON#7PNDa$V&A_Qy3`Mf%Y98fYx?3Vv#c?@VE5-wFO&&RzkE3{>&s&^O=3gzykJ0!+ z?TJc=v`@zoGcK1o%7xr${PL20)YOdCK2T5j)Re69_vY1RHukIrprwSSK;^ZWs z`5cO+L~fMcs%7NpPvl4DbqP?Tv6=6})r>k+fOzmt-}nt%gYxbsSzkf&1N*uHDx&cv z&I=Lp^StJg!6unkXvkLxQ0^8p5s1=2ua;g7@VBKug*C)loJ(Ee73bB>Id*Td9^5J~C2yn$*t%4|)S3n#Px>Ble6Dn|$#fL5p4Y?Vyr+j#_7IC<9QUlWQR$6|W$OSLj*t>j zSE~Mv)0f}Iwl=ECcxO}XN<#7U3hd$jsOkM0J2{akc2jp_Oc=Da%a=&)oE$tj;PecL zZw|>Bts;@N2MHj?KPLSUOS9#f16r49BH0V_*L5eCUP^kVa`Z2Gz1Ok_yB&69p-SR1 zu)ZATIt;*K5Nc@=Wf(giJ7|mZ$MF5ua#ZfotGBE8#4xJFZZH-i?RCEHFJSDM+v;l7 z-;}loc>%G4h@hefD$>}23W)vx-^jY> z{KI*!svKFFDtkw)HK(sP!l2nMt=%-l?lz6P5kORg)6tUkOADp#@ME;gHQ4Itw-uMI zta=2RS|p3rt?$HkWY6LzO>Y6>wcd8_{sl#UQ#-fxu~oS6GX?ok%~hBFl~`@+&YB&Y zpPq)1%f)zKH%g7vd@;rM54`I8_!?Sx>oUSaz<#p3P!D{t>cN`f7NFn?(?eJbC0CYmMV0++ajz1H4bkal_4hh^y_Pza6MuXjtlyKF1V zw59F+@x528cKb1{)XwCgK0sIJ{wsvj)`cbUHE_p*IRGQ$>$Zi!tt`yKlzy{=-)iBw z%T`XbGSgVG`&qXy<=<6}EHDs$c76K=pfR8XmUYi-@diGg^70q^PAuxPMi$`Yt}3e) zBe%14LNfGbcbQr9om=|zERD169aGGJHq+0UZ~VHt4@#D@G6u%Z9NGtBu-0$8yKnQz ze&!t8KyV(a%?U}09rN7%Sm}uL$~2K>K=E83^qP4Bz~^o`mu>G;4cLZ~qs=LP_K%6# zzqLmsAH#Dhn>u9=Zm|?y2AdbbaCk$>R=4)_cJor?v9Wn~2h7o^o+^iG)#ESEi3O(^ zD=BYk+Uh>frRqH!WIT!xJLhZ8z0?V6|zdp8y?U z1{*~*H!vy%V+CE6UiJDq7puh{FyN#K5AXGQTU?0cOQ$@kWnPyTCs}DfLh>@x{U}o` zs{vVx_1mq>4F}}k?zTQ!nCbC++u_G)=u`ew9}8s}@@dgpU`x|Q{;tSx^Z@M6^9{)d zqqB!aQ~h1seXqVv zIJ7;|h<342i*QS~`m}IwzMH?eUqr)4Zo4wIH&(++-B@hcjz$ya{VmYB@O+i3jLo9^D4aM zKu5y|8(Hhth`?_SZ`1y;f2OOrrMF6WQcj*B!nm!=63O zd@EL+Aj-AL3nd2JCXjaN@|#-Y*|r^T8$F{rKsMy(DGhu1$Fdn^3r{e~a5HK;#ySsq zFK3jGtf^2^yqnoZQ%`5t%D78J5EP;-l|%hpx=+6#jHcS)8cyyyWM&ho#|$PH9@5E5 z-fw6XI64KT)nRbEmX3vQVNx35Q**Xz_Y3H;cuE9q&zSVjo^_?YBO}pKznooT55X}? zS{%+j$!MFxWu`s>A*OBdCfbHkToNQf^Caxqx~fiea{F&{I9wNeNs`R;0X+@g=ccNIq8 zFH@ggN7a-d$yd5XI0*YXHX~~;k5&*dx@3)kt2Vtohz{4?ZH(KPC!i30TC|~IpMB#( zvqHlJQ2z~c17)D%<>l?rm`!d7w5x97UvV!Jk!S4$i)0-IxG<0rkCQe!mF7>OV%}Od zo#ts(BeIcq5L%TV*Hwyy_I3uW4hxJlQbVPPH%_0)l?q(+Gky?x%}+yHu!B1VbK~@H zE8}pDQXuyU6EvMMi#tt8ZKoN%4)#2$Us;EuvO^YGUmQoyGNIQ~p0C%(yJ{oW;@i1J z#XD1Yi}w%Mi{^duZsn`1abjH?Q}sPqcS`#1Bo;xzCtDX9@wOFNyF2tJjbJH9T%Xt*#0YjXN9zTW2|E>f< zJ&t(WR9Lsm*HWG({DAGJWDf-VdYeyuxw&dj{KW|ICj0U>%W9+7T@JHLC(q9-NP9tR zH#7Y~-?u8nDs0Suz*<}rQ=uK^u_-b6d>H6F#T}n>o5X7@tU>_bu0LsV(%ybVPDJYR$50>IUstP1{k(=LObL!P#JMRsPD zO6cmvaEl_~Hl6jXArY;0>C#yvy=6;+^DdqRPUrm7SZXa(t{l1(J-E~lG>mEH{ddux z`2Ggp3`6kA?pHhR+NYd%ZE$D+n|f9(XE3DE%%<(mAoU8aznv6Jv{!kwtM`a^^QCR3 zgTv1xbonyD#6FWw0?#@f8+PqVWOsnREM-ze7LOymg@{fmh6rbCkxdsiwPvT}wtoE( z-A0F(AXeMiZ-w!WE=O&ylu(5p0ZQNsK`qot#>Dd8l2_CqCHw$h4~VFZgLYbE+dK2akkRT z%r&nOxA^|E&2%z}*TMAf{(6Lu1r9y>Z*n-z&Cnshcg37<`D0?kQBsMg58j3o+egTh ztyhinrS&L06Z&>%++EqahgQ!`WC1s(hYev;m*-{4RvW8g?U9zgOpkg|Y;_GuBvd5d zy)~BT2&Yar1;}c`QL=tzHFAk=QsS}_{HCo<&)6i{N9>cE-LLCC*j4Y8)=R_D^gM)o zirnZa`6ghyb`uu)%ejld6ddf%YkAnlC4sbu*PRQQxsm>WUgDwLqA&NHfv=q?4Pl-& zb{}PuT5-u;;TR!*lyLK%AggPBjVoV0$5$`CU8hlBl%p(r9DDG~*4Xp(RPP#mgtiEE zIzjne|A4_V2L6Rg85ISnh*#jdTQ<@@vQsLxRnqk=4fd*aH$RxNgNr6Fzx{GL+P^Ez zwd`e%@B)7ldyEQt? z%Li1fbm2f-S*CXpsAzh<)w4-uzg)93Gj|8(*Sl@_sD*NH5>;19oA7Ie9OcU};JU27 z$}#S8YNBNvZU2g9RX5*ATWOSC`qK&EL-$s6xa5J&IUU>%HhgGP4geKvHxf-PFQw{o z%XO=A+1oLx>n-H!zn%rJ=L_^MyN4e$;_~LC_$kp1@l<&-sc>E(`E8iuU%T7}kL9@yr_jX-yMw!UZCCkocO{U60arE=LJFIH(3fiK6r{=F(8KP;}N?JTw*fm{~ z9h0%oWKvmLy1>TNz9G;rGa!D0Er>tId*MAaL5q6YeZ1y2eLZujZ>I&jEhe>|m*dL6 z^=H?n10L162&7#7;|-f@#042qD-C{WCCcYM)GGKlz{h8W(hCECl>7IkGe+sU?f%=% zimwa#25a678}4u33RVic2c*Af65&m|dKvW#hhML)8lx0O-#4jhMTt1P07L-`ulKf} zX7|z>6^Be74oJd(Q%w z(Wy!HBMvtAyAVx~e!(~bB)!PL{{*TD<9$h}^cSZdP#{85o%|XMKw%DNb*`OPf1R@@ zuX2?cS$$*aYjnh#z>drF2((eRJ@GdQAS_0oLt-Dq-kFh3#kHOq)6cdOT~$thir?ysBA=3Y-e)1Ph3=6Q{g zDAPaHv)gw*2Hn)x4tf{pw7&iIi3v8KS-L*HfCZH|9yKhQtu@druV}o=?@DS2U16>H zeXz;VX!S%us+;)fW9IKcT9;?V%HaY3J*z+47SL@WO^I{Fz*Jq^J3Sf$_~a6FYErYV z?Y9)Cr@r9@j@(nV(%I(fqHvQ_c6znOh+5wrg_S})ibp)SzokaAj~steYbvUjI&8i6 zbN1b4`k~j*WT)DDk4MxR7zUz;s&~4R;}#5OL-}uzOaHnvw%9}!x9w8r45YXck683T z7u&foSF44s*@l<`oA=cEi*Vy#fJS|GY-KE}} zuCK}BZ(h7LYUibz?NO;2f0;tV<@Ctryj2{*a$j!njgaJ)|(JqP*2Pz;*h7>I9UFe6HtliG8VDH&>q&tp-RI1L+jGF7r^>B40q|Y!cYtG&P*c>Nbw}QtlmU!~ z`fCsF$BNm+KG{b5CMYl2qEkXpJnYsNUS2Q?E28>4E1TF~%Y0Ls?_jculN~F&f30z( z&Ic_>bXjX+Fdlu~vzNypO3X4vxU4E0xemtCPr)LFe()Wuqhs2v20GqrVzZ<%dRjgRIvXW-jZ z3^zY4dD6%!7e4R~ProT9IQw-dKU`{HAwKzU%PY&3n^HL?xF9l*0=}LsMHp8AeokD~ zvk$yj=`(tFcF%Q6lWtY*BeYb1or>$Y4hLDz*f@vB0dPBvn4+%j*6OnVEVohqDn)Du zgc=?hJj(f8pj7aYVABG_JS;GDz4{3GWnXO?tqrp;BQ@IK-An2YKZo-n5lRhV+kE}# zshI|M0k(3>@+X(o=O%ge==)mX){LumtjBu~1(HmqxA5p-n5mbGGy$K1gEVs+CmLke zyFAKFs72?;c(1`NTrKP7^mW^dkh z|8`marx}$$c@;v^gHF##X=A7b22GGEja>dxI6nAbJnfnonQmtgvj99*>PcT69{4Rw zAEKckl1kO!-G7Ki@Z@hD#BjLYN1GZJ%}R^QBN-j%jGDTK!p_p4V~1%)IwCc+=8>L> zWmuzii=RjvUD|Q?*jb#q*N!lSM`s^sxw0S%UN{By;$ssM^Z6$Zon;ZQv-C;q2a^l3 zEgymoX!7XxHWfpCId=!7c%h{?w!Kl2!26v=!{RE&TmcA=1}cKq_1)!$*!zRu;)f#K zJ}&stY=mdq?MLU?HNH|;$mQ_JjI<}>QQE}1*$DpoTr&G$fl8;`L>*0y+!qa2|k zNKRw3%`i#i7_}cVeVT<1++u0DRaH@AUfL`s%*{AhV0nnxyV>#H%;VFq{(ZJIr0#v0 zY2_ES8&EH)+fhN$X}b}7B`6-pA{;~oqg`BFK@foBxCT&s&Esw!s0VLGf0{Ol5_w zii|Ca)TC&n^7pT6EoU*H0H&S!s+NH}>9buqJzIAe!J#wgFXgjNDYby-Ldq+h)++}} zQsm|}?HRSLuC;T-;~?ij*p{TfsoPRgWAngl)6q7&^v}w*5;_?L1~dqiz>lHl_*)sv zrnsfQ3-Ww_>^v-ZUz^FFX2AwSO32f>yoUt^S`qSUZAS*m?=n?s+}w^&NA93rTy1$O ztqmXj)L|+8K9beemmeb2)b3?(zq{pJKB3d`&0^qFW_yzs{cAw>Zo+TRno|8e;vl7Z z#E&*V_`53$aVA-`9*24JQa&{N}o}crsf1&S*yL1ftRxZWBdmrO+im zsOPKgmtb~7FT0nMNOEcgMoDtoY)bc&6-k9sz-C5#2X8Z=rp~3`O=PzzDZO;eLP>_tPi}z7I(L@b zXqeLqrQ;XH{d1LQl{Hc+}Lz5G~Z5l*I=MonFVgd#^&2YtWilFw0r|v?yEIb z3U2o43)f7!htl)Xx@+bjj6JQt@%}G~HmE+QDmm;`pDc@w;&-fbTdUPz`y`UO0tF^< zj{$lqm|1|%^(gHGQ!}d5^tr|X@&`FU1?D>0X6<<^VpYYJ#s|p1;R$M>%3H_fX~VD( zF7i9$YMhed^m#iE;22A2qx0_Adxg?&1P^z(5jOiwcM*-YGu?Kp>Byb*e>?tOoSZ7a z*4nuP4+eIHSFquF&a-?3FQ`6?q&v0lwjDGt;A_qcg+LuvUu)WJ7VPtkW7DatVKvvS z?fa419&2cOzR9>7V zhL@GiOTpa3Q}wu_h?TO{emAZ=v37knAN*M{u!_OYMnDQhBzO7hf(xNhl*QCzEtfmj zZFVmOzq|X}&c`~`4eDt1&83DU{u#_lc7+^ZtsB?-mBja#SS?KF7u1lxJPNQOCtohA zX5=eibaBo=8$bSbzr}!=<5hl9Xx8{7alE@HNQI@;>Xwx6%twzJBcA zUQPr01QV^E$g25m4Bj0U1mv4&84$i zMpfZ1WgOpY2N{XgiTzM_YkU8Uo~&87f~3^L<}g%-zf(} zrEb62kXKed#Bf^;^4(_V^iAl<%#0H z5&;nO2m_<-C=EP%JDm*f7@m4CpJaMyo->Fy9#8F_GS>C$;n^PJXqzmCucj^m0NJs)f~Nh+OGIDJzOD_kFJg^8Ip%_saI3 z{hA)L#ex@V@fORBYB24(UYmqTm-p)H$D9f)&F{Y5n}>p~tIdBzCIEVsU)2?Sn2Nt6zBj6wj9+QGF+tIB$5N&aPs?~cp z^`bb@yaoWxJ*jEKoyA&eZYWfaHr}XFUvPXElbT?ex&|OV!bem}I)Q`q?Zs(7r2rPL zd&|`Ydk*h`pmw-=76fiH?T}OTr~+u9-=d>ic4J#U;@Y#*orrXMkjO_!*g>~bQix2c zvo||FmJGZMu%J)kpkBU?Cf(&}JpY|$<*n>alo#aJ#=&)J?)!0JnXs+;(T@scD@Klu z>GvwHKxsg3T;)_Q_e+mibeZg+P4{~@FPzx(C-Pedk;?rfM$!wXZngFV(mPrwFOzBv z3PdtS4w>C%4<+Yf7(qjAt52+3o{{OQuvgf@v3fhX_r~~`2~^c97LuKMo>*A?xK<)B z!@VYhnG(5LV-LdiJ>x*e7t8#*qN9$36zSWUY|3XlNt$GQYfry-fVPy3rb3#NqNI zo3od$u_R_9>-}82Zu@Y6mHLVTD&5lZA$$8Ou{Sf-85H1v?c%hLx6N}w zVtv_n3~TDHUT;vQwp+9BJ-BO^06DNAm8fE`AErep4j9?sxL%y5#0gZT8W(v}OWSn3 zP64;r*|o?n8epQ@AJ7<{V!bfTMtP!pj|#}4>AxEv;F<^ zQamf!)i%{}{arSMD{&s3=X%v&-oIWU!+II2i~T)SLQL4K?)r=DckhPBf`S)mWe~Ke zhfni+d>)uxFU__utlVx_zK>M3rIE(R#1y?j(~XnPR)`mEg?HpU#lSx(H;WOKCilB- zJJnnQV*y+uw=2fJHsE~DZ(i6-uyWtYv{m*qEwM5Fcj*moP1<4Ar%^Ky))YTL{>w44Q! zb%4z?DW&P@dprql-G>X*MBz1RFfH%^GRVQYRSkvD+E8RCU(LM*vLx`AOto|y)c zJ{{5Y0}sZ7g#e2sly&dqdtdAK9!K3RFO3zFdB;vz#SAG)daCr6%Dpu@afHdoAqd6zhK)&UXKs?z`? zFK1&*^i~k0JsqRyC3Tk2UVWzAt6(DR0`3n4Z0$d)lv95M@yw6a5Z1XPw6*LG@3H7M zqt9X+Z>)ySGK?C!&b@Yt*Jzl&U!!KJ)srk7k&?nR6#F2)u1w4Yo@1wzQ%ddlpl{CP zZsgiKmtQ8Du4h`oxaZEZ$1+3+dA{7Qj~;;yhi6q(A1!1(0>%~qC(bAc^A>}G&lJxx zO5nJNW^0{^d{7(t`jS}cDOgw%s9@QCf4RX5^uVL0EVu&zwSfnSo|ip$zIf2ZlVrxk zBqb+QP=rf2IOuF>HmmWd13uc8ePo5qv+TkUdSGS`#|?(INJ;SQnA-rzq0;92>#p}} zocAQ3K9Om30u)wbe~R~yTr()Ui|2SYUX}vlvNO2e)UFo(VO0ueQy7J=P668L;U%wou?mQrKN;jIt!y4@!*rWyGaI*zr>0yH}?NMW-!J z?0wfBgoA37(b;C>F&yfUBs{k6*Yvas$LY3?fNH+;r&f7Lx zPirn;gA;@H&0V(IXHW3=e~*m{g5LA;4X!KbeYBV5%{e!`!2fK!$rMPpfdDY6Utj3D zVPV(IGf9Nma4?8p2F$GZ{pfW8(Z(G2JM1W0Q@6MAPGM7%5MOf8JW7Ps>OIHS41QCj zw2_wW^ZQ~hur|E5eq>IHOQr4%k1K1?i=N?{pvDFGhJgwF8m}*Z#qBE2g(cOr!&D_% zw7a;4P}gDxGf+!Wd-=kS4d$$ItfMQ|+U6$62S#ca!{ixT_uQj*jGd+vgHaxqzb=SF;t|!++UlHRt!F(UX7quR|Ss z#3k%Wl)5xZCG_#Qx7lRzWRB!PUl;j7>LwjkTRo{~>~IX1+*&b-S!+?M$mQF8anq=4_|rg784=9YT-9<3h~nnhDLb9gMGz$4 z3_Un~DkH$NI5(^Mo{LqvC3iEkWxMB&&J(ezWB|2}xAx|AuyYSgzB^Rsmv#*ijXn^P zo@zJze`qrVxzklXSQJnP!eSwJKt;KEc3yFJhqD0Sv3 z#7%ShIpSXW3tlnx=>x9dR3ghs@>bQUaF7p_Pck%t6O7_ z$(`}Ns~izx+FIaC?`HMsY}TL8c7`*i&ZpD{z*>GktI%pN)0*YqNrmX=;ySe!albwM zPP9|Yua|ZWV0d*mZKU?C4yu$=<#hl{n(Ila&Wg-y7p zx;GGIx@NC#k!cCAvyf?CY&u7fy;@}`sh01bca3b)7ZAyO#A#!Y+_-C|d%W}k8dNaZ z@_d$)+C;azIRj8P4V9GMeyYzp)f`v)$~^>DXcet0hzBRTtyo3g8io2Bn+0qO;5EnM z)k2$PzGVY{U29hGm$}=Y??ZG2cD)lZ%+DU^AEMuY??$V)$?8YV#=`Az0!-}cDD3;3 z0Uu!EEKxeM74=Ya-{E;&(+@;bStTUQ{=-sE9Mv}D@)`Fk1q$SgKfLZ;yrFrKyWFHT z{Jf>iC;w&9G`7Fmt>cL=a=k+{*L=-)X&lS>-nK{?O<{VP0upOP!<+evApo~5%~_zw zDyl<;p#kFh0=1*4YK2;H3J(z1XS=Z+skeppE#gcC7<=v&?GJ^T+X{)cFfeJW`#_lO z+q;Oq56jT(&H3U3iO)Jv1KIq|c&+WGFnj_O<~PTLZU)xil=LiJ<$^ZYrk!QK6xHmf zyqZLCO7ECNrx`cX2feaufdirik0I=E=V}cN-jG6u!RPOJtIkeqYx}(JWy_PSo%&Q- zm6k*`@y%*q2)anchDltGzVhL4Req!|X~IaeV~do{%NQ6FeieM3k|_-T^Y`Leh4d?( zMW%W#b&SGCPRQAKYa;#CTl+A9YnFm%8dLzfz1z&&Oqi_T`dObUKS=&|1M*N>Hibn>IdhWb@&8)3q2$6c0mBO)o+<5zaS0IKiWI3#+m zni0DxUrz<)Iz)WT+ZK1e8>?$P+vL7^EG!We9^xP(X~zd*64TrC*~Ry;dJj|j_#*B( z`~Asmj}>ku*_}Un{BBFwbugboxHnT$Dchy$C2<5WZAFblyhmN*X#gxkG%bu$Pdi1X zrXVuo#cT1}hNJCu(8=AO@sTCguXFSKkpIGN&dlY63AU1A7r8=~16`2wgp6<_`t~qo zO;jPCUs`CrEQ8lK5V)@z4+wKCha4ltdW$O9BIy1cuks?p6=Sv=St5LGy7 zYGb0|!&Q1nb| ze37cR=uO435z#F+vrjrsw{u#iFxjL(=^pXGxAdJGPfG@_W^&T*_vZed2jSeAS;2I< zn~zNMJ~xQ>+v@aKrD-B5!M2_2pH}Wg5Q1oG^-UB;d4EnIqWJXHGScZn z#DUn`t8{iJfIlJn&zpjL8?$$YO7T5$DFQ)f|+6V{vtD-aUsjo&vTTs*{n| zm#RXW4Jbe}ArHl@o~4eX1o!7H=Np-(^2*yL%P?%^uF zY>MhfpK{92{_?;~q6TH9Rwz3(lBK(y;;x-+->n7z@gJ`rG~Sk@^s`gyoK0?8K09|f zhQB41d5eIm?S!_$H?yxc7zas02HS7%vo9f`;BCq5%~dK;;Dlf$ddZdNu&nr@%7+njb?TA??cgkJg3jN&qysOJ5cvM;Csj6byGw3B^t2cEoS!sdRkW?i(oBjOE%LMPI+ zRJYo{w|a-n))t5w)HEIA*{D zri701B7}Wwfpchdri=Bp>j|e)-^CVQzK&*mpj){@>{Y5tQcz`Z;!N_RIRBdCu9MA@*Nqv<%UDItS z5>%U;EM%o1Yf>&Rg7(-%zIu`T(0J z;#ei#+{^&7dLhsJev9{*Ry^cXDvOo(xxKuv7tFiWeft(Xcp87$s=b66*->Zjw9oq3 zY;{Mw9@D=izoL&(lcIk&9ObJS$h%|E~@)bOwQc{+n+0L0~q)8=z{vc)&<5#eOe;<{t} z6mi~}>s9H*s;tI=ag0`QQ(!)kdMMl1>vQ*r(Dbgpg>-sDMF#g<#@UK@`q7m6Xczl^qSU+3jb^(w|c!h5Qpe z!=JE$Kh!Cz=@02UD9XMQP-#=3;akFkJjb6Fijy=9exU>KXpV#C*zpaK<^xKd+^p*W`d|gWzF2(b1zpGm;di7;N^90S52hQ;Rb}SY-8Qlf!OUoC z!2-NRHh0l9UCam72jT$+uif9ZK~aZW^NPF7t}iL}KPm&%NU}Fk2o9$TP|FohZhF?xjDkhGc2_eI9r=wLjVVuYY7 zRGJ4ZkUs9$pUkRQP-T+iys1*R%nj@OuGblLr?HhUJx&<3t>^14t2{!4xZA8#)FRNt z-3HaesJwBj?X?nFST1g2!fqrFoH0{o*<{#D!bU#V;qZ1TbuQ`rvEEDHWYePovQbVC z4(@4w+CZSap%hqLrcEAtzsl3*qfe^XsFvKVOC10r`feW@^}$kgvPTgHc2!8;;_cn4 z*n&*kaI9bJH*e#-+tqyM>r?wKL!eE10hH}rJqo!ze9mn9$rftkC`N`@rvSav$QQNh zmJIWUB=-xBM-~z|4Bdixh=H+5 zeb>6BuJI_@ts9*)SQF(15T<%f52R;Z?3M5I9pIntXXZe6V9Ilyu<<@UFk>DyfakTJ0kg3?kN`fts=7nTWoAej68gH2JG&64;IxR6n$sB zt$ZbmDu`~Gw^L7NB+Ax(HYJ{%KkLQ-)filmr~f(VuByJV?SX9eW{{|3F1!1ThGJUS z=znfMbGYk8afRw+i@+?cpG{qMJgvIO(MRplD<9z_A8HZ6Ne(RdOvfu`XE0Bw+BYAF zdZyEzrXNiWHhn#H?UdIL0X~}*EF+iFsc22Me8t5!bZOEyGZ3Ld(m_mIww0t?+bQE^ zcY(fnrr40&^^)9JpUU%-D^3QL8DEOo8Zf=DKCjd5NDR0L?jiGUZe{`(QkH$-<#@Z}6l38!qTm-OoM4;5YiouAMA!_Hne z0$aHv_I3Y^f%z-s9**$t!6?!(xRebazi;l@nse;K_=~)&SdoxVt$MBr6u&59lW5zT z5l{(wR9D3EhM0%;2pzhu)V6fUw#!FnSq2zlT-(U%_i2m#gV$%btlm*~YP_!XH|S-N z>YltxjPX~^$|rs_JmIN-V_4!zP&LFhWv3hFXTHJt-bu|*zb5X zvVk=us(cnl#d4>cmnX;H_HeYHxnTa}pdjI|fNdi5|M8musQ3>}_dm*%g4fh|$kU@? zsq+9K5JV^ITE9sr-JKMsSwFx1Xi$xPpY3}|VTwCDE^V{6j}#|PvDk8!K5SVG*kGTq z*$T|$m3?pm-@H&OXX6_GHuo|c@w%4;V2n!>(1ou96uP-oU1m|R|%`*(1 z3{@svDpiuW7AJDE z`vN_28_qt-G|lXXCHE;k`%U#FFWr`K-E|;-na@4j+`!Ov(S?iayW+a*q8A)~-!@Nj zzXJry$ED`6w(Ahp4rd+F(Fekd>Utny=3$h%Ttsf4O`VUlZGN;-uo75w06PYfoqGHc zb#LUwmr+~HAgfOtnJs*i9Y9ufd)A;yU28FXMOhv0rjGMcZ5{)YE9U}f7dWt_yj*tb z9p}umqe)TOs7&%ME|v)U9!9URe~$ZkXNHdp%}XDGJI}0JU(9?MTr<9hV^ zN1s!A7_0|%2bHaq96`l>!*)<{0@$v~UtHQIqbz z)P2qf+iY~p%#6|SI)My?J993Z_x&ES|7CKt{sPSkdry94{M~Tf6NuFIGo`wm>ucfPuZsqrJT2<}u0lNKl;~|R?%`Ai4EjM-!n9J1(=%pC#RG_d;%=)pc;q&2p#Lo(ADB1;e0Vvi)+V<8KN249i0aPzF4*v7&TM@>&)R>>(ZWgGTB7|xZA zy{Ttdjia{g--R}(^tnFRKN0C&^zJZ=?xi~Y&A~13_l=PU2AQol_gZQ$MYHQOx}C;_ zTKahg*_v@Hta~|pG+vjXjdr@g|6ya9$iCG$uBxN?CTLeai&~jhi(h$LNt0fC*B2GV z*wiM)u2uFcq)B#w%tHthWmJ6wxu;^g*_MgAHc>=c2FM`CkMppt3IS`y@?tp3G3^W> zF2dcY6ZBEk>Hj7lJoZ*CQY?&Uc+c8RDj8?k>~kgX{SC%Zepy~eVzq%WO;5TXSd(LE|@P${Cm1yJ_X9l*MFG>cNIw4icXY zJE@@$p@d4!fh>CyDaLpFLasaVr~J`B{|69?BDHOt zUNBsAdg-nx-T7tVD8(o%8wlsK)dVmx6JCl%-aCu`H?-x`S5e=rBH()`6|v zLAPh>?7D|%E0^kJ6*qEF%#bGDOBJUr<|4_BZT@e1P3$_i+YZ@|uw@`lqWim<`F%m1 z*8<`IVLR(bGBNVc08G129RNF31&c#MAd`6UaUKPhrLU(sB{cs&^;a82>>u?U^>~k` zk!9J(hr3x-UnlF+!y43}7wh9V;ON&oY#nt8e23Tp#R$D=aJOI~9=j=?D$`pcjg0c4 z8PV%x?W-V|uAP2tdQzI5Go|d=UKgra5IF-sHAhM6bheN_s;4&l|HsmKt*eSP)-o>-MU;1M~yV8MxTHh!6$`)y051BV_l*AsD;Cp79EgiZDZ91LoixkrVfg-wg3F2OBnj=4{9sy*vw=O4#+n^0;Gf9_T zon#TVP5PeoY}R$U{h+cW=P^`bw;}mF7nY+@0dhj)X3O4TXMc5S+4rZ-P?^uMG&P6o z-Se;vAk7 zdV^n1BK14|5l!#>TAT02xRklX9mv%@tQ_~bs&K*hve0Mi>d2ErMSw9m&a4!9hHe!C zIDcj8+w3U#dMW_4>V0AlidAQOTckepCQi@Zi$U}DwXU9BLoMsvL0?ZK6{GrBmaWdU z^sF7V*|5J3-{CRb__O_Kyx2y;7WUy-w|xoson$v>8{@O3LN20Ky-UTlnB}(0-GVzq zwN<}JBH*zWTmT%mOVGI~AX#EWtR=)f@%1AujDH1I`&hluV8ttui*I#OJI;z)%DA>L zSRiDPM_ye}QpaAuF4UkWrki%Ug-MI+H{i6QKU}9L^IX59EjN?bDtyc9%;Qf?e07QZ zLoydlpIL6bd<9vJ**R?PKv5W2Im*_t4*R~JQ;`lU!KOck6~^B-X3V2$A$aY^!)IDn zS|-N`^y0TGw>F(^cKgU8B5kx%v-|cs+v26QJ6pVJDz{p`hSc3P<@7nr4gS9TE?8-* z*@d;sCE3Kc)g-Q|H|NtF`^1fuzDUQasm?k}`(ZZ&#u3 zxns!Ax;oJx#^DahrLSJiT$_`kk=3CQM3#%lW|SA?wA)E_eLVen8QXmClqv-zR*Tl< zUb82ioX!wyAS+|+nE=Rrv+D*mIplZ$rtB+E*oYmM5n1Y= zZj;^p=Qs_(K5|+V<^7bf06}-L`EAvBDmmM$PlwM!0{~gBZ~@_f!7s>kc3VN8=>|Be zr>Xbayok5M?Ev>@*hdAREhw7PwN?0?;`CeXI-$a)a^S(M3)JOAdVed;OKDoHW*`@I zIO^y{(-5c8RcHUSDDpLXjH|ZY9#-#%#D}6)j`WoCDG!kV1#C6@W&sQfU1&NKS0^y( z4X%H)(|QQnyeEVhSGThnp*QV?zh2GvWm$W;VuQz=wEgPnIj^)7t#Rx7_j8+Mml{NW z9b3r4=3R<)E*kfzGg%^DVam32_(+`9Xd)wnq>Zp!73KLpUvT<+`8(KpgwmbQfeJX-?U$^ zB9v;3Pe7UU$+B{cK0Y;{tsB1Y`ec1Az7S@L#ht47?yTQXBi>6^{UbbX!RTC_|2|SS zgOfLWeI|;f!ld&PfiC*yU~6|}0k^PE?Cbd zWq8S}T|RalXu5SzFK-Wshd#$tZ@@&FbrXH{`gWBR;el#qGK3nIlAbJ2-NkWAO2^|H z+kHDq{;gL~vL#O)K65U-00B9kHE&#fdR;f$r2ZpDdamhQzy*JMa40_eAoils9YSk@ zjJQH)hu4!TSJYmRkJ*9}2`CfN+l<^?=P4Y|oK}W?=I)j1RzK=Cn6%HWU)EvFdLfUez6qLWlMIP_dsNb%6YM|MF6WdVA+l^6TEO(e1Er$_I;nG9t{{psq89 z17ue#App8FH;d}C)Ei)#iS;3FVPCTLVRTj$e}xUko%VxeiSc%;6emR5)W0Ca;hc`L zR0Oc~WU|-&v#lUSy_ZcrocyF`jrmMDo4^RV>yBafUvZ9@e0%lNkg(g){BCjmv@2Ub zeeGP{If;oH{0nXj)5Ai}cad6HT1=yiGT1^5^|5@gBf2oZc1EjbN;;PI`w=ngvc1!F zuPFzma^Cstp{wM}>8Me)7V}bm49K5hfTZ*`pzZxvmaCm|*`ZaNU9Y<*J`%#Cs0{M8 zXKXiWAZ`LG;VbN-miVW zknS(vO%H^h({FFZ`eZ`y6SI)JGv#hjQRhQY1Z@^9Gu)1NX0dzU?j8L6cD39TMHcVA zf9{nwn>uwqc6xBj4WP7Mp29;kv{rwv8nJ?cuQ;vwIjZWUAeqEX2BQ~z!P#nKmKt=5 z6k&Xr>-2j-0MMa5+QBp`6pRslK4&$uyJ#-{eJS<%d%V(8m0NGWsEL zQFU7&AY9}S%~m950VXP4nc}xMd;4rJi}Z*{0acA;-ZJ6owQ3^*kp|2i4!5CNgXHfF z-K0-V=~y|B6sElx43KlJJ-z&ejLOxdG%G@H0Mxrq#5VRPG^aH?M^-C^OY;6$HO_IV zHAz2-qqb>d>`auDIavnkbM_P=y-Xoq%8GOTcBky+^isuOE_DlU_+MUrr98ZyZ!z_e&ZMOr}N^5KUU+}mxqz|Ej@nmb{KSxjnpvaR$Jz;^T(3lx7XqOH;_u) zok5OaJZb2w#v?v=lmqNu#sfJkx30D_k(D5s}h2^mgiwbi?0e zdyfM(vO6+g9?lkc4Q3Sc)npuokJ*>9a?Gn_q=X5`;U>}D@M8S+hUxtXpw@4A)adau z=!1nKnAYs_CZ-3FG3*e*^4LBgo3o!8l-4O#iOUWMXRUd&vh>fH@$h(B#>z7j6zHz$bgd)6oaw#IG6YV$o33Kc};B!E4oSE?q2X&0e?&JTggVX10{$1pn>22&RFH zTzVy|v)T6vJiADoMYG3#farM@+Wwujnz!GH1an@hOGR^HdmQ8R``#YPgkF71+5P#b z{{&=jrV5p||5mniHqT#*N_cbb6hq_{<8z`(z#{?HGY6uj@8>t|O|IVPHSJ$XSa3j% z$o>h${jkiAkrqDPW>oML&O~Me((}70w2jLafSN=p_36n*%1l}%NX2V|cPhwq&r$7h zl3l_}hD)Nq?2x5w4xYs@SY{^N2m6&bST2fMo#J?Fl4`yVY$g1u{Y>Lj&;O2RDt8t0 zpf~DVh7O+Ip%{NuRykUxeM5m5FPN8w4a8Kf_wQCvydU$%3}wt7dt2=b`L z2N1oo8&@KBy9F!fHXEl&czH%m5(@Lu3)HihSlm_XcEt$e-Py;8N> zW5KT0m_Oc!lWGYL)s=?XUtF?1yPC?uqbw=I_{*;#^%7PEA30qaBsyNMr<}`Y({*#A znrk+}uiBc-))V60>^12*EWZ`9f_sK~H zjgoCH9-sPL@3zx?>AmL`>rVA)MI#f;k#Du7AGLUy`a+Vs0iAO9fHhR21EnI>y&#&H zEBNCM{}66`Yqcki+vLT}w&w{8L(em$ehcV;cQ^a1@rhcG!djfo1AGr3(zRI$I+nc= zpM96|$n4lP>(a&}E?5M;Sy;>2E0g-->izf>_LE7gQE+&pZSHqwrZBqSs@h_C_wKTs zI~uIIAc)HTH5(vZStE>_gu=+?oX*hi_1l^`Kxwh z>-c--u-mDJm#gN<9^rW=vskA_S9L94WXJ@~1CrJ+SpLHy*&whAaOhYRhWW*dMyt!) zQ(F%GRNNHSon08Zf4d>?5f5HbI#_i-*LIOVHY*~DodcK>5L`0~bY#K!mbD(AP#1!M z4LF~i4H5Lm^@@1gT2m;-PYZY9X-&Znv;qii`~KO-*TCVJ72&~2YN-~h_H+q2+rqS- zDaQ~xhEG5VZgTdSRiSH?zTTY5`DI&WCo=e%`kqn^~;e=X0j~JPNxA zkajRL90#4cTY5#W(%>b?z`y}~Yvtijs^YEm^$fD>E+3Xr{=gzb_V5Np{gCi^<=%Lku6?`iS50xybPiym?0SJ zn^bR;^^?iLG%`-#ev?A=_}Dnpy)-jU%(7kM!lI&~`q}*u~xPz3OHR4(MbT3+| zF#P0O9?`O68IWeZ<#W0kE?!V?tPUGvymwkKEubK)+pRnJHt?V0Jns-c`9y^t-mFGe ztzsVsE9L1OX@3GdrNM+j7?;Fy07~VvMZc@&26r@bV#5sFmI{XsX8H|5zB=(>$EpLf z1D7c;o!_?;0x!W>DELjS8(V3WN3e7|WSn+jH$8516X-@oWo0?>q^0-zo0n2r@Zyc^RK8uZlQ%EM{jor3dkLDb9j(icwdQ#jC~AOjrB=B>H4wKU|? z-xBfPgRfVZze`;1`wQ~E4tYUB@>E1P~LkDA{UiwMCN4l>* z=+1p)?O#^P+)FJUZ#Rq*U@SVpGjt(?eTToK^;R)hNKGU3>~`Try0vq0c~#`|v#$5; zJ*?l!I`jq)=c&%HELzkzk}sBP7A_z61PDgRoi$#~-SOZ!cdC=UhIC!DP|s{{C8-&{ zS$B3>8RRB=_8k~4rCGIJ!20_`EhN)oG^<^wyxhUFh4d`DsgzcSr#B&>mR)}%xr_}3 zgzor8Tog$)>SRW=Pu>0+Te?``2jA70U) z69&KHLJ^1pc1b9CbO-_KJM%4|g)B8&KduFSeS==4VJ`MmDES3EWag`$)E%w$F)A`Y#ymPSdr65&HnW&_10wi9CqIQ1z)`-hqkiZQLTkK5l+`_$+O^(%r9x| zmw5dgP`;CRxg5;2%Pc{zVr0mKU3H>S6@xv0=K3p+N(UGkV!<}0=DEXS{#c!3)q#5S z=vi}arP*dxpa;8c1FBi)ZrDqr4YIhFLWX$pO$K~nwDb4p6lWB-wD)UJ^Ci8ev`;g# z+Azw)Bq(-&~L)~dIcSyk%a z=LRe-UR`N)n~@%C6=Is+SX{BwR<-nfnL;6816L;bi$G~h7Kc54(mj@Zd=<;86t|pw z@lH;CMR;a)^?<=*3{u=RZVnv=0UfK0b#n_m;Q09sCooMk2Pb4ylCwE>y&0^s&feYh zS2cdnE}vI@8hGYkX7;NuVZ~0(sZ6r_WpvzIfHbNI$41)I8>cooi-$rL6zTaQx+EX4 zfxPZBcr0quG`?Y>HnyMa)#G*LYi6;RaZ5%2xf)-MF-4;61lTv-cW)1wg1ncO>W?OJ zFF~vZGT%Zs$5cPn@wu`~30a?Q-Uz(iYLln=QJK68J#A+eIVF{!f1vTHU;g$CHh8|h zrngw_Z6we>Rrr6VslKG-8sh$( zS{Hb%iGCU;E=fi>J+=zxBgpK3fxP2=M|112*P^@SV_})c zTeTZ%OY_v=L44Ntwe{|EZJeeU258EB%h-gSUj13hWu4v#@SpZh)16oKQ5cB}!0DFq zusFXPM={ElR`S$q8%pb=U~K=#L{o8^8K#F(gb-}JjjmfK%lv)t9mkzg&Cd8Xx# z8V!228!nF8GmU)Hp79Md^I=$gVPUReX zmHiO&`jh`cY@v;ncgOnx-Iw&0W7VPfu`nbae zOKpu!Kb;ge&d<3XZcOJ?>^0xOl+yE^cYf9>ud?IcLpv>!%@`Iv@qQqv+4f?_rhxfD zA;D8vZBc)?V`w|bApcYU$4+?JlX)sJQD;;{;07*=SqvT?NBX_>|Axcmczm9?cV%_Wf-}c(e2p)N;-J{ zRnWWTzKMP2G$h-R&cJ=IG+?Pc^4p-rm6gWlO>gEH45@?1#KEv1chd*c^ZG`c$tkI( znpJ{+)&IUZdDu>ZMXqph^GIvpN>1%pN(6gyePRXc^zD-%6dtjZ)+&Q_YBS{2+&)kW z0luVYAnAcX0Ltnb}FZ z3f1gkX=?2@;0ssH*ClrCwF9`71(eb=+c#$Sj@_*_J4btIDZFNlfMrEu~ed6!~x9vLs-?zwW{2^JQr+iIHXUK+^9ztS4D}b%3{(VH5c2z-dN>$ztp<(QX6u>fN%?buL+)a^G=5BB9i zwU;ApQ}~RdA5=^MPK=tzpKfFw_5N{gkMR<-mS%I3?I3&ZHC>~WHQKNj9HlXKb#;o{ z*+s+r(kTOGjuz3UgIXVTHTPGs9&3jy`;epd3p-__^WpB0yrlzjdQNV8s#m=>2{U`2 zktL8H!Rz%?9#z}B&27yXTBwH;AwIjElK%4O)LJ}g5`+z3UrwMzKfiA%HbPj?r+sS? zcVZTiC*Gd&)~~*2kw-(#_%@x9_x=7IvHqE<f&HB_~5F3s&wtyy80}u&isllbNpakYfv>A4}{|* zCQFYU^p5I*wd>@wVWjuZ#X<|`*EOVk+bjG1_mHHLWl~CQ>y_MRej!`S5}J;bfVFy^ zz5GmV$_b$6^)LH;=I~ms{pyq15}UNV2R-7yBSaWa2bKfT((ahg-&ot`nK99?~ez=aS#(=Oed71EKN0d4WQK4#7l5^fs&qAos$^z*H?1kP^1Q4N3{%R?w>I2qL-6A zvi5J{kL2UZ9+oHT0j(EJdt;)t@5a)0&QkL(^#UyT=`c&H$LcQA=Y;b`Nkh!Cy8i1= z3c&JgOOTX0XYRMttAclJlxoFeQ*QtQw1>I%)X#w4JY$7;b$`toS`~7&B-*KGTTsuLWfY!SHtLY%gbxdN-(R^-uYiAyt(e9BD6L z{8~ig&Hd-SYEfeP(8+ur?>$5+Dcl*s#$T6Ch9cnv@IL`)Gr1IQqMR44CUm4rm)(1s z|2k`ZdCn_h+^ikV?5qDiX#)y2&Xk!(*xv=4nWP-Yp~_@bR0PODyY%1krWmH3wR z7T)G=c}M{c?^?B5Ai%u$%k!826JQ4Sg<`Bkd5CQ6&p=1q9>h^a4YP9NseS{V$O+W~ zcG9K+)oEciyj|CnzuI<`BAlS_dn)x_8DXwB4%#mH!|w|6=+N8wwLMTiw$PndX=|l? zpoJp&{{^>sZ+kDxRu>v@cXI}BC;gG7Qu%oHY4^}%xvmkJR1w^xkSG+suv;T-anedM z_JVr0bLF%nI-sxMn+s{Tdf-ZGbyaRkzkbVwk~h=AW2MhW^Key=>yzL)KmL7AC7z{h zc3oJ}OT0Utr}s>agnmRi{#x(24NV=t*Ws8EB&SBZ-L@UANACC0NtWX}6^gfG>ozA5 zk3SoSHg)GN8lRMm|NkgaxkJMH{`j|NNWt5pSV7SiX4=6HJtT%UT*4%D1fjs*7CkC9@`fr{LGl1l2N9D);6A>TB@DrQB)_pv%-Bd^VoghC{s}$EV?Lw zYPz#3m#JrCLmkSkOAoy+AIS&Wh)C?j^hO*(a`&vO${G3WLi+DyIr{Gf^{{?uj=|2s>^Xgs0nSiaZ4 zP*H>13bU=@9~t^yPEP7beO5EAI62YKV9#vV1Iyb%^N-#=IV10#&l4ZmP6#>KW~=|c zy8}~*K~;?QKH0=9dVf}q6&zFYZz^nN`u&;Pgijh9EV=1YyC2P)meuzV ztGrf!h&n!REPfI+er$g8ZP{Rq83zrM;5AOzj5dwqxW%(5**(nHL2NDypu}u3xnXABSN@rKUG(t33`y%q62oGF^l{r)mjk+dGa=k0E;w0{wu;r*Te zo|uvb;;BP~!jv%gc$J)|faEc?{#Nf6vzQbhYfv5A!Ll;)Z==B}DaUk$pTp@Z2e@(r zY&mb?X*}z|j+YhQU!dsP z&(GHYnz3rf*Cg7fcJ+=LsZkolvv6r*&<~u&&1icf$1;+k>qWEDlnSEW8?tbgee2_J zD-S>DQ=Gm|L%WIU=4%G@V*iVlo6Gdj@{_GI=hV;wfmE9jCwcM5m z=Cf1S%|^pz2J(@MQ`4$%Gx}*XS*xF{4CmC_2=s@Gi>k{-9P*LFZM|47b)drujjH-* zy99cBl(tp#wfweD>tlbETBpbJVm{{|)%3R|Nw!l!r^g*R%qYkDfc0 zxpinSHSJ#dI09d4@Lo55@kYrqOm4UCwYJlZDGjgr3Xg$QEeo$}HL^UWSPhAkaVLSQ za(yirZ26iezCr}}X*NNQc*c~)>H4Q6<3TXRQe!xbr}>>qY159R3hZ57Fu8ay9jhLA zAoT82gXEGTXPLhQ*$a&Ec za6yaEJI&;o5yQBTdx>1=Z4-i3ky3uc71 zuh^)(#>TZP2A<^|Iu|;X+_XHs9GkZDpgh@!CP+3H`r?o6;h*6iD(M3`8Dt2Z$bzcEZf*d8`14G^4P7mc|IYjFHTK3@_aB9GXKlE9;C2VIv znc`*Gr{0^dkN|hI)XvHY7Fb`MV_^1YR78o`#@^nHYQhu8}xWF$4;#| z;*B?-%K3Z&USmC%K{Yh7iqDW=*phBO(tHH)sO5pSpQEAEd|p7t&z+A_nzOr!#+IsiB!)je3ws z9m8~aH7-3X6+uVd9c+h9DnjY?SUAjO@i_j-P=l$#9ed0`yLmX5&Pv##M@0HkXr`a| zazbw_+wg7~exIg(ruS6Z4zkuJ+uq{M&&AEST>0&fjobi2e?R{(uv&!S=a%!b&DntR z?BaJFoOh75hzljCv5Pa8@Jnb-v_ojCpM|79w&BCLzjTHy52fYi`SU*DEn<`*X>`jH zeu84O204_u(Nsz}a{?>^%6p<9RhZH6ZJgd^L~H(NTA2*<1~l4B=XoKA!7}~Odz=f& z8Lemhk!-9l*BzpN=^?+IY}Yaxg3_Cz|HI$PiYtFoq<24Jm9CXq&^l>>tIoiPB>oe*o)Ok zomaLPJ4E1bPST&|gX>n0ZT3E9TN7|;&s%`vK1}2RX?X0XGFyMq>R$ihj9hoNz1m_a zHulvAk$ZFlEY*owB(#fXN>fYHb?2AA0MS^<;1v}O;uPUH7?Y@^`$r`GsBu~42RAff zZ?op+;jddaWvFHrI)^uo1k%pn%FOFdRsElYfS-Vu{t<<5Qq=PH- z>7|BsY7fMetmIbPhnv=Ap$2uOUjecxWn8@je@ri}&JC;Ip$Z?z>PYyy{`gMeH%`<# zlk;U84r8)X9rV}W$nMRbfO{jJQdF|b7-d1R`&b2FaOno4k1+v?UkZy370|L_@9l;| zg~=vve)jk19NwS)d9W4as8OT45j6Ij8Y72qELcDpOEG}D7NYRuq1dg&%=7k9+WLOx zGQ7=v&Q0i09oseJ`foy{3R5v9SEPw;LRfoQIqgY?if( zFt4ogr}a38icpvO{fOtgcN%U%dbmnAQnUH^FYNRhFWWn3b51{FXd{r@+I)cJ9=#7F zrJ5901l!A7^rD>#0mQWRLNDH@>{7?3T(jOaKArqbF;8;C;tcN%@S(H+A#b_griJ80N1*>YOqpw4hiA2vYHXzxeKRD>MM(Cfm}yw!k> z-60*F!Y0|uYoxk5U#!u!`@cX;u z6*;$;KKaw?3m2Mm;X$#% z{Rp4^^&!~mX55WryTcdL*)1ope0EPY>L+!tD4>1P)ae~L>38!>lI;gQ=2z?LIGsH9 zaGvB6ihF5ot<(&;8Cv?bneKa4o))NVhP~0cZ4~Ms8aO7r%oR(yBNFv)+pc0Y#?9(E z+O}Zer4xE~()tt3Fp+Q~8}t@b2qx>e#EL2IA%dd+d^|W}{r42Z=IV5^`G|-(((f9D z(k5`1YWMwdOF1)0mR84fjtx%AbmK;=n$-EYTq;C{;@gJ-z9{bZ2C43xe`v4e0 zpxg9?_iJ5yz(%@LCg#sB4J(E%Mbkh)?FMr03w>S4Ar987aqaYZ?{nNBrGdE>uK(9) zJ~QK--$J0pcB>A!UT1?+4xcL~CCWeYg!r4iC%cl@P7PADy#~Ppj7go_&Y#ssrX!PE zrSaZ1!_p>Jvb)(1sT4cgF%KP+*W-m5$K=XUD;NZy8r?5HziPFDnHJFv!?xEU;Ux)O}xnxgKOhx+`zP7dtxhemB~DY)p0 zPqI%+E;ozwB;i`aF?qYtM;_9y&gO7IqFsDR;OkBInFYmWxnJAO|6PtY8lyM%?l6cp z`E~bsJ$!<@Oib0>37+a`H~p*sz!y8X1ugg25D==jyx(dtje5L|{bHsp&W~p}mGbRU zZ4%<`bOY32aHVN)gY_i$mYLM77qkTnnuj%aBt+>_EbBV}Rv(%?U!$(oZIWCB0&r>k zyE<$WrGB0%r>j@<#5?2D#;p$?WA3%}r2{ttM1FrgLB}s8%)}!&tAt zMZa&@#|L*hRdMTp#9XloJkzHQo@P1{k+iMWpw{+ihjeg#%FBh6#{`#Bipx--8xyUh!7iwl7K zUiQeVGk*D@9B6wxx8Q4+q+gi=U`Huc4{LVy>8T6u0xc5aeej5!n-gfkWQ zTaNeHalr@cyMsxoyvGn_7w$oVI2~UXxsSrZrbfEJ;oxU+`*?ErWICtrjFO&^h!qqw z`Gx!yyUpux=5AH0H3G+{oq5?7kp)V^&kJcR^(G#+fu<&U8_Z3_{H5XEq{ggERdK52 zf@I693%f$ljbk+Wbd+m`erwtYXj$_jS_0Q`hsr+3+r0p*PUTvPj_2Fjuavnm#V8|w zQJ56NV9%;==!<_+$$T0}yWE-B)JZ}vesc0{$eouCfota-cNTwOT5h}A-0Che zA^frwMmznrKBs%}Io2g2XNsL6$-ge*c1|tQN3gQMCADP)tIwZxp0q#leo1%sVI zP4mUi34y}Y;P-?AOsGVzCWG{9xlZzjYU_#G*GbA&%j97Gj8iUAowAk6xrh$cfPQ@n zpQ9(%GN0AaD`tSIQV6_!FMED`|DNUy8<>+NICWYo7))@c>i?4bJ2Mo~SgJIy#YHcC zgkc8`27lC0u!i|Kk06}73%&Yio1EsDYs&$mJ$*=wJ^oR ze>u0gmNuGm(PKW3T~pAe$DEbtc6|iqWI~sbjRph&^0{*BnLU`He9y?|{`z^EeLAro z1mZ$y4!&vdo)XLNSlh--M~Ug|Zhm9|;Oyqp$lMp-vs@M=>iy-iq4V#n#f~Z`@9=o- zIkJ1}Zg1(yXLhN$uE9<-z1b_|!wd@l{l~mBcxQqp7pNDg(@eSVYQmV&-vx(y6doOI zd%T~kJz|iFJjK7kKzq83=NJ10+tFdU0Dn_YSC*c_W7Z$150*MAu?QDc19ljK;#;^k zW7`$ad29Vl2OX)@>%x~T)`8XjGr(y)UvtK>B^`VAubMRrQG4UUx%>$vPvM39;UDd; zOPXn7&sCn}aFVgf_N(!IR2EyJv*>EDsvAqRHV*X(v9FQX-%uJBrde{2 zw88%7vB$s|0R29}igDKOe~9XRE+p|@PkqkJXLobPt+NJD%lUGT%ZXm*0Xt!~uu0^% z2%!x;F$CV%o!jVM>?-R;VO6ShZ%PDjQmJL2EkiD6Cq=k>dg#S$%m>T;o#}1+Yf?JB zTKh&n;l@y2v9f}IL}R!1g~r02GfoC@=TgVGH~?O_nNy0wPlz@!TN#~C=)6Sy+Ii$kFLTyZ)fR{CIBYH)tH&*YHnV8= zf>ppK)&$UcjqmK3aGOx=KAuYf{J!#D5`H!FO`ksBzh7j4)G~JW3s2=`2D=>2Xz|f$ z<}ES!@h!BCT_-=)qnlQj07a4|ZtOnQe%b_B5b&ai9e3dJxZ`%I8AJ0Vvo$*ED|u=5 zu1rh*YMyZWcFQg7YsvHPr{(B{LOl+slRhu_L9(}#lbyXYymkp^Z*PhEhX$VB#P)c%}QZUB!T6^af} zQDgS25c22IY{sA5c?Ye5z$V+vZzU+K^e#K@@yS01N53u7UtfP`^M^@Bz2eei*?|*5 zc4%{Lb(g9j+Z{(es(P+Y0nF!~I<5-Q3$68T8xNxlLwWO+T=O}v_x3X?oodSvgl#&9 zTXfl*(p2fE$!|ldpgeLe94qj+tv%x0J_pLlf%yv-W50eo)uTStIHqNFxqf>N41QCd zr*c`deeoxcetXrtSCr5Xmo9yvkYaDw(z7*~tGSDCR8z^CyaDm%p-gk!DH!54D}eFw zTUUo8r7&3D?i8HGf@;B1+Vj#6v5$`C zWZ3YgClph`tOYUj#cdcEuG(8cOyrPuyrnIa_f2n%u<_YE_Lql9(bi-gw}Qb(YWIfs zx>vtqPE4gs^ZwmX)P`G3>~1`2^EFQ$&;N36n5Nx@OoUeRAyTw!qvEzkM=YnFj4XZz zXvq$uJ`WHoHn7Rk`^}a4UaApnOCg?@?6qAteTbl9Y3?QT>ikMKCRyk}Z}cj8e3E5c z-Dgjy^6E(Mbqs!y;prLL)lQ^O{ApY2CCa11bZQ1~z|ZrDGlzEV9W5dBl7DK|2GV?= zJgXeqmwvhtMQDBM*`onj?pn>6*zI+C;0toROR;`Q+5@rB9)pIxnIY!Rs2>+#6hfPs z#mGvBI-wG|6ikQl@6O|v$`62Ij zKGc1XjgN~cT|`ReFU-xKXA#O`LM6FWu5pu03Rds_Dz>0*kpHROUH(K~HwEW1&qC_C zVaBdest7agYW@x{O9{y#vaOE&0Sr&l7pR7|IJd$&aP#~e@LbCbVr z=nJD}Nh4bYWXfQrSMrHi(31jR`+XbpMZepK5Lk~~UtZy1l`^)~^wl_1_)S$BeZlMU z9Ok!>kTQ)jTZVE>^n_|M^*^f4Yh6)vi=y|u1t>vL3?K$X1r&^^m_ZOE7{ILWf7Y(P zIyZgMUsqL^vVniCImbB7n~y5bWZtlSC>C)#9nWPPA?lsYoufL?D1G-Pdp;V!Qj&Gi z+FapI@hkk*w21N-#g<33S-kIUa`-N}hjH0xqbo2G7nkena!ST)t*P{||+D@Qo)f zduAEI3XUpwcavxC%nU1TZ+9^ofEGWFa+%VKMMu-)ZBjq~#^-YSb)ZS|Tl8nwQrGRxR|Q>GhQmg;=z!5h1A9j1QyDixUN+TDjVRzUcqTQG!UkEdV+1kh>jqSU#2DD(jhQ)ia?OApvJ^!f}6ud3DtTe8; z7B;`kFBaG8IEk|gFx9Hr zZ=t?PHd0EzdpK$85ggyEv+RazQSbMYFLgq)wUUR3wsF<7Upm*N5vvQ|ZF`0pv|E_- zu{C*``R9%A!u+TK=@si3)37%8`H3eh=AvD*sMi6*7sHmtAP_fNJ2;P5wxc{8MtE1k z)5#3y0(cbgt956aY)0&M(`n@r!Hu`+oW+K#b(vf;zd-d($dx?ylPi*GLO{YG@d+)R zS~^7!#FjzTQ?t&)X)QTH1Q%hZc^GzZvfok&N^fLP{EVOc=pLj?`?TXhx6sHT`S+uG zUUxWRIyW-w!KU90R-vPR>rbnH@2&Tr4B=+9Ct34XYrU)|6{lC9DxYErJZhF=WeJUj@_ZTk3_oUw*^{21l5H{S z=(o2uEmOKtK^S7OM;nv(~3PpyGj5w5VO zl)Rq3`lW{TxagcuPWaH|YGdEJ5q!&YbVyCu%+&&S# zUA6~yW~tb#W^%;x&X1#98k&YSMFN`Y1AW7eV|_EpW}qn{&qCR6dwpDgOzD7*pn8^4 zC%U%r&ig@r(lOtHDmNP>@GK))ucRlKua3J&9jlanH@bKh%~AfjjRws$tjnsq^mNd^ zRPeMHj;^1Frj&Y;znF0E)+7zaCU3gcgKrajm0jFR@(M!chjilYjCcN0@h_Xv?}@1U)GA-*TNU6ffz(cp_@W?7cd_ zA?t15vn^rtHTAOcM|xH@f!za>^2dbgufH6#u3U^+f!7S)uwl$Wsf-?1TeSH8aN@I!<(H|r8D%D*+;J@@g`=?8RV9&RJoeM%9Py7~`#ChXu0wW)#-MIAOzTy(76@CJlLwMj^;}n;5l5rv zzF?th#)8fsST?9sT1GRxynq+S&Y3Iot|l}9xQn5h^MB(Jb8-J7bPOV4K#~VA!oCHr znIZe$dINN+97}cfc|gb76`#cAK_1l2>2?iHkUkIdYHByGO&0bDBVjp}a?nnI)atz* z0nH#E$EGncH~89U5A0`m9f?-0FWOqGxPBiP?cs(X`ZS1n{s#Bh)(U+@U+}@nLFL+Q zZjqdhW>D$iZ~cv6Zog&-WR1hO{8$HAQJPuwSz2e(#=9G&%0S1|;A-K_L*vr2lO{2w zabW8Yzqd6qOsGwsAlz$DZBff67$jIH$u0Vo^LA~1fba_mx{yTWHI(G%lBCxO7{cD< zVZ+XcgtqJZ-hni05DvLjCQMj3+j+;8euA(|j;fJ5L3d?u4T0yCZqxmIdMivu^=;Yq z>?5P@dV?YLHZP-YXNUO<|e~Zg)&(QWTNMLB1K zseNEgx4u8MJqOpfe?Z&7Y2(E=ws4GUP%u_7g(CX7$K^R{F0d-7T6SObm_)bw+b3sG zDBW)$&S{n>#RU)NS8Jy3-3rN9Wmo||&-X5bo;J5N3~Be~n)#H-*`jXM(aXJ6(C2t+ z#fpa9o)%+s7>s1X9*HKvGT+-use|p_UMW3+xM`zNnHXz&8yPA_2;Cx{a)b*IeR3Y# zp~k>$!ss#IzJ0gj{$w&&9%3xvw-*X@l)w4IsDFI6CWzcw;S|k*LT^>l?R!_A{2$pIJS z)LY*l4}i2Y8@T+|$3^$cx`ogID&~h=ts7iC)jHV++>iPZ?=HL{ct39sF#~xabqmih z^;_$O1lNQzLuHS%^<(C|L2P&OY)?kRW&^V5R6T|)+Ok&;SB*t@QNs;sol4%*U?C%o&(gl%vxS2JA1z)4r(5Dyo_z`+e}x9XSN7A^ zGF@oJ%y2VAV@$)^yPl_g(Y&(P1Mx`$?y#V-ZW+eZFKx+v{d@;$Sws!)a zJzrn6iUsYttiT>&Pqk0T3Q(chGET}-FOE_<@_YZ*;cED79eji?cuimDcB9Rrf2T^z z&-G1YU>0;x7)U`YB!Cds@UXROV`NjD4eBq3%_b3CQSL;iivmj9f=GdsMo^p*3yyr7m^I)EB;*x zp}DDq={DPW;FFZAe0qh+n;+kl?Xlp0m0}158osOcdG(w?DpKiZcJy(O50#ztMy8Hb zlfZG1T&nH6);1Tb>b&f|19%;(KNms|qx*l`X2xK9TYDj6=oPv}&;4n69~GHTVR8z) z7SK(lx%`_D99DTzhrZNxkgahb%v%@ z1i2FZHWDD$oi>~FNy5uSzo82Yy#aa%)GoCVxz?B+7QsQIUzefHz0&W^d{dx!&B(Rk z+r;*JL$Y3nm+BVx3-25Hhw{#<<(YMrhGlKl-&JQNtd87`dB&P%Ke`6P#gG@0)H~;t z?o#1Xa?gg|7n$FvcTEo;tI?w6fAe*sb=Yd~F~3$bX+tqHTR)U%$gymf2hLIpu)%av ziwm=bwQbZ2$JH?t?DFa^udOq5buvZWX>rq2UYm4!rvY8k@z;58_?ABpI@g{c`?Vq0 zUXKnZX5wQ3-S?eLpXn~w!qeg}Rw2W;CN5c4pBE<1f1a^91f z3Hmc`a>+W^M-{_{6XPIo4@^9^?Gf09ck2Bfev@x2zxI4|)2%=3k|(CF^r~n*o8g@( zg5ohr72ee9jhtgZ2#!XFK~q^dlhM>3UV3~qom}o1{k%WU6Z|Hfm>>gh!yOHnk3|MA zolD@lw<_UyNI*J%00KmWKYOAvz3O6_J#?l=_Sy8#L3mn>-uY|yl0m~k4!neAGrk1$ zaA@uDVTqO|hnDEp@?7uupsiN<@kUbiHz&7>n&<4a^$F;Vv!qWG{(Cy2Tcni_nSFCb z6kb;$0oSYTMK7%`t@Lp(v1|cM=%L*U#cLaESapjnHY?pN$oG^ zm)9LQ%BAGFBe{rKHo}=!a>g+hUkvy~HW-fTGa9j`){iT# zx)VItv4`{i5pTO3gI$jK07@0x@);F`hDHv^0c! zL>G_8;|e^Tn;oZ#TwC{|;5zNzQZ%^l5rTkx3wT(^>WWy!7qutfdEPCy=7j^l8g(c) zb}tuDnAtbeu(b5|aYw)Q_>RQR0tENNc7axn?8OMPmGP(4_8CBtTxx5cXL61H^|{)v z28GuKeN;!dHEz`0V!lgs!eG0z{~&@-c!j+177Ugd&8P{}z-!N=y zLSH!N2D&e7H`B$S9#lxpKVShNdBg8&v<$HsGegvj>Ou1p=yWZIo?!`!YK=!(Lz6V3%e4ARuKEr->zHYF}#Z9 z*t}i~uq%}X$RBh3?6jdJ9(C;VE;MiBVu7|}8xnE9bK7k8%x3K&D5OmD(@ z&B|w;KuW!)$Bcsf#X50_Q8p_7`oc*(m>z};(kqhm5SZv zR{El4T2zDU>~EU&v>^*E_tD)=Sru`0DT{S}Lb-%s?}LF#c@-RP!&Aq~Obf=Lwa=s>2X{iIdp~_jm+Vs94mzVY z@bJPo$PIj}v!7dstSNkU4_d{~{l&XlRJ?DKi;i86u6D|vxtaamaI#r$0Tpu|nxF7F z22zuG#A~TH{SxJKZMArh%dm);{FM)nw`;Fc>;HlrofPNEin%Tu0-nEyIW2z?_DhyQ zg2F0${wI!r;m`02oqk6FmufMZQ^Da3K30bR!gY*s%gSPNREZsxsL zOd4J)V3vN`sb*iIfN5!f%K0}_XMjzESbo4kZ(~D(+u;S%H2n8L%M01glq=o*2bb7d z@3jlDGz#YPYzirTXVAx_ChhXEXv@3USwng}xZj3#Tv2a>kIrtuaNL+1`mp0M3$G8t zSE5HfM|-Y|6BCoSCe;gyY)FReN2=|mAccnuxbqmVVZ3_@z~qRwD-=hihgGh+1SXD- z-oD!S*Rknz^|=vhEB>;)hR%R?ZG>&b`;sYt2ru)rRU=a>f_LA z)X?$edHy4RR_m=v14#4MqH$nfkIi#1kLV5(9|k!#jIPEL&@OAPekj1*t2fq;&*11x497;49fM(8o-I-bGFd{CT4R=do*gzdk81VU>)vM!^Zj~J)ii&wU&Qf zoGk?IIE8*8Gc14<{`7 z$wr6E>~-?&$9gC%SaWSofK@LZ_n~YU(_HvicAi8E#B*uxqIN3r-YMnm2=QOT9=nDh z*jXv&c34BgYreKHf++6KCADEM78Rl3r>>iKu0*9XPHPJP>%kociE2kK{a`z9rXmK3 zxYA?-gQctr*I;ycaj-q?dMgel8l=8h+1#yl`@lFU==KFd$)&oE7Jv)4<}VM*3ecYy zdAbgo;GNHsFrEAR19JNX%MrZ%e@o~u!n@?xe;Cc#$bPf= zo{6Qf`tkf;e4_&UWK8o})`HJg;`@Gn(-CgReIPwP*=x)pQF-b3iFmAg4Jj&vmM8oz zUIfIen?|`Uj|cO87e>BYJQ!#}t;&_@m-6M5Oo?##ftvJg^KJj9n@EP>N`zi}PmbHy zBu8F;gMpXt9K$F_R(|AouQeBtK5Y%wm;ULs8%AG{IrQ%+?-5Bezly+N1=e#MNd+%^ z7J^iBFI`-^;SCjFh+BiZ!XNy7a^pmhuM=FiY|w>ZdC zG~^K3TY%CvWI(NwYm8(EgnmgoVMTyVF*X09|bI`4R~R-OY<-(Vq`jLhbF3 zRQV`)b~5fPnm={i2n6`>)vjz9vJ*Y4)rL%)IX}+YGA4x{6j<;c<+8dAI{YU;1zG_OMzN zOrPSNaKs-R@ds}d=D_J*q#Keml`|o(Hjbpn=5m>B(am$=dfyBs?57C=CDqUVH$2W; zkZC0bsO;XF!ms+Yl0_L-<95zc&>vrhhp*iXtB=NA=6i>(_!zzdAY+|c6+Svev-|Pa zTG4M2gZ}vnA3)v+l=kfrw>jEFj?nYeDy^T>rj7tq%v!O#II}bIi%&KG-WTFW;Z%VH zoNeXirz%W;J+qviw6*ad$Spaha+TPS1#641Ug}K`zA+-JYJ$YK;!zL7eWvuh z*Gl93#zeo1!3KM!j8}b5wL+%DzSho>BsT$_3#0St-M@;{44NYf+r2Cv?7}gEpQ)0J z5`&&$^cK2vC{lBIPTrE3t%>X8(_ay) zpDQ5sLnS9u4EOX~cQ&2h#uF_Inv?>BnA)zmk1tAz+m2UP!oe9ZE37iDR!fhsJ(Ks2 zX5P(*EqF7zg0(Ssf6a$P4~Oh}4mS_a{td+n?VI0vBoAv@HcO`;ydD384C5B2)0s!I zXpgk=t8|~GUoOW_-W-zD&wF`=5!1BbIZU!ntrB974If;z#-Cbu^e`~L+d03@&(rvU z)N;XfjYoCfFg60d*nHw6JX*#s!YkP>TfDK5U`y@kXR{rcnOXIHc`o+p*ZMAuA_%B+?e87ytsRc!{mqz7-I-iPkDSgi0!1r0 zk?z%61$kTCjc&_5wara#_HHZ3*O`!0%#KmC3x6-Bd!$uvd@D}+9W2#JUiDu>SH|%}} zv3wGaeLxK^i}}kj*C_8au{O+oN>sT%`%?AtsgR5(_Dx1dU(1m!kpX5OM(T)6c>Snq zGw1X}?)(4%^$m{kp2kfP4yM=gused)DXLUwm~nOmn41QKTb@?Kg} z$o61&IoEZ3jUF6}ksZP%Zx|KqscYoC*&o|yV4nRHi z`JUDOfH)zoyuuySp?tkb_skW`kk4_4SE_!C00;4O3YFi2`#oI5S+}A3i^_NA&tw zyUMJ6+kqvngeDZF@UxBxjY82TS1esZW^dz@r{sCj`iarp*=yZO3CuF841{676IcC6=b<+TgpWPH5> zOxLKD40_Gd<Fckts%1XQPCHNkc-JadUUU2u)IPi^+Ysf+ys)dcC0LTW!BhZJ z(yE$>2|SeTtXuuvx)P6mXFyaGd$3}B8z3Q?pTOos3cNerK87ko+UH3fEr3An1m6N- z-jT5*#{;e-GvKW{9HB0ZHB!*+X!mI!HjafszfJ3?p7!2kT;CfY05i-;^>vUR&4ItKPh^$|zjp zOuwn#R@v;ec9me(>6qLLk`4+2;8qQLPby|Qtn}2F@&vfQ5hdxmuK-4QBlffN(TPUc zXM)er$3c|X3||Y9Sg7#d#q^5>^||}$ASx`vdfAQc_9~wFhghIVx_M> zjr`+7I)!3eioF>Cry8eIqgPN%x>{n&rUO^PXENfYuad~!H?+Qoi%vSVUW~P1J48}g zvnYdS%s354yXCmTHh&5qww2-Ed5RHk+Nb%+Wbqg8LPFsWibYpm;h>sx_w34kWp3p+ z)-q_MFIic#lq%!GU6^0!U@{}EgFFz2{YCu-P?_6~hgq6*&=wn9+g8)fJUUn}%z<#L zG<{=TPVrvWzai?dRZEfN`g-!hPEL0^$$@X|wSH1erhPt6)}C`9L50v^vY(fSQ*T#; zEDDCknwbBar9X}vH!C2i!wtNqe!y_yA z@oXa~+4p4JXw{4l0!%wINw{qLQ^n!<~-7FzKj&7b1jk zHguVT8=iD6uBVQi>O!GtN56ad@Ado6gF;UQ4amS>Vn|&*yZ&h05Z?sTO5@P>+__j9 z_BdzhiJ42|HqZ5yvVKT5#^FzRy?mCe4TBBI`F3oFPrB+1- z#%Qe3_tl~VhOq0j>u08)*K>Xwz?Q&1EgsOQ$|Y#q7jxfqe2}C}QZUd{2#B`?T8u?Y`E3k@s2AMAw;bSY%ml66U9+>L0RJm2PfelSVkKaVY#wrN=<(4 zuy@{a7Lg`Q@HF_(nhym4kWnKQ*?kug8XnZ4v( zP)eV;%OqA0vA-_2NTL}lPk2S3tgx$=q1PyU;Uhl(JY)TBWuR4f0<(EbnexU6*G49)6l*d9vs^~~Im=@MV-f5b!fc-QdOt$}5| zojcxV@7?6~c^=8FGSq80N86=ho@)@(7Ru$Uw9;AZR%bL&8>KAKRk@Rt^~ifq zOCw|DH52@cqI8?Li#f=Zozi~P-*#;i%QYv>PNPr?K!D{IkNDMi{|cugd7Wp{qirSU zq1s}$hDOilg^0SAoBP|@%vGN3Ef&f$dguUwjN2Z6OfkB`lPj|}f)b3mep#$9IbY13 zh4pg!nR25TD!nx>|7MX>`Rl1wFIDX98GHPCmgdxcXPm-1mdleRq0m6ziVSOQfDm;1 z{Bwv&*_fP&+Xf{4(IdbVON--_ME?74o@IWawu8)uJ>{6qfB){MLRabXsCI%!CwNPF z??pE|O63h^5Va+AC`H;FT)Sa=g`V1pmVvy*c!>XLq8E$S9o0Lo z3Ja89AUt9GE(@I%Hk7+=KpJ8S5O>3^SfXBQc)$o$7XDh%=WL33&(rKx!y+n%=^LACjs|?U4b$5#{Nhnjc};&6^|2H#$cIgs&(p?#ua(5% z*~$0DoJS-22b_`DYlvO)cC_jCU?Mwx+)(OPtzGmkxenmb7uPk1WS0*Yi{6pE{fmvigIhB@7yC>eBZ z0e0RufNF;haBjweMA5K@)N&syBN-zD)`mz2pkf1ShunllpmGr z=C}pt;%XT;?fC@}PFT?$yLw|xbAwl?$KRU!FACAkY5aU@%kDSS8ac9Y^VD2P?cVH84c~Qn`xN zOHe8|Mz7K6J9xJ5&uus}r6U=Z+Jy^JGOcUd}b|>bir@! zfQXVF9z3OjzfYGXEc)Z3X4MY6eU)o&+hM8sy*7D5Od*xiK6H~-?gfMt*n!IJ?^3KE z`B(XRZ3-A`yPVXYr3Ro)33TQK61xSsyYWl2QnPd7JT+PEk6XNsWFT-RuIu;lbOjps zfm(W9d2v$V-*BBU(tye4!1kI$qfO>RbT&B{{NUe(LxE+_5C^sVpw>;s2M!rPlRLF= zcy^MYuTng_LYWUfXS{cd^|F@~6m?z;GpQA*)W{Dz|K*G^oLL(nPqs@P^oGL;Y?aO+ zHzV(7KIJNNe1UrhvYf`Or-uc8goVe#Cre4x>yD?G1Ukt<`C8DaMODk+!~sga>Kpzz zH9$+^R**QJcFq!XBC~*Nl{C%Dr;871P>Y|LV`UB^7m!b_9#cYiIH!U;YcYFlu&}Zj z-{7=XUm5*D9ON?sK$Z7{-8tg$-!Gx#G`D}&B{XY2d<+=3VbMVQkO|$Gb2I_P)T#D& zaei>%z4|D+ysx$Z)r7&zV3@8{kHzejD&h4nQ>1cX{*4uvP_?ID>6V((|Igpo^XK*5 z>W@*t$>gt_6-BDJAGMtF)XZMs!d|vdqo8IR@J#s(5z%e3b$%fvz0vF zFH-|Qlvz_+BENl zjj>t4?MWhRj*Wnhor-2Kb#A4N;o5#CErcRdSyW1ag`wX&euiyn)s1c?ItEC$9PZhd zPeh~6#hA-QbAT<6X{{eZUM8=J7tR@sXEQ1hg%>~zL(_msbO^pvF%@b4>PVkU+MI8q z7-PQQz5BT{sA~%yU(>(W_CtB8!vnZillG^p`7pp=P3_B(MS44P{ov0dt)+Nml3I^f z53cpGxAwC*l}Ap-Sl#v9uIa)?NP>m1Y3)4n+?dAGAmc#tsWItN+rl21+R|naEKkX9 z{EhW=6Y6@Sttl0E3uh-jdghT3WqCU;C8cVoeoNr9C-y+$B+RDX{9q^xWfyJ2S?(!?)mw>`lT((K%Sf#8m{=;AxebNB7; zU;&&)s_dKMh z_Q&1TKY?$}t)|So(;j5K?0rl*_Sz0^F(TYVtnEMpgqbG{$&GXy#5Qsrc z#_{DcY1l>X#4TI-;qATRm3(P&g9EWUW;M2$8nAEwTJ{d3?5RhC>Mw<-I~`_PTnhf}*>CS|3ooS!CC zG&Yeaa|t9Fuxz(7e$8YQVEpc}f&|6)t#;r}*K0%k1O-4W?^?V;Wp~?m3s)+jYUw_s z_LO_WlY-;K^W_Ijk9u`UtIaWZCRXRwk4Uaauaw^S%Na4K?^tTA{bj1D7|ht2=x~J@ z%K0pRL9+V{vvw4iK;xARMstk1>O0p_E^@j2*h0BEQX$Uo91E(yMqzaL2CR>^PW-_W zJ`d5m8;|2o`~y^a_-K^>KJO|k75$nD?kabYs*er*NPqIb{1tiF5JG_cp>m_H%hvjZ z^4Fg>#A|wX(7yuBFqYzp0D;8HlE5o(gJFs2?QP{X*f>I9IHeL_pMg#qB!krjSFR9K zr`(R1c{81-S8Z(CJA+OHJ&SVE zLj59a;F=);@IQ=Y`g81K0mC7pP22gFl(7 zaJ|Wt4Dt;frdz(Bvgb3$-Dh8=IoOh5g=WG(5nR1h^QSu6eFpo{@^kv(VmaGiQ|Rpi zz!3I${YbSFN|j0Hf>w9=eQ|Z@m?#PcSSs``TaVUu&fZ6=ozW`>>$<(sFK*a}7Hx|T zul*v`2ig}36194`ZVpE55U4{pm z0ydRPztO9Z5h{d+T<1nqnO>s%-{`8QlmnM#JFGul$EBS05rPW9HBlDAzdAxM9tHjd zdV^VQ>gF+D$sONKfbZj|Ooij=M}PHZ5SpS@<tV)^7WE5sS zWWC37)cR<~>d~G>>jje$J07tHDtIsda>j#InUhkm?Ln%0@&L9wI`@O;Q>DF(}97)KYbI+a7>EqLSFK3t(xY_S< zR+BiPAg%fN{MaEi>-1_d@nN~P+YysOw5e>J2N`Y?zY}rLe3#3`1&SX(yt3n_W#7IP z-ff9a3zL10fyHWCFkj_8M`X}7@XP4)I`W!Xp#m6WV&UM2jj}Q?-Q7dSxN$&D`h3&P zcY2N4^+vVZAFSY9a?`LjZ_~k7RPw{3HNq1fVszPA&?tF6a%JvlC$||w>ZeMg5NSQ3 zF-$%*wqH0uDy1!~nB$DUJo0?8(tL~JH?u7yjY55bC1aOCZ>%Bj(oMw5C@oN0_tJ1A z&?nFIrZhB5KRDo*rQf_#7!O=XV<^*K9e>GeN4EXf=4YmAfNAPQg5NH{8Dv@CApMn? zE#AwL?{g`m*vU|V#?9X>-C?~&J6y~yJOwQKMF$1D&a6~pV(Br(hNdf5*R_L#~fc3 z8E4cv_y=emo9?P~iv3mk7@v3_%ELuHjiK9ZWip!pnQ$!Q4XYf?<5yI{)X3@0AMT~! zn*oe=*SPvj9g|K;QbpR+_%|f0*{P2^Kd@d630gYz_Ia;GveHVy-nEt&{q`iRn6r>d zm=^v{WTg~cNu&E2{9vwU^GXGBqUPk6^q@0b-jHoP9^M`&4f7XOv&H#mGqSBd(Nvz9 ziP5QkNQgNc*+dd^#EyCHr#Ksjd39J1vxvbL$#-0B-M@d@3S+!ytmpJLs?sfCDfCyh zMu#*PmU!m{!&cjEKR+7V8Go0(Zn`E+-z&js?+8PrmZ}umkKF9zjp*_PjB3g37T zXUcI1&4T=wElc2EBwz4~X4{)oGA?$#^)LkudN@O{3nDvvSCPt8HM96fIMrM!PvrTI zK;0rN$*lF01l*$i66<6RMFWIoE^&mV#L0tPi`dR~e;<=yJ~Y96ShWIj?L2e6@gRaa z7*AizSxw<{@UzkJ-o@K!;t@|NIedr*as9sB=a1KA#n zs4@}0>r=Tmnp*tH!|Ej(`oWbeQIvu$p8Vi*W^3cUnB{rL0pp``8$1fnZisX2Uu+T> zb2KvW+E%G&$kAuEm^I}Rw(OgWF(B);66Rf3cQSQYr8=)K%&|ncV+FEXKM4_D!23n4 zNq?GV`*8qad|eYSwY`wrp` z+bhDb{z_@w^~$J4aHW7)fxA6J?OLzw)nQ6kNG|()jz-?vQ0f-;IlsJy28CcIX)r5B z)Mh4Z`M;)Nwi2##hQDv;%kz0-fZ#i>VY2M^$H()proaHA;@X_u2NJ53hr=3;L8Z$; z=ltV&uc)1}?U;`p&lFN-%7fSNwzScDUuw&Y-E%aLS?b(cxl$YATU8ULNo54a5@-%iCtd9_I zfUiq-9~AeiV1Bgqyil3}nIK|DNw{=+Epo8WC@!;1D%ozgg;dMD!Z#U4cOj`e&MDi| z;R8tBy)s=)ufJ*O(dIxB=}V`0QQNF;gk)vV{=x=_z1Ip3-+lmB+?_-gWGPleLY`!@ z8q@hsn?QY=eh6U{Xg}!|o*x$r9$@YyJE*ys(u(PC_hpb`^2+V{kQ4Vvm=BF~Xmbtm zZ9}T|BP#}PLD7Vr=kTRPG#_lTYZQkQbp23gj*`zY zh9N);(14GnZHINJvF)_&&w{1@NNgOrO6M}hZQlmGef|7U+cxB^3dQU1PpBML@6SRp(aM(EOBas-q}S^&B;aqkkJumSOB*AWQ`DT(*4POLR7pU%%sl<|RA z*eD1q_cN!cpi~2QS2@lqg`5W}n-a6(6}rv@!3ea*xsAXgH6vYv^c_r+{|1X&A?GW{ z@_giVh8vq(d}z_I{=RDhRDM7)DLA+K8h@ZZ#I>vQ*q>a8NrxEvh;X+^dGF8EnP%Va zZ9BJu*LyTE)2pKOd!$bBHB-hwYGRjD69BUv=OSnkEm_QTWhLIeg~8dHzS z?bI@v-gNlv{#r~oV)A%?8Q&7YBX*LKoco^L2#5MEEY6I>OJ${ds~SPWX(sA;^xN~u zmdh>b+ScA>R}escYn5uAqrX$;AS6#EgUh?gEhKhgI7pw97cSHm1L4{S)kwzfoni)c zzmpmkUO~CgtayJY(H{>9OACQBnTe7#w4m1LE3pmfqQ@Q>mhd&L_knHKc+`bOf!$bD zZ;}w)ojR4Yy}d+W<3-=>BporyqFvs!3LU`Dzg~d8+#n~Jn|B6%9JZ= zK*aBEYz4*GoT}BY@De%??}nG6{4ioj*jw16 zoJd1oVV%qz%~KB?to!jd8tv3RTHE$kx6;az5iH^$5pQ05@tcRko}z`2n!`D>uDoxm zC*B@eTYZsAdHg@BUqo6jVf|{V-CEPUz z&gc0hT7YG-N=U&Xw`jD0oycx&oyg#w*=E*-$oY~$@EqfP>+7ZSI89QwCjvqZ3-V_c zrU`>Dd|9e7N>RZ)j#o}weZzD4PcsF8*K<5d!4WuUAKHceF}02T^5D!#L2O2%Xo?I)?vn{DYX=2Ts4tn0`vC2wURe#H z|LiI(NnbRS^h)MH>|hlH(%>H}@^giKGoy$11*{psKN3j1Jt>H2b6C&n?|f35!hB%8 z(pDd%O8~lWHR|WztSFY6187ms3#9S^T1rNuCLM~Yz9!;&F{~#cJyWF0{GQaiZ90J% z5cTvI8MB`W`W;D8DQ-e+ zK$Kosq1DEPfv|nO1V7Ge?Lda-|t*=CgPaV;k2 zf=K2}IE6Z-fK3nenEc64eBi!ptURc8cZ#R;J{6|O1^uWVV{jK%hsl*I_Ugj^j_B# zrFZq76at-zuGhQgnsv%MO}8z6GbQ%8&OBrKDhGR_R_>Vdt!S6)hehW@gC{I+y^X;9_ePeIjBZl$dd*>zcfAcR;aE&?s~r<~|QwWk=E7 z+VvO?*c|{JgXg2PaO2(y1~4{?t49PNUUc^SJ|+E#i-#E{XV*UlKg$JKcYCp2<7`zf zFb7ljMsCT@KBxR(c74;Meq&wL=+f9+t{$IK7E#`MuST7Il9zjCP9v@{RUu~Lz-H`d z{3wjquhvfCWX&rpXb29(> z8NLtQkOrvy*O(xA8+2)faReL5{Q`mtBaY`c_je56=ymbn7SZ&Od0z`D04-OLd8X>p zpsNFN?V+Rst9OZ3p!s#KIO!A@&j|)9->?DTKK&;wNrZl~dbI7F3>K7}&|%^TQcl>W~wDnvJfN zVP0_4huTsfGDiDv=5kmDvRFed>f(pXt&u1>722|sPlgTI?ME!&f|l#u#oiPP005RT z+c6fWC(~}WcW?qcU%D>Gt>b750f7VyR_d+SOGGVyBqe(S&dL|0)!s6rSru-q$@J9R zKZR4HvTsc1-9b9@)koHGz$WLU*8*#2x|42KxN_e^uw(7E3g(MhDdYZ}KDi=x0T5?8 z+o1a0Jo3_rn^2ACqDt$HT=YIxtMyft51m8$1n~1A?j7Gp{gy}m?3Pajqv~mcNU`AS z>qQbck&PB)t}79wRT1$?ORbKUa4{6 z>8TeGX5+pEZNe;X(>1>1;=^cA*wxDSno|tR%l&0$(Cey5r~?pEMJIxLN8^iRNEEm)A!?RH=eBOW99S<3p1Mq)TMo$9P6*K+kb7ovrZan zSQYvsI5HABL!kY`pe_%d$T8iC?zDq0Kw@7BfW~OHO#VgwYEDNAz7+^@>h8gtm)qTj z_p8m1Wj1O$Tt;Bh=Pj)U84Vn2{VQ^OqtJ?6f-?3jVYCiSkC*VAHyh@d&2QWe)q{*# zk4&xN3>od}_jj^Q1*Vu@{V)#PT@_grX&8~I#gYCf3S$EWIq)}-E8k68to8f}yjgta zd{ZZBYHj)=6^!?Ns=mJ-9CuRl6O?My3;!{PTjS`3Lio)nCh@6tRYd9_us}|XPXJW>&ThGT&<(y~X)lv4A$3BtF zDu0|Q!_R214vQb1x2A!?IjgK6Xfr)W8%F~ar&HR8ujc53>HS8$H`&~Pim#vj=E3!vUq(-AvCCL#CmEa*rqT!^x5Q)2fc}+GZ;ueBSAbpiz9?iaL+L`_duRHtzj_>VM#-%>)5~vAq+DJn48nR( z`@-+ffFaZ_?2kw@*3wH5X#S)TIXc7ZFAYy^;46(jh3ox3>yW4n)o6YHc*nIXEC{$v zZGNc(k-fz2eWfA3`9D#FaYKpA6%ovf?6AxtUd zH>v;b=jRq?^!V+us1w)b!yGPX_|?<5Q=>mo0r|4M0=A34Q$%v2_jIvetOu?4DTV3d z_~P?v3s2o-^PFaHy+#6;uz(%=^77TUJgVCm4~9VS3@+XaQ1nQhU%cSN=mWf5Ukxex zppRbx?PZ(rDgJyA8J|X~;xFXIJ#lwn5g4qNf)Sm{=(icDJGjmlm*%8_NL`3b_LB5mS0hRV?bA+-@m8OoOj(@&k&kHg5Uy0|cjzWmfGkXYd ze82htuO!}*6$A!nr*(-niKn2?TJJ7qtykOo^vb&LNk2cp@y26KeA4*Fm)KBVwf!?4 zUYI5L1iJmlkbk?aNwe@nCTchs%nM)TQ2z==++{&;QQyoyV9IsH&+5I4r+0-fl$mqU zYo}}g&xi|ud~ZpdE|axH^ zc~_GO=d7cl#*4;yxCKjH=(VWBb9LXL05j4BWcaXB+uN&?v;JIKLj@~{es^q>DEy}g zu+Uz5a9Ut9znh(7-bptXGZesBSrQUn9?jp5POYsr!65(M8grX}R)@l%=KT4a3M9;` z$A7QJ)5RKuIty3nqVoZV8kI0ttT zFr17lumW$Egw~|id@mhCI;wqnEn}FEP7Ao*t~VPsx-E}gxT$+Drf(bs>E50pfgyjr zhSS;Yzx~m1W_DMWldD3by3+Y|-({aI4s15=<-)CQO?t6AEQ)YcGt zUF!lJoFfuI4({YIZm{o(&ABP6K{f8sxY5}r2$eTTa{YEDdj38*DtM|ihjK1Gf(g@p zwa5okm8}#z7a;Xxez(Xj_ifwM9;?TGypd)vlAasesIz;nW>rL9np-MmlaAjvrFWyT zT}UO-JztlTL*?E{--(HkLpSvMd>oo0@Y-s2!BAh0aLZ`Io8 zyK{DfXT_aaX~wge>>HXFd|Y{P`ee}VNNeVNXUx9^4q0(rDhF!7gUvu{M+FjoXcM7Q zqXleXpT)H_9feV)G)MOijK!d!WsTgRu^j7c}%8_q8*rEbSg#w$aOqt%3>Xxh68?ETi3`G7f43o8Sf z@6uKrI=llIe6u?A%Q_%{4_7b+#IitrK0h0a=p5OGU#C9fM;*ZE%iP-QVD@@E zSAV+Ol4oa9L(%QzKE&O75)SVv2Z`nbKN~M_b)la=&D^8hBK-PT15wK5zLzs1nLgYB z62F+~&$*-65|NAA8+)~SN=q}ewV&U&B=3&w?79snt4XT4aI$3JzcQaX)cf+NIJKs` z)4z}kQI(WpPZhZ$r0Cwb4v;i77ky-la0rZk(0nNcWQLBK8w|j`;mWHpohew6+VGyq zP3Om;{VFP1VC)CT_~8aq0fqRk?#d(wxdNAxrl%(+1BAteazdQqGW*@HA9G%lkDUOB z7~%tFF9eWUlwAW{!94&`HdlA*#a?+QV%px~yTuW4C!)&sb%y!H4ZUYsCUsNQU6vQFkGb-t9zQc-u(s=X(Iv`;gaDayf+ z%Az9$RYEs95D!r#)M5b{6BMUbU)a!H9A9#8(bMha!V-Lyd9qFiq6kCZP8o}5>*0KI zY3J?e4VSOEa9maAzXY@cjh32UAvo{4I#b-Y#H z$pO9C^GKFWE+HhK<@zA}?}a{t!5}~X43fIZh`;XCGfAJICHwJ874{-Z@171v3mHxDrHDN6-G<7o*ao<9 zbr5|17SZFdO2#BC<}tb2bEZmfEQ~LV)4x;U2j|X6LosfCwJL2f-sv?y%2iu5a}{;z zoR8cb$CFWS+iY2_xXzbaQ_Oj6@64?u;kF?A_+{F5Uwn7sx<<}!$!dMQ^D6e#>1tFWWZBdxBXQaz` zg9mqbcQSRnrkV2*xy1g-+wJNFobrc~)YIo|ZKeA8Z7*8MkmJTz$rhYgc^4w&j7P8G zj?T#1&Uqj0Ti#?<_rYx5zgKmT4n%dgsHWpCe0%3y+~AT7b(s%dmz~}pY5nu8cV^kp zORePf(g**Li;Tt@WoxwS*KJyumqYhfX_x!^VR-W=O0IWn&&AQmeMh2}9D1X9AuFA{ z%l=x_<0GUe#Ny_`^ky`qQj&s5=+)iE5PH>zK0RoR-3c+b>W~|=BigxzX z=l8OLN&hO?|14m0gF!yJmVt8cXbb;U;QqHiUT3J*9EIBKzm+4!0SMt+F6&{#phyo} zg>IWb;CEfJ?WRAF4+nyu@pHM}09dv^1@T7nNDfo#H)Uh}8@et~IGJA(B@i}7BXa8T zY4YwEFD}TgLXcFtcg-OD%ys*;{ARz>-Nb)a0ZxZICk)Vq#?J^zZ9(;z^IzZ#UwGwQ z8pvnKf=n(Yso%{uM=UbD6f%Y3KHkj7ZLiHpkh(F1k%CrlbH%J*Tvj5bB^}8T?D*)2 z9|+#uerL(;VhwAK99p?mE6;f@hrqm0Db?Hh{0m=;%3ZDl{>)&*Zhl(2Wg$?P>L^sO z^m~)heOzo0XR&pKl;KHcv2`#n4M&1{obO>$9(Ux*j0))$)8ti78TAa7){E%mmJ+CLsZC$Z_0qs%n}p~9Si z1{HKA*{FN0b9xKRJw~1-R|0dDdkJ`zu>-BJe>L5glEp4pYg7V{XXWXsR?K->vKtpy z>^_%cMw4hA<@-46chlq#g*P=njJRsgN(i~$`HJ(2@`U;(#nXm;mxlB8DPgjp`rUPBt+YGHQKt!0gf1Ba856MtReIn%Q?-dGR64zGekjnAlopAq+*| zchK~m&DIa{s-eN0yihMrxw1Il`av(#{Dgj)pW`}*6z4=!;2eFestaO$%{1KSkao3& zes6?pvDsRJp2>SEq}RM=cdt}Nn?HxKM^)KjbIdPMy?Dlq@(3Y-QrpG!+4bzzBlls= z3VdH?E<)ctJ=Zx@rq0hnnz;O31>eSPJU#a3{$46Nus9~%@*30k+vOmKgm3Z**_kaA z`=H{;%@+$=6&eCi?i|e)14tHpjZd1L>s_={HLb*EsxdxV&t^yecDkdtKFA1~8k~OU zfOyfyZYY3gPLGD$)FH)hoJX_X&v?P{9;V0J%XLD)uX0)n+eGc&Ovj~hXUFHT{!fy>j7lR5G_!xTSIv}{i$`#qaAX44#e6cc~)j>Od*j>F`X)E1&Gl6;S;+Md{ z;I6HL$WknJ51<Yjk%gh>I$1#fXgrz|(}X%5walma z>95AJPxd?`6oF#^M@@_C_z<@}>ZERAp=4_GklZ;BUjX0G+DEo~Fh!IMiy2PV%X0%Z zp8rR${$Ewv_6MBjdH&r`{;QKmuhY&Kd7{#`qMsVKR);6t*xE)9_;)VO#$UPHuj+eItRO8K`$W4dNM)K>%56ya%=b+ zGtbK`qt#InPk+86@XC-V57IQ#sal0`QQ*SB?tZ^72wWW;Yz#QTg~iBQ9v6zjBl~8^ zt@uW7INxEJW&$arT6H|=Y7MtqZ8mO=Uo9Zgy;H8N{{#yq+N}fx3Cr5iz5|Iiew5Yi z3bw8Y=p#0Co3}}=?W~(KrAYK~oUgH;m3Nd<*YETXjKFq(;1lZonD^$fXk>6Gs(w0& zKYG6}m_ooP3fd&^sV6LBwZ#G`SqkCN*~sIrNh;}?C#TJH16uLUo0#o#KfQek5XU6jxn)!Uz?ZFX7x1KFkA!fRb#d1qsE9tJW^ zju%G_GcMUc9beKjtJL;*tw0BZVXK{;<5rC{#3YJKBf2<0&() zU=wxc^$*3{bp$DeydgDL0(y{QI(iGqAXBQmz&Z!pdF(rmG*c0FO&Z#rHr6m&GG1>~ zycNtlD%(QmwV-|Z)HOy0AnfPP5nxBySkv@#Q(s(0B7gf#hw%6X<6h1Q4`OeYC)eQk zl2$>DnzV{`5r{4YwOn4qiS>Tj%;*c|^jOstdG%s|OWyzFgA;6X^Rp3$)K`FIA;+6h zkS2Ocz2_>p3egJ&)%%t2N8=+sglhC?5!H#EOsGA3N9DL!QDiixyFFgeF=OC;O#~f6 za`7%M+z6m5@QO1!X6V>;ss+|Se}1$`m#}m=@w0rmeVB|DVq;L(&sCryhG1wtjoEEC zTi}r<`pKLbzwjqAii`;a=@MggS?a&lQ%1#x5k4}mUQ*mR;LRDA(Ej>zt+rnUQJ6dz z&lo_M5DoYdk!XQ$I?vmAATm)TL}bs(K}Pp*3oQ{~w?X;7q3!0OB+H`&N(Miu<(Vbf zInwu4exU9u#TRU|O&?is!+B3hrOJ@ln;NqAEjN1vj_-ZLJ3S!pm+nq)XUY|r6`MB& z8m-A%Tr!%VcTkfED(@@@vj<238!{*CHT4`Q*#n)i^Cw1hIlR^$Hf|&W+rP*DPm0-Mf}XYc)cV9baEmh+ zbV#!w=#X%WkVo{3>^YG0!r)YI83)rW-0-i(zqvvTdz}yT4CiUju==$qfQ@$L_!8(Y z?G-vRxYh76*y}>!owtkgu{6{mYy%~)j7>eB++ZvSkn3^31upR$BY9fmyTpJf`w*+p z?FKhl4t9C4h@u3$=r5%_&#Ur;O@s4f?a}WMGwHam00!ihT0}L6e9uh}`VXYs5nyb)4gH+wi;k)I@_JwfO&eV1vU}M)wZ?q zA-H$#ECEpgcgtLaC=;QE=+U*4A$#dE*~y_g6P%r12M`l^*pV>r4p3Zz0~N0B#2!@B zsO$M+1x*3!1FM)!P>j^QcHQMa8)Qb9WGXzFkiNAmdi1GKF>%^yuoIfqf$l>RfbRQr3+WSC0G0=-j^WY0tPozR{$|F6)WB0)4>IpS)jniZ zPo;cCPA?!bLh=80>y1MEakehc-Ujt4?<`5~5<^Ffzbqw1mDAamT9T$)sxVAC|WWXmb#86JIqNM<=%#f~nmTgSqU$F~UN zBn?I2{q%a3Lv#3p>hX|QtsxJgN!^Faj!zX>As7dC#KT{3S*F8p z*cU6G78qjEgKZyao;I&iKOB8V9d6m#cE+%ZCUnliufg+jQ%@JIu*;w@@#pI0=k{@q z;hEtt)PLB%C&u*O1OtJMN=7bE_!kQ092&tJ$IdXaAaUptM`~`qs|B!c>7M?x*juu2 zolepE=7S383={#~iD69<>}(xRi&<-T1=<`oHpd5UkRE-y>4{T4xD?YiS#40S51YmM z0$)@2rBKtJ!?u5~tY$zL+o&yofpCadvOf@5jM9JVASdQ;DWKg}A^&rb&fXweH!0=^ z<<2HQ-c}Zu>HZ<*(^JJew6=4@6n+448aKGHLyq>Ow(L}XMnFB^SypX@2lzn-LXFJ6sHk4$hg-=gQNbC-n?&X*kT#`Dm zPF+hw6ip3&q`zn3G!34FReHdGByp7diB?yx13TGwYq2<9@Z196DaBy=sCFO=@bA-J zobu?93Yh#@GyCt%?IHH^*u9*ti2EaO;0Y*tN*1j&rKcO_$v^V(3OQ+ubGf0S?4TI6b33I^1W(U|-dv)o%ohhL z7G*d2*8cQyUF`Zq$R1vqD0r?KsLhSZLsrcV&<|r(ORzN8Wt56l>epJ6Ui&EDUrv6o z1u};I1Y(Nbhp43htN)P?M98jCHYl9ekWoGyfiaTjQXj==!lK%3F}UmO^~&FubWWeM zjq_7=S1XD>QYTLFN_D4rLw%*1{dfrMFr^GRomAfNHMBsed$qo<%wB)MCYO@ z+vb-m+s|VWHJO}v&CjAuZN6B5vQ23WT^2Oj&jmldNNe!jHKKhZy0!qHeLJNhf2h|8 zj@>ZkfNXjgOx4`2s)N6cNM~t)qQD=xKJp~y z6KP)PJ5Biiz5-8dWWz}m+~8%yBL=N0`)_#429HIq5@%qE-y7ff{~WjeJFA{=1fGo3 z;NN`Jcw|IlpApahxp(e<^6y_`u8HC;fhF=ztxDxz38vR~GLw6MHof!hor2MKDc;?bQ@fOYqZQ`SQ3tAV z%U2MPR1~J!Pvn715*H$#j}7ZNKrPb^{=PDMd2$vAYk>Vr@8G zRx4c;AIr2SEPDr}x^EuGxzxm3Xn?)m02~LLww6FaM$aRD zH#W;thEl?@W@Ix|G_pUC-`iQ{L->M^_rW(?3ejt=q9SOI60#`KRF6(ifZiuH1nt+vduZhMxY%sZg`t$MY`Ve{E&X5(zR9LCUD#qVnu2zjD9rnH6x$Hn zEnaybw3V|5w=O=GQ|M>|+~IEUCIx_?2lm-{)iallbx0je6)-FP|6l>pm*sVipnhyKm$`jwz$>>^c%Go z!mFFdn*FW^28rIN7;=S%C>B;VQkX!apQW<)0ncGNa@oblbhg-Qlhfqkt$qU>EfaW>4P3F(B(5yf6WxJ=eT_FAcebT zwO2f})$`>$lcW69g+gK1T0g?#ZRIz~ZmmXkxaT?ima%xECF0|_mN+G69T8~VMHRbu z2fqvWriu1(_vyd0(d!#dZm%PLWmHyOLX67p&`A+Tv9vnS;c2-Yr>7Zl<*B!DGzl*K zKk2`?ltKE&iL)c#`SaAIXW{yFTh5CUjP_TGCoYKgMFk@3o<1IBk-jf4fjGPOw`#dx z8W<(RZy-RGY3{OZY&I?zuy=!#^N5)sjU{8@%Hb#MSoAXto6xA7OWGf3zVBFNg&{(xiB4 z32aPTomFy9F^RIhNU80`nB8jk4%8$ zafvaPZ1%|TuKt@Z)BWw{-%Scn@wd^+@s&#I7Kp9-bAN-hN`F<%?>8Ch{O6S`ziX|n z@H~!F?TidICCs9U1=*JlT@YmkRR);N5mGsGdamCqX1V*x_<%+b;d2&=f)(W%Z zK!^MeepYY_g~E8ZwCV2Od>vxJF7YlBR?$r+gK`0R-_x(ubndi}VZQbqq$O)~AA zb^Z7w(6>2U5fC<0`LkAIX`^g_y-9CNYD>tu<-t9@L~t)HydN~?-x=B z^Y?E`Ih)+~1w{@c4EtPTLvzitJHtbZ%d14(+^J2i0 zcIdV%;$3hc*TX$tzDN5;iu^UTn(hN=EAh?p(18Qyy3+J{WfoW!Uv4ms<_dVcXWIx> z{J}tISoJU00~*PNj3d*d{&neB+ZL~^O)p0lUSee?cs;}~Kv%1Po z(c7JDY|q(n80yHTt!LA4B4vQR-mw;ym7tZCoU@V5)-$TMFdDjuANI5~DFMzsA5}_zb|N9~q(!+x;C|Lf-{# zr%bTTsmD+ZUFeG-3p|sKCRKzR08i$}OcVH$yB?0D+(&Ow8`ms|qiaB6ex8$|-mC6A z>gE!=N-NJ#7m}5^xj01gwu2ZzWVztu@#a+A;3PwvugMQT4l6TA;6*Q8Di^)!73AvLwaGh@BSPZpCL0^0by zsL;5Y-cJfKWX<8cYkq7ET$F2J-(L+%4!C3nX$#{jFvAW zl3RBI!s`|sNced?0JF-+FQ$ERYzOpSF@6U18wX1Av!uL~?Py1?`Z9PO!9?<@* z$+HokviD^@{ZW@=O+o&i#1Ff!W+3Rzv|N2=)@%H`y>=k`XoOFfWMfj38=)69T)x{z z*ZF`d>R%6dc!}1t?!u@2Deb_?U*N)mzwLzU$ryBOk4ClBq!K#_Gv{WyOv=e5nJb<(iT7(bmg{PL@gC1O{M7y% zEUz0@B35TO-zv>#x`8^&cs~XmNZ&T~ZWEk$&}eLtJ$Pb!pmdRD5aCST0ey4LB)u%l zCr5g^$EoqFdi&@QOgpLOkEwp3n94enGs`it)=6iiDW}e!`ytR*sx4@153V9J3MnKm&fV2+Y+V%i}m)Y6(c!ZE#G zkCNqi{_hRthv|a2z;sQp-$;S4XIHYD~wlZBs-}7 zq-gd{=@3;87{Wg`;a%D);EY@w&7wN)MLjnR=DDc^Q2J?6Tl}S<6O)+;iIZZp)18Hp zI)XmD*y*P|FKn=EGv7WC1}i=bThAZ6%M{e$IQk9(JyuaKpK(uUM48!aFge`b zE(oTW4<6ew$5mk&-e2)sEiTJozc zb?LvpxEc-v6n|yx&xf%+;OuMA7+v(hEEPT}Z}{2}_qSPVk-jNXpL&I$tJ7B*jL$O-%_?i|-pV9dIRVxzO_v%PsN+u^w@z+$E?uuZiu@p$#M<5FIJ z{OG{Ew&J7+9y9eg_xC^KVZfBkK_ZE!wFl@ zbRny-*gfw{i^0_9m~Un`LiN4+%`7W+2*Uib`H-WEV6H{-vH1^f9IbTAdln=N5JjZ7f6>0g#-(#zXAG;i37+ngcqZU$@q z;%Lye0)U%fViy~caE@-ew`iat6GFKGg`RH~|( z+UMr z@_C1_q-oJU%m9R7CCcnkMkk2$=7)`G@3Ne)hRa`^IqO3qYtxcz6lIiO`2p%TK-*)% zJ-C+ZWq)|vchAK%)O9U=xG@T^y;B{nk$rp_$ouB)HHCwzQrt}4*Q(!gm(Of^>cZUu z0UnrhI6yLdfAxNWE5ylq!S4mv7VHVDf`x^EFN|QC>RwK!H#^0IJf!D?}k8k+@XIyo7Fu=~NMA z;20ppkVv~~*`sc-pbJZA;o*-6b>V^Pw3fQE_8A8Jf#t?e$jGNbCNLcc$ZH4eIS>J3TEGpGWxSoHZ#c%i{Tewi~*JA!K zAln3Q&0RFEPzuCJ<2-#1p1O2*?M2xFR#881FS*_882_Yr2|%iIq`lI!yEylvPBWtH-jebe>0u)eaBnuv?wJnXce)kg`0WyTkql z&1gzcp3R);Ci=sNq{%b2d(Y*}MZjaa7sKl(SV?%L@BQ~^#uVU?`Ij85c`c&I--kh1ny`1K4fm6L%I(9Om~`VM~l(vS=*K8I#;-vV@}lWvwW2LZDjCCb$D9MO;A(TYxaQetReT>Z1UE#Xp-H8Iy^+yZBP#peY}YUv(U%>)wjwD1ig}k~?)6ODS%pIc>ke zm<#}jnP$bvwD;*qEDv`~DS5?%lE-||FFCd?n&%U8RNIbP1|0t>(@G`DVSAofF&<@v}Z4ne^r$ zZ*HI3vrYr5Aq2>|(G5==oz#E82i2RA4La6Vbr_}6T*q57H3!RzK;r

Cpy|$c-5nY{e%<@05=_F^fZh4+(W(mquOr+Hvu@X##?70mGtbKPUQPV|@U-7mk6{=e@sk3*8MZuOklES3h3oa7XB;yDFBy>C=H-NJ z3x&(9H0tso*|3x#|J}e8@KQR9=~TMYg%9Y```286Oz+*yetPn#d;m@aE>Hv|ubnHF z-QTBGq)FA?uc=Nur1*Hxf57msup#Th6vW%8kI z0G_dR&-I`7`3Ke3bvph7)Rj&;E!HJzd*&QZ9xsCz-Z243@)=0yeoB3Vc;hmopN}WL zA9w1DZt+NE!6yH@8j04n5uhL?J{5K|A~Q-{20(jp$)<~h+DEzA*H^O9fz=T zV>_&9YBQ63zp}h!;VilPy@7eJ#pWebhNaJ`$u6uLE^JcuV0={db$FiKn*jmgW&%2{ zr2F{>0^GU(LDRXm9jk6(_?>yF*^g+^Q|3x&n4&ay=T&Iw#^s(6>Ry8E?I9ljs|z&Yia~O-?ucQD}PeG zP6I|(=XChH-!{lS)7NM3!^UGOX?{rm{n=MOHc)H^p`u>)+z6d*;a!?P=KPV_WN5o6c>C z09WJ9s|uUtAu`~&fM<5)O9Oh+EiqzF=jegZ7qI`Kzt<+w)^>A`Z2=Vof0e=rri6JL zV4MWmyuTjfnsgQbb;5{fwRHw6;gBaqNdE3nDt%$oa1_w6ZZI@#INNbaaFH4}PNs?P(AP(+&NjJB+&+H3^XvSYFK zZ1j`MDAf+&(7sHfT;#q9+6bg;f(G>8r0={%YO!haca<-}UE2ODj$DG+Rt3VRvfY$I&LvHDSlMd(J>=1X=iw&GE@v_#kXG*S+$ z@oqKiyRcqArdSAj9c=8F{@zaSxiuI9)@YnvBzuVQ>|b~myXi}A9#VaAE@>T5219We zLdhxx9dPM*e05{|>o-!B_$R}P-jy_B3FbU|5321~f7ejtc9z|W zEzFZngSQ1mfe?T?#0;XBjbkqOed7GaSJfGv?BZQr{9!fSfPMmaj7QCQP|5!ga4tPM ze4%6Ou&J7LvZGV_i(_PNlH9`%{f3}Dox(4>eV**r##eauk0frX^s|TgDaDlC{l?nI z)E$vN_4;>sW~JkpLF-y!FnHZA5BF1xqd9+f6jl*dyVT9aE zSeClV)qLE8SekU~t&d08IwVs9sr^1+%X%}>wN!t0S#W-ZjZzkO0G`TSGdFDN{=M^SUnrQh?Oa=+K0ecKbSB)q^Q0 z|2nOD>emrK3w|}+^7VxJoIn=gdezf!f?q)QRIge>>bLoV$^C9WDs%B-3m4Sd54vwz zTVnP?=wpiWztJMVvDL3^WKXZc3MXX-8BaqC~WefP_Xo@y_$V)TprP@g^U zt~njptTa;rtDGlIa<@4DNF3}MQ(D=dU`T{jc>w|ePn-nA z0t^Au%$c?t2&6u7L5EG%w^EqAd))HTTL{7%coS_Krm|^lTz#xXKR<`iN`1kdAC$?x zr*}*lcH5?hDWgTV^%^4d;ba>FMeQyv-N5-J{?nxv~B&2>-i}a?&}j5 zOzLaW(!h`4fBj^K56ACOwLQ6@h?`l`u-ZFsv8Db=34jO}Lr4H}+*`mL^0_Nz&kr42 z_KkAh~rzC*Z=?>JtspqK0GY`2^fOdZ-V;BHka)^^RDk>sa; zfp!XD%;qIu3us6Jt>6@3?X67VZP{^cRcqeIRlA)t1*cMwVp3iUou%Jw09vO}Ui)&n z9kq~EsjoHXIp16)@o@6(U!7;h$Zrh2<{fN=Jv zFm!xyATIM05d&b4)m1c_ydjdhmRC&6-!U@(vvYF1p>IWrWTv0a#Drp!p+a1{=?CYE z%vY|DRDo%AYXp5R9Lh*LF8tcTK}@F=xdvZTNUb&C5caex_dVHwnXCs8_kFD zeNM3X^=R4++Kr5wB)1MGhHN!`o#1^;TO)X9V^;Xlrgw+@1*z;QuQ!I$N&PTdP#-~{ zFU&d>M$BV%9EZu1flyuT4EysvnTd967?{7d|8iwG`=u402pW_tb?|D+O8+KW#p(p6 zm~CmLdQs>`EaAQwOI{jB*iTog>g(xyS~>2bP}3{!pYPH{MBd%R=r-*FtSP%gVpOK$#qtl_O z(|63d)bo67`KJ;jadO@OT)&lkNgF2CX-dJ#ZkD>iPkl9X^UUd9ePxAAY(&M!Ko7?`W#kjI&_1jtdB{c|ur?`s7ez@= zzY&TSmeMLYVfjd0JvR~W#SvD~=E%K*%_gBY3o|Om-XB1dShdhw_k);nLHW!U8Nj1e1}Q7AooMoK?r+Y9YciywD=eE-?9> zNZCP@x`r%P$NK@sCP`_rc%O%1?=*oB&h_^W`1?ks4?(jJGnW#d#WPbzFL=0Gmu=aS zxT9VoqB_g|EB7Ms@D?}5hYL6^`>H<1naxM=TTIV^tO(zR8Q*pEKG@@jgkCIsXUO<7 z7u@@^rSHbZ7SGkcfKn^8kVSpdDb{ZBr@XJdMl1x7cYDPeP4dBkO^@KhVH_c)BEyDA zF=r2Q{w4b};OXC-ad8gc4eqopT*d_?`L?-OnJ#z5O{+3Yiy8?GQZqe@A;A&5Hwl7` zz==(J8agZI|J8msi*g5>#(l42cF91Z5(n)f`}9GuVA5~0Q|rd!w`^A7z}cCBvq!Pk zfFOf4gV#KJns%mT`~2{xG&Lh*Z{U3+oXa1v`5~B!Tu$BGSU`kzUs|UE zZo4#{rM87C$adrq4zcY<_?4(Vb}FODxo?Kz-%HZ_EViOTlg`nplb-bF%|2sCKL18$ zplk+31fMMDu1cS+OSUG#B%JxHQY$QszP(^Fep{WLF=7h4{tI^@N-EBZR7_3PzA_lSu|UDXyzuQ)B3Z z1jGS5y(Yu1%QGz`q@KRofg7lmb??Iix~|-Md~Kd=^-opkk@TEi}?n9H9o#$osVh%W@<>+Mg^VX_vX<@S4+`%MS7Sl+`2qxNe73~Vm~Z}#_d z%IeyNm0NiNQUI{G+?4_~8f3Ok!Fvgd}e+w=AsRC6S{I6FPJ`)A6Pt}g%~=S#yY z_-hrjU4N@B^3RU3g%$4cncNOp6ZH5AAaSaIY;waj_MF_s9CN;17g5(KNwS{{>>Ss+qq39O>@Y zrB2~1?JgP;Q~}e+sI)pxxY6jLH5!W>{aPk_8!5!SURwd^=wohBvq1jlRV z3Nt$RBdzr7@tjU6_UaJdVItZ@jT@myu51c;cM5^X^X--;H+i^EcgLd>^Kbw`Zw70q zt@%jlGs6n$J9|(jUUq&i*0mPzq~-83yaee^rLUC=6T46I>Soo1S(m$?H%n)h-sWYj zjX$a3P8G8>kKD1*%*`2A>*x*3;@+#rd8mfJt5l+Ye!X?EMg76TvuebE&JT{sH>mZ) z_p8yg>y1Q6+3ziejj>K7bU7rF8w8Q{I(iwGk|${TVttJOTL2F z5*fZ#`AISgSnjD{T3#O^;~(fbX~U=MPvwwL`7t{$Fzj_=C1JYi9pKk4ToTNS z;fHos3vCWPuO}`viXPcyqJR+xer+ce*8ck(x4YcPH1*WOgyxjj(-mNi| zb{n2znC_OxYOuEQhgZH=j=Zk%HugJO6yB(w3+6XuyuQoVnS7dy_%P=#A=Q=Y60QD* zjy5O?Z1mo(13PSJ|9AVu_OMS&dvH?b*F~zmJ*s?ah|g-Ag26X7xupu#Dx%!) z*~Om#dk#4{LO0qV^96+Yla)9pFkp$%Y#mym0N-RHA8C>t11N?2+aqPrmAfZbyYP zmI|c7@N7}~{J6%sS7uV{KU^jJSy6RyMAa7qnDyTD@g+n2+dQg0Rbaxvtc;;6(#hC3Pl#w^<|O4_w1~T$0OeuA1#vAMg6&_!PGK6^&8QXS3T$pgbhIEMB z0KCIyCaUYttymb=5w>H7ygyL2m)hDAu3LqNIEoK5ATxyk)LyH?}5J}$t7xAuX&Re-HJ z^X$Iqein|`oR6YGv(kGF#THRwwd(REv}aBFaUZu}=Sv6eHa4Kv?L`$dg`-YSD>-CxVTP?A3s$eif&a*%Gg?> zl(|RuG$Vg-|Ao9<{)V5gY@6yPZmmDvuP^k{ufB5E`7C$eAHVF7XpRaM*saN48=EQl zzl?TsPhSoJui2nfj<$9i(#}6^K|Ahp(jmBUCh*<%oPORwXamgB9J6%mjk7~IvlrXucl3c)P!!$ ze|vP9xBAO*86Fv%!CpcSefmcLBT(8I2^ z9{izl41Qcf9v{l9Y-fJ{@6&hqyiyMtDSCi*CsUilN^_Vo$EV8^>8{grvmIUSlwSMv z>}8Ew&C2VlOLlKYNJqiOfQby0PJ-Z`2f^N%YF-qyS$nNA8F*oJ-l$a?r!6E`^FW`z zvNp5V>NtzinxLN3bFy82U4d&;?wY4RXm&}5wMO$zyvKqK>&gEj!A^fP# zd#O;t*m@HQdwUOOofak=UJ@&Jab~!iETe0>^OX9H1wH|BQ)*tjqw_Itukg+bn zm5j?sEUn^&W0g@aLBQnIpZZk&(cSDC^LcTrH3i|E+>0CK_q!UVUpP!4DpwIJ7!9yQ z`PJP|^P3G5O&1+F?xb$|!aB{79+^U~TNykVMmF`zm07bhy}Zx?Y#^T?46Wg&>aQK*kgMKBB-3ZepU%NF z7Ogr3;gs7DTXN2)uFXn)wIEWGS0!t=BEud8m2iS3tmi!Zi4W(+TgbHzDDu>s!=j?+ z?f~6Jm;O6TR8(m59n}y(7UC)Bg!9{Tde=tV*{|C$>N}lX>%A92-7j_r=)Z5w`0Trg z0WC0_1N+8A*{4P{ut7?5=zl?R>`K+axSMLS?fapz6w-?K*XS0?GZycuXS@@^(|ty39u z+`bI2Z%dz=-QEhZw_@iV3{O8i`o;VJ0;;2CQ>gFT$>{NYLz}C(fgmEcQzrO!2Gg}c z+OAngYE>u@zj~jXc^&E!Y!J7+9(7@x>q95@&&kc@A?;b6f+u$GLa{c+qohzo3aaG;?L&Ok!C7?=3|^6e<6+i zx>yf~PF7|g)xmWLLh|ZcS-jtG(KC2bCMMzyflE*7)W9QgU2cMF(RN~mNvB{Dz3ZHB z9{3eSHS9$>v3kqOYC2_9Tmuq&@t>7GfJ?z@UGruG83A5VeQxaZZ=0A7Xm7BJ{Kqyb z_AdWUl%;&wsCbP+xFbvs;DeX5R?#nZ`C35L=h;-mCUYuREnwKezj5QDItNY8A{X3Vti#C&?8av9(RIV9+EHDSene6L7qScy! ziV}V8KlvEsCC2voV#BoYb%gz}g?65Ax(Y%Ds)r6X-7Bs?flUvJb5=KYALdY8KQF#`AH$~i{xO&OWmtw?q1$8H52bhzE>#FEG*iuF;>2{U z9bmjdS}+$wj{`*hk~KfCwjM=3eOIz9qu;8*Vg5`kB@IVq=GZ5COrM*JSG#v60H})# zX>bmunEumLhrj&`rj^eDbUivL*Aa}MoG38>Q6p-yvE+r2=CjhSHP!9=$jwFh7d<14 zQP!}@bzw~q4fR-*KL381|I$+c^~vE1Ed8-}y{8($v{nH-Qr@gP;qOu$ZMsS+Q=jF9 zws9J+S`vqfD|qLfhhiHKT94J2^B~h0P7wYgv_aUDI!)T&<~S)Vr^06;-zOufeeTwe z?Mq`D{vO#c{MnD!?RC}$&h>)q0Uta23fB=@1(jALAtQRe&Xxw;YDqlQjF$MN!E%P5 zS}S2T8z|*!)$65G(^`j#l-g+mF2`QQgRLRk?}%|FxAiqJ~9nAG!AdkdPUn$Vp;Urx|2S7bpeA5z&Ky@xQGNY&W^ zrH&nGSX#h!4xnZ;A13INFFlzDqZlq#+RIyx*ZodbY8*>2|3)*^;7a3mnJX`Fx&6)~ z37cz>K6Ey+$=qV!z~2*#l1EpeYl!VBy_C-%hAacyXV697;+}P1d4+v-lilP;Upi9S zIY?yx#>j`sh%;&4IG=s4M?Em3_yRta9*>@m%qiMUq~l>Y8})4z&_}l4hR@h$9=#wO zqJ11gFYRCMioGC|j`mkQEhzu|AxubMj}lD1%*Z0iEAj&6Z5q!+B7!`nQ&;}$8lSHre{q?TvOaIUA- zMKsiUi0fnh5cXp(4ldgs%o=mc7ZUaSjSC;`K-7n#-vZ z86&U5J%?2Yl}lhVFpVMwr>AnT_l7$#Yo|B}*UD%gQKp+{*p3_1OdX(JbLgMe6^X0b zd^mt=_vSE)>!DNLtF)P9T5>F$@p}I_J!i>~y+5Cz@KAjh%^_BIR|H@7QBjjsjhCUt zu##EU(P6c%KUGR)!4KiT7bB%tvH{0eOfJzjOc(UE;@AG6ocyO}PmqfGsr**}1mTP< zps$?aY%7jgeHz2WjGiYl?_kSui+Iy*>@;9Hc(Bdg%$$%R6>tF-%_J$CCem0zmrP~w zPA8dd`vqyQ`odGex?j%-%fI-j%o?Cra7zeS}P-@ z+4p=6;w)*JSWJg-@V~!FsbyJnwspNjfWld&7t4Bo%GL|BZ$Yq(a+0_E`M;tqJAnsv zv;`n?gh22>9t6gxR)!&nBC#o+2$^9OEx^N&@ah9{%|l$~O~O0Xvg$8EFUAA1_zcfk z&I%Tr&LfgB?2f=UFkZvbf0c)v;A8ktoE>BNPqSWVa*IOY9WNe2H#4U0HJyN+|Cx%~ zhv-b#RMA_Mj^ENg?@}YA3QWnVG8{ERdS`W}^gV57!41HSuuNgCnJbjP`QiS$-N*sX zM?*1O0iyu0o8%qX@<0KvX;CK~Lz!@pKG(!Ud9Wy^^$bkalK$Tx$-Cz5dk{V6H3c6j z+BUVfw|*gIfu|{LLV-iER1&(0m&l#mDG@mW4#m!n`{hnnteqFwJ6o_e!aLdUln@Ug9XFw^=d9)M15Wn#}>X*f$`U!>xP=qT@`{_)E z_BWZ9v(>oWs8yuj{WN*`O9Q|$L(Oe=PA}kljh|=ZW&b=uwro4Q4pm+5K>+*49@+b&fyo05&BH-&Dg z1rOnlO+a}SCW6yea9FN0@VkDYcE*y_q_%V$vsyA5!(q650~sG>?IBlC*aAcK3Gf1Y zi#R#)3K_#U&`-{*MjdXB&J;9>)Ek~WO&yGe*W3qtObYNM_*_1i3`D&3frm}(0d_EG zTcyq&KnfwST`l-MmB_kq!I^)9{UC|16-dqPKF#l3;-Kh({~*K5uHs*Oy*E;6$nbJo zwjXUOkzR))#%WsTkzL8A$BI(T(#mbqeEL<8HA11Uvo?ybvxZCH{JkM-xtM5Pj9ZBI z73`JIhbS#JIuOj5{ETBVNu>uSxa8+VFcQ!H2?novU`{FpLi!m;jL?yfEV- z7!$QbE-jYy-RaO)vukH9o0wm9Ak4yJ3ql+e9j}tk4$cvU6JTj?undxg6*D}2&oHZv z-nY`KH^4jArKB8~s06#!`|gh#`pr&TpR*J!tv7OQ491Py(7eNIu`>x{+5e^GVr?Cm zh&hGbI2K= zs+l;%+hsHT+f?@Ma@ zse2qRJWj|gdT~?usrmOyvTsqhV|zwOCso3&uQsn!XyrT9p!NFz3WZ;9IznqG^|tfQ zCZ|y>d%?pmHynLO2rw89i{j;hE-Tr^uwHst=+ZkRfedWD=@c}r+igT;t7P@tXoC@@ zW0N8O>4Xl}+?x`bHNWq#70XDfMhX3aJ}Q5R0H^9qMFL*K5XWEL*Udj*p6nRhVKxD4 z*!R+gNOjVHVS0uK#~N&-<;7M!UDP~UPa;10z70>mXE=;I&Pv}g4j=Z*b z<_(u_X_XFlXGbyJWV=nRxe zYgqMU3Ge_Z{PeKTf53aAU&ih zLfbw53O~~ZF_tUO5oBTtdl3MF$|KjoC$P#{ab*^7cP2%m4+TJSHXUxzU$vJj7oY$< zNGX3kC`ggrA9=s!&XxmV`5ZrYhOjlkAI(r;%q+~LXXbUCdUa2v^7RRXk674dUue-t zWxG(o^~Qv6gq1sqfCsdQ-?b{v;jKCo*B*5m;$X7tYyxFrRB8yXS+}6MAkX$Q^?cQ2Dhg;g^_*CVjRIBQnYQy19mPgcuO z&I`x2ZMKWdf8?K;cB&{=?^QT5tYcES#$B!UoGx||0Bz+#!LaW$_ji5;S3@ifku$xp z+1=SV1B?a%;?)lW(UvWLqdXS)Bg=f``~vPRH)S&IbsItp9diwQUc0!bD1?vlqnfct zFM`1ATS`P7WxiES?DijRaEsjs=JZjHCG9r=jQ(A&mxF_6e97D(U4LEr;TY4#x$1P< z$13yto$J(g>*oHt^X{28-@>QpKK?Wj+#O1cZiD8b{RZ*kttqJDcGEbhko>z9)e7Hg zH?qYxf6o-^zdA{VVsSmBC*augAaa1gsxNouP{<0r8f^wvpIPsA7q^sO7tFs(u?f*~ zsSNR~O9Qmv=hL6;ulNV-5&ohoy+041UBJ5vT%CIC3!$y$Wm7bc^<%%W-(Zt{Gs&L@ zGE|E)LRsyfd9!*m1fgj2pJ`oc>zF0o>Tv|8&Kmp~DSnZ~^$Lk3hYf@>cfy?8&L@`} zchIOX7h=?LXnvzlT)O3^i~elmX}uviA%NP^<>~foUy`}FHHC^Cfpfy7hD2}fw!RLH zS;`##7)JGWjZMt+=6A4$e$PH{op+6$+T}-s!iqTez_dB*-1x#j6wzO`y&t%ZREWsy z{acF&;3k!7V={NU1`-eT*V%bh@(pw3bC8($11Nw|y)62rr8LD`(b{bL?0T{|74;YV z!e@XbHLB)?#`PZCyf>a4%n&pZc1npp0d^&ZUuF!tiyi8yR(7P_S z(nR5Jl|rfQAxXEkDnrJ4+-sztGtP-03z|H=LS3Kda>suUg@rW#&fOgCmZYbcp3-pq zu0TbLY8)=PnfA$6LmSz556`PIjc)Z0{wxoy9bu&yuet)8{M*{X|A|H&LYW=SoKpMb zy=uE1m4VUJ<}S*x{S5_XU7T+ENZ7sfV1z5qSjIzdJ$jCosx40qcyg|U4$O{-85~h7 zo?lwXVc@RL@Rx~Yla32L-DR!x&ZV!{GvX9FOi3njmxl_aWg;*}Jx&QaYR^q+_L} zap$12t4Dsc*5|tx3>VHr_VN-j?W|~x+Rb_dUa$#E*X|vF06_TzZNc1{YxQ|tf6yAx z&S>y1{)xFKjubA}ECcIO?C)9Jn57=MN_JckdJUH;^v++oQ6_=vI0Rf@~qOiurOiJWaJ;g){`0Ua;{xe?-&X{=C* z=n48qD(TOitB%r%1n3h<;E8E@rJF6l0si^Zo_27xUX}LG8)?d(uXIPrzE-QTNfy9- zgU1STjM1U8`}h!F|6RDL9gR&EA%E4 z{cnXiMqrh^4{^RSRhetup#QF(P_5pF%)briF$kn1B z%-zg7uv6~CJ3O_&oI0aPaTZcVx{+;}=ttt1lYgGfzU4t75BWWey<89WC#?VNQg^sm z-Mn|(b4HyGHiQdJz4HKezL(uekt;KSVM@N==)6mZ!ps$6PsE-~NuZvDFI8)&xIc?= z=_!lc^OP$>?tRr4!u+QA6#*1F7Ibzqv%b?4g zD~ra7a^4@eteSB7V)Em;V@>8nKn_xGVYDC-xSTN;n89ICLj5SGmG?~~`+J)4js%N+ zrqiONSvC|>r}ufel|IGh@{jiO#;iObgsxoH%#XyrhrsWCJA4%BM|p1drxU=jl_9fC z6~^AP)#v|yav|UPyQ}`(6U|(K{|8wgcoU}~Hw}g92XV_35&^Mv`d6UQG=3noYk3ye zjA7m$fR0+X*^?-JGv^;wARzp@ICFS#7S^f#_uhS~_aL=CR-^5*j(*%V0+IgU5LUVb zkehs2gi$^er-)S@ytKAb!(J~ajI8>zB77vL2JyC|2e9)ikVsA~VJ@_rwctdtSRf8C zV%i5TQZ>Rj>Os|Ms^Q^&*qH{%VOlvy?705`qSB<5Z$S#CgQF9+i%QRiGSEzq={3cD z|A34rsWGy3hd(%zHbzB+ICie1SevCkLUnLTDB?uz*2exceTw;H(9`*23wsLh7RUyY z13=(mF(&*FocnEBA=TCanqKjC;}#aal*JM)xdTf{p1V=^%iKqM8;WmJuwsk7#>OZ4 z-QQ|uQry;b;V?V-WrS*_spt%}LA4k((cH<1Zo&J+HUNjhSdnN<$Kz}dPrdOGnKqyg zobPT^-Z2ZK_GXHJQo`#Lv4(^|uD1V@rejRaG<+2njT;^>Kzn_DrO^?zZ*u7++J7wh z)AvK2Uu#$;ONS{x%x0RUPG*h|@~{Sa=a8LvX^-3VwtSZMK}v69%F7H3%y%`qWZvka zp$&_K|DLjN1;564NWc z`SbTEPO$@ioqwwrXp5bHHK~1Nesm(PS5iA;_VKZi#CFC#ng}VA`%8Q%4f?b0#9snW zFv=-S=uaHs?mVFV%Whp5h>vawq(>Z39qV3^z?9_?(5vI}o5##;wyY`0Zb8?{W9H6R z0B0)@*gP7+958ZvNoxp}nLoT7Q(wF4t(LJI??>B1=dWV7;L&DaK$W_& zPd4&}pG}IBiA>z^F=jnBZ~gIftRuQ7=potaKRZ1UEi!-EnnGCGd|z3mDuCT{96}?> zT>cTR_Dd?Ys#wGyNT3FBhJHaH2^NRJaEuX$ERC(VZq|GWR!}B(AM&JlnI~b5gAHnZ z`8VLtGAv*M%iBVxk^ai-Ehh0aT=`AnubW#|AXa?)`x7sjXRsVVv}brEf=vGmXLHnd zFO{vvqKg*eY&KC3Dr$7I_0;aEA*p%#Oi@y1Lb}km-jCM#BP(_iwjvG&reqj_hNePV zUX)sH_?KE&d1jSrgk&ytLhKd3Dq{PmxX2!M-|92Vq0V0y&pD8;I!bB6{`;>5dLS>) z8~|~*dvMZ_9pi0*@oDAR6}W1kZDiLtY(fKEsw>H~$O#Uvlsd6%7T^QHQcB+GXF_;o zc;rIa`x@KoWmwGUW7XW{c9xD}THfa#`6GdBa+RQ|ESIaN*V%c7tTwZOt4)eiJ2HyJ zy}H^$FeCe-Z{^=QOG7si1wZLK{1$aE9|B>`%f3Zd}D3^S6J3*nvG6x zJg<58qCA|_gt@L_)!C42Nan7iSHNXSF+)OlY~tQDz0HpULPeop(njyLi9DRhZIF9= zQEva-9|Mi7-)naDUv=v>v%ACgeu``2uiZr(r~c|naLNywfV46cwj%h=o_-DU?Rkg@ zk_6s}ek#9PIoz)_#5W|#3Tu}?PeVaBW~EG^J&XHd6~m6D6urKV^1)-SK*pchnh$NG z_h;~+M{-pf*!RUR8&0QOZLlT2Ou2HsSc7xsk-J6DZLZVl?ruJ)!B7C?*}<1AMJSBsf3sR#J93z>)mwvg^ZSV*9DFt$^9lzg`l4i*ibR#$n$YUc(MAe{USr zPp%c1W@NLF_k$h{(8i#SoNGv{TKnx@JRRMt(O-EP z#jF~h>A1H-24z1cEWo48rxP8OeZ#oVw#-C_P|>*FIyE5MSLrI_biS$TugB(ZKOx?x zSlWb%()+VGi`T&%TcBlpJZ5h0i>fx*qGb<@1EWXN@@L33mrJTCF!kD@L z+ZOX`6VV}o9vs>Sf?%ghuNFtuhFLuv++l_;Wgx;oX<*d+_xxeMW$S(XyE~jsoidpA z34JbyT7(A&saHbsxeRSk3#_e#a^XM^)OfOCL&&dzdG&e?WySuY!xel5N`q?(vepza z*r=RJ9Kp;6Tm0ts{W4EiAY4tH8-!uGJ>LuC0da2To2!+5=K5`aH+UDOyH>fW6u!O0 z70~k_EugzZpVw4)|F#EF1ARb`_$DCZM*$3!^Y~ZGW~s&&O|0@k*%p(NqIWlgmpp6c z25Ty^u2J?de0AP<%1{h|HfWZbAnXyWUJ>7-Em%1OeTz zI_w*?b>bH7XafhwNsj5O>x%4`G=VQG6Ii58Ra_2@b`R+)jhq7OQdL9`T>1Qxz|U|f zcboleDpi3RcJ^N%5kAckHd58D9bT!jx@A$IFT9w5r;V0pwO54L5UmhPv@^2a_F8)MLp>ogR zMGl5YD7a1lKVIJm{#LuSnt-HAO<|=xN~@!iMdO#-MN{Q!@%Ahkup()NkcTLw{{FUA zq%m0)aIgP(0$_74kW6JI;cG1f1xcW54R9WR$ zn>I|M2p9Aq<&+Np5#mLD>5w278@gK4T14=(Kk-NL;SJ`6v;M9DwD{u8n<8CASGlA7 z`HaC@kQR+24!n7UxHiW8Ahz?3zh?{V+XgQU-i&33lw6L3adof&vdeIh{NB;cr70&Q zO66iP0e4D5; z<{;H|QcG`e_W_G_)h+Fy zttD8Q+K^wV#3>yRwqAb~YqwQ#Nm;OsEw1$<{Brq9f8EHTDR?u;Z(h**%t_2HCnEcC z{RjG1hn{=^V%zfpV27qDbGiQcJx%wO?XZMZ6|=WlUY%^3frFHn9r|}uL3sMm#9$3^ z-v_{tX>a@T;n_VOGfOJF?_Ceo!h4`hr|GHx@unNnzr^%XJ-42V<(d(K!0eE$2nPtH zHv80|{onrV`p?D`CK!WN7e1ozy*ze#?rM&@@+Qf99_U9Z??ZYw%E*sKQ8+gs&K6A* zzVb($8G^S=0&Pnj$6?Eo(w3RHro5jL7io+0wJ`?%##6;f zDvCYrt64N!=idP`lD(xoUiF@3y+wBbKu~_);kHuDv@XEt7#Nl5?C)E%hKcsJM?X#t zj9h@Hv*JbIxk`5Pb;#8x5V)%QNdO(I;{YNKTeCsV&Nb#dFT&&q@JkQ~D4@|doAvAK z+-AXpCa#f{Ay9hG-ZnvZVX{z8A2qK~Gnc$M{2cnaBdWic4(=cLOXd0U^wA>#Q{KB7 z1P~5v5ZF{&M*cH`(AuKDPj0>bFe`?ga~nM@0;K0@r#wKqUvr^aKo|d7XEg8vjBt|z zxX<_3T;G2(JAM*$IXig)zdb8Y-Ko%E-r2JMF5T=Vd5Hf^VUK>azgS@M5sF7Q-_Cfl zkN4K0pq_lN+*=)NUp7bwZjH0{+q-Ey>HN_cra?()uCTcVhSl#Q;sb^55>wx=Ch4=0 z@)c2A1F5QZcj0s00>)D&%{(2lKKi6uPuh3brznQtv#WLwB2nX@Y5=Vq9$~JSd$Y4I z@(no`K7uT{MGovid3ZGEz@fpmx%C7;EIx$RdFyrp)t)8%OQw7y7TK`RrMHaF?p0TLN8;F7o}}p0cG6N6C^e>VRceIK$Ff%kEG`5>QPMpPQSq$m2`%O zowSPEG17kP@3Ff1d&F>sJc~UWfeARrLc1BE*Fz02;vucKwd4)ZV1Hf zk7#BGA5$KHH}ip1Y`5acXZ`jA>foMgP0|ljI`Q-MR!qb7>jC?({tWZx0J%O!SJ3_q zXWc1L%8r1k4dvcnA{oQy4o(z9(JQO|t>X+i7>C;P# zY(EJ?OK*9QADFjv=M5mz=j~V@w5{6l%(fe@+Gw~jz*)w)7;X>CH%|VKw=-*0RLi#XJHO(9fC_d9qS&B_g4l~9_6?1Kh}c&1Qop^X zJL2TYo0XYW_dZlSZMU(NcCpr+V|=4e)SI}@tHV{R*Yz{043q-;QrF3p%8hNmeJQ3& zO{Cu$GK7DnS0G)gZyhC2KZ86xR-Q^Fk#qoQCmyd-DFj!mSDWm%=VmF9Q4;rTxB}_2 z0xBy$y2_B1Q_n5kn>N<37&phdd}qWT)#fw)_?rkT{69(K;$ zXuySsPE*~r>t3Sd&yhT?(5)`OOON<_Kla1rYh~JztrfMoftQvYrLzFt!9=N@UVH{c zXSgTZ_of3WYR$Jl&Do#CA_FE=rJE}l96)G?^GiB$2zFtzh!MH$oV;A5l3i{;`3kGvSHpw!WMdIzSnJ4=^h?6v9_T;5AB2RKX9#wC_)`?YCK?aK?ait`B zvh{ugOvz_5TYO*3sP7o0x|5yMuSs5hO7)_QFkw{5uf zx>OEx^yI!ef+z#X8f@ylnU{{U;mlah()r!Cq7I1NNswl(+JFK+=AHvPMZ6yT+O3S_lfMZnWyrSrixNZ^;KGx@2MxcPtj`GYxyhCaw3 zX{N@)seTNbPBkN>Fd}=YJucl5Ml4PKV>hiFz=m&OBeu%}sJ@ zL}!XLCmR%E(By&CZ0bW%u+UQrK5&mQwq1Ih514HY-R8KmjvuOttC_k~<}V-p0O_uuM95q7qDVJeE{`I`ErD-rwW>+#wIdN(b{K(QGxocDv zagLX_c4M}wWP}fBoc)=6lKd#{XbN@%q)ao(!L4N@g;H;GUT?A2=2f%>N>;p`($h@6lr_*gb zzJ@#(aB4&|EM<^{0pPqM1g(hAiGMoRq!5no1Z0*d<$sM;YS;QC-y=ON01ew}uRO{RVVx;7rEuRg?N$nw=9{Ak*lp4W8d)y!e0?rd|!(Ub#so35|rJ zpzb2TP+p;SY@-wH&#^;KQuX3;25d_(ZO#f1R9LvY%q1u8za6_JSijoMWs9>qh3sL{ zf%e1$p8s$EgIxAa6RMEo4dbL6OqpK|rWCQ&$YF1N_O>?#z@AEV)YzF?QTKuuQ6BU1 zP_~2P1$<2F0t8$+E>#2X{F%0(v>M`Y-^DQ@eAjAHvM)W8O~t=u0@z_i49WDCXoCeB z8vF*DFj$P>&8 zXrt5EdJkgjOW9+sJej7q(;If=n;_X1UouhJTM%WS_8*}-q`WL}*0(1nR&uJRSz-^$ zWMTu|xnddEVG@z%HwU24INTKyXA9lta|f=Vp_iDiLJ6t?ipWxoI)_CEN$6Xd{q0XCo(5VG@5GbmJ_qpw9pR9K8fi=~~cx zVP5N@u4TSMW|Lps${41<3Y3Lk zLI;NC)DDq-4+f@XI4JS;QzpJcna_TIyhSPYzI(pybL>{A!thvKd=gP?)~+|&>>giw zwbdF3|HWo}xGUfG3uGmgaQ!PV?*l-P!{DcQZH|SkBoFvxt&eU^`e9%LJKJUEC=5h| zQJ1ALRisc=q7EcQ)t$O;OYPp+9zy0#lBn&9s5%jE^Fs2`Ea!G# zl4%QcsorJl3s&%WWW_4MwfDoN3@!3qiU~oKll+}n`jb(s#8dQOjGUEXxFNbsh@ulUU^u&b1&_58B z`{H(j9@ZXeGE`>ufD-^za%Tgur3aZBnY*^Nat~|`602&g5ce0g5mH}Q_a{1Qh)ZIB zG{@bgj3us;9!)NZLGvmx!##7@96ps4Tmna>&b9h&LQikq}kn=Mvgo$b2AHvam;o!}i=Du`VRRCq|sxq}#>W$?2@Wa*~A7p>IC; zA{wzkpYBFTZ!#{DDZ_-2U2%I&rs?8v0^e6{J;xmaQ>e#dZbmhE`y{ZVcoF4_It zp1%`M8ptcuLMOMUHge4-p-i{*igoB8k^Bv3T1s$x18u(7R9-N76@xXC&rg&^B6Ews zga_Gd?8Hw$tMta*>77cO{hl!Z{f(qG*x-8H!5ye+#iEd>sMZ~3MjGK*Q4d{0h+FEI z22}@-d-}NZK#Ajf?gse-Q9UuQa7{?{J`z(pjpzVA0tN&s<6$RN);W;MKm0Fx-*=PO z_8F+v(-$GNWbGCAYM{MmgE9Kft>T5rSn2X>;qpXE!hnfl=YaY8qEzfKo?byT2hl)% zO^BsnxQntw*K@nXUZUOs6ls%A769bYa1FoDnZ$iL$;Ub%IY>vKPN2N~VR+R03Z&tn zl;|CSg18y4U_NM)q>?aU{3grguchh|#<|kwQfO{p`h(r92NgTN4AO!}{HlmOw)TyK=<9WKatoz58e=lfY^GO3& z2DyOfTUDs=71xO+^brf}{Cak$~A%)2WLs%6ipDxa( zQ_90A*~S^+yN~-)oib7a$ndkCa7yMmeApj7lzNEQ`=+15tY^Wc6NE{%FgFOJ$uaqu zmGkX7`idz9#^iQI*KU+xWRn>fVY98UgiQ{iQGx;*gp0r^-?m_VKKwKCCswR0DG zy)JdknyO{!%cUep_1&?C5s9b^O7Lte<<&a!M3LtWvOl{&dXOko+ElJ_%qN&?rrlc> zbBU(DWP^@XAjjfG4Flj5;WpZcf8cnxI24ic7byXq(fX*vbJ@`>UCZN8dt)$ktTF&!O|72l{dKs-Ck2T=zcI<*_KeJZKE*?12CLN11D#GxfMD>? zu>ah3P!Ocag-hMOt-OkVAdTu^7wo2fD_HmO8?e^L8qAOuS$IfiNT^9TJ*0L^WKLxL znl(y8Z3~#%8>O2aGXE*X+OOP3oA00S(77C^vx2Ama62P_g_gd`q9E!K!s%44Ms0*_ z>;W~XouSDa43#4t^b758r=No0m93`gXJJjX*4xB=I&Z*4cn;@$H{-_oLAb2xRgwpg zoZ4<8-l!XGfgs#{gTkhf2^OtJ4ua9tjeW?yVH~t}Iz0P(kjO_;1-{T6*YFkOH%uba zzB+^IYYWA4y^0*j^$QEcaoQucZaW8dG-(6?tQ_-;=xbxFb?oK53UXV3SN)yi#v;v^>M#t;rBuqHKBf4I(0x7q@a-1xY|0SJP4OyF6$C2 zbsxc1RZi3;4djj?^~j8jG_?aSD|r2C3rLhp5^cL|CP1DwA1KlVxHri$Fj&U)X7tM%xuJ2fVfP%P$c$(yx>X~gkK1)qdiI8bKivcH2C)uWvD$iqK%g7S0S+= zLSbC*1u%f!%eQ#3E3i*?$Z}&;+{2?XYXIB%+6GleJZ5eTctAommP*<9VQ9=6hZPHKaf=5MhV2u2iIs&o=ZEj{ zalj13qmkb$O2xfrpiH;!h<6lCClZjzer!zP;@Jo4d!)verBTtuxk68SL*~g8rw&)? zL6Q%#j*Bybqp>fGj{KQuv%6uKlR&>$;txd!xV#~RS&g^X=k1|ETI7P5r@tq7gAnVt zOrn7fNrcBue-LJ0Fup5gTkDA6X!)+W0dXj-uP(G!@J6t{d(A7+J5I;1SzjZX?CtuQ z?lMT3!urkDZm^kW(*#Rqp!K^DhE9pw=fPrseB{afGOeaI(@~~l%Wcp$paJyz3wh#v zOJI%9wd!uFA&6hCY}Y1>e6 z)6L(x^OHvmV(1?XQkZCK4N~M|y+l*YzLna#)iA>@Z_I};ZJ1B@ohPJsljMBDk`n5r zlVDDx6o|l$k*{w)ef2w-^N3kfOb!C-`xg6tm&*KY+Buu2?Wi+{pqvZZni##^*4BT0 z>GwN#KY#a4j&@37?76KDY7Gt%-13Q#OVtp3s_d17^k4VjeYTBGye)O7QYso_-|I~? zcazZ5x06>F7nRtsVnf&GuRTLh!tOS?5r%(Iv@C17^mNxKHGT`FTqCOS^TOef$>)!L zp3K!IB@JL-`C&f!6o7?gHWQueEZ;rqCj?c6T#?^T^+MO~Tvqc28lBMa-=l3$6o%Nq zToxK=`IUzuw$RyS!>)iSh~-fMmLjzzOL; zL9mox4377u9UpBi~S-0I(hZF1Y(M4i4~q7U29zs%XEG0AexQQc0s zZ4AWpfm@QVLmhE=ZCe}V4n>$3VG(XUNI&aNN#;~>QW4xblhF_b5hmasR9q{iV?#hF zqw?Z=6}x6W-nv%n_9Oaz758X{%`{8UP|4e*hOMfVEQ+V!vPCu|qnhn6S9zXHQoru5 zpPTLHeHqeAyLK=yRFtv;L0lfU-NNi?f}?FroBYHU~D>djb@ZLMNI zXP^&RC1Wu~Bv-$-U2CO?pI~_*h{i)W0Wr{G|BNb7N~VP_T7<}CST)Z-GYk7`+xh1r zQ<~@ByRlptgN~+E{B<0Dozm|}_v<)}=?5;FME2(l!(rjA zZo1)=evS$PhecZcKHW%fI0w~PGwE`JXil)(mh?&thF%+);qoPR!< z(2oc-<=VxcAwAO^F-tUWH7j-h>cCUx*Fih(3_)3j-xDsu`5#3;FPqaxwZ+_ZikYqJ z7YUjFI!xaS;BN=<=k1?E{O2E!@t+g&=cxa^U*K8t>+F4>3CPce{cPuVvyb1sfK}VC zi`t@pkNw{R^t}a8yj7EFp*6Js;TR&n9v9z(_`gI@P&=>p(>;dYpCSv~4*5TFe|&#n za$GK7{M)bD-@k?qLw5E*@9rPj@$u{;*?|j$!)Ek9{#e6*$o)|e_&-Wq?vE`3??2t! z`;TG~eyt-}-F-!$r|rJ}_p)k22(gJZt`?GI6eKYT{^)P2JzX2&h% z`#yYA6F&0$rX1bg@Ubs=m*al^v_CZr{C~-`*d5?)#~~_ww=G!VJUb za_slN=Dr)75#VJW_B)gN`S;fkcKCbiTG1bqe{!q}fBUvS56bWTLbB73_5L|bKUQ0Q1W!X~i(d}Z&c(&}L zZdnars%-b--9lADj2zKEBtQwiG}U`GqJ^^K#}1GkTUw{`cP=CB(9H`^0c}hqs|vY~ zX?yE#=Z1+(8SJUB$jMk8K8-Bm=ks>CD)IT|Y*>iFQVD?eJ;={%-o*+N*R)FpV=CSU z5+{MAL7_d745a`;VWz zY-SAnJ8Gb=c3COXtV)V_c!Zdo4T|YnGa;T_kBuR-!v+`hHx%HnhIgLL#ub>eS0@V; zRmA~EhMjG3(w~NN#q?uZO-SwR1VCJb(zA}{+ryK#y0)_T3CWNBWagx9I*m$epGf>3 zZNHB!PK1)*D-(xk+5?^XdA|L5endI;EKZw01D|uN$|%g~*G&^J!smlDgNCT}h^C2O z1K)RWw2V~_PfIEK(PXD3uF~MmxL%8)l|$?m6tZ>FmwJ%&nMBep*By(~>_LV3^b!ge zqj#fb=kfsb+>mdP#7zi{bB7VCmRdXGnq`OM+e5z$O~KEK)O@RzS}EN|AT2fT#N(Mo zdLWTdlrC4Gt$Pw1)-9Lgp^?0Y)N;~Z`HDBU{ERTS7Ik2Z_3Y#+mOZMpRtH)xeR*&P zjrkOi=_Z#yYtQiB!nqGX?dy$;nA=vC4rv2HJc)u^)Bv&LrhL73=)nQ&A6y6*iaFtV zGE@9*0$3o=(*RMjN2C8LU~Q)=Tu%eYH{9CqM;~Jz4#7 zCj$pH{!HM~N(OEXtgxRuJE{zW2$JyS^9lF0nksfIU)(XWxA!-zFF`PMVKPW|iITo2MsFnxEk(Em`(uV)9`cSzebb&Ld`wi zlzHpb{HX1Rk1C}EYeFAZARDxXKOQ&tPLR*N@t(}vtV1&PBZq19>a|+r!txlVc+E-W zoT%}s=d~oDVR|770T5?aAgFBc9g}6?Dj(}ye_<7*S(SonK;Vuw2E=)InO8Gnp*Bu# z5hcdcJG0i2c$9EbZ6_Pc453CI2R*G$#ha6Hrl=3A#%?~^+C~gghA1$k%-V-=8R^ zCfc-+m~v-sQo^|#t!@vqCz6aULL;^#sE%o0asYhCy%K-w4xYW6 z{Wi1m-`M%3hS_KNc&V+VLu9wRy?KJFw#K*Hu9SN^Or5(U{wkMC--gfRF^5LG)9eTx zJF0S*b_Zb`0v&;>4b^nzMpw>XdRFG{grUnB|$rlU9E@1`VbJP=h1Ib7p?QgC;~rH z2U!{TL4ApLDv1&{u1~0ZEPT3)aeOrsZVn4Gq9A=o@?En`H%gJ(f~EUdRdbw`Y)y*! zbRgANRbVjk(DYT>jND9tEx>0g^V4g&d?xB~O(-PVZQ!UI%RB-G;l;h0Jc+_?>lO5G znX49Vf?G-7�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

    Yry`ySXl#oIKN(BH&@DrlWsYDSOM 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

    kTBo?wKgQ?H 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 1, delete the second T on POTATTO + + smetrics.WagnerFischer("MOUSE", "HOUSE", 2, 2, 4) + >> 4, substitute M for H + +## Ukkonen + + func Ukkonen(a, b string, icost, dcost, scost int) int + +The Ukkonen algorithm for calculating the Levenshtein distance. The algorithm is described [here](http://www.cs.helsinki.fi/u/ukkonen/InfCont85.PDF). It runs on O(t . min(m, n)) where t is the actual distance between strings a and b, so this version should be preferred over the WagnerFischer for strings **very** similar. In practice, it's slower most of the times. It needs O(min(t, m, n)) space. + +The first two parameters are the two strings to be compared. The last three parameters are the insertion cost, the deletion cost and the substitution cost. These are normally defined as 1, 1 and 2. + +#### Examples: + + smetrics.Ukkonen("POTATO", "POTATTO", 1, 1, 2) + >> 1, delete the second T on POTATTO + + smetrics.Ukkonen("MOUSE", "HOUSE", 2, 2, 4) + >> 4, substitute M for H + +## Jaro + + func Jaro(a, b string) float64 + +The Jaro distance. It is not very accurate, therefore you should prefer the JaroWinkler optimized version. + +#### Examples: + + smetrics.Jaro("AL", "AL") + >> 1, equal strings + + smetrics.Jaro("MARTHA", "MARHTA") + >> 0.9444444444444445, very likely a typo + + smetrics.Jaro("JONES", "JOHNSON") + >> 0.7904761904761904 + +## JaroWinkler + + func JaroWinkler(a, b string, boostThreshold float64, prefixSize int) float64 + +The JaroWinkler distance. JaroWinkler returns a number between 0 and 1 where 1 means perfectly equal and 0 means completely different. It is commonly used on Record Linkage stuff, thus it tries to be accurate for real names and common typos. You should consider it on data such as person names and street names. + +JaroWinkler is a more accurate version of the Jaro algorithm. It works by boosting the score of exact matches at the beginning of the strings. By doing this, Winkler says that typos are less common to happen at the beginning. For this to happen, it introduces two more parameters: the boostThreshold and the prefixSize. These are commonly set to 0.7 and 4, respectively. + +#### Examples: + + smetrics.JaroWinkler("AL", "AL", 0.7, 4) + >> 1, equal strings + + smetrics.JaroWinkler("MARTHA", "MARHTA", 0.7, 4) + >> 0.9611111111111111, very likely a typo + + smetrics.JaroWinkler("JONES", "JOHNSON", 0.7, 4) + >> 0.8323809523809523 + +## Soundex + + func Soundex(s string) string + +The Soundex encoding. It is a phonetic algorithm that considers how the words sound in english. Soundex maps a name to a 4-byte string consisting of the first letter of the original string and three numbers. Strings that sound similar should map to the same thing. + +#### Examples: + + smetrics.Soundex("Euler") + >> E460 + + smetrics.Soundex("Ellery") + >> E460 + + smetrics.Soundex("Lloyd") + >> L300 + + smetrics.Soundex("Ladd") + >> L300 + +## Hamming + + func Hamming(a, b string) (int, error) + +The Hamming distance is simply the minimum number of substitutions required to change one string into the other. Both strings must have the same size, of the function returns an error. + +#### Examples: + + smetrics.Hamming("aaa", "aaa") + >> 0, nil + + smetrics.Hamming("aaa", "aab") + >> 1, nil + + smetrics.Hamming("aaaa", "a") + >> -1, error + +# TODO + +- Accept cost functions instead of constant values in every Levenshtein implementation. + +- Make a better interface. + +- Moar algos! diff --git a/vendor/go.bug.st/serial.v1/.travis.yml b/vendor/go.bug.st/serial.v1/.travis.yml new file mode 100644 index 000000000..6cbc8139c --- /dev/null +++ b/vendor/go.bug.st/serial.v1/.travis.yml @@ -0,0 +1,70 @@ +language: go + +os: + - linux + - osx + +go: + - 1.7.x + - 1.8.x + - 1.9.x + - 1.10.x + - 1.11.x + +go_import_path: go.bug.st/serial.v1 + +env: + - TEST_OS=linux TEST_ARCH=386 + - TEST_OS=linux TEST_ARCH=amd64 + - TEST_OS=linux TEST_ARCH=arm + - TEST_OS=windows TEST_ARCH=386 + - TEST_OS=windows TEST_ARCH=amd64 + - TEST_OS=darwin TEST_ARCH=386 + - TEST_OS=darwin TEST_ARCH=amd64 + - TEST_OS=freebsd TEST_ARCH=amd64 + - TEST_OS=openbsd TEST_ARCH=amd64 + - TEST_OS=openbsd TEST_ARCH=386 + - TEST_OS=openbsd TEST_ARCH=arm + +matrix: + exclude: + - os: linux + env: TEST_OS=darwin TEST_ARCH=386 + - os: linux + env: TEST_OS=darwin TEST_ARCH=amd64 + - os: osx + env: TEST_OS=linux TEST_ARCH=386 + - os: osx + env: TEST_OS=linux TEST_ARCH=amd64 + - os: osx + env: TEST_OS=linux TEST_ARCH=arm + - os: osx + env: TEST_OS=windows TEST_ARCH=386 + - os: osx + env: TEST_OS=windows TEST_ARCH=amd64 + - os: osx + env: TEST_OS=freebsd TEST_ARCH=amd64 + - os: osx + env: TEST_OS=openbsd TEST_ARCH=amd64 + - os: osx + env: TEST_OS=openbsd TEST_ARCH=386 + - os: osx + env: TEST_OS=openbsd TEST_ARCH=arm + allow_failures: + - env: TEST_OS=openbsd TEST_ARCH=arm + +before_install: + +script: + - GOARM=5 GO386=387 GOOS=$TEST_OS GOARCH=$TEST_ARCH go get github.com/stretchr/testify/require + - GOARM=5 GO386=387 GOOS=$TEST_OS GOARCH=$TEST_ARCH go get golang.org/x/sys/windows + - GOARM=5 GO386=387 GOOS=$TEST_OS GOARCH=$TEST_ARCH go build -v go.bug.st/serial.v1 + - GOARM=5 GO386=387 GOOS=$TEST_OS GOARCH=$TEST_ARCH go test -c -v go.bug.st/serial.v1 + +notifications: + email: + recipients: + - c.maglie@bug.st + on_success: change + on_failure: always + diff --git a/vendor/go.bug.st/serial.v1/README.md b/vendor/go.bug.st/serial.v1/README.md new file mode 100644 index 000000000..4ff3ccb4e --- /dev/null +++ b/vendor/go.bug.st/serial.v1/README.md @@ -0,0 +1,35 @@ +[![Build Status](https://travis-ci.org/bugst/go-serial.svg?branch=v1)](https://travis-ci.org/bugst/go-serial) + +# go.bug.st/serial.v1 + +A cross-platform serial library for go-lang. + +## Documentation and examples + +See the godoc here: https://godoc.org/go.bug.st/serial.v1 + +## Development + +If you want to contribute to the development of this library, you must clone this git repository directly into your `src` folder under `src/go.bug.st/serial.v1` and checkout the branch `v1`. + +``` +cd $GOPATH +mkdir -p src/go.bug.st/ +git clone https://github.com/bugst/go-serial.git -b v1 src/go.bug.st/serial.v1 +go test go.bug.st/serial.v1 +``` + +## What's new in v1 + +There are some API improvements, in particular object naming is now more idiomatic, class names are less redundant (for example `serial.SerialPort` is now called `serial.Port`), some internal class fields, constants or enumerations are now private and some methods have been moved into the proper interface. + +If you come from the version v0 and want to see the full list of API changes, please check this pull request: + +https://github.com/bugst/go-serial/pull/5/files + +## License + +The software is release under a BSD 3-clause license + +https://github.com/bugst/go-serial/blob/v1/LICENSE + diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 122c03e70..e86e89661 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -484,6 +484,7 @@ userAuthLoop: // sig.Format. This is usually the same, but // for certs, the names differ. if !isAcceptableAlgo(sig.Format) { + authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) break } signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) diff --git a/vendor/golang.org/x/net/internal/socket/empty.s b/vendor/golang.org/x/net/internal/socket/empty.s new file mode 100644 index 000000000..bff0231c7 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/empty.s @@ -0,0 +1,7 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin,go1.12 + +// This exists solely so we can linkname in symbols from syscall. diff --git a/vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go b/vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go new file mode 100644 index 000000000..02d2b3cc8 --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_go1_11_darwin.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.12 + +package socket + +import ( + "syscall" + "unsafe" +) + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(unsafe.Pointer(&l)), 0) + return int(l), errnoErr(errno) +} + +func setsockopt(s uintptr, level, name int, b []byte) error { + _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, s, uintptr(level), uintptr(name), uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), 0) + return errnoErr(errno) +} + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_RECVMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + n, _, errno := syscall.Syscall(syscall.SYS_SENDMSG, s, uintptr(unsafe.Pointer(h)), uintptr(flags)) + return int(n), errnoErr(errno) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_go1_12_darwin.go b/vendor/golang.org/x/net/internal/socket/sys_go1_12_darwin.go new file mode 100644 index 000000000..0999a19fb --- /dev/null +++ b/vendor/golang.org/x/net/internal/socket/sys_go1_12_darwin.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.12 + +package socket + +import ( + "syscall" + "unsafe" +) + +//go:linkname syscall_getsockopt syscall.getsockopt +func syscall_getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *uint32) error + +func getsockopt(s uintptr, level, name int, b []byte) (int, error) { + l := uint32(len(b)) + err := syscall_getsockopt(int(s), level, name, unsafe.Pointer(&b[0]), &l) + return int(l), err +} + +//go:linkname syscall_setsockopt syscall.setsockopt +func syscall_setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error + +func setsockopt(s uintptr, level, name int, b []byte) error { + return syscall_setsockopt(int(s), level, name, unsafe.Pointer(&b[0]), uintptr(len(b))) +} + +//go:linkname syscall_recvmsg syscall.recvmsg +func syscall_recvmsg(s int, msg *syscall.Msghdr, flags int) (n int, err error) + +func recvmsg(s uintptr, h *msghdr, flags int) (int, error) { + return syscall_recvmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags) +} + +//go:linkname syscall_sendmsg syscall.sendmsg +func syscall_sendmsg(s int, msg *syscall.Msghdr, flags int) (n int, err error) + +func sendmsg(s uintptr, h *msghdr, flags int) (int, error) { + return syscall_sendmsg(int(s), (*syscall.Msghdr)(unsafe.Pointer(h)), flags) +} diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go index dc130c27e..9a9bc4762 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_posix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -121,18 +121,21 @@ var zoneCache = ipv6ZoneCache{ toName: make(map[int]string), } -func (zc *ipv6ZoneCache) update(ift []net.Interface) { +// update refreshes the network interface information if the cache was last +// updated more than 1 minute ago, or if force is set. It returns whether the +// cache was updated. +func (zc *ipv6ZoneCache) update(ift []net.Interface, force bool) (updated bool) { zc.Lock() defer zc.Unlock() now := time.Now() - if zc.lastFetched.After(now.Add(-60 * time.Second)) { - return + if !force && zc.lastFetched.After(now.Add(-60*time.Second)) { + return false } zc.lastFetched = now if len(ift) == 0 { var err error if ift, err = net.Interfaces(); err != nil { - return + return false } } zc.toIndex = make(map[string]int, len(ift)) @@ -143,25 +146,38 @@ func (zc *ipv6ZoneCache) update(ift []net.Interface) { zc.toName[ifi.Index] = ifi.Name } } + return true } func (zc *ipv6ZoneCache) name(zone int) string { - zoneCache.update(nil) + updated := zoneCache.update(nil, false) zoneCache.RLock() - defer zoneCache.RUnlock() name, ok := zoneCache.toName[zone] - if !ok { + zoneCache.RUnlock() + if !ok && !updated { + zoneCache.update(nil, true) + zoneCache.RLock() + name, ok = zoneCache.toName[zone] + zoneCache.RUnlock() + } + if !ok { // last resort name = strconv.Itoa(zone) } return name } func (zc *ipv6ZoneCache) index(zone string) int { - zoneCache.update(nil) + updated := zoneCache.update(nil, false) zoneCache.RLock() - defer zoneCache.RUnlock() index, ok := zoneCache.toIndex[zone] - if !ok { + zoneCache.RUnlock() + if !ok && !updated { + zoneCache.update(nil, true) + zoneCache.RLock() + index, ok = zoneCache.toIndex[zone] + zoneCache.RUnlock() + } + if !ok { // last resort index, _ = strconv.Atoi(zone) } return index diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go index 18eba3085..0eb71283f 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux,!s390x,!386 netbsd openbsd +// +build dragonfly freebsd linux,!s390x,!386 netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go index 3efa29037..863d55b8d 100644 --- a/vendor/golang.org/x/net/ipv4/doc.go +++ b/vendor/golang.org/x/net/ipv4/doc.go @@ -241,4 +241,5 @@ // IncludeSourceSpecificGroup may return an error. package ipv4 // import "golang.org/x/net/ipv4" -// BUG(mikio): This package is not implemented on JS, NaCl and Plan 9. +// BUG(mikio): This package is not implemented on AIX, JS, NaCl and +// Plan 9. diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go index 204a49fea..a7c892dc4 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !js,!nacl,!plan9,!windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go b/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go index 8d45599f4..15a27b7a0 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_8.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build !go1.9 -// +build !js,!nacl,!plan9,!windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go b/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go index 4081aad8b..aab3b224e 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg_go1_9.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build go1.9 -// +build !js,!nacl,!plan9,!windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go index 1d434c61a..d57f05c10 100644 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build js nacl plan9 windows +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go index e0be9d50d..d38ea0da6 100644 --- a/vendor/golang.org/x/net/ipv6/doc.go +++ b/vendor/golang.org/x/net/ipv6/doc.go @@ -240,4 +240,5 @@ // IncludeSourceSpecificGroup may return an error. package ipv6 // import "golang.org/x/net/ipv6" -// BUG(mikio): This package is not implemented on JS, NaCl and Plan 9. +// BUG(mikio): This package is not implemented on AIX, JS, NaCl and +// Plan 9. diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go index 3f23b5d21..e17847d0b 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !js,!nacl,!plan9,!windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go b/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go index bc4209db7..a48a6ed64 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_8.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build !go1.9 -// +build !js,!nacl,!plan9,!windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go b/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go index 7dd650480..fb196ed80 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg_go1_9.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build go1.9 -// +build !js,!nacl,!plan9,!windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go index 459142d26..bfb544784 100644 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build js nacl plan9 windows +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris package ipv6 diff --git a/vendor/golang.org/x/sys/unix/.gitignore b/vendor/golang.org/x/sys/unix/.gitignore new file mode 100644 index 000000000..e3e0fc6f8 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/.gitignore @@ -0,0 +1,2 @@ +_obj/ +unix.test diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/golang.org/x/sys/unix/README.md new file mode 100644 index 000000000..bc6f6031f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/README.md @@ -0,0 +1,173 @@ +# Building `sys/unix` + +The sys/unix package provides access to the raw system call interface of the +underlying operating system. See: https://godoc.org/golang.org/x/sys/unix + +Porting Go to a new architecture/OS combination or adding syscalls, types, or +constants to an existing architecture/OS pair requires some manual effort; +however, there are tools that automate much of the process. + +## Build Systems + +There are currently two ways we generate the necessary files. We are currently +migrating the build system to use containers so the builds are reproducible. +This is being done on an OS-by-OS basis. Please update this documentation as +components of the build system change. + +### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) + +The old build system generates the Go files based on the C header files +present on your system. This means that files +for a given GOOS/GOARCH pair must be generated on a system with that OS and +architecture. This also means that the generated code can differ from system +to system, based on differences in the header files. + +To avoid this, if you are using the old build system, only generate the Go +files on an installation with unmodified header files. It is also important to +keep track of which version of the OS the files were generated from (ex. +Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes +and have each OS upgrade correspond to a single change. + +To build the files for your current OS and architecture, make sure GOOS and +GOARCH are set correctly and run `mkall.sh`. This will generate the files for +your specific system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go + +### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) + +The new build system uses a Docker container to generate the go files directly +from source checkouts of the kernel and various system libraries. This means +that on any platform that supports Docker, all the files using the new build +system can be generated at once, and generated files will not change based on +what the person running the scripts has installed on their computer. + +The OS specific files for the new build system are located in the `${GOOS}` +directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When +the kernel or system library updates, modify the Dockerfile at +`${GOOS}/Dockerfile` to checkout the new release of the source. + +To build all the files under the new build system, you must be on an amd64/Linux +system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will +then generate all of the files for all of the GOOS/GOARCH pairs in the new build +system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go, docker + +## Component files + +This section describes the various files used in the code generation process. +It also contains instructions on how to modify these files to add a new +architecture/OS or to add additional syscalls, types, or constants. Note that +if you are using the new build system, the scripts cannot be called normally. +They must be called from within the docker container. + +### asm files + +The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system +call dispatch. There are three entry points: +``` + func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) + func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +``` +The first and second are the standard ones; they differ only in how many +arguments can be passed to the kernel. The third is for low-level use by the +ForkExec wrapper. Unlike the first two, it does not call into the scheduler to +let it know that a system call is running. + +When porting Go to an new architecture/OS, this file must be implemented for +each GOOS/GOARCH pair. + +### mksysnum + +Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` +for the old system). This script takes in a list of header files containing the +syscall number declarations and parses them to produce the corresponding list of +Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated +constants. + +Adding new syscall numbers is mostly done by running the build on a sufficiently +new installation of the target OS (or updating the source checkouts for the +new build system). However, depending on the OS, you make need to update the +parsing in mksysnum. + +### mksyscall.pl + +The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are +hand-written Go files which implement system calls (for unix, the specific OS, +or the specific OS/Architecture pair respectively) that need special handling +and list `//sys` comments giving prototypes for ones that can be generated. + +The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts +them into syscalls. This requires the name of the prototype in the comment to +match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function +prototype can be exported (capitalized) or not. + +Adding a new syscall often just requires adding a new `//sys` function prototype +with the desired arguments and a capitalized name so it is exported. However, if +you want the interface to the syscall to be different, often one will make an +unexported `//sys` prototype, an then write a custom wrapper in +`syscall_${GOOS}.go`. + +### types files + +For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or +`types_${GOOS}.go` on the old system). This file includes standard C headers and +creates Go type aliases to the corresponding C types. The file is then fed +through godef to get the Go compatible definitions. Finally, the generated code +is fed though mkpost.go to format the code correctly and remove any hidden or +private identifiers. This cleaned-up code is written to +`ztypes_${GOOS}_${GOARCH}.go`. + +The hardest part about preparing this file is figuring out which headers to +include and which symbols need to be `#define`d to get the actual data +structures that pass through to the kernel system calls. Some C libraries +preset alternate versions for binary compatibility and translate them on the +way in and out of system calls, but there is almost always a `#define` that can +get the real ones. +See `types_darwin.go` and `linux/types.go` for examples. + +To add a new type, add in the necessary include statement at the top of the +file (if it is not already there) and add in a type alias line. Note that if +your type is significantly different on different architectures, you may need +some `#if/#elif` macros in your include statements. + +### mkerrors.sh + +This script is used to generate the system's various constants. This doesn't +just include the error numbers and error strings, but also the signal numbers +an a wide variety of miscellaneous constants. The constants come from the list +of include files in the `includes_${uname}` variable. A regex then picks out +the desired `#define` statements, and generates the corresponding Go constants. +The error numbers and strings are generated from `#include `, and the +signal numbers and strings are generated from `#include `. All of +these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, +`_errors.c`, which prints out all the constants. + +To add a constant, add the header that includes it to the appropriate variable. +Then, edit the regex (if necessary) to match the desired constant. Avoid making +the regex too broad to avoid matching unintended constants. + + +## Generated files + +### `zerror_${GOOS}_${GOARCH}.go` + +A file containing all of the system's generated error numbers, error strings, +signal numbers, and constants. Generated by `mkerrors.sh` (see above). + +### `zsyscall_${GOOS}_${GOARCH}.go` + +A file containing all the generated syscalls for a specific GOOS and GOARCH. +Generated by `mksyscall.pl` (see above). + +### `zsysnum_${GOOS}_${GOARCH}.go` + +A list of numeric constants for all the syscall number of the specific GOOS +and GOARCH. Generated by mksysnum (see above). + +### `ztypes_${GOOS}_${GOARCH}.go` + +A file containing Go types for passing into (or returning from) syscalls. +Generated by godefs and the types file (see above). diff --git a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s index 649e58714..88f712557 100644 --- a/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s +++ b/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -15,12 +15,6 @@ // Just jump to package syscall's implementation for all these functions. // The runtime may know about them. -TEXT ·Syscall(SB),NOSPLIT,$0-56 - BR syscall·Syscall(SB) - -TEXT ·Syscall6(SB),NOSPLIT,$0-80 - BR syscall·Syscall6(SB) - TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 BL runtime·entersyscall(SB) MOVD a1+8(FP), R3 @@ -36,12 +30,6 @@ TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 BL runtime·exitsyscall(SB) RET -TEXT ·RawSyscall(SB),NOSPLIT,$0-56 - BR syscall·RawSyscall(SB) - -TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 - BR syscall·RawSyscall6(SB) - TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 MOVD a1+8(FP), R3 MOVD a2+16(FP), R4 diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh new file mode 100755 index 000000000..9b76ad669 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -0,0 +1,204 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This script runs or (given -n) prints suggested commands to generate files for +# the Architecture/OS specified by the GOARCH and GOOS environment variables. +# See README.md for more information about how the build system works. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" +cmd="" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + # Run the command line that appears in the first line + # of the generated file to regenerate it. + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + cmd="echo" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + # Use then new build system + # Files generated through docker (use $cmd so you can Ctl-C the build or run) + $cmd docker build --tag generate:$GOOS $GOOS + $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS + exit +fi + +GOOSARCH_in=syscall_$GOOSARCH.go +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +aix_ppc) + mkerrors="$mkerrors -maix32" + mksyscall="./mksyscall_aix_ppc.pl -aix" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +aix_ppc64) + mkerrors="$mkerrors -maix64" + mksyscall="./mksyscall_aix_ppc64.pl -aix" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_amd64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm) + mkerrors="$mkerrors" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_amd64) + mkerrors="$mkerrors -m64" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +linux_sparc64) + GOOSARCH_in=syscall_linux_sparc64.go + unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -netbsd -arm" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +openbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -openbsd -arm" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +solaris_amd64) + mksyscall="./mksyscall_solaris.pl" + mkerrors="$mkerrors -m64" + mksysnum= + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + *) + syscall_goos="syscall_$GOOS.go" + case "$GOOS" in + darwin | dragonfly | freebsd | netbsd | openbsd) + syscall_goos="syscall_bsd.go $syscall_goos" + ;; + esac + if [ -n "$mksyscall" ]; then + if [ "$GOOSARCH" == "aix_ppc64" ]; then + # aix/ppc64 script generates files instead of writing to stdin. + echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in && gofmt -w zsyscall_$GOOSARCH.go && gofmt -w zsyscall_"$GOOSARCH"_gccgo.go && gofmt -w zsyscall_"$GOOSARCH"_gc.go " ; + else + echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; + fi + fi + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then + echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; + fi +) | $run diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh new file mode 100755 index 000000000..955dd50f9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -0,0 +1,658 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +if test -z "$GOARCH" -o -z "$GOOS"; then + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 +fi + +# Check that we are using the new build system if we should +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then + echo 1>&2 "In the new build system, mkerrors should not be called directly." + echo 1>&2 "See README.md" + exit 1 + fi +fi + +if [[ "$GOOS" = "aix" ]]; then + CC=${CC:-gcc} +else + CC=${CC:-cc} +fi + +if [[ "$GOOS" = "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi + +uname=$(uname) + +includes_AIX=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define AF_LOCAL AF_UNIX +' + +includes_Darwin=' +#define _DARWIN_C_SOURCE +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_DragonFly=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_FreeBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __FreeBSD__ >= 10 +#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 +#undef SIOCAIFADDR +#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data +#undef SIOCSIFPHYADDR +#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data +#endif +' + +includes_Linux=' +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#ifndef __LP64__ +#define _FILE_OFFSET_BITS 64 +#endif +#define _GNU_SOURCE + +// is broken on powerpc64, as it fails to include definitions of +// these structures. We just include them copied from . +#if defined(__powerpc__) +struct sgttyb { + char sg_ispeed; + char sg_ospeed; + char sg_erase; + char sg_kill; + short sg_flags; +}; + +struct tchars { + char t_intrc; + char t_quitc; + char t_startc; + char t_stopc; + char t_eofc; + char t_brkc; +}; + +struct ltchars { + char t_suspc; + char t_dsuspc; + char t_rprntc; + char t_flushc; + char t_werasc; + char t_lnextc; +}; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MSG_FASTOPEN +#define MSG_FASTOPEN 0x20000000 +#endif + +#ifndef PTRACE_GETREGS +#define PTRACE_GETREGS 0xc +#endif + +#ifndef PTRACE_SETREGS +#define PTRACE_SETREGS 0xd +#endif + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +#ifdef SOL_BLUETOOTH +// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h +// but it is already in bluetooth_linux.go +#undef SOL_BLUETOOTH +#endif + +// Certain constants are missing from the fs/crypto UAPI +#define FS_KEY_DESC_PREFIX "fscrypt:" +#define FS_KEY_DESC_PREFIX_SIZE 8 +#define FS_MAX_KEY_SIZE 64 + +// XDP socket constants do not appear to be picked up otherwise. +// Copied from samples/bpf/xdpsock_user.c. +#ifndef SOL_XDP +#define SOL_XDP 283 +#endif + +#ifndef AF_XDP +#define AF_XDP 44 +#endif +' + +includes_NetBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Needed since refers to it... +#define schedppq 1 +' + +includes_OpenBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// We keep some constants not supported in OpenBSD 5.5 and beyond for +// the promise of compatibility. +#define EMUL_ENABLED 0x1 +#define EMUL_NATIVE 0x2 +#define IPV6_FAITH 0x1d +#define IPV6_OPTIONS 0x1 +#define IPV6_RTHDR_STRICT 0x1 +#define IPV6_SOCKOPT_RESERVED1 0x3 +#define SIOCGIFGENERIC 0xc020693a +#define SIOCSIFGENERIC 0x80206939 +#define WALTSIG 0x4 +' + +includes_SunOS=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package unix + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo 'import "syscall"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + $2 ~ /^ELF_.*$/ {next}# contains ELF_ARCH, etc. + + $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || + $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} + + $2 !~ /^ECCAPBITS/ && + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^(OLD|NEW)DEV$/ || + $2 == "BOTHER" || + $2 ~ /^CI?BAUD(EX)?$/ || + $2 == "IBSHIFT" || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 !~ "X86_CR3_PCID_NOFLUSH" && + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 == "XCASE" || + $2 == "ALTWERASE" || + $2 == "NOKERNINFO" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || + $2 ~ /^O?XTABS$/ || + $2 ~ /^TC[IO](ON|OFF)$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^TP_STATUS_/ || + $2 ~ /^FALLOC_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ || + $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ || + $2 ~ /^HW_MACHINE$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 !~ "MNT_BITS" && + $2 ~ /^(MS|MNT|UMOUNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^KEXEC_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 ~ /^MODULE_INIT_/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^CLOCK_/ || + $2 ~ /^CAN_/ || + $2 ~ /^CAP_/ || + $2 ~ /^ALG_/ || + $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || + $2 ~ /^GRND_/ || + $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || + $2 ~ /^KEYCTL_/ || + $2 ~ /^PERF_EVENT_IOC_/ || + $2 ~ /^SECCOMP_MODE_/ || + $2 ~ /^SPLICE_/ || + $2 ~ /^SYNC_FILE_RANGE_/ || + $2 !~ /^AUDIT_RECORD_MAGIC/ && + $2 !~ /IOC_MAGIC/ && + $2 ~ /^[A-Z][A-Z0-9_]+_MAGIC2?$/ || + $2 ~ /^(VM|VMADDR)_/ || + $2 ~ /^IOCTL_VM_SOCKETS_/ || + $2 ~ /^(TASKSTATS|TS)_/ || + $2 ~ /^CGROUPSTATS_/ || + $2 ~ /^GENL_/ || + $2 ~ /^STATX_/ || + $2 ~ /^RENAME/ || + $2 ~ /^UBI_IOC[A-Z]/ || + $2 ~ /^UTIME_/ || + $2 ~ /^XATTR_(CREATE|REPLACE|NO(DEFAULT|FOLLOW|SECURITY)|SHOWCOMPRESSION)/ || + $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || + $2 ~ /^FSOPT_/ || + $2 ~ /^WDIOC_/ || + $2 ~ /^NFN/ || + $2 ~ /^XDP_/ || + $2 ~ /^(HDIO|WIN|SMART)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ || + $2 ~/^PPPIOC/ || + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// Code generated by the command above; see README.md. DO NOT EDIT.' +echo +echo "// +build ${GOARCH},${GOOS}" +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +struct tuple { + int num; + const char *name; +}; + +struct tuple errors[] = { +" + for i in $errors + do + echo -E ' {'$i', "'$i'" },' + done + + echo -E " +}; + +struct tuple signals[] = { +" + for i in $signals + do + echo -E ' {'$i', "'$i'" },' + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +tuplecmp(const void *a, const void *b) +{ + return ((struct tuple *)a)->num - ((struct tuple *)b)->num; +} + +int +main(void) +{ + int i, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errorList = [...]struct {\n"); + printf("\tnum syscall.Errno\n"); + printf("\tname string\n"); + printf("\tdesc string\n"); + printf("} {\n"); + qsort(errors, nelem(errors), sizeof errors[0], tuplecmp); + for(i=0; i 0 && errors[i-1].num == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t{ %d, \"%s\", \"%s\" },\n", e, errors[i].name, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signalList = [...]struct {\n"); + printf("\tnum syscall.Signal\n"); + printf("\tname string\n"); + printf("\tdesc string\n"); + printf("} {\n"); + qsort(signals, nelem(signals), sizeof signals[0], tuplecmp); + for(i=0; i 0 && signals[i-1].num == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t{ %d, \"%s\", \"%s\" },\n", e, signals[i].name, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go index 7e5c22c47..6d263cf15 100644 --- a/vendor/golang.org/x/sys/unix/mkpost.go +++ b/vendor/golang.org/x/sys/unix/mkpost.go @@ -46,6 +46,10 @@ func main() { valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) + // Intentionally export __fds_bits field in FdSet + fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) + b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) + // If we have empty Ptrace structs, we should delete them. Only s390x emits // nonempty Ptrace structs. ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) @@ -65,6 +69,10 @@ func main() { convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + // Convert [1024]int8 to [1024]byte in Ptmget members + convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) + b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) + // Remove spare fields (e.g. in Statx_t) spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) b = spareFieldsRegex.ReplaceAll(b, []byte("_")) diff --git a/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/golang.org/x/sys/unix/mksyscall.pl new file mode 100755 index 000000000..1f6b926f8 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -0,0 +1,341 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This program reads a file containing function prototypes +# (like syscall_darwin.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair +my $tags = ""; # build tags + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} +if($ARGV[0] eq "-tags") { + shift; + $tags = $ARGV[0]; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { + if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksyscall should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; + } +} + + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "RawSyscallNoError"; + } else { + $asm = "RawSyscall"; + } + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "SyscallNoError"; + } + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + # raw syscall without error on Linux, see golang.org/issue/22924 + $text .= "\t$ret[0], $ret[1] := $call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = errnoErr(e1)\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + $in = join(', ', @in); + $out = join(', ', @out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Check if value return, err return available + my $errvar = ""; + my $retvar = ""; + my $rettype = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + } else { + $retvar = $name; + $rettype = $type; + } + } + + # System call name. + #if($func ne "fcntl") { + + if($sysname eq "") { + $sysname = "$func"; + } + + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + my $C_rettype = ""; + if($rettype eq "unsafe.Pointer") { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "uintptr") { + $C_rettype = "uintptr_t"; + } elsif($rettype =~ /^_/) { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "int") { + $C_rettype = "int"; + } elsif($rettype eq "int32") { + $C_rettype = "int"; + } elsif($rettype eq "int64") { + $C_rettype = "long long"; + } elsif($rettype eq "uint32") { + $C_rettype = "unsigned int"; + } elsif($rettype eq "uint64") { + $C_rettype = "unsigned long long"; + } else { + $C_rettype = "int"; + } + if($sysname eq "exit") { + $C_rettype = "void"; + } + + # Change types to c + my @c_in = (); + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @c_in, "uintptr_t"; + } elsif($type eq "string") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^\[\](.*)/) { + push @c_in, "uintptr_t", "size_t"; + } elsif($type eq "unsafe.Pointer") { + push @c_in, "uintptr_t"; + } elsif($type eq "uintptr") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^_/) { + push @c_in, "uintptr_t"; + } elsif($type eq "int") { + push @c_in, "int"; + } elsif($type eq "int32") { + push @c_in, "int"; + } elsif($type eq "int64") { + push @c_in, "long long"; + } elsif($type eq "uint32") { + push @c_in, "unsigned int"; + } elsif($type eq "uint64") { + push @c_in, "unsigned long long"; + } else { + push @c_in, "int"; + } + } + + if ($func ne "fcntl" && $func ne "FcntlInt" && $func ne "readlen" && $func ne "writelen") { + # Imports of system calls from libc + $c_extern .= "$C_rettype $sysname"; + my $c_in = join(', ', @c_in); + $c_extern .= "($c_in);\n"; + } + + # So file name. + if($aix) { + if($modname eq "") { + $modname = "libc.a/shr_64.o"; + } else { + print STDERR "$func: only syscall using libc are available\n"; + $errors = 1; + next; + } + } + + my $strconvfunc = "C.CString"; + my $strconvtype = "*byte"; + + # Go function header. + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out ; + + # Prepare arguments to call. + my @args = (); + my $n = 0; + my $arg_n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "C.uintptr_t(uintptr(unsafe.Pointer($name)))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\t_p$n := uintptr(unsafe.Pointer($strconvfunc($name)))\n"; + push @args, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\t_p$n := uintptr(unsafe.Pointer($strconvfunc($name)))\n"; + push @args, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "C.uintptr_t(uintptr(unsafe.Pointer(_p$n)))"; + $n++; + $text .= "\tvar _p$n int\n"; + $text .= "\t_p$n = len($name)\n"; + push @args, "C.size_t(_p$n)"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + $n++; + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "_p$n"; + $n++; + } elsif($type =~ /^_/) { + push @args, "C.uintptr_t(uintptr($name))"; + } elsif($type eq "unsafe.Pointer") { + push @args, "C.uintptr_t(uintptr($name))"; + } elsif($type eq "int") { + if (($arg_n == 2) && (($func eq "readlen") || ($func eq "writelen"))) { + push @args, "C.size_t($name)"; + } elsif ($arg_n == 0 && $func eq "fcntl") { + push @args, "C.uintptr_t($name)"; + } elsif (($arg_n == 2) && (($func eq "fcntl") || ($func eq "FcntlInt"))) { + push @args, "C.uintptr_t($name)"; + } else { + push @args, "C.int($name)"; + } + } elsif($type eq "int32") { + push @args, "C.int($name)"; + } elsif($type eq "int64") { + push @args, "C.longlong($name)"; + } elsif($type eq "uint32") { + push @args, "C.uint($name)"; + } elsif($type eq "uint64") { + push @args, "C.ulonglong($name)"; + } elsif($type eq "uintptr") { + push @args, "C.uintptr_t($name)"; + } else { + push @args, "C.int($name)"; + } + $arg_n++; + } + my $nargs = @args; + + + # Determine which form to use; pad args with zeros. + if ($nonblock) { + } + + my $args = join(', ', @args); + my $call = ""; + if ($sysname eq "exit") { + if ($errvar ne "") { + $call .= "er :="; + } else { + $call .= ""; + } + } elsif ($errvar ne "") { + $call .= "r0,er :="; + } elsif ($retvar ne "") { + $call .= "r0,_ :="; + } else { + $call .= "" + } + $call .= "C.$sysname($args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + } else { + $reg = "r0"; + } + if($reg ne "e1" ) { + $body .= "\t$name = $type($reg)\n"; + } + } + + # verify return + if ($sysname ne "exit" && $errvar ne "") { + if ($C_rettype =~ /^uintptr/) { + $body .= "\tif \(uintptr\(r0\) ==\^uintptr\(0\) && er != nil\) {\n"; + $body .= "\t\t$errvar = er\n"; + $body .= "\t}\n"; + } else { + $body .= "\tif \(r0 ==-1 && er != nil\) {\n"; + $body .= "\t\t$errvar = er\n"; + $body .= "\t}\n"; + } + } elsif ($errvar ne "") { + $body .= "\tif \(er != nil\) {\n"; + $body .= "\t\t$errvar = er\n"; + $body .= "\t}\n"; + } + + $text .= "\t$call\n"; + $text .= $body; + + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + $in = join(', ', @in); + $out = join(', ', @out); + + if($sysname eq "") { + $sysname = "$func"; + } + + my $onlyCommon = 0; + if ($func eq "readlen" || $func eq "writelen" || $func eq "FcntlInt" || $func eq "FcntlFlock") { + # This function call another syscall which is already implemented. + # Therefore, the gc and gccgo part must not be generated. + $onlyCommon = 1 + } + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + + $textcommon .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + if (!$onlyCommon) { + $textgccgo .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + $textgc .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + } + + + # Check if value return, err return available + my $errvar = ""; + my $retvar = ""; + my $rettype = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + } else { + $retvar = $name; + $rettype = $type; + } + } + + + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # GCCGO Prototype return type + my $C_rettype = ""; + if($rettype eq "unsafe.Pointer") { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "uintptr") { + $C_rettype = "uintptr_t"; + } elsif($rettype =~ /^_/) { + $C_rettype = "uintptr_t"; + } elsif($rettype eq "int") { + $C_rettype = "int"; + } elsif($rettype eq "int32") { + $C_rettype = "int"; + } elsif($rettype eq "int64") { + $C_rettype = "long long"; + } elsif($rettype eq "uint32") { + $C_rettype = "unsigned int"; + } elsif($rettype eq "uint64") { + $C_rettype = "unsigned long long"; + } else { + $C_rettype = "int"; + } + if($sysname eq "exit") { + $C_rettype = "void"; + } + + # GCCGO Prototype arguments type + my @c_in = (); + foreach my $i (0 .. $#in) { + my ($name, $type) = parseparam($in[$i]); + if($type =~ /^\*/) { + push @c_in, "uintptr_t"; + } elsif($type eq "string") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^\[\](.*)/) { + push @c_in, "uintptr_t", "size_t"; + } elsif($type eq "unsafe.Pointer") { + push @c_in, "uintptr_t"; + } elsif($type eq "uintptr") { + push @c_in, "uintptr_t"; + } elsif($type =~ /^_/) { + push @c_in, "uintptr_t"; + } elsif($type eq "int") { + if (($i == 0 || $i == 2) && $func eq "fcntl"){ + # These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock + push @c_in, "uintptr_t"; + } else { + push @c_in, "int"; + } + } elsif($type eq "int32") { + push @c_in, "int"; + } elsif($type eq "int64") { + push @c_in, "long long"; + } elsif($type eq "uint32") { + push @c_in, "unsigned int"; + } elsif($type eq "uint64") { + push @c_in, "unsigned long long"; + } else { + push @c_in, "int"; + } + } + + if (!$onlyCommon){ + # GCCGO Prototype Generation + # Imports of system calls from libc + $c_extern .= "$C_rettype $sysname"; + my $c_in = join(', ', @c_in); + $c_extern .= "($c_in);\n"; + } + + # GC Library name + if($modname eq "") { + $modname = "libc.a/shr_64.o"; + } else { + print STDERR "$func: only syscall using libc are available\n"; + $errors = 1; + next; + } + my $sysvarname = "libc_${sysname}"; + + if (!$onlyCommon){ + # GC Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n"; + # GC Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n"; + # GC Library proc address variable. + push @vars, $sysvarname; + } + + my $strconvfunc ="BytePtrFromString"; + my $strconvtype = "*byte"; + + # Go function header. + if($out ne "") { + $out = " ($out)"; + } + if($textcommon ne "") { + $textcommon .= "\n" + } + + $textcommon .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out ; + + # Prepare arguments to call. + my @argscommun = (); # Arguments in the commun part + my @argscall = (); # Arguments for call prototype + my @argsgc = (); # Arguments for gc call (with syscall6) + my @argsgccgo = (); # Arguments for gccgo call (with C.name_of_syscall) + my $n = 0; + my $arg_n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @argscommun, "uintptr(unsafe.Pointer($name))"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } elsif($type eq "string" && $errvar ne "") { + $textcommon .= "\tvar _p$n $strconvtype\n"; + $textcommon .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $textcommon .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + + push @argscommun, "uintptr(unsafe.Pointer(_p$n))"; + push @argscall, "_p$n uintptr "; + push @argsgc, "_p$n"; + push @argsgccgo, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $textcommon .= "\tvar _p$n $strconvtype\n"; + $textcommon .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $textcommon .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + + push @argscommun, "uintptr(unsafe.Pointer(_p$n))"; + push @argscall, "_p$n uintptr"; + push @argsgc, "_p$n"; + push @argsgccgo, "C.uintptr_t(_p$n)"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $textcommon .= "\tvar _p$n *$1\n"; + $textcommon .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @argscommun, "uintptr(unsafe.Pointer(_p$n))", "len($name)"; + push @argscall, "_p$n uintptr", "_lenp$n int"; + push @argsgc, "_p$n", "uintptr(_lenp$n)"; + push @argsgccgo, "C.uintptr_t(_p$n)", "C.size_t(_lenp$n)"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + print STDERR "$ARGV:$.: $func uses int64 with 32 bits mode. Case not yet implemented\n"; + # if($_32bit eq "big-endian") { + # push @args, "uintptr($name >> 32)", "uintptr($name)"; + # } else { + # push @args, "uintptr($name)", "uintptr($name >> 32)"; + # } + # $n++; + } elsif($type eq "bool") { + print STDERR "$ARGV:$.: $func uses bool. Case not yet implemented\n"; + # $text .= "\tvar _p$n uint32\n"; + # $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + # push @args, "_p$n"; + # $n++; + } elsif($type =~ /^_/ ||$type eq "unsafe.Pointer") { + push @argscommun, "uintptr($name)"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } elsif($type eq "int") { + if (($arg_n == 0 || $arg_n == 2) && ($func eq "fcntl" || $func eq "FcntlInt" || $func eq "FcntlFlock")) { + # These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock + push @argscommun, "uintptr($name)"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } else { + push @argscommun, "$name"; + push @argscall, "$name int"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.int($name)"; + } + } elsif($type eq "int32") { + push @argscommun, "$name"; + push @argscall, "$name int32"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.int($name)"; + } elsif($type eq "int64") { + push @argscommun, "$name"; + push @argscall, "$name int64"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.longlong($name)"; + } elsif($type eq "uint32") { + push @argscommun, "$name"; + push @argscall, "$name uint32"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.uint($name)"; + } elsif($type eq "uint64") { + push @argscommun, "$name"; + push @argscall, "$name uint64"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.ulonglong($name)"; + } elsif($type eq "uintptr") { + push @argscommun, "$name"; + push @argscall, "$name uintptr"; + push @argsgc, "$name"; + push @argsgccgo, "C.uintptr_t($name)"; + } else { + push @argscommun, "int($name)"; + push @argscall, "$name int"; + push @argsgc, "uintptr($name)"; + push @argsgccgo, "C.int($name)"; + } + $arg_n++; + } + my $nargs = @argsgc; + + # COMMUN function generation + my $argscommun = join(', ', @argscommun); + my $callcommun = "call$sysname($argscommun)"; + my @ret = ("_", "_"); + my $body = ""; + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[1] = $reg; + $do_errno = 1; + } else { + $reg = "r0"; + $ret[0] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_") { + $textcommon .= "\t$callcommun\n"; + } else { + $textcommon .= "\t$ret[0], $ret[1] := $callcommun\n"; + } + $textcommon .= $body; + + if ($do_errno) { + $textcommon .= "\tif e1 != 0 {\n"; + $textcommon .= "\t\terr = errnoErr(e1)\n"; + $textcommon .= "\t}\n"; + } + $textcommon .= "\treturn\n"; + $textcommon .= "}\n"; + + if ($onlyCommon){ + next + } + # CALL Prototype + my $callProto = sprintf "func call%s(%s) (r1 uintptr, e1 Errno) {\n", $sysname, join(', ', @argscall); + + # GC function generation + my $asm = "syscall6"; + if ($nonblock) { + $asm = "rawSyscall6"; + } + + if(@argsgc <= 6) { + while(@argsgc < 6) { + push @argsgc, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + my $argsgc = join(', ', @argsgc); + my $callgc = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $argsgc)"; + + $textgc .= $callProto; + $textgc .= "\tr1, _, e1 = $callgc\n"; + $textgc .= "\treturn\n}\n"; + + # GCCGO function generation + my $argsgccgo = join(', ', @argsgccgo); + my $callgccgo = "C.$sysname($argsgccgo)"; + $textgccgo .= $callProto; + $textgccgo .= "\tr1 = uintptr($callgccgo)\n"; + $textgccgo .= "\te1 = syscall.GetErrno()\n"; + $textgccgo .= "\treturn\n}\n"; +} + +if($errors) { + exit 1; +} + +# Print zsyscall_aix_ppc64.go +open(my $fcommun, '>', 'zsyscall_aix_ppc64.go'); +my $tofcommun = <', 'zsyscall_aix_ppc64_gc.go'); +my $tofgc = <', 'zsyscall_aix_ppc64_gccgo.go'); +my $tofgccgo = <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # So file name. + if($modname eq "") { + $modname = "libc"; + } + + # System call name. + if($sysname eq "") { + $sysname = "$func"; + } + + # System call pointer variable name. + my $sysvarname = "proc$sysname"; + + my $strconvfunc = "BytePtrFromString"; + my $strconvtype = "*byte"; + + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; + # Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; + # Library proc address variable. + push @vars, $sysvarname; + + # Go function header. + $out = join(', ', @out); + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "uintptr(_p$n)"; + $n++; + } else { + push @args, "uintptr($name)"; + } + } + my $nargs = @args; + + # Determine which form to use; pad args with zeros. + my $asm = "sysvicall6"; + if ($nonblock) { + $asm = "rawSysvicall6"; + } + if(@args <= 6) { + while(@args < 6) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + my @ret = ("_", "_", "_"); + my @pout= (); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + $text .= $body; + + if ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print < "net.inet", + "net.inet.ipproto" => "net.inet", + "net.inet6.ipv6proto" => "net.inet6", + "net.inet6.ipv6" => "net.inet6.ip6", + "net.inet.icmpv6" => "net.inet6.icmp6", + "net.inet6.divert6" => "net.inet6.divert", + "net.inet6.tcp6" => "net.inet.tcp", + "net.inet6.udp6" => "net.inet.udp", + "mpls" => "net.mpls", + "swpenc" => "vm.swapencrypt" +); + +# Node mappings +my %node_map = ( + "net.inet.ip.ifq" => "net.ifq", + "net.inet.pfsync" => "net.pfsync", + "net.mpls.ifq" => "net.ifq" +); + +my $ctlname; +my %mib = (); +my %sysctl = (); +my $node; + +sub debug() { + print STDERR "$_[0]\n" if $debug; +} + +# Walk the MIB and build a sysctl name to OID mapping. +sub build_sysctl() { + my ($node, $name, $oid) = @_; + my %node = %{$node}; + my @oid = @{$oid}; + + foreach my $key (sort keys %node) { + my @node = @{$node{$key}}; + my $nodename = $name.($name ne '' ? '.' : '').$key; + my @nodeoid = (@oid, $node[0]); + if ($node[1] eq 'CTLTYPE_NODE') { + if (exists $node_map{$nodename}) { + $node = \%mib; + $ctlname = $node_map{$nodename}; + foreach my $part (split /\./, $ctlname) { + $node = \%{@{$$node{$part}}[2]}; + } + } else { + $node = $node[2]; + } + &build_sysctl($node, $nodename, \@nodeoid); + } elsif ($node[1] ne '') { + $sysctl{$nodename} = \@nodeoid; + } + } +} + +foreach my $ctl (@ctls) { + $ctls{$ctl} = $ctl; +} + +# Build MIB +foreach my $header (@headers) { + &debug("Processing $header..."); + open HEADER, "/usr/include/$header" || + print STDERR "Failed to open $header\n"; + while (

    ) { + if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || + $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || + $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { + if ($1 eq 'CTL_NAMES') { + # Top level. + $node = \%mib; + } else { + # Node. + my $nodename = lc($2); + if ($header =~ /^netinet\//) { + $ctlname = "net.inet.$nodename"; + } elsif ($header =~ /^netinet6\//) { + $ctlname = "net.inet6.$nodename"; + } elsif ($header =~ /^net\//) { + $ctlname = "net.$nodename"; + } else { + $ctlname = "$nodename"; + $ctlname =~ s/^(fs|net|kern)_/$1\./; + } + if (exists $ctl_map{$ctlname}) { + $ctlname = $ctl_map{$ctlname}; + } + if (not exists $ctls{$ctlname}) { + &debug("Ignoring $ctlname..."); + next; + } + + # Walk down from the top of the MIB. + $node = \%mib; + foreach my $part (split /\./, $ctlname) { + if (not exists $$node{$part}) { + &debug("Missing node $part"); + $$node{$part} = [ 0, '', {} ]; + } + $node = \%{@{$$node{$part}}[2]}; + } + } + + # Populate current node with entries. + my $i = -1; + while (defined($_) && $_ !~ /^}/) { + $_ =
    ; + $i++ if $_ =~ /{.*}/; + next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; + $$node{$1} = [ $i, $2, {} ]; + } + } + } + close HEADER; +} + +&build_sysctl(\%mib, "", []); + +print <){ + if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ + my $name = $1; + my $num = $2; + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;" + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if(/^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if($line =~ /^(.*)\\$/) { + # Handle continuation + $line = $1; + $_ =~ s/^\s+//; + $line .= $_; + } else { + # New line + $line = $_; + } + next if $line =~ /\\$/; + if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { + my $num = $1; + my $proto = $6; + my $compat = $8; + my $name = "$7_$9"; + + $name = "$7_$11" if $11 ne ''; + $name =~ y/a-z/A-Z/; + + if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { + print " $name = $num; // $proto\n"; + } + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ + my $num = $1; + my $proto = $3; + my $name = $4; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print < IFNAMSIZ-1 { + return nil, 0, EINVAL + } + + *(*uint16)(unsafe.Pointer(&sa.raw[0])) = AF_PPPOX + // This next field is in host-endian byte order. We can't use the + // same unsafe pointer cast as above, because this value is not + // 32-bit aligned and some architectures don't allow unaligned + // access. + // + // However, the value of px_proto_oe is 0, so we can use + // encoding/binary helpers to write the bytes without worrying + // about the ordering. + binary.BigEndian.PutUint32(sa.raw[2:6], px_proto_oe) + // This field is deliberately big-endian, unlike the previous + // one. The kernel expects SID to be in network byte order. + binary.BigEndian.PutUint16(sa.raw[6:8], sa.SID) + copy(sa.raw[8:14], sa.Remote) + for i := 14; i < 14+IFNAMSIZ; i++ { + sa.raw[i] = 0 + } + copy(sa.raw[14:], sa.Dev) + return unsafe.Pointer(&sa.raw), SizeofSockaddrPPPoX, nil +} + func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: @@ -820,6 +876,22 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { SharedUmemFD: pp.Shared_umem_fd, } return sa, nil + case AF_PPPOX: + pp := (*RawSockaddrPPPoX)(unsafe.Pointer(rsa)) + if binary.BigEndian.Uint32(pp[2:6]) != px_proto_oe { + return nil, EINVAL + } + sa := &SockaddrPPPoE{ + SID: binary.BigEndian.Uint16(pp[6:8]), + Remote: net.HardwareAddr(pp[8:14]), + } + for i := 14; i < 14+IFNAMSIZ; i++ { + if pp[i] == 0 { + sa.Dev = string(pp[14:i]) + break + } + } + return sa, nil } return nil, EAFNOSUPPORT } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index b711aca82..059327a36 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -13,6 +13,7 @@ package unix import ( + "runtime" "syscall" "unsafe" ) @@ -190,6 +191,13 @@ func IoctlGetTermios(fd int, req uint) (*Termios, error) { return &value, err } +func IoctlGetPtmget(fd int, req uint) (*Ptmget, error) { + var value Ptmget + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + runtime.KeepAlive(value) + return &value, err +} + func Uname(uname *Utsname) error { mib := []_C_int{CTL_KERN, KERN_OSTYPE} n := unsafe.Sizeof(uname.Sysname) diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go index 4cb8e8edf..1c70d1b69 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix_gc.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build darwin dragonfly freebsd linux netbsd openbsd solaris -// +build !gccgo +// +build !gccgo,!ppc64le,!ppc64 package unix diff --git a/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go new file mode 100644 index 000000000..86dc765ab --- /dev/null +++ b/vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go @@ -0,0 +1,24 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64le ppc64 +// +build !gccgo + +package unix + +import "syscall" + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + return syscall.Syscall(trap, a1, a2, a3) +} +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + return syscall.Syscall6(trap, a1, a2, a3, a4, a5, a6) +} +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + return syscall.RawSyscall(trap, a1, a2, a3) +} +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + return syscall.RawSyscall6(trap, a1, a2, a3, a4, a5, a6) +} diff --git a/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/golang.org/x/sys/unix/types_freebsd.go index 8421ccf1c..747079895 100644 --- a/vendor/golang.org/x/sys/unix/types_freebsd.go +++ b/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -26,7 +26,7 @@ package unix #include #include #include -#include +#include #include #include #include diff --git a/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/golang.org/x/sys/unix/types_netbsd.go index 1edbf1ba7..2dd4f9542 100644 --- a/vendor/golang.org/x/sys/unix/types_netbsd.go +++ b/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -248,6 +248,8 @@ type Termios C.struct_termios type Winsize C.struct_winsize +type Ptmget C.struct_ptmget + // fchmodat-like syscalls. const ( diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 673152b94..db3c31ef8 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -1293,6 +1293,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x40042406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8008743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40087446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x400c744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40087447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1696,6 +1726,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1751,6 +1782,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 5735bcf3c..4785835b6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -1293,6 +1293,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1697,6 +1727,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1752,6 +1783,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index d8e8442e5..5e902423a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x40042406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8008743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40087446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x400c744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40087447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1703,6 +1733,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1758,6 +1789,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 5d79b789b..ebe9d8b41 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -1294,6 +1294,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1687,6 +1717,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1742,6 +1773,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 3c91615c8..d467d211b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x80042406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4008743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80087446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x800c744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80087447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1696,6 +1726,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1751,6 +1782,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index e1f86c1cd..9c293ed13 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1696,6 +1726,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1751,6 +1782,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index d09e3b68b..e2162508c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1696,6 +1726,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1751,6 +1782,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index f78108dfb..836c0c654 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x80042406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4008743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80087446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x800c744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80087447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1696,6 +1726,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1751,6 +1782,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x40047309 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 8da57a99c..7ca618431 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -1292,6 +1292,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1752,6 +1782,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1807,6 +1838,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 1832c0a7c..839ac214c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -1292,6 +1292,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x80082406 PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x8004743d + PPPIOCATTCHAN = 0x80047438 + PPPIOCCONNECT = 0x8004743a + PPPIOCDETACH = 0x8004743c + PPPIOCDISCONN = 0x20007439 + PPPIOCGASYNCMAP = 0x40047458 + PPPIOCGCHAN = 0x40047437 + PPPIOCGDEBUG = 0x40047441 + PPPIOCGFLAGS = 0x4004745a + PPPIOCGIDLE = 0x4010743f + PPPIOCGL2TPSTATS = 0x40487436 + PPPIOCGMRU = 0x40047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x40047455 + PPPIOCGUNIT = 0x40047456 + PPPIOCGXASYNCMAP = 0x40207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x80107446 + PPPIOCSASYNCMAP = 0x80047457 + PPPIOCSCOMPRESS = 0x8010744d + PPPIOCSDEBUG = 0x80047440 + PPPIOCSFLAGS = 0x80047459 + PPPIOCSMAXCID = 0x80047451 + PPPIOCSMRRU = 0x8004743b + PPPIOCSMRU = 0x80047452 + PPPIOCSNPMODE = 0x8008744b + PPPIOCSPASS = 0x80107447 + PPPIOCSRASYNCMAP = 0x80047454 + PPPIOCSXASYNCMAP = 0x8020744f + PPPIOCXFERUNIT = 0x2000744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1752,6 +1782,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1807,6 +1838,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index c6bd4efff..a747aa1b7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1684,6 +1714,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1739,6 +1770,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 8cdf353dc..96aff5083 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -1291,6 +1291,36 @@ const ( PERF_EVENT_IOC_SET_FILTER = 0x40082406 PERF_EVENT_IOC_SET_OUTPUT = 0x2405 PIPEFS_MAGIC = 0x50495045 + PPPIOCATTACH = 0x4004743d + PPPIOCATTCHAN = 0x40047438 + PPPIOCCONNECT = 0x4004743a + PPPIOCDETACH = 0x4004743c + PPPIOCDISCONN = 0x7439 + PPPIOCGASYNCMAP = 0x80047458 + PPPIOCGCHAN = 0x80047437 + PPPIOCGDEBUG = 0x80047441 + PPPIOCGFLAGS = 0x8004745a + PPPIOCGIDLE = 0x8010743f + PPPIOCGL2TPSTATS = 0x80487436 + PPPIOCGMRU = 0x80047453 + PPPIOCGNPMODE = 0xc008744c + PPPIOCGRASYNCMAP = 0x80047455 + PPPIOCGUNIT = 0x80047456 + PPPIOCGXASYNCMAP = 0x80207450 + PPPIOCNEWUNIT = 0xc004743e + PPPIOCSACTIVE = 0x40107446 + PPPIOCSASYNCMAP = 0x40047457 + PPPIOCSCOMPRESS = 0x4010744d + PPPIOCSDEBUG = 0x40047440 + PPPIOCSFLAGS = 0x40047459 + PPPIOCSMAXCID = 0x40047451 + PPPIOCSMRRU = 0x4004743b + PPPIOCSMRU = 0x40047452 + PPPIOCSNPMODE = 0x4008744b + PPPIOCSPASS = 0x40107447 + PPPIOCSRASYNCMAP = 0x40047454 + PPPIOCSXASYNCMAP = 0x4020744f + PPPIOCXFERUNIT = 0x744e PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 @@ -1757,6 +1787,7 @@ const ( SCM_TIMESTAMPNS = 0x23 SCM_TXTIME = 0x3d SCM_WIFI_STATUS = 0x29 + SC_LOG_FLUSH = 0x100000 SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 @@ -1812,6 +1843,9 @@ const ( SIOCGMIIPHY = 0x8947 SIOCGMIIREG = 0x8948 SIOCGPGRP = 0x8904 + SIOCGPPPCSTATS = 0x89f2 + SIOCGPPPSTATS = 0x89f0 + SIOCGPPPVER = 0x89f1 SIOCGRARP = 0x8961 SIOCGSKNS = 0x894c SIOCGSTAMP = 0x8906 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 28ef5242f..c146c1ad3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -339,7 +339,7 @@ type Kevent_t struct { } type FdSet struct { - _ [32]uint32 + Bits [32]uint32 } const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index e2d984a48..ac33a8dd4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -337,7 +337,7 @@ type Kevent_t struct { } type FdSet struct { - _ [16]uint64 + Bits [16]uint64 } const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index 9b415aba4..e27511a64 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -337,7 +337,7 @@ type Kevent_t struct { } type FdSet struct { - _ [32]uint32 + Bits [32]uint32 } const ( diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 5f8f03492..f56e164b7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -286,6 +286,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -421,6 +423,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index aa52a439d..ac5f636a6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -288,6 +288,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -425,6 +427,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 23c8438be..eb7562da7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -289,6 +289,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -424,6 +426,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index d7a993e25..3c4fb88d7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -289,6 +289,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -426,6 +428,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index b8c3d0a4d..647e40a77 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -287,6 +287,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -422,6 +424,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index a6f76149a..e0159b01d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -289,6 +289,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -426,6 +428,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 3dd194176..c1a024dfd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -289,6 +289,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -426,6 +428,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 210de76cc..7e525eb7f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -287,6 +287,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -422,6 +424,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x8 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index b46d54e37..85ae2954d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -290,6 +290,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -427,6 +429,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 6ee799cef..d0c930a13 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -290,6 +290,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -427,6 +429,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 60ae71e62..c1a20bcd3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -289,6 +289,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -426,6 +428,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index dea88f7bb..3c26ea82b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -288,6 +288,8 @@ type RawSockaddrXDP struct { Shared_umem_fd uint32 } +type RawSockaddrPPPoX [0x1e]byte + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -425,6 +427,7 @@ const ( SizeofSockaddrALG = 0x58 SizeofSockaddrVM = 0x10 SizeofSockaddrXDP = 0x10 + SizeofSockaddrPPPoX = 0x1e SizeofLinger = 0x8 SizeofIovec = 0x10 SizeofIPMreq = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index 1fdc5fd21..2dae0c17a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -402,6 +402,13 @@ type Winsize struct { Ypixel uint16 } +type Ptmget struct { + Cfd int32 + Sfd int32 + Cn [1024]byte + Sn [1024]byte +} + const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x200 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 711f78067..1f0e76c0c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -409,6 +409,13 @@ type Winsize struct { Ypixel uint16 } +type Ptmget struct { + Cfd int32 + Sfd int32 + Cn [1024]byte + Sn [1024]byte +} + const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x200 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index fa1a16bae..53f2159c7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -407,6 +407,13 @@ type Winsize struct { Ypixel uint16 } +type Ptmget struct { + Cfd int32 + Sfd int32 + Cn [1024]byte + Sn [1024]byte +} + const ( AT_FDCWD = -0x64 AT_SYMLINK_NOFOLLOW = 0x200 diff --git a/vendor/gopkg.in/go-playground/validator.v8/.gitignore b/vendor/gopkg.in/go-playground/validator.v8/.gitignore new file mode 100644 index 000000000..792ca00d2 --- /dev/null +++ b/vendor/gopkg.in/go-playground/validator.v8/.gitignore @@ -0,0 +1,29 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.test +*.out +*.txt +cover.html +README.html \ No newline at end of file diff --git a/vendor/gopkg.in/go-playground/validator.v8/README.md b/vendor/gopkg.in/go-playground/validator.v8/README.md new file mode 100644 index 000000000..758325928 --- /dev/null +++ b/vendor/gopkg.in/go-playground/validator.v8/README.md @@ -0,0 +1,367 @@ +Package validator +================ + +[![Join the chat at https://gitter.im/bluesuncorp/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +![Project status](https://img.shields.io/badge/version-8.18.1-green.svg) +[![Build Status](https://semaphoreci.com/api/v1/projects/ec20115f-ef1b-4c7d-9393-cc76aba74eb4/530054/badge.svg)](https://semaphoreci.com/joeybloggs/validator) +[![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=v8&service=github)](https://coveralls.io/github/go-playground/validator?branch=v8) +[![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) +[![GoDoc](https://godoc.org/gopkg.in/go-playground/validator.v8?status.svg)](https://godoc.org/gopkg.in/go-playground/validator.v8) +![License](https://img.shields.io/dub/l/vibe-d.svg) + +Package validator implements value validations for structs and individual fields based on tags. + +It has the following **unique** features: + +- Cross Field and Cross Struct validations by using validation tags or custom validators. +- Slice, Array and Map diving, which allows any or all levels of a multidimensional field to be validated. +- Handles type interface by determining it's underlying type prior to validation. +- Handles custom field types such as sql driver Valuer see [Valuer](https://golang.org/src/database/sql/driver/types.go?s=1210:1293#L29) +- Alias validation tags, which allows for mapping of several validations to a single tag for easier defining of validations on structs +- Extraction of custom defined Field Name e.g. can specify to extract the JSON name while validating and have it available in the resulting FieldError + +Installation +------------ + +Use go get. + + go get gopkg.in/go-playground/validator.v8 + +or to update + + go get -u gopkg.in/go-playground/validator.v8 + +Then import the validator package into your own code. + + import "gopkg.in/go-playground/validator.v8" + +Error Return Value +------- + +Validation functions return type error + +They return type error to avoid the issue discussed in the following, where err is always != nil: + +* http://stackoverflow.com/a/29138676/3158232 +* https://github.com/go-playground/validator/issues/134 + +validator only returns nil or ValidationErrors as type error; so in you code all you need to do +is check if the error returned is not nil, and if it's not type cast it to type ValidationErrors +like so: + +```go +err := validate.Struct(mystruct) +validationErrors := err.(validator.ValidationErrors) + ``` + +Usage and documentation +------ + +Please see http://godoc.org/gopkg.in/go-playground/validator.v8 for detailed usage docs. + +##### Examples: + +Struct & Field validation +```go +package main + +import ( + "fmt" + + "gopkg.in/go-playground/validator.v8" +) + +// User contains user information +type User struct { + FirstName string `validate:"required"` + LastName string `validate:"required"` + Age uint8 `validate:"gte=0,lte=130"` + Email string `validate:"required,email"` + FavouriteColor string `validate:"hexcolor|rgb|rgba"` + Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage... +} + +// Address houses a users address information +type Address struct { + Street string `validate:"required"` + City string `validate:"required"` + Planet string `validate:"required"` + Phone string `validate:"required"` +} + +var validate *validator.Validate + +func main() { + + config := &validator.Config{TagName: "validate"} + + validate = validator.New(config) + + validateStruct() + validateField() +} + +func validateStruct() { + + address := &Address{ + Street: "Eavesdown Docks", + Planet: "Persphone", + Phone: "none", + } + + user := &User{ + FirstName: "Badger", + LastName: "Smith", + Age: 135, + Email: "Badger.Smith@gmail.com", + FavouriteColor: "#000", + Addresses: []*Address{address}, + } + + // returns nil or ValidationErrors ( map[string]*FieldError ) + errs := validate.Struct(user) + + if errs != nil { + + fmt.Println(errs) // output: Key: "User.Age" Error:Field validation for "Age" failed on the "lte" tag + // Key: "User.Addresses[0].City" Error:Field validation for "City" failed on the "required" tag + err := errs.(validator.ValidationErrors)["User.Addresses[0].City"] + fmt.Println(err.Field) // output: City + fmt.Println(err.Tag) // output: required + fmt.Println(err.Kind) // output: string + fmt.Println(err.Type) // output: string + fmt.Println(err.Param) // output: + fmt.Println(err.Value) // output: + + // from here you can create your own error messages in whatever language you wish + return + } + + // save user to database +} + +func validateField() { + myEmail := "joeybloggs.gmail.com" + + errs := validate.Field(myEmail, "required,email") + + if errs != nil { + fmt.Println(errs) // output: Key: "" Error:Field validation for "" failed on the "email" tag + return + } + + // email ok, move on +} +``` + +Custom Field Type +```go +package main + +import ( + "database/sql" + "database/sql/driver" + "fmt" + "reflect" + + "gopkg.in/go-playground/validator.v8" +) + +// DbBackedUser User struct +type DbBackedUser struct { + Name sql.NullString `validate:"required"` + Age sql.NullInt64 `validate:"required"` +} + +func main() { + + config := &validator.Config{TagName: "validate"} + + validate := validator.New(config) + + // register all sql.Null* types to use the ValidateValuer CustomTypeFunc + validate.RegisterCustomTypeFunc(ValidateValuer, sql.NullString{}, sql.NullInt64{}, sql.NullBool{}, sql.NullFloat64{}) + + x := DbBackedUser{Name: sql.NullString{String: "", Valid: true}, Age: sql.NullInt64{Int64: 0, Valid: false}} + errs := validate.Struct(x) + + if len(errs.(validator.ValidationErrors)) > 0 { + fmt.Printf("Errs:\n%+v\n", errs) + } +} + +// ValidateValuer implements validator.CustomTypeFunc +func ValidateValuer(field reflect.Value) interface{} { + if valuer, ok := field.Interface().(driver.Valuer); ok { + val, err := valuer.Value() + if err == nil { + return val + } + // handle the error how you want + } + return nil +} +``` + +Struct Level Validation +```go +package main + +import ( + "fmt" + "reflect" + + "gopkg.in/go-playground/validator.v8" +) + +// User contains user information +type User struct { + FirstName string `json:"fname"` + LastName string `json:"lname"` + Age uint8 `validate:"gte=0,lte=130"` + Email string `validate:"required,email"` + FavouriteColor string `validate:"hexcolor|rgb|rgba"` + Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage... +} + +// Address houses a users address information +type Address struct { + Street string `validate:"required"` + City string `validate:"required"` + Planet string `validate:"required"` + Phone string `validate:"required"` +} + +var validate *validator.Validate + +func main() { + + config := &validator.Config{TagName: "validate"} + + validate = validator.New(config) + validate.RegisterStructValidation(UserStructLevelValidation, User{}) + + validateStruct() +} + +// UserStructLevelValidation contains custom struct level validations that don't always +// make sense at the field validation level. For Example this function validates that either +// FirstName or LastName exist; could have done that with a custom field validation but then +// would have had to add it to both fields duplicating the logic + overhead, this way it's +// only validated once. +// +// NOTE: you may ask why wouldn't I just do this outside of validator, because doing this way +// hooks right into validator and you can combine with validation tags and still have a +// common error output format. +func UserStructLevelValidation(v *validator.Validate, structLevel *validator.StructLevel) { + + user := structLevel.CurrentStruct.Interface().(User) + + if len(user.FirstName) == 0 && len(user.LastName) == 0 { + structLevel.ReportError(reflect.ValueOf(user.FirstName), "FirstName", "fname", "fnameorlname") + structLevel.ReportError(reflect.ValueOf(user.LastName), "LastName", "lname", "fnameorlname") + } + + // plus can to more, even with different tag than "fnameorlname" +} + +func validateStruct() { + + address := &Address{ + Street: "Eavesdown Docks", + Planet: "Persphone", + Phone: "none", + City: "Unknown", + } + + user := &User{ + FirstName: "", + LastName: "", + Age: 45, + Email: "Badger.Smith@gmail.com", + FavouriteColor: "#000", + Addresses: []*Address{address}, + } + + // returns nil or ValidationErrors ( map[string]*FieldError ) + errs := validate.Struct(user) + + if errs != nil { + + fmt.Println(errs) // output: Key: 'User.LastName' Error:Field validation for 'LastName' failed on the 'fnameorlname' tag + // Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'fnameorlname' tag + err := errs.(validator.ValidationErrors)["User.FirstName"] + fmt.Println(err.Field) // output: FirstName + fmt.Println(err.Tag) // output: fnameorlname + fmt.Println(err.Kind) // output: string + fmt.Println(err.Type) // output: string + fmt.Println(err.Param) // output: + fmt.Println(err.Value) // output: + + // from here you can create your own error messages in whatever language you wish + return + } + + // save user to database +} +``` + +Benchmarks +------ +###### Run on MacBook Pro (Retina, 15-inch, Late 2013) 2.6 GHz Intel Core i7 16 GB 1600 MHz DDR3 using Go version go1.5.3 darwin/amd64 +```go +PASS +BenchmarkFieldSuccess-8 20000000 118 ns/op 0 B/op 0 allocs/op +BenchmarkFieldFailure-8 2000000 758 ns/op 432 B/op 4 allocs/op +BenchmarkFieldDiveSuccess-8 500000 2471 ns/op 464 B/op 28 allocs/op +BenchmarkFieldDiveFailure-8 500000 3172 ns/op 896 B/op 32 allocs/op +BenchmarkFieldCustomTypeSuccess-8 5000000 300 ns/op 32 B/op 2 allocs/op +BenchmarkFieldCustomTypeFailure-8 2000000 775 ns/op 432 B/op 4 allocs/op +BenchmarkFieldOrTagSuccess-8 1000000 1122 ns/op 4 B/op 1 allocs/op +BenchmarkFieldOrTagFailure-8 1000000 1167 ns/op 448 B/op 6 allocs/op +BenchmarkStructLevelValidationSuccess-8 3000000 548 ns/op 160 B/op 5 allocs/op +BenchmarkStructLevelValidationFailure-8 3000000 558 ns/op 160 B/op 5 allocs/op +BenchmarkStructSimpleCustomTypeSuccess-8 2000000 623 ns/op 36 B/op 3 allocs/op +BenchmarkStructSimpleCustomTypeFailure-8 1000000 1381 ns/op 640 B/op 9 allocs/op +BenchmarkStructPartialSuccess-8 1000000 1036 ns/op 272 B/op 9 allocs/op +BenchmarkStructPartialFailure-8 1000000 1734 ns/op 730 B/op 14 allocs/op +BenchmarkStructExceptSuccess-8 2000000 888 ns/op 250 B/op 7 allocs/op +BenchmarkStructExceptFailure-8 1000000 1036 ns/op 272 B/op 9 allocs/op +BenchmarkStructSimpleCrossFieldSuccess-8 2000000 773 ns/op 80 B/op 4 allocs/op +BenchmarkStructSimpleCrossFieldFailure-8 1000000 1487 ns/op 536 B/op 9 allocs/op +BenchmarkStructSimpleCrossStructCrossFieldSuccess-8 1000000 1261 ns/op 112 B/op 7 allocs/op +BenchmarkStructSimpleCrossStructCrossFieldFailure-8 1000000 2055 ns/op 576 B/op 12 allocs/op +BenchmarkStructSimpleSuccess-8 3000000 519 ns/op 4 B/op 1 allocs/op +BenchmarkStructSimpleFailure-8 1000000 1429 ns/op 640 B/op 9 allocs/op +BenchmarkStructSimpleSuccessParallel-8 10000000 146 ns/op 4 B/op 1 allocs/op +BenchmarkStructSimpleFailureParallel-8 2000000 551 ns/op 640 B/op 9 allocs/op +BenchmarkStructComplexSuccess-8 500000 3269 ns/op 244 B/op 15 allocs/op +BenchmarkStructComplexFailure-8 200000 8436 ns/op 3609 B/op 60 allocs/op +BenchmarkStructComplexSuccessParallel-8 1000000 1024 ns/op 244 B/op 15 allocs/op +BenchmarkStructComplexFailureParallel-8 500000 3536 ns/op 3609 B/op 60 allocs/op +``` + +Complimentary Software +---------------------- + +Here is a list of software that compliments using this library either pre or post validation. + +* [Gorilla Schema](https://github.com/gorilla/schema) - Package gorilla/schema fills a struct with form values. +* [Conform](https://github.com/leebenson/conform) - Trims, sanitizes & scrubs data based on struct tags. + +How to Contribute +------ + +There will always be a development branch for each version i.e. `v1-development`. In order to contribute, +please make your pull requests against those branches. + +If the changes being proposed or requested are breaking changes, please create an issue, for discussion +or create a pull request against the highest development branch for example this package has a +v1 and v1-development branch however, there will also be a v2-development branch even though v2 doesn't exist yet. + +I strongly encourage everyone whom creates a custom validation function to contribute them and +help make this package even better. + +License +------ +Distributed under MIT License, please see license file in code for more details. diff --git a/vendor/gopkg.in/go-playground/validator.v8/logo.png b/vendor/gopkg.in/go-playground/validator.v8/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..355000f5247d50e979cf5db5de38188ef4649a34 GIT binary patch literal 13443 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 V^Rh-@K?jDw= 0 && !out.OverflowUint(uint64(resolved)) { out.SetUint(uint64(resolved)) - return true + good = true } case int64: if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { out.SetUint(uint64(resolved)) - return true + good = true } case uint64: if !out.OverflowUint(uint64(resolved)) { out.SetUint(uint64(resolved)) - return true + good = true } case float64: if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { out.SetUint(uint64(resolved)) - return true + good = true } } case reflect.Bool: switch resolved := resolved.(type) { case bool: out.SetBool(resolved) - return true + good = true } case reflect.Float32, reflect.Float64: switch resolved := resolved.(type) { case int: out.SetFloat(float64(resolved)) - return true + good = true case int64: out.SetFloat(float64(resolved)) - return true + good = true case uint64: out.SetFloat(float64(resolved)) - return true + good = true case float64: out.SetFloat(resolved) - return true - } - case reflect.Struct: - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - out.Set(resolvedv) - return true + good = true } case reflect.Ptr: if out.Type().Elem() == reflect.TypeOf(resolved) { @@ -526,11 +459,13 @@ func (d *decoder) scalar(n *node, out reflect.Value) bool { elem := reflect.New(out.Type().Elem()) elem.Elem().Set(reflect.ValueOf(resolved)) out.Set(elem) - return true + good = true } } - d.terror(n, tag, out) - return false + if !good { + d.terror(n, tag, out) + } + return good } func settableValueOf(i interface{}) reflect.Value { @@ -547,10 +482,6 @@ func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { switch out.Kind() { case reflect.Slice: out.Set(reflect.MakeSlice(out.Type(), l, l)) - case reflect.Array: - if l != out.Len() { - failf("invalid array: want %d elements but got %d", out.Len(), l) - } case reflect.Interface: // No type hints. Will have to use a generic sequence. iface = out @@ -569,9 +500,7 @@ func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { j++ } } - if out.Kind() != reflect.Array { - out.Set(out.Slice(0, j)) - } + out.Set(out.Slice(0, j)) if iface.IsValid() { iface.Set(out) } @@ -632,7 +561,7 @@ func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { } e := reflect.New(et).Elem() if d.unmarshal(n.children[i+1], e) { - d.setMapIndex(n.children[i+1], out, k, e) + out.SetMapIndex(k, e) } } } @@ -640,14 +569,6 @@ func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { return true } -func (d *decoder) setMapIndex(n *node, out, k, v reflect.Value) { - if d.strict && out.MapIndex(k) != zeroValue { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: key %#v already set in map", n.line+1, k.Interface())) - return - } - out.SetMapIndex(k, v) -} - func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { outt := out.Type() if outt.Elem() != mapItemType { @@ -695,10 +616,6 @@ func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { elemType = inlineMap.Type().Elem() } - var doneFields []bool - if d.strict { - doneFields = make([]bool, len(sinfo.FieldsList)) - } for i := 0; i < l; i += 2 { ni := n.children[i] if isMerge(ni) { @@ -709,13 +626,6 @@ func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { continue } if info, ok := sinfo.FieldsMap[name.String()]; ok { - if d.strict { - if doneFields[info.Id] { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.line+1, name.String(), out.Type())) - continue - } - doneFields[info.Id] = true - } var field reflect.Value if info.Inline == nil { field = out.Field(info.Num) @@ -729,9 +639,7 @@ func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { } value := reflect.New(elemType).Elem() d.unmarshal(n.children[i+1], value) - d.setMapIndex(n.children[i+1], inlineMap, name, value) - } else if d.strict { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.line+1, name.String(), out.Type())) + inlineMap.SetMapIndex(name, value) } } return true diff --git a/vendor/gopkg.in/yaml.v2/emitterc.go b/vendor/gopkg.in/yaml.v2/emitterc.go index a1c2cc526..2befd553e 100644 --- a/vendor/gopkg.in/yaml.v2/emitterc.go +++ b/vendor/gopkg.in/yaml.v2/emitterc.go @@ -2,7 +2,6 @@ package yaml import ( "bytes" - "fmt" ) // Flush the buffer if needed. @@ -665,8 +664,9 @@ func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, return yaml_emitter_emit_mapping_start(emitter, event) default: return yaml_emitter_set_emitter_error(emitter, - fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) + "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS") } + return false } // Expect ALIAS. @@ -843,7 +843,7 @@ func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event return true } -// Write an anchor. +// Write an achor. func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { if emitter.anchor_data.anchor == nil { return true @@ -995,10 +995,10 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { break_space = false space_break = false - preceded_by_whitespace = false - followed_by_whitespace = false - previous_space = false - previous_break = false + preceeded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false ) emitter.scalar_data.value = value @@ -1017,7 +1017,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { flow_indicators = true } - preceded_by_whitespace = true + preceeded_by_whitespace = true for i, w := 0, 0; i < len(value); i += w { w = width(value[i]) followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) @@ -1048,7 +1048,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { block_indicators = true } case '#': - if preceded_by_whitespace { + if preceeded_by_whitespace { flow_indicators = true block_indicators = true } @@ -1089,7 +1089,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { } // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. - preceded_by_whitespace = is_blankz(value, i) + preceeded_by_whitespace = is_blankz(value, i) } emitter.scalar_data.multiline = line_breaks diff --git a/vendor/gopkg.in/yaml.v2/encode.go b/vendor/gopkg.in/yaml.v2/encode.go index a14435e82..84f849955 100644 --- a/vendor/gopkg.in/yaml.v2/encode.go +++ b/vendor/gopkg.in/yaml.v2/encode.go @@ -3,14 +3,12 @@ package yaml import ( "encoding" "fmt" - "io" "reflect" "regexp" "sort" "strconv" "strings" "time" - "unicode/utf8" ) type encoder struct { @@ -18,39 +16,25 @@ type encoder struct { event yaml_event_t out []byte flow bool - // doneInit holds whether the initial stream_start_event has been - // emitted. - doneInit bool } -func newEncoder() *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) +func newEncoder() (e *encoder) { + e = &encoder{} + e.must(yaml_emitter_initialize(&e.emitter)) yaml_emitter_set_output_string(&e.emitter, &e.out) yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func newEncoderWithWriter(w io.Writer) *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_writer(&e.emitter, w) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func (e *encoder) init() { - if e.doneInit { - return - } - yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) + e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)) + e.emit() + e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true)) e.emit() - e.doneInit = true + return e } func (e *encoder) finish() { + e.must(yaml_document_end_event_initialize(&e.event, true)) + e.emit() e.emitter.open_ended = false - yaml_stream_end_event_initialize(&e.event) + e.must(yaml_stream_end_event_initialize(&e.event)) e.emit() } @@ -60,7 +44,9 @@ func (e *encoder) destroy() { func (e *encoder) emit() { // This will internally delete the e.event value. - e.must(yaml_emitter_emit(&e.emitter, &e.event)) + if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT { + e.must(false) + } } func (e *encoder) must(ok bool) { @@ -73,28 +59,13 @@ func (e *encoder) must(ok bool) { } } -func (e *encoder) marshalDoc(tag string, in reflect.Value) { - e.init() - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.emit() - e.marshal(tag, in) - yaml_document_end_event_initialize(&e.event, true) - e.emit() -} - func (e *encoder) marshal(tag string, in reflect.Value) { - if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + if !in.IsValid() { e.nilv() return } iface := in.Interface() - switch m := iface.(type) { - case time.Time, *time.Time: - // Although time.Time implements TextMarshaler, - // we don't want to treat it as a string for YAML - // purposes because YAML has special support for - // timestamps. - case Marshaler: + if m, ok := iface.(Marshaler); ok { v, err := m.MarshalYAML() if err != nil { fail(err) @@ -104,34 +75,31 @@ func (e *encoder) marshal(tag string, in reflect.Value) { return } in = reflect.ValueOf(v) - case encoding.TextMarshaler: + } else if m, ok := iface.(encoding.TextMarshaler); ok { text, err := m.MarshalText() if err != nil { fail(err) } in = reflect.ValueOf(string(text)) - case nil: - e.nilv() - return } switch in.Kind() { case reflect.Interface: - e.marshal(tag, in.Elem()) + if in.IsNil() { + e.nilv() + } else { + e.marshal(tag, in.Elem()) + } case reflect.Map: e.mapv(tag, in) case reflect.Ptr: - if in.Type() == ptrTimeType { - e.timev(tag, in.Elem()) + if in.IsNil() { + e.nilv() } else { e.marshal(tag, in.Elem()) } case reflect.Struct: - if in.Type() == timeType { - e.timev(tag, in) - } else { - e.structv(tag, in) - } - case reflect.Slice, reflect.Array: + e.structv(tag, in) + case reflect.Slice: if in.Type().Elem() == mapItemType { e.itemsv(tag, in) } else { @@ -223,10 +191,10 @@ func (e *encoder) mappingv(tag string, f func()) { e.flow = false style = yaml_FLOW_MAPPING_STYLE } - yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) + e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) e.emit() f() - yaml_mapping_end_event_initialize(&e.event) + e.must(yaml_mapping_end_event_initialize(&e.event)) e.emit() } @@ -272,36 +240,23 @@ var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0 func (e *encoder) stringv(tag string, in reflect.Value) { var style yaml_scalar_style_t s := in.String() - canUsePlain := true - switch { - case !utf8.ValidString(s): - if tag == yaml_BINARY_TAG { + rtag, rs := resolve("", s) + if rtag == yaml_BINARY_TAG { + if tag == "" || tag == yaml_STR_TAG { + tag = rtag + s = rs.(string) + } else if tag == yaml_BINARY_TAG { failf("explicitly tagged !!binary data must be base64-encoded") - } - if tag != "" { + } else { failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = yaml_BINARY_TAG - s = encodeBase64(s) - case tag == "": - // Check to see if it would resolve to a specific - // tag when encoded unquoted. If it doesn't, - // there's no need to quote it. - rtag, _ := resolve("", s) - canUsePlain = rtag == yaml_STR_TAG && !isBase60Float(s) } - // Note: it's possible for user code to emit invalid YAML - // if they explicitly specify a tag and a string containing - // text that's incompatible with that tag. - switch { - case strings.Contains(s, "\n"): + if tag == "" && (rtag != yaml_STR_TAG || isBase60Float(s)) { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else if strings.Contains(s, "\n") { style = yaml_LITERAL_SCALAR_STYLE - case canUsePlain: + } else { style = yaml_PLAIN_SCALAR_STYLE - default: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE } e.emitScalar(s, "", tag, style) } @@ -326,20 +281,9 @@ func (e *encoder) uintv(tag string, in reflect.Value) { e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) } -func (e *encoder) timev(tag string, in reflect.Value) { - t := in.Interface().(time.Time) - s := t.Format(time.RFC3339Nano) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - func (e *encoder) floatv(tag string, in reflect.Value) { - // Issue #352: When formatting, use the precision of the underlying value - precision := 64 - if in.Kind() == reflect.Float32 { - precision = 32 - } - - s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + // FIXME: Handle 64 bits here. + s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32) switch s { case "+Inf": s = ".inf" diff --git a/vendor/gopkg.in/yaml.v2/parserc.go b/vendor/gopkg.in/yaml.v2/parserc.go index 81d05dfe5..0a7037ad1 100644 --- a/vendor/gopkg.in/yaml.v2/parserc.go +++ b/vendor/gopkg.in/yaml.v2/parserc.go @@ -166,6 +166,7 @@ func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool default: panic("invalid parser state") } + return false } // Parse the production: diff --git a/vendor/gopkg.in/yaml.v2/readerc.go b/vendor/gopkg.in/yaml.v2/readerc.go index 7c1f5fac3..f45079171 100644 --- a/vendor/gopkg.in/yaml.v2/readerc.go +++ b/vendor/gopkg.in/yaml.v2/readerc.go @@ -93,18 +93,9 @@ func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { panic("read handler must be set") } - // [Go] This function was changed to guarantee the requested length size at EOF. - // The fact we need to do this is pretty awful, but the description above implies - // for that to be the case, and there are tests - // If the EOF flag is set and the raw buffer is empty, do nothing. if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { - // [Go] ACTUALLY! Read the documentation of this function above. - // This is just broken. To return true, we need to have the - // given length in the buffer. Not doing that means every single - // check that calls this function to make sure the buffer has a - // given length is Go) panicking; or C) accessing invalid memory. - //return true + return true } // Return if the buffer contains enough characters. @@ -398,15 +389,6 @@ func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { break } } - // [Go] Read the documentation of this function above. To return true, - // we need to have the given length in the buffer. Not doing that means - // every single check that calls this function to make sure the buffer - // has a given length is Go) panicking; or C) accessing invalid memory. - // This happens here due to the EOF above breaking early. - for buffer_len < length { - parser.buffer[buffer_len] = 0 - buffer_len++ - } parser.buffer = parser.buffer[:buffer_len] return true } diff --git a/vendor/gopkg.in/yaml.v2/resolve.go b/vendor/gopkg.in/yaml.v2/resolve.go index 6c151db6f..93a863274 100644 --- a/vendor/gopkg.in/yaml.v2/resolve.go +++ b/vendor/gopkg.in/yaml.v2/resolve.go @@ -3,10 +3,9 @@ package yaml import ( "encoding/base64" "math" - "regexp" "strconv" "strings" - "time" + "unicode/utf8" ) type resolveMapItem struct { @@ -75,14 +74,12 @@ func longTag(tag string) string { func resolvableTag(tag string) bool { switch tag { - case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG, yaml_TIMESTAMP_TAG: + case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG: return true } return false } -var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`) - func resolve(tag string, in string) (rtag string, out interface{}) { if !resolvableTag(tag) { return tag, in @@ -92,19 +89,6 @@ func resolve(tag string, in string) (rtag string, out interface{}) { switch tag { case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: return - case yaml_FLOAT_TAG: - if rtag == yaml_INT_TAG { - switch v := out.(type) { - case int64: - rtag = yaml_FLOAT_TAG - out = float64(v) - return - case int: - rtag = yaml_FLOAT_TAG - out = float64(v) - return - } - } } failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) }() @@ -138,15 +122,6 @@ func resolve(tag string, in string) (rtag string, out interface{}) { case 'D', 'S': // Int, float, or timestamp. - // Only try values as a timestamp if the value is unquoted or there's an explicit - // !!timestamp tag. - if tag == "" || tag == yaml_TIMESTAMP_TAG { - t, ok := parseTimestamp(in) - if ok { - return yaml_TIMESTAMP_TAG, t - } - } - plain := strings.Replace(in, "_", "", -1) intv, err := strconv.ParseInt(plain, 0, 64) if err == nil { @@ -160,11 +135,9 @@ func resolve(tag string, in string) (rtag string, out interface{}) { if err == nil { return yaml_INT_TAG, uintv } - if yamlStyleFloat.MatchString(plain) { - floatv, err := strconv.ParseFloat(plain, 64) - if err == nil { - return yaml_FLOAT_TAG, floatv - } + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv } if strings.HasPrefix(plain, "0b") { intv, err := strconv.ParseInt(plain[2:], 2, 64) @@ -180,20 +153,28 @@ func resolve(tag string, in string) (rtag string, out interface{}) { return yaml_INT_TAG, uintv } } else if strings.HasPrefix(plain, "-0b") { - intv, err := strconv.ParseInt("-" + plain[3:], 2, 64) + intv, err := strconv.ParseInt(plain[3:], 2, 64) if err == nil { - if true || intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) + if intv == int64(int(intv)) { + return yaml_INT_TAG, -int(intv) } else { - return yaml_INT_TAG, intv + return yaml_INT_TAG, -intv } } } + // XXX Handle timestamps here. + default: panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")") } } - return yaml_STR_TAG, in + if tag == yaml_BINARY_TAG { + return yaml_BINARY_TAG, in + } + if utf8.ValidString(in) { + return yaml_STR_TAG, in + } + return yaml_BINARY_TAG, encodeBase64(in) } // encodeBase64 encodes s as base64 that is broken up into multiple lines @@ -220,39 +201,3 @@ func encodeBase64(s string) string { } return string(out[:k]) } - -// This is a subset of the formats allowed by the regular expression -// defined at http://yaml.org/type/timestamp.html. -var allowedTimestampFormats = []string{ - "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. - "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". - "2006-1-2 15:4:5.999999999", // space separated with no time zone - "2006-1-2", // date only - // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" - // from the set of examples. -} - -// parseTimestamp parses s as a timestamp string and -// returns the timestamp and reports whether it succeeded. -// Timestamp formats are defined at http://yaml.org/type/timestamp.html -func parseTimestamp(s string) (time.Time, bool) { - // TODO write code to check all the formats supported by - // http://yaml.org/type/timestamp.html instead of using time.Parse. - - // Quick check: all date formats start with YYYY-. - i := 0 - for ; i < len(s); i++ { - if c := s[i]; c < '0' || c > '9' { - break - } - } - if i != 4 || i == len(s) || s[i] != '-' { - return time.Time{}, false - } - for _, format := range allowedTimestampFormats { - if t, err := time.Parse(format, s); err == nil { - return t, true - } - } - return time.Time{}, false -} diff --git a/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/gopkg.in/yaml.v2/scannerc.go index 077fd1dd2..25808000f 100644 --- a/vendor/gopkg.in/yaml.v2/scannerc.go +++ b/vendor/gopkg.in/yaml.v2/scannerc.go @@ -9,7 +9,7 @@ import ( // ************ // // The following notes assume that you are familiar with the YAML specification -// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in +// (http://yaml.org/spec/cvs/current.html). We mostly follow it, although in // some cases we are less restrictive that it requires. // // The process of transforming a YAML stream into a sequence of events is @@ -611,7 +611,7 @@ func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, co if directive { context = "while parsing a %TAG directive" } - return yaml_parser_set_scanner_error(parser, context, context_mark, problem) + return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet") } func trace(args ...interface{}) func() { @@ -871,6 +871,12 @@ func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { required := parser.flow_level == 0 && parser.indent == parser.mark.column + // A simple key is required only when it is the first token in the current + // line. Therefore it is always allowed. But we add a check anyway. + if required && !parser.simple_key_allowed { + panic("should not happen") + } + // // If the current position may start a simple key, save it. // @@ -1938,7 +1944,7 @@ func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_ma } else { // It's either the '!' tag or not really a tag handle. If it's a %TAG // directive, it's an error. If it's a tag token, it must be a part of URI. - if directive && string(s) != "!" { + if directive && !(s[0] == '!' && s[1] == 0) { yaml_parser_set_scanner_tag_error(parser, directive, start_mark, "did not find expected '!'") return false @@ -1953,7 +1959,6 @@ func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_ma func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { //size_t length = head ? strlen((char *)head) : 0 var s []byte - hasTag := len(head) > 0 // Copy the head if needed. // @@ -1995,10 +2000,10 @@ func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { return false } - hasTag = true } - if !hasTag { + // Check if the tag is non-empty. + if len(s) == 0 { yaml_parser_set_scanner_tag_error(parser, directive, start_mark, "did not find expected tag URI") return false @@ -2469,10 +2474,6 @@ func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, si } } - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } - // Check if we are at the end of the scalar. if single { if parser.buffer[parser.buffer_pos] == '\'' { @@ -2485,6 +2486,10 @@ func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, si } // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { if is_blank(parser.buffer, parser.buffer_pos) { // Consume a space or a tab character. @@ -2586,10 +2591,19 @@ func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) b // Consume non-blank characters. for !is_blankz(parser.buffer, parser.buffer_pos) { + // Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13". + if parser.flow_level > 0 && + parser.buffer[parser.buffer_pos] == ':' && + !is_blankz(parser.buffer, parser.buffer_pos+1) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found unexpected ':'") + return false + } + // Check for indicators that may end a plain scalar. if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || (parser.flow_level > 0 && - (parser.buffer[parser.buffer_pos] == ',' || + (parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || parser.buffer[parser.buffer_pos] == '}')) { @@ -2641,10 +2655,10 @@ func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) b for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { if is_blank(parser.buffer, parser.buffer_pos) { - // Check for tab characters that abuse indentation. + // Check for tab character that abuse indentation. if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", - start_mark, "found a tab character that violates indentation") + start_mark, "found a tab character that violate indentation") return false } diff --git a/vendor/gopkg.in/yaml.v2/sorter.go b/vendor/gopkg.in/yaml.v2/sorter.go index 4c45e660a..5958822f9 100644 --- a/vendor/gopkg.in/yaml.v2/sorter.go +++ b/vendor/gopkg.in/yaml.v2/sorter.go @@ -51,15 +51,6 @@ func (l keyList) Less(i, j int) bool { } var ai, bi int var an, bn int64 - if ar[i] == '0' || br[i] == '0' { - for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- { - if ar[j] != '0' { - an = 1 - bn = 1 - break - } - } - } for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { an = an*10 + int64(ar[ai]-'0') } diff --git a/vendor/gopkg.in/yaml.v2/writerc.go b/vendor/gopkg.in/yaml.v2/writerc.go index a2dde608c..190362f25 100644 --- a/vendor/gopkg.in/yaml.v2/writerc.go +++ b/vendor/gopkg.in/yaml.v2/writerc.go @@ -18,9 +18,72 @@ func yaml_emitter_flush(emitter *yaml_emitter_t) bool { return true } - if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + // If the output encoding is UTF-8, we don't need to recode the buffer. + if emitter.encoding == yaml_UTF8_ENCODING { + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true + } + + // Recode the buffer into the raw buffer. + var low, high int + if emitter.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + high, low = 1, 0 + } + + pos := 0 + for pos < emitter.buffer_pos { + // See the "reader.c" code for more details on UTF-8 encoding. Note + // that we assume that the buffer contains a valid UTF-8 sequence. + + // Read the next UTF-8 character. + octet := emitter.buffer[pos] + + var w int + var value rune + switch { + case octet&0x80 == 0x00: + w, value = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, value = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, value = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, value = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = emitter.buffer[pos+k] + value = (value << 6) + (rune(octet) & 0x3F) + } + pos += w + + // Write the character. + if value < 0x10000 { + var b [2]byte + b[high] = byte(value >> 8) + b[low] = byte(value & 0xFF) + emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1]) + } else { + // Write the character using a surrogate pair (check "reader.c"). + var b [4]byte + value -= 0x10000 + b[high] = byte(0xD8 + (value >> 18)) + b[low] = byte((value >> 10) & 0xFF) + b[high+2] = byte(0xDC + ((value >> 8) & 0xFF)) + b[low+2] = byte(value & 0xFF) + emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3]) + } + } + + // Write the raw buffer. + if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil { return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) } emitter.buffer_pos = 0 + emitter.raw_buffer = emitter.raw_buffer[:0] return true } diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v2/yaml.go index de85aa4cd..36d6b883a 100644 --- a/vendor/gopkg.in/yaml.v2/yaml.go +++ b/vendor/gopkg.in/yaml.v2/yaml.go @@ -9,7 +9,6 @@ package yaml import ( "errors" "fmt" - "io" "reflect" "strings" "sync" @@ -78,65 +77,8 @@ type Marshaler interface { // supported tag options. // func Unmarshal(in []byte, out interface{}) (err error) { - return unmarshal(in, out, false) -} - -// UnmarshalStrict is like Unmarshal except that any fields that are found -// in the data that do not have corresponding struct members, or mapping -// keys that are duplicates, will result in -// an error. -func UnmarshalStrict(in []byte, out interface{}) (err error) { - return unmarshal(in, out, true) -} - -// A Decorder reads and decodes YAML values from an input stream. -type Decoder struct { - strict bool - parser *parser -} - -// NewDecoder returns a new decoder that reads from r. -// -// The decoder introduces its own buffering and may read -// data from r beyond the YAML values requested. -func NewDecoder(r io.Reader) *Decoder { - return &Decoder{ - parser: newParserFromReader(r), - } -} - -// SetStrict sets whether strict decoding behaviour is enabled when -// decoding items in the data (see UnmarshalStrict). By default, decoding is not strict. -func (dec *Decoder) SetStrict(strict bool) { - dec.strict = strict -} - -// Decode reads the next YAML-encoded value from its input -// and stores it in the value pointed to by v. -// -// See the documentation for Unmarshal for details about the -// conversion of YAML into a Go value. -func (dec *Decoder) Decode(v interface{}) (err error) { - d := newDecoder(dec.strict) - defer handleErr(&err) - node := dec.parser.parse() - if node == nil { - return io.EOF - } - out := reflect.ValueOf(v) - if out.Kind() == reflect.Ptr && !out.IsNil() { - out = out.Elem() - } - d.unmarshal(node, out) - if len(d.terrors) > 0 { - return &TypeError{d.terrors} - } - return nil -} - -func unmarshal(in []byte, out interface{}, strict bool) (err error) { defer handleErr(&err) - d := newDecoder(strict) + d := newDecoder() p := newParser(in) defer p.destroy() node := p.parse() @@ -157,8 +99,8 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // of the generated document will reflect the structure of the value itself. // Maps and pointers (to struct, string, int, etc) are accepted as the in value. // -// Struct fields are only marshalled if they are exported (have an upper case -// first letter), and are marshalled using the field name lowercased as the +// Struct fields are only unmarshalled if they are exported (have an upper case +// first letter), and are unmarshalled using the field name lowercased as the // default key. Custom keys may be defined via the "yaml" name in the field // tag: the content preceding the first comma is used as the key, and the // following comma-separated options are used to tweak the marshalling process. @@ -172,10 +114,7 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // // omitempty Only include the field if it's not set to the zero // value for the type or to empty slices or maps. -// Zero valued structs will be omitted if all their public -// fields are zero, unless they implement an IsZero -// method (see the IsZeroer interface type), in which -// case the field will be included if that method returns true. +// Does not apply to zero valued structs. // // flow Marshal using a flow style (useful for structs, // sequences and maps). @@ -190,7 +129,7 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // For example: // // type T struct { -// F int `yaml:"a,omitempty"` +// F int "a,omitempty" // B int // } // yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" @@ -200,47 +139,12 @@ func Marshal(in interface{}) (out []byte, err error) { defer handleErr(&err) e := newEncoder() defer e.destroy() - e.marshalDoc("", reflect.ValueOf(in)) + e.marshal("", reflect.ValueOf(in)) e.finish() out = e.out return } -// An Encoder writes YAML values to an output stream. -type Encoder struct { - encoder *encoder -} - -// NewEncoder returns a new encoder that writes to w. -// The Encoder should be closed after use to flush all data -// to w. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - encoder: newEncoderWithWriter(w), - } -} - -// Encode writes the YAML encoding of v to the stream. -// If multiple items are encoded to the stream, the -// second and subsequent document will be preceded -// with a "---" document separator, but the first will not. -// -// See the documentation for Marshal for details about the conversion of Go -// values to YAML. -func (e *Encoder) Encode(v interface{}) (err error) { - defer handleErr(&err) - e.encoder.marshalDoc("", reflect.ValueOf(v)) - return nil -} - -// Close closes the encoder by writing any remaining data. -// It does not write a stream terminating string "...". -func (e *Encoder) Close() (err error) { - defer handleErr(&err) - e.encoder.finish() - return nil -} - func handleErr(err *error) { if v := recover(); v != nil { if e, ok := v.(yamlError); ok { @@ -296,9 +200,6 @@ type fieldInfo struct { Num int OmitEmpty bool Flow bool - // Id holds the unique field identifier, so we can cheaply - // check for field duplicates without maintaining an extra map. - Id int // Inline holds the field index if the field is part of an inlined struct. Inline []int @@ -378,7 +279,6 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { } else { finfo.Inline = append([]int{i}, finfo.Inline...) } - finfo.Id = len(fieldsList) fieldsMap[finfo.Key] = finfo fieldsList = append(fieldsList, finfo) } @@ -400,16 +300,11 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { return nil, errors.New(msg) } - info.Id = len(fieldsList) fieldsList = append(fieldsList, info) fieldsMap[info.Key] = info } - sinfo = &structInfo{ - FieldsMap: fieldsMap, - FieldsList: fieldsList, - InlineMap: inlineMap, - } + sinfo = &structInfo{fieldsMap, fieldsList, inlineMap} fieldMapMutex.Lock() structMap[st] = sinfo @@ -417,23 +312,8 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { return sinfo, nil } -// IsZeroer is used to check whether an object is zero to -// determine whether it should be omitted when marshaling -// with the omitempty flag. One notable implementation -// is time.Time. -type IsZeroer interface { - IsZero() bool -} - func isZero(v reflect.Value) bool { - kind := v.Kind() - if z, ok := v.Interface().(IsZeroer); ok { - if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { - return true - } - return z.IsZero() - } - switch kind { + switch v.Kind() { case reflect.String: return len(v.String()) == 0 case reflect.Interface, reflect.Ptr: diff --git a/vendor/gopkg.in/yaml.v2/yamlh.go b/vendor/gopkg.in/yaml.v2/yamlh.go index e25cee563..d60a6b6b0 100644 --- a/vendor/gopkg.in/yaml.v2/yamlh.go +++ b/vendor/gopkg.in/yaml.v2/yamlh.go @@ -1,7 +1,6 @@ package yaml import ( - "fmt" "io" ) @@ -240,27 +239,6 @@ const ( yaml_MAPPING_END_EVENT // A MAPPING-END event. ) -var eventStrings = []string{ - yaml_NO_EVENT: "none", - yaml_STREAM_START_EVENT: "stream start", - yaml_STREAM_END_EVENT: "stream end", - yaml_DOCUMENT_START_EVENT: "document start", - yaml_DOCUMENT_END_EVENT: "document end", - yaml_ALIAS_EVENT: "alias", - yaml_SCALAR_EVENT: "scalar", - yaml_SEQUENCE_START_EVENT: "sequence start", - yaml_SEQUENCE_END_EVENT: "sequence end", - yaml_MAPPING_START_EVENT: "mapping start", - yaml_MAPPING_END_EVENT: "mapping end", -} - -func (e yaml_event_type_t) String() string { - if e < 0 || int(e) >= len(eventStrings) { - return fmt.Sprintf("unknown event %d", e) - } - return eventStrings[e] -} - // The event structure. type yaml_event_t struct { @@ -530,7 +508,7 @@ type yaml_parser_t struct { problem string // Error description. - // The byte about which the problem occurred. + // The byte about which the problem occured. problem_offset int problem_value int problem_mark yaml_mark_t @@ -543,9 +521,9 @@ type yaml_parser_t struct { read_handler yaml_read_handler_t // Read handler. - input_reader io.Reader // File input data. - input []byte // String input data. - input_pos int + input_file io.Reader // File input data. + input []byte // String input data. + input_pos int eof bool // EOF flag @@ -654,7 +632,7 @@ type yaml_emitter_t struct { write_handler yaml_write_handler_t // Write handler. output_buffer *[]byte // String output data. - output_writer io.Writer // File output data. + output_file io.Writer // File output data. buffer []byte // The working buffer. buffer_pos int // The current position of the buffer. From 282ae8da8020e34fca79a9d1cc413737432f0984 Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Fri, 23 Nov 2018 12:29:54 +0100 Subject: [PATCH 2/7] downgrade systray version --- Gopkg.lock | 5 +-- Gopkg.toml | 2 +- .../getlantern/systray/systray_darwin.m | 37 ++++-------------- .../getlantern/systray/systray_linux.c | 38 +++++++++---------- .../getlantern/systray/systray_windows.go | 8 +--- 5 files changed, 29 insertions(+), 61 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 877378d5b..03895783f 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -82,12 +82,11 @@ revision = "37353306c90844c8e0591956f56611f46299d202" [[projects]] - branch = "master" - digest = "1:24b1213b120b37fa3edb567e4e052abd05a54ebfaef43443c76a5f75afe5ae58" + digest = "1:bd5504d3204cc1625bc017e477690ad7da71f5c800dc5efdf8a9a7d4feebe2e7" name = "github.com/getlantern/systray" packages = ["."] pruneopts = "UT" - revision = "19c034af4717bf1737fc722e1804f5eb57e3bec5" + revision = "89b3d9c45cc69f861868cc7f3159eba2b4cdfb22" [[projects]] branch = "master" diff --git a/Gopkg.toml b/Gopkg.toml index d9a57a3c0..97bc5fa07 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -34,7 +34,7 @@ version = "3.5.1" [[constraint]] - branch = "master" + revision = "89b3d9c45cc69f861868cc7f3159eba2b4cdfb22" name = "github.com/getlantern/systray" [[constraint]] diff --git a/vendor/github.com/getlantern/systray/systray_darwin.m b/vendor/github.com/getlantern/systray/systray_darwin.m index 3d9286859..a489bc477 100644 --- a/vendor/github.com/getlantern/systray/systray_darwin.m +++ b/vendor/github.com/getlantern/systray/systray_darwin.m @@ -1,14 +1,6 @@ #import #include "systray.h" -#ifndef NSControlStateValueOff - #define NSControlStateValueOff NSOffState -#endif - -#ifndef NSControlStateValueOn - #define NSControlStateValueOn NSOnState -#endif - @interface MenuItem : NSObject { @public @@ -72,30 +64,15 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification } - (void)setIcon:(NSImage *)image { - statusItem.button.image = image; - [self updateTitleButtonStyle]; + [statusItem setImage:image]; } - (void)setTitle:(NSString *)title { - statusItem.button.title = title; - [self updateTitleButtonStyle]; + [statusItem setTitle:title]; } --(void)updateTitleButtonStyle { - if (statusItem.button.image != nil) { - if ([statusItem.button.title length] == 0) { - statusItem.button.imagePosition = NSImageOnly; - } else { - statusItem.button.imagePosition = NSImageLeft; - } - } else { - statusItem.button.imagePosition = NSNoImage; - } -} - - - (void)setTooltip:(NSString *)tooltip { - statusItem.button.toolTip = tooltip; + [statusItem setToolTip:tooltip]; } - (IBAction)menuHandler:(id)sender @@ -120,14 +97,14 @@ - (void) add_or_update_menu_item:(MenuItem*) item } [menuItem setToolTip:item->tooltip]; if (item->disabled == 1) { - menuItem.enabled = FALSE; + [menuItem setEnabled:FALSE]; } else { - menuItem.enabled = TRUE; + [menuItem setEnabled:TRUE]; } if (item->checked == 1) { - menuItem.state = NSControlStateValueOn; + [menuItem setState:NSOnState]; } else { - menuItem.state = NSControlStateValueOff; + [menuItem setState:NSOffState]; } } diff --git a/vendor/github.com/getlantern/systray/systray_linux.c b/vendor/github.com/getlantern/systray/systray_linux.c index 72cd6140f..a34c2672a 100644 --- a/vendor/github.com/getlantern/systray/systray_linux.c +++ b/vendor/github.com/getlantern/systray/systray_linux.c @@ -8,7 +8,8 @@ static AppIndicator *global_app_indicator; static GtkWidget *global_tray_menu = NULL; static GList *global_menu_items = NULL; -static char temp_file_name[PATH_MAX] = ""; +// Keep track of all generated temp files to remove when app quits +static GArray *global_temp_icon_file_names = NULL; typedef struct { GtkWidget *menu_item; @@ -30,39 +31,24 @@ int nativeLoop(void) { app_indicator_set_status(global_app_indicator, APP_INDICATOR_STATUS_ACTIVE); global_tray_menu = gtk_menu_new(); app_indicator_set_menu(global_app_indicator, GTK_MENU(global_tray_menu)); + global_temp_icon_file_names = g_array_new(TRUE, FALSE, sizeof(char*)); systray_ready(); gtk_main(); systray_on_exit(); return 0; } -void _unlink_temp_file() { - if (strlen(temp_file_name) != 0) { - int ret = unlink(temp_file_name); - if (ret == -1) { - printf("failed to remove temp icon file %s: %s\n", temp_file_name, strerror(errno)); - } - temp_file_name[0] = '\0'; - } -} - // runs in main thread, should always return FALSE to prevent gtk to execute it again gboolean do_set_icon(gpointer data) { - _unlink_temp_file(); - char *tmpdir = getenv("TMPDIR"); - if (NULL == tmpdir) { - tmpdir = "/tmp"; - } - strncpy(temp_file_name, tmpdir, PATH_MAX-1); - strncat(temp_file_name, "/systray_XXXXXX", PATH_MAX-1); - temp_file_name[PATH_MAX-1] = '\0'; - GBytes* bytes = (GBytes*)data; + char* temp_file_name = malloc(PATH_MAX); + strcpy(temp_file_name, "/tmp/systray_XXXXXX"); int fd = mkstemp(temp_file_name); if (fd == -1) { printf("failed to create temp icon file %s: %s\n", temp_file_name, strerror(errno)); return FALSE; } + g_array_append_val(global_temp_icon_file_names, temp_file_name); gsize size = 0; gconstpointer icon_data = g_bytes_get_data(bytes, &size); ssize_t written = write(fd, icon_data, size); @@ -160,7 +146,17 @@ gboolean do_show_menu_item(gpointer data) { // runs in main thread, should always return FALSE to prevent gtk to execute it again gboolean do_quit(gpointer data) { - _unlink_temp_file(); + int i; + for (i = 0; i < INT_MAX; ++i) { + char * temp_file_name = g_array_index(global_temp_icon_file_names, char*, i); + if (temp_file_name == NULL) { + break; + } + int ret = unlink(temp_file_name); + if (ret == -1) { + printf("failed to remove temp icon file %s: %s\n", temp_file_name, strerror(errno)); + } + } // app indicator doesn't provide a way to remove it, hide it as a workaround app_indicator_set_status(global_app_indicator, APP_INDICATOR_STATUS_PASSIVE); gtk_main_quit(); diff --git a/vendor/github.com/getlantern/systray/systray_windows.go b/vendor/github.com/getlantern/systray/systray_windows.go index 26a0f8074..7a9d7a17a 100644 --- a/vendor/github.com/getlantern/systray/systray_windows.go +++ b/vendor/github.com/getlantern/systray/systray_windows.go @@ -8,7 +8,6 @@ import ( "io/ioutil" "os" "path/filepath" - "syscall" "unsafe" "golang.org/x/sys/windows" @@ -464,10 +463,8 @@ func (t *winTray) addOrUpdateMenuItem(menuId int32, title string, disabled, chec // The return value is the identifier of the specified menu item. // If the menu item identifier is NULL or if the specified item opens a submenu, the return value is -1. - // If the given menu identifier is not found (becase we deleted the menu item when hiding it), - // the call will return the next integer that is available as an existing menu item. res, _, err := pGetMenuItemID.Call(uintptr(t.menu), uintptr(menuId)) - if int32(res) == -1 || int32(res) != menuId { + if int32(res) == -1 { res, _, err = pInsertMenuItem.Call( uintptr(t.menu), uintptr(menuId), @@ -525,14 +522,13 @@ func (t *winTray) addSeparatorMenuItem(menuId int32) error { func (t *winTray) hideMenuItem(menuId int32) error { // https://msdn.microsoft.com/en-us/library/windows/desktop/ms647629(v=vs.85).aspx const MF_BYCOMMAND = 0x00000000 - const ERROR_SUCCESS syscall.Errno = 0 res, _, err := pDeleteMenu.Call( uintptr(t.menu), uintptr(uint32(menuId)), MF_BYCOMMAND, ) - if res == 0 && err.(syscall.Errno) != ERROR_SUCCESS { + if res == 0 { return err } From 82be52f8721f31bf15c93549fea123916bfe3005 Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Tue, 27 Nov 2018 16:00:27 +0100 Subject: [PATCH 3/7] created unarchive tests and injecting logger in unarchive functions --- tools/download.go | 76 +++++++++++++++++++++++------------------- tools/download_test.go | 72 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 111 insertions(+), 37 deletions(-) diff --git a/tools/download.go b/tools/download.go index cd4ec94ec..df966ae7c 100644 --- a/tools/download.go +++ b/tools/download.go @@ -10,6 +10,7 @@ import ( "encoding/hex" "encoding/json" "errors" + "fmt" "io" "io/ioutil" "net/http" @@ -226,7 +227,7 @@ func (t *Tools) Download(pack, name, version, behaviour string) error { // Decompress t.Logger("Unpacking tool " + name) - location := path.Join(dir(), pack, correctTool.Name, correctTool.Version) + location := path.Join("tmp", dir(), pack, correctTool.Name, correctTool.Version) err = os.RemoveAll(location) if err != nil { @@ -240,12 +241,12 @@ func (t *Tools) Download(pack, name, version, behaviour string) error { switch srcType { case "application/zip": - location, err = extractZip(body, location) + location, err = extractZip(t.Logger, body, location) case "application/x-bz2": case "application/octet-stream": - location, err = extractBz2(body, location) + location, err = extractBz2(t.Logger, body, location) case "application/x-gzip": - location, err = extractTarGz(body, location) + location, err = extractTarGz(t.Logger, body, location) default: return errors.New("Unknown extension for file " + correctSystem.URL) } @@ -392,7 +393,7 @@ func findBaseDir(dirList []string) string { return commonBaseDir } -func extractZip(body []byte, location string) (string, error) { +func extractZip(log func(msg string) , body []byte, location string) (string, error) { path, err := utilities.SaveFileonTempDir("tooldownloaded.zip", bytes.NewReader(body)) r, err := zip.OpenReader(path) if err != nil { @@ -406,6 +407,7 @@ func extractZip(body []byte, location string) (string, error) { } basedir := findBaseDir(dirList) + log(fmt.Sprintf("selected baseDir %s from Zip Archive Content: %v", basedir, dirList)) for _, f := range r.File { fullname := filepath.Join(location, strings.Replace(f.Name, basedir, "", -1)) @@ -439,7 +441,7 @@ func extractZip(body []byte, location string) (string, error) { return location, nil } -func extractTarGz(body []byte, location string) (string, error) { +func extractTarGz(log func(msg string),body []byte, location string) (string, error) { bodyCopy := make([]byte, len(body)) copy(bodyCopy, body) tarFile, _ := gzip.NewReader(bytes.NewReader(body)) @@ -456,6 +458,7 @@ func extractTarGz(body []byte, location string) (string, error) { } basedir := findBaseDir(dirList) + log(fmt.Sprintf("selected baseDir %s from TarGz Archive Content: %v", basedir, dirList)) tarFile, _ = gzip.NewReader(bytes.NewReader(bodyCopy)) tarReader = tar.NewReader(tarFile) @@ -502,36 +505,8 @@ func extractTarGz(body []byte, location string) (string, error) { return location, nil } -func (t *Tools) installDrivers(location string) error { - OK_PRESSED := 6 - extension := ".bat" - preamble := "" - if runtime.GOOS != "windows" { - extension = ".sh" - // add ./ to force locality - preamble = "./" - } - if _, err := os.Stat(filepath.Join(location, "post_install"+extension)); err == nil { - t.Logger("Installing drivers") - ok := MessageBox("Installing drivers", "We are about to install some drivers needed to use Arduino/Genuino boards\nDo you want to continue?") - if ok == OK_PRESSED { - os.Chdir(location) - t.Logger(preamble + "post_install" + extension) - oscmd := exec.Command(preamble + "post_install" + extension) - if runtime.GOOS != "linux" { - // spawning a shell could be the only way to let the user type his password - TellCommandNotToSpawnShell(oscmd) - } - err = oscmd.Run() - return err - } else { - return errors.New("Could not install drivers") - } - } - return nil -} -func extractBz2(body []byte, location string) (string, error) { +func extractBz2(log func(msg string),body []byte, location string) (string, error) { bodyCopy := make([]byte, len(body)) copy(bodyCopy, body) tarFile := bzip2.NewReader(bytes.NewReader(body)) @@ -548,6 +523,7 @@ func extractBz2(body []byte, location string) (string, error) { } basedir := findBaseDir(dirList) + log(fmt.Sprintf("selected baseDir %s from Bz2 Archive Content: %v", basedir, dirList)) tarFile = bzip2.NewReader(bytes.NewReader(bodyCopy)) tarReader = tar.NewReader(tarFile) @@ -596,6 +572,36 @@ func extractBz2(body []byte, location string) (string, error) { return location, nil } + +func (t *Tools) installDrivers(location string) error { + OK_PRESSED := 6 + extension := ".bat" + preamble := "" + if runtime.GOOS != "windows" { + extension = ".sh" + // add ./ to force locality + preamble = "./" + } + if _, err := os.Stat(filepath.Join(location, "post_install"+extension)); err == nil { + t.Logger("Installing drivers") + ok := MessageBox("Installing drivers", "We are about to install some drivers needed to use Arduino/Genuino boards\nDo you want to continue?") + if ok == OK_PRESSED { + os.Chdir(location) + t.Logger(preamble + "post_install" + extension) + oscmd := exec.Command(preamble + "post_install" + extension) + if runtime.GOOS != "linux" { + // spawning a shell could be the only way to let the user type his password + TellCommandNotToSpawnShell(oscmd) + } + err = oscmd.Run() + return err + } else { + return errors.New("Could not install drivers") + } + } + return nil +} + func makeExecutable(location string) error { location = path.Join(location, "bin") files, err := ioutil.ReadDir(location) diff --git a/tools/download_test.go b/tools/download_test.go index 74adefb44..d444a4c05 100644 --- a/tools/download_test.go +++ b/tools/download_test.go @@ -2,6 +2,11 @@ package tools import ( "fmt" + "github.com/stretchr/testify/assert" + "io/ioutil" + "net/http" + "os" + "path" "testing" ) @@ -14,8 +19,7 @@ func Test_findBaseDir(t *testing.T) { {[]string{"bin/", "bin/bossac"}, "bin/"}, {[]string{"bin/", "bin/bossac", "example"}, ""}, {[]string{"avrdude/bin/avrdude", "avrdude/etc/avrdude.conf"}, "avrdude/"}, - {[]string{"pax_global_header","bin/", "bin/bossac"}, "bin/"}, - + {[]string{"pax_global_header", "bin/", "bin/bossac"}, "bin/"}, } for _, tt := range cases { t.Run(fmt.Sprintln(tt.dirList), func(t *testing.T) { @@ -25,3 +29,67 @@ func Test_findBaseDir(t *testing.T) { }) } } + +func TestTools_DownloadAndUnpackBehaviour(t *testing.T) { + urls := []string{ + "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-armhf-pc-linux-gnu.tar.bz2", + "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-aarch64-pc-linux-gnu.tar.bz2", + "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i386-apple-darwin11.tar.bz2", + "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-x86_64-pc-linux-gnu.tar.bz2", + "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i686-pc-linux-gnu.tar.bz2", + "http://downloads.arduino.cc/tools/avrdude-6.3.0-arduino14-i686-w64-mingw32.zip", + } + expectedDirList := []string{"bin", "etc"} + + for _, url := range urls { + t.Log("Downloading tool from " + url) + resp, err := http.Get(url) + if err != nil { + t.Errorf("%v", err) + } + defer resp.Body.Close() + + // Read the body + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + t.Errorf("%v", err) + } + + location := path.Join("/tmp", dir(), "arduino", "avrdude", "6.3.0-arduino14") + os.MkdirAll(location, os.ModePerm) + err = os.RemoveAll(location) + + if err != nil { + t.Errorf("%v", err) + } + + srcType, err := mimeType(body) + if err != nil { + t.Errorf("%v", err) + } + + switch srcType { + case "application/zip": + location, err = extractZip(func(msg string) { t.Log(msg) }, body, location) + case "application/x-bz2": + case "application/octet-stream": + location, err = extractBz2(func(msg string) { t.Log(msg) }, body, location) + case "application/x-gzip": + location, err = extractTarGz(func(msg string) { t.Log(msg) }, body, location) + default: + t.Errorf("no suitable type found") + } + files, err := ioutil.ReadDir(location) + if err != nil { + t.Errorf("%v", err) + } + dirList := []string{} + for _, f := range files { + dirList = append(dirList, f.Name()) + } + + assert.ElementsMatchf(t, dirList, expectedDirList, "error message %s", "formatted") + + } + +} From 23f848329132ea7831e92bb1584e1fd93d9bf4d0 Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Tue, 27 Nov 2018 16:05:35 +0100 Subject: [PATCH 4/7] updated testcase for findBaseDir with winavrdude zip content --- tools/download_test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/download_test.go b/tools/download_test.go index d444a4c05..4798ed854 100644 --- a/tools/download_test.go +++ b/tools/download_test.go @@ -18,7 +18,15 @@ func Test_findBaseDir(t *testing.T) { {[]string{"bin/bossac"}, "bin/"}, {[]string{"bin/", "bin/bossac"}, "bin/"}, {[]string{"bin/", "bin/bossac", "example"}, ""}, - {[]string{"avrdude/bin/avrdude", "avrdude/etc/avrdude.conf"}, "avrdude/"}, + {[]string{"avrdude/bin/", + "avrdude/bin/avrdude.exe", + "avrdude/bin/remove_giveio.bat", + "avrdude/bin/status_giveio.bat", + "avrdude/bin/giveio.sys", + "avrdude/bin/loaddrv.exe", + "avrdude/bin/libusb0.dll", + "avrdude/bin/install_giveio.bat", + "avrdude/etc/avrdude.conf"}, "avrdude/"}, {[]string{"pax_global_header", "bin/", "bin/bossac"}, "bin/"}, } for _, tt := range cases { From e9c3509aec6a61be193246b485ce7744f15ea131 Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Wed, 28 Nov 2018 09:29:15 +0100 Subject: [PATCH 5/7] removed os dependant funcs to mantain best practice in mangling os paths --- tools/download.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/download.go b/tools/download.go index df966ae7c..00e2ab5f6 100644 --- a/tools/download.go +++ b/tools/download.go @@ -377,7 +377,7 @@ func removeStringFromSlice(s []string, r string) []string { func findBaseDir(dirList []string) string { if len(dirList) == 1 { - return filepath.Dir(dirList[0]) + "/" + return path.Dir(dirList[0]) + "/" } // https://github.com/backdrop-ops/contrib/issues/55#issuecomment-73814500 @@ -386,7 +386,7 @@ func findBaseDir(dirList []string) string { dirList = removeStringFromSlice(dirList, v) } - commonBaseDir := commonPrefix(os.PathSeparator, dirList) + commonBaseDir := commonPrefix('/', dirList) if commonBaseDir != "" { commonBaseDir = commonBaseDir + "/" } @@ -411,6 +411,7 @@ func extractZip(log func(msg string) , body []byte, location string) (string, e for _, f := range r.File { fullname := filepath.Join(location, strings.Replace(f.Name, basedir, "", -1)) + log(fmt.Sprintf("generated fullname %s removing %s from %s", fullname, basedir, f.Name)) if f.FileInfo().IsDir() { os.MkdirAll(fullname, f.FileInfo().Mode().Perm()) } else { From 65d1a2b781435d8bea4e6ac0ad746412ed4f0e07 Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Wed, 28 Nov 2018 09:47:00 +0100 Subject: [PATCH 6/7] fixes string bug in download location path --- tools/download.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/download.go b/tools/download.go index 00e2ab5f6..57ac0419d 100644 --- a/tools/download.go +++ b/tools/download.go @@ -227,7 +227,7 @@ func (t *Tools) Download(pack, name, version, behaviour string) error { // Decompress t.Logger("Unpacking tool " + name) - location := path.Join("tmp", dir(), pack, correctTool.Name, correctTool.Version) + location := path.Join( dir(), pack, correctTool.Name, correctTool.Version) err = os.RemoveAll(location) if err != nil { From 393c7430a60325ac3b69f3a9a0e3baf28faf0fda Mon Sep 17 00:00:00 2001 From: Roberto Sora Date: Wed, 28 Nov 2018 12:02:21 +0100 Subject: [PATCH 7/7] fixed debug console html title --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 49add9640..6b0012dfd 100755 --- a/main.go +++ b/main.go @@ -335,7 +335,7 @@ var homeTemplate = template.Must(template.New("home").Parse(homeTemplateHtml)) const homeTemplateHtml = ` -Serial Port Example +Arduino Create Agent Debug Console