ruby_memprofiler_pprof 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ext/ruby_memprofiler_pprof/backtrace.c +429 -0
- data/ext/ruby_memprofiler_pprof/collector.c +1055 -0
- data/ext/ruby_memprofiler_pprof/compat.c +182 -0
- data/ext/ruby_memprofiler_pprof/extconf.rb +72 -0
- data/ext/ruby_memprofiler_pprof/pprof.upb.c +170 -0
- data/ext/ruby_memprofiler_pprof/pprof.upb.h +848 -0
- data/ext/ruby_memprofiler_pprof/pprof_out.c +285 -0
- data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.c +11 -0
- data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.h +301 -0
- data/ext/ruby_memprofiler_pprof/strtab.c +391 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/BUILD +719 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/CONTRIBUTING.md +37 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/DESIGN.md +201 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/LICENSE +26 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/README.md +78 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/WORKSPACE +58 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/BUILD +53 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/amalgamate.py +129 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/build_defs.bzl +160 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/lua.BUILD +127 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/protobuf.patch +54 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/py_proto_library.bzl +137 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/python_downloads.bzl +84 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/system_python.bzl +101 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/upb_proto_library.bzl +388 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/workspace_deps.bzl +89 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD +252 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD.googleapis +54 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/benchmark.cc +333 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/build_defs.bzl +88 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/compare.py +118 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor.proto +888 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor_sv.proto +890 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/empty.proto +6 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_protobuf_binary_cc.py +64 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_synthetic_protos.py +118 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_upb_binary_c.py +65 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/BUILD.bazel +102 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/README.md +23 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/build_defs.bzl +73 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/make_cmakelists.py +340 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test.py +57 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test_lib.py +186 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/render.py +43 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/style-guide.md +65 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/vs-cpp-protos.md +255 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/docs/wrapping-upb.md +444 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/BUILD +216 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.c +394 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.h +63 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.c +1694 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.h +80 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.c +704 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.h +114 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.c +650 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.h +48 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/BUILD.bazel +193 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/dist.bzl +190 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.c +247 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.h +39 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.c +522 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.h +66 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.c +1909 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.h +101 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/minimal_test.py +183 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/BUILD +70 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/README.md +11 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_database_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_pool_test_wrapper.py +45 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_test_wrapper.py +46 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/generator_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/json_format_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/keywords_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_factory_test_wrapper.py +37 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_test_wrapper.py +52 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/proto_builder_test_wrapper.py +32 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/pyproto_test_wrapper.bzl +36 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/reflection_test_wrapper.py +45 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/service_reflection_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/symbol_database_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_encoding_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_format_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/unknown_fields_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/well_known_types_test_wrapper.py +36 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/wire_format_test_wrapper.py +30 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.c +350 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.h +230 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/py_extension.bzl +55 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/python_api.h +61 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.c +828 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.h +69 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.c +404 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.h +39 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/python/version_script.lds +6 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/LICENSE +32 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/README.google +9 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/console.lua +156 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/lunit.lua +725 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/BUILD +19 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/LICENSE +21 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/naive.c +92 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-neon.c +157 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-sse.c +170 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/utf8_range.h +9 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/BUILD.bazel +129 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/README.md +8 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/def.c +939 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/lua_proto_library.bzl +138 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/main.c +83 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/msg.c +1118 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test.proto +69 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test_upb.lua +846 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.c +258 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.h +132 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.lua +58 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upbc.cc +134 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.c +192 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.h +174 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb.c +346 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb_failures.txt +1 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.c +1221 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.h +94 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.c +1055 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.h +153 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_internal.h +211 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.c +3262 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.h +414 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.hpp +438 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/empty.proto +1 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.c +604 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.h +71 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/BUILD +13 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/file_descriptor_parsenew_fuzzer.cc +43 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.c +1509 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.h +47 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.c +776 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.h +62 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.c +1147 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.h +189 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.hpp +112 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.c +363 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.h +263 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_internal.h +59 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_test.cc +425 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_test.cc +230 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.c +428 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.h +114 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_internal.h +836 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.cc +491 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.proto +195 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_def.inc +261 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_undef.inc +62 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.c +323 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.h +109 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.hpp +37 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table.c +926 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table_internal.h +385 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test.proto +74 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.cc +186 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.proto +12 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_generated_code.cc +977 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_table.cc +580 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.c +472 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.h +64 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.c +362 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.h +378 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.hpp +115 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb_internal.h +68 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/BUILD +121 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/README.md +7 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.c +300 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.h +66 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare_test.cc +236 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.c +572 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.h +62 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_public_import_test.proto +32 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_regular_import_test.proto +36 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.cc +143 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.proto +119 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_weak_import_test.proto +28 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_wweak_import_test.proto +28 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.c +311 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.h +94 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.cc +202 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.proto +48 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/BUILD +78 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.cc +77 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.h +112 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upb.cc +1997 -0
- data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upbdefs.cc +193 -0
- data/lib/ruby_memprofiler_pprof/atfork.rb +77 -0
- data/lib/ruby_memprofiler_pprof/block_flusher.rb +61 -0
- data/lib/ruby_memprofiler_pprof/file_flusher.rb +45 -0
- data/lib/ruby_memprofiler_pprof/profile_app.rb +30 -0
- data/lib/ruby_memprofiler_pprof/profile_data.rb +18 -0
- data/lib/ruby_memprofiler_pprof/version.rb +5 -0
- data/lib/ruby_memprofiler_pprof.rb +8 -0
- data/libexec/ruby_memprofiler_pprof_profile +16 -0
- metadata +257 -0
@@ -0,0 +1,261 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009-2021, Google LLC
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
* * Redistributions of source code must retain the above copyright
|
8
|
+
* notice, this list of conditions and the following disclaimer.
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer in the
|
11
|
+
* documentation and/or other materials provided with the distribution.
|
12
|
+
* * Neither the name of Google LLC nor the
|
13
|
+
* names of its contributors may be used to endorse or promote products
|
14
|
+
* derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
* DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
|
20
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
/*
|
29
|
+
* This is where we define macros used across upb.
|
30
|
+
*
|
31
|
+
* All of these macros are undef'd in port_undef.inc to avoid leaking them to
|
32
|
+
* users.
|
33
|
+
*
|
34
|
+
* The correct usage is:
|
35
|
+
*
|
36
|
+
* #include "upb/foobar.h"
|
37
|
+
* #include "upb/baz.h"
|
38
|
+
*
|
39
|
+
* // MUST be last included header.
|
40
|
+
* #include "upb/port_def.inc"
|
41
|
+
*
|
42
|
+
* // Code for this file.
|
43
|
+
* // <...>
|
44
|
+
*
|
45
|
+
* // Can be omitted for .c files, required for .h.
|
46
|
+
* #include "upb/port_undef.inc"
|
47
|
+
*
|
48
|
+
* This file is private and must not be included by users!
|
49
|
+
*/
|
50
|
+
|
51
|
+
#if !((defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
|
52
|
+
(defined(__cplusplus) && __cplusplus >= 201103L) || \
|
53
|
+
(defined(_MSC_VER) && _MSC_VER >= 1900))
|
54
|
+
#error upb requires C99 or C++11 or MSVC >= 2015.
|
55
|
+
#endif
|
56
|
+
|
57
|
+
#include <stdint.h>
|
58
|
+
#include <stddef.h>
|
59
|
+
|
60
|
+
#if UINTPTR_MAX == 0xffffffff
|
61
|
+
#define UPB_SIZE(size32, size64) size32
|
62
|
+
#else
|
63
|
+
#define UPB_SIZE(size32, size64) size64
|
64
|
+
#endif
|
65
|
+
|
66
|
+
/* If we always read/write as a consistent type to each address, this shouldn't
|
67
|
+
* violate aliasing.
|
68
|
+
*/
|
69
|
+
#define UPB_PTR_AT(msg, ofs, type) ((type*)((char*)(msg) + (ofs)))
|
70
|
+
|
71
|
+
#define UPB_READ_ONEOF(msg, fieldtype, offset, case_offset, case_val, default) \
|
72
|
+
*UPB_PTR_AT(msg, case_offset, int) == case_val \
|
73
|
+
? *UPB_PTR_AT(msg, offset, fieldtype) \
|
74
|
+
: default
|
75
|
+
|
76
|
+
#define UPB_WRITE_ONEOF(msg, fieldtype, offset, value, case_offset, case_val) \
|
77
|
+
*UPB_PTR_AT(msg, case_offset, int) = case_val; \
|
78
|
+
*UPB_PTR_AT(msg, offset, fieldtype) = value;
|
79
|
+
|
80
|
+
#define UPB_MAPTYPE_STRING 0
|
81
|
+
|
82
|
+
/* UPB_INLINE: inline if possible, emit standalone code if required. */
|
83
|
+
#ifdef __cplusplus
|
84
|
+
#define UPB_INLINE inline
|
85
|
+
#elif defined (__GNUC__) || defined(__clang__)
|
86
|
+
#define UPB_INLINE static __inline__
|
87
|
+
#else
|
88
|
+
#define UPB_INLINE static
|
89
|
+
#endif
|
90
|
+
|
91
|
+
#define UPB_ALIGN_UP(size, align) (((size) + (align) - 1) / (align) * (align))
|
92
|
+
#define UPB_ALIGN_DOWN(size, align) ((size) / (align) * (align))
|
93
|
+
#define UPB_ALIGN_MALLOC(size) UPB_ALIGN_UP(size, 16)
|
94
|
+
#define UPB_ALIGN_OF(type) offsetof (struct { char c; type member; }, member)
|
95
|
+
|
96
|
+
/* Hints to the compiler about likely/unlikely branches. */
|
97
|
+
#if defined (__GNUC__) || defined(__clang__)
|
98
|
+
#define UPB_LIKELY(x) __builtin_expect((x),1)
|
99
|
+
#define UPB_UNLIKELY(x) __builtin_expect((x),0)
|
100
|
+
#else
|
101
|
+
#define UPB_LIKELY(x) (x)
|
102
|
+
#define UPB_UNLIKELY(x) (x)
|
103
|
+
#endif
|
104
|
+
|
105
|
+
/* Macros for function attributes on compilers that support them. */
|
106
|
+
#ifdef __GNUC__
|
107
|
+
#define UPB_FORCEINLINE __inline__ __attribute__((always_inline))
|
108
|
+
#define UPB_NOINLINE __attribute__((noinline))
|
109
|
+
#define UPB_NORETURN __attribute__((__noreturn__))
|
110
|
+
#define UPB_PRINTF(str, first_vararg) __attribute__((format (printf, str, first_vararg)))
|
111
|
+
#elif defined(_MSC_VER)
|
112
|
+
#define UPB_NOINLINE
|
113
|
+
#define UPB_FORCEINLINE
|
114
|
+
#define UPB_NORETURN __declspec(noreturn)
|
115
|
+
#define UPB_PRINTF(str, first_vararg)
|
116
|
+
#else /* !defined(__GNUC__) */
|
117
|
+
#define UPB_FORCEINLINE
|
118
|
+
#define UPB_NOINLINE
|
119
|
+
#define UPB_NORETURN
|
120
|
+
#define UPB_PRINTF(str, first_vararg)
|
121
|
+
#endif
|
122
|
+
|
123
|
+
#define UPB_MAX(x, y) ((x) > (y) ? (x) : (y))
|
124
|
+
#define UPB_MIN(x, y) ((x) < (y) ? (x) : (y))
|
125
|
+
|
126
|
+
#define UPB_UNUSED(var) (void)var
|
127
|
+
|
128
|
+
/* UPB_ASSUME(): in release mode, we tell the compiler to assume this is true.
|
129
|
+
*/
|
130
|
+
#ifdef NDEBUG
|
131
|
+
#ifdef __GNUC__
|
132
|
+
#define UPB_ASSUME(expr) if (!(expr)) __builtin_unreachable()
|
133
|
+
#elif defined _MSC_VER
|
134
|
+
#define UPB_ASSUME(expr) if (!(expr)) __assume(0)
|
135
|
+
#else
|
136
|
+
#define UPB_ASSUME(expr) do {} while (false && (expr))
|
137
|
+
#endif
|
138
|
+
#else
|
139
|
+
#define UPB_ASSUME(expr) assert(expr)
|
140
|
+
#endif
|
141
|
+
|
142
|
+
/* UPB_ASSERT(): in release mode, we use the expression without letting it be
|
143
|
+
* evaluated. This prevents "unused variable" warnings. */
|
144
|
+
#ifdef NDEBUG
|
145
|
+
#define UPB_ASSERT(expr) do {} while (false && (expr))
|
146
|
+
#else
|
147
|
+
#define UPB_ASSERT(expr) assert(expr)
|
148
|
+
#endif
|
149
|
+
|
150
|
+
#if defined(__GNUC__) || defined(__clang__)
|
151
|
+
#define UPB_UNREACHABLE() do { assert(0); __builtin_unreachable(); } while(0)
|
152
|
+
#else
|
153
|
+
#define UPB_UNREACHABLE() do { assert(0); } while(0)
|
154
|
+
#endif
|
155
|
+
|
156
|
+
/* UPB_SETJMP() / UPB_LONGJMP(): avoid setting/restoring signal mask. */
|
157
|
+
#ifdef __APPLE__
|
158
|
+
#define UPB_SETJMP(buf) _setjmp(buf)
|
159
|
+
#define UPB_LONGJMP(buf, val) _longjmp(buf, val)
|
160
|
+
#else
|
161
|
+
#define UPB_SETJMP(buf) setjmp(buf)
|
162
|
+
#define UPB_LONGJMP(buf, val) longjmp(buf, val)
|
163
|
+
#endif
|
164
|
+
|
165
|
+
/* UPB_PTRADD(ptr, ofs): add pointer while avoiding "NULL + 0" UB */
|
166
|
+
#define UPB_PTRADD(ptr, ofs) ((ofs) ? (ptr) + (ofs) : (ptr))
|
167
|
+
|
168
|
+
/* Configure whether fasttable is switched on or not. *************************/
|
169
|
+
|
170
|
+
#ifdef __has_attribute
|
171
|
+
#define UPB_HAS_ATTRIBUTE(x) __has_attribute(x)
|
172
|
+
#else
|
173
|
+
#define UPB_HAS_ATTRIBUTE(x) 0
|
174
|
+
#endif
|
175
|
+
|
176
|
+
#if UPB_HAS_ATTRIBUTE(musttail)
|
177
|
+
#define UPB_MUSTTAIL __attribute__((musttail))
|
178
|
+
#else
|
179
|
+
#define UPB_MUSTTAIL
|
180
|
+
#endif
|
181
|
+
|
182
|
+
#undef UPB_HAS_ATTRIBUTE
|
183
|
+
|
184
|
+
/* This check is not fully robust: it does not require that we have "musttail"
|
185
|
+
* support available. We need tail calls to avoid consuming arbitrary amounts
|
186
|
+
* of stack space.
|
187
|
+
*
|
188
|
+
* GCC/Clang can mostly be trusted to generate tail calls as long as
|
189
|
+
* optimization is enabled, but, debug builds will not generate tail calls
|
190
|
+
* unless "musttail" is available.
|
191
|
+
*
|
192
|
+
* We should probably either:
|
193
|
+
* 1. require that the compiler supports musttail.
|
194
|
+
* 2. add some fallback code for when musttail isn't available (ie. return
|
195
|
+
* instead of tail calling). This is safe and portable, but this comes at
|
196
|
+
* a CPU cost.
|
197
|
+
*/
|
198
|
+
#if (defined(__x86_64__) || defined(__aarch64__)) && defined(__GNUC__)
|
199
|
+
#define UPB_FASTTABLE_SUPPORTED 1
|
200
|
+
#else
|
201
|
+
#define UPB_FASTTABLE_SUPPORTED 0
|
202
|
+
#endif
|
203
|
+
|
204
|
+
/* define UPB_ENABLE_FASTTABLE to force fast table support.
|
205
|
+
* This is useful when we want to ensure we are really getting fasttable,
|
206
|
+
* for example for testing or benchmarking. */
|
207
|
+
#if defined(UPB_ENABLE_FASTTABLE)
|
208
|
+
#if !UPB_FASTTABLE_SUPPORTED
|
209
|
+
#error fasttable is x86-64/ARM64 only and requires GCC or Clang.
|
210
|
+
#endif
|
211
|
+
#define UPB_FASTTABLE 1
|
212
|
+
/* Define UPB_TRY_ENABLE_FASTTABLE to use fasttable if possible.
|
213
|
+
* This is useful for releasing code that might be used on multiple platforms,
|
214
|
+
* for example the PHP or Ruby C extensions. */
|
215
|
+
#elif defined(UPB_TRY_ENABLE_FASTTABLE)
|
216
|
+
#define UPB_FASTTABLE UPB_FASTTABLE_SUPPORTED
|
217
|
+
#else
|
218
|
+
#define UPB_FASTTABLE 0
|
219
|
+
#endif
|
220
|
+
|
221
|
+
/* UPB_FASTTABLE_INIT() allows protos compiled for fasttable to gracefully
|
222
|
+
* degrade to non-fasttable if we are using UPB_TRY_ENABLE_FASTTABLE. */
|
223
|
+
#if !UPB_FASTTABLE && defined(UPB_TRY_ENABLE_FASTTABLE)
|
224
|
+
#define UPB_FASTTABLE_INIT(...)
|
225
|
+
#else
|
226
|
+
#define UPB_FASTTABLE_INIT(...) __VA_ARGS__
|
227
|
+
#endif
|
228
|
+
|
229
|
+
#undef UPB_FASTTABLE_SUPPORTED
|
230
|
+
|
231
|
+
/* ASAN poisoning (for arena) *************************************************/
|
232
|
+
|
233
|
+
#if defined(__SANITIZE_ADDRESS__)
|
234
|
+
#define UPB_ASAN 1
|
235
|
+
#ifdef __cplusplus
|
236
|
+
extern "C" {
|
237
|
+
#endif
|
238
|
+
void __asan_poison_memory_region(void const volatile *addr, size_t size);
|
239
|
+
void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
|
240
|
+
#ifdef __cplusplus
|
241
|
+
} /* extern "C" */
|
242
|
+
#endif
|
243
|
+
#define UPB_POISON_MEMORY_REGION(addr, size) \
|
244
|
+
__asan_poison_memory_region((addr), (size))
|
245
|
+
#define UPB_UNPOISON_MEMORY_REGION(addr, size) \
|
246
|
+
__asan_unpoison_memory_region((addr), (size))
|
247
|
+
#else
|
248
|
+
#define UPB_ASAN 0
|
249
|
+
#define UPB_POISON_MEMORY_REGION(addr, size) \
|
250
|
+
((void)(addr), (void)(size))
|
251
|
+
#define UPB_UNPOISON_MEMORY_REGION(addr, size) \
|
252
|
+
((void)(addr), (void)(size))
|
253
|
+
#endif
|
254
|
+
|
255
|
+
/* Disable proto2 arena behavior (TEMPORARY) **********************************/
|
256
|
+
|
257
|
+
#ifdef UPB_DISABLE_PROTO2_ENUM_CHECKING
|
258
|
+
#define UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 1
|
259
|
+
#else
|
260
|
+
#define UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 0
|
261
|
+
#endif
|
@@ -0,0 +1,62 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009-2021, Google LLC
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
* * Redistributions of source code must retain the above copyright
|
8
|
+
* notice, this list of conditions and the following disclaimer.
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer in the
|
11
|
+
* documentation and/or other materials provided with the distribution.
|
12
|
+
* * Neither the name of Google LLC nor the
|
13
|
+
* names of its contributors may be used to endorse or promote products
|
14
|
+
* derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
17
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
* DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
|
20
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
/* See port_def.inc. This should #undef all macros #defined there. */
|
29
|
+
|
30
|
+
#undef UPB_SIZE
|
31
|
+
#undef UPB_PTR_AT
|
32
|
+
#undef UPB_READ_ONEOF
|
33
|
+
#undef UPB_WRITE_ONEOF
|
34
|
+
#undef UPB_MAPTYPE_STRING
|
35
|
+
#undef UPB_INLINE
|
36
|
+
#undef UPB_ALIGN_UP
|
37
|
+
#undef UPB_ALIGN_DOWN
|
38
|
+
#undef UPB_ALIGN_MALLOC
|
39
|
+
#undef UPB_ALIGN_OF
|
40
|
+
#undef UPB_LIKELY
|
41
|
+
#undef UPB_UNLIKELY
|
42
|
+
#undef UPB_FORCEINLINE
|
43
|
+
#undef UPB_NOINLINE
|
44
|
+
#undef UPB_NORETURN
|
45
|
+
#undef UPB_PRINTF
|
46
|
+
#undef UPB_MAX
|
47
|
+
#undef UPB_MIN
|
48
|
+
#undef UPB_UNUSED
|
49
|
+
#undef UPB_ASSUME
|
50
|
+
#undef UPB_ASSERT
|
51
|
+
#undef UPB_UNREACHABLE
|
52
|
+
#undef UPB_SETJMP
|
53
|
+
#undef UPB_LONGJMP
|
54
|
+
#undef UPB_PTRADD
|
55
|
+
#undef UPB_MUSTTAIL
|
56
|
+
#undef UPB_FASTTABLE_SUPPORTED
|
57
|
+
#undef UPB_FASTTABLE
|
58
|
+
#undef UPB_FASTTABLE_INIT
|
59
|
+
#undef UPB_POISON_MEMORY_REGION
|
60
|
+
#undef UPB_UNPOISON_MEMORY_REGION
|
61
|
+
#undef UPB_ASAN
|
62
|
+
#undef UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3
|
@@ -0,0 +1,323 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009-2021, Google LLC
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
* * Redistributions of source code must retain the above copyright
|
8
|
+
* notice, this list of conditions and the following disclaimer.
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer in the
|
11
|
+
* documentation and/or other materials provided with the distribution.
|
12
|
+
* * Neither the name of Google LLC nor the
|
13
|
+
* names of its contributors may be used to endorse or promote products
|
14
|
+
* derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
|
20
|
+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#include "upb/reflection.h"
|
29
|
+
|
30
|
+
#include <string.h>
|
31
|
+
|
32
|
+
#include "upb/msg.h"
|
33
|
+
#include "upb/port_def.inc"
|
34
|
+
#include "upb/table_internal.h"
|
35
|
+
|
36
|
+
static size_t get_field_size(const upb_MiniTable_Field* f) {
|
37
|
+
static unsigned char sizes[] = {
|
38
|
+
0, /* 0 */
|
39
|
+
8, /* kUpb_FieldType_Double */
|
40
|
+
4, /* kUpb_FieldType_Float */
|
41
|
+
8, /* kUpb_FieldType_Int64 */
|
42
|
+
8, /* kUpb_FieldType_UInt64 */
|
43
|
+
4, /* kUpb_FieldType_Int32 */
|
44
|
+
8, /* kUpb_FieldType_Fixed64 */
|
45
|
+
4, /* kUpb_FieldType_Fixed32 */
|
46
|
+
1, /* kUpb_FieldType_Bool */
|
47
|
+
sizeof(upb_StringView), /* kUpb_FieldType_String */
|
48
|
+
sizeof(void*), /* kUpb_FieldType_Group */
|
49
|
+
sizeof(void*), /* kUpb_FieldType_Message */
|
50
|
+
sizeof(upb_StringView), /* kUpb_FieldType_Bytes */
|
51
|
+
4, /* kUpb_FieldType_UInt32 */
|
52
|
+
4, /* kUpb_FieldType_Enum */
|
53
|
+
4, /* kUpb_FieldType_SFixed32 */
|
54
|
+
8, /* kUpb_FieldType_SFixed64 */
|
55
|
+
4, /* kUpb_FieldType_SInt32 */
|
56
|
+
8, /* kUpb_FieldType_SInt64 */
|
57
|
+
};
|
58
|
+
return upb_IsRepeatedOrMap(f) ? sizeof(void*) : sizes[f->descriptortype];
|
59
|
+
}
|
60
|
+
|
61
|
+
/** upb_Message
|
62
|
+
* *******************************************************************/
|
63
|
+
|
64
|
+
upb_Message* upb_Message_New(const upb_MessageDef* m, upb_Arena* a) {
|
65
|
+
return _upb_Message_New(upb_MessageDef_MiniTable(m), a);
|
66
|
+
}
|
67
|
+
|
68
|
+
static bool in_oneof(const upb_MiniTable_Field* field) {
|
69
|
+
return field->presence < 0;
|
70
|
+
}
|
71
|
+
|
72
|
+
static upb_MessageValue _upb_Message_Getraw(const upb_Message* msg,
|
73
|
+
const upb_FieldDef* f) {
|
74
|
+
const upb_MiniTable_Field* field = upb_FieldDef_MiniTable(f);
|
75
|
+
const char* mem = UPB_PTR_AT(msg, field->offset, char);
|
76
|
+
upb_MessageValue val = {0};
|
77
|
+
memcpy(&val, mem, get_field_size(field));
|
78
|
+
return val;
|
79
|
+
}
|
80
|
+
|
81
|
+
bool upb_Message_Has(const upb_Message* msg, const upb_FieldDef* f) {
|
82
|
+
assert(upb_FieldDef_HasPresence(f));
|
83
|
+
if (upb_FieldDef_IsExtension(f)) {
|
84
|
+
const upb_MiniTable_Extension* ext = _upb_FieldDef_ExtensionMiniTable(f);
|
85
|
+
return _upb_Message_Getext(msg, ext) != NULL;
|
86
|
+
} else {
|
87
|
+
const upb_MiniTable_Field* field = upb_FieldDef_MiniTable(f);
|
88
|
+
if (in_oneof(field)) {
|
89
|
+
return _upb_getoneofcase_field(msg, field) == field->number;
|
90
|
+
} else if (field->presence > 0) {
|
91
|
+
return _upb_hasbit_field(msg, field);
|
92
|
+
} else {
|
93
|
+
UPB_ASSERT(field->descriptortype == kUpb_FieldType_Message ||
|
94
|
+
field->descriptortype == kUpb_FieldType_Group);
|
95
|
+
return _upb_Message_Getraw(msg, f).msg_val != NULL;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
const upb_FieldDef* upb_Message_WhichOneof(const upb_Message* msg,
|
101
|
+
const upb_OneofDef* o) {
|
102
|
+
const upb_FieldDef* f = upb_OneofDef_Field(o, 0);
|
103
|
+
if (upb_OneofDef_IsSynthetic(o)) {
|
104
|
+
UPB_ASSERT(upb_OneofDef_FieldCount(o) == 1);
|
105
|
+
return upb_Message_Has(msg, f) ? f : NULL;
|
106
|
+
} else {
|
107
|
+
const upb_MiniTable_Field* field = upb_FieldDef_MiniTable(f);
|
108
|
+
uint32_t oneof_case = _upb_getoneofcase_field(msg, field);
|
109
|
+
f = oneof_case ? upb_OneofDef_LookupNumber(o, oneof_case) : NULL;
|
110
|
+
UPB_ASSERT((f != NULL) == (oneof_case != 0));
|
111
|
+
return f;
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
upb_MessageValue upb_Message_Get(const upb_Message* msg,
|
116
|
+
const upb_FieldDef* f) {
|
117
|
+
if (upb_FieldDef_IsExtension(f)) {
|
118
|
+
const upb_Message_Extension* ext =
|
119
|
+
_upb_Message_Getext(msg, _upb_FieldDef_ExtensionMiniTable(f));
|
120
|
+
if (ext) {
|
121
|
+
upb_MessageValue val;
|
122
|
+
memcpy(&val, &ext->data, sizeof(val));
|
123
|
+
return val;
|
124
|
+
} else if (upb_FieldDef_IsRepeated(f)) {
|
125
|
+
return (upb_MessageValue){.array_val = NULL};
|
126
|
+
}
|
127
|
+
} else if (!upb_FieldDef_HasPresence(f) || upb_Message_Has(msg, f)) {
|
128
|
+
return _upb_Message_Getraw(msg, f);
|
129
|
+
}
|
130
|
+
return upb_FieldDef_Default(f);
|
131
|
+
}
|
132
|
+
|
133
|
+
upb_MutableMessageValue upb_Message_Mutable(upb_Message* msg,
|
134
|
+
const upb_FieldDef* f,
|
135
|
+
upb_Arena* a) {
|
136
|
+
UPB_ASSERT(upb_FieldDef_IsSubMessage(f) || upb_FieldDef_IsRepeated(f));
|
137
|
+
if (upb_FieldDef_HasPresence(f) && !upb_Message_Has(msg, f)) {
|
138
|
+
// We need to skip the upb_Message_Get() call in this case.
|
139
|
+
goto make;
|
140
|
+
}
|
141
|
+
|
142
|
+
upb_MessageValue val = upb_Message_Get(msg, f);
|
143
|
+
if (val.array_val) {
|
144
|
+
return (upb_MutableMessageValue){.array = (upb_Array*)val.array_val};
|
145
|
+
}
|
146
|
+
|
147
|
+
upb_MutableMessageValue ret;
|
148
|
+
make:
|
149
|
+
if (!a) return (upb_MutableMessageValue){.array = NULL};
|
150
|
+
if (upb_FieldDef_IsMap(f)) {
|
151
|
+
const upb_MessageDef* entry = upb_FieldDef_MessageSubDef(f);
|
152
|
+
const upb_FieldDef* key =
|
153
|
+
upb_MessageDef_FindFieldByNumber(entry, kUpb_MapEntry_KeyFieldNumber);
|
154
|
+
const upb_FieldDef* value =
|
155
|
+
upb_MessageDef_FindFieldByNumber(entry, kUpb_MapEntry_ValueFieldNumber);
|
156
|
+
ret.map =
|
157
|
+
upb_Map_New(a, upb_FieldDef_CType(key), upb_FieldDef_CType(value));
|
158
|
+
} else if (upb_FieldDef_IsRepeated(f)) {
|
159
|
+
ret.array = upb_Array_New(a, upb_FieldDef_CType(f));
|
160
|
+
} else {
|
161
|
+
UPB_ASSERT(upb_FieldDef_IsSubMessage(f));
|
162
|
+
ret.msg = upb_Message_New(upb_FieldDef_MessageSubDef(f), a);
|
163
|
+
}
|
164
|
+
|
165
|
+
val.array_val = ret.array;
|
166
|
+
upb_Message_Set(msg, f, val, a);
|
167
|
+
|
168
|
+
return ret;
|
169
|
+
}
|
170
|
+
|
171
|
+
bool upb_Message_Set(upb_Message* msg, const upb_FieldDef* f,
|
172
|
+
upb_MessageValue val, upb_Arena* a) {
|
173
|
+
if (upb_FieldDef_IsExtension(f)) {
|
174
|
+
upb_Message_Extension* ext = _upb_Message_GetOrCreateExtension(
|
175
|
+
msg, _upb_FieldDef_ExtensionMiniTable(f), a);
|
176
|
+
if (!ext) return false;
|
177
|
+
memcpy(&ext->data, &val, sizeof(val));
|
178
|
+
} else {
|
179
|
+
const upb_MiniTable_Field* field = upb_FieldDef_MiniTable(f);
|
180
|
+
char* mem = UPB_PTR_AT(msg, field->offset, char);
|
181
|
+
memcpy(mem, &val, get_field_size(field));
|
182
|
+
if (field->presence > 0) {
|
183
|
+
_upb_sethas_field(msg, field);
|
184
|
+
} else if (in_oneof(field)) {
|
185
|
+
*_upb_oneofcase_field(msg, field) = field->number;
|
186
|
+
}
|
187
|
+
}
|
188
|
+
return true;
|
189
|
+
}
|
190
|
+
|
191
|
+
void upb_Message_ClearField(upb_Message* msg, const upb_FieldDef* f) {
|
192
|
+
if (upb_FieldDef_IsExtension(f)) {
|
193
|
+
_upb_Message_Clearext(msg, _upb_FieldDef_ExtensionMiniTable(f));
|
194
|
+
} else {
|
195
|
+
const upb_MiniTable_Field* field = upb_FieldDef_MiniTable(f);
|
196
|
+
char* mem = UPB_PTR_AT(msg, field->offset, char);
|
197
|
+
|
198
|
+
if (field->presence > 0) {
|
199
|
+
_upb_clearhas_field(msg, field);
|
200
|
+
} else if (in_oneof(field)) {
|
201
|
+
uint32_t* oneof_case = _upb_oneofcase_field(msg, field);
|
202
|
+
if (*oneof_case != field->number) return;
|
203
|
+
*oneof_case = 0;
|
204
|
+
}
|
205
|
+
|
206
|
+
memset(mem, 0, get_field_size(field));
|
207
|
+
}
|
208
|
+
}
|
209
|
+
|
210
|
+
void upb_Message_Clear(upb_Message* msg, const upb_MessageDef* m) {
|
211
|
+
_upb_Message_Clear(msg, upb_MessageDef_MiniTable(m));
|
212
|
+
}
|
213
|
+
|
214
|
+
bool upb_Message_Next(const upb_Message* msg, const upb_MessageDef* m,
|
215
|
+
const upb_DefPool* ext_pool, const upb_FieldDef** out_f,
|
216
|
+
upb_MessageValue* out_val, size_t* iter) {
|
217
|
+
size_t i = *iter;
|
218
|
+
size_t n = upb_MessageDef_FieldCount(m);
|
219
|
+
const upb_MessageValue zero = {0};
|
220
|
+
UPB_UNUSED(ext_pool);
|
221
|
+
|
222
|
+
/* Iterate over normal fields, returning the first one that is set. */
|
223
|
+
while (++i < n) {
|
224
|
+
const upb_FieldDef* f = upb_MessageDef_Field(m, i);
|
225
|
+
upb_MessageValue val = _upb_Message_Getraw(msg, f);
|
226
|
+
|
227
|
+
/* Skip field if unset or empty. */
|
228
|
+
if (upb_FieldDef_HasPresence(f)) {
|
229
|
+
if (!upb_Message_Has(msg, f)) continue;
|
230
|
+
} else {
|
231
|
+
upb_MessageValue test = val;
|
232
|
+
if (upb_FieldDef_IsString(f) && !upb_FieldDef_IsRepeated(f)) {
|
233
|
+
/* Clear string pointer, only size matters (ptr could be non-NULL). */
|
234
|
+
test.str_val.data = NULL;
|
235
|
+
}
|
236
|
+
/* Continue if NULL or 0. */
|
237
|
+
if (memcmp(&test, &zero, sizeof(test)) == 0) continue;
|
238
|
+
|
239
|
+
/* Continue on empty array or map. */
|
240
|
+
if (upb_FieldDef_IsMap(f)) {
|
241
|
+
if (upb_Map_Size(test.map_val) == 0) continue;
|
242
|
+
} else if (upb_FieldDef_IsRepeated(f)) {
|
243
|
+
if (upb_Array_Size(test.array_val) == 0) continue;
|
244
|
+
}
|
245
|
+
}
|
246
|
+
|
247
|
+
*out_val = val;
|
248
|
+
*out_f = f;
|
249
|
+
*iter = i;
|
250
|
+
return true;
|
251
|
+
}
|
252
|
+
|
253
|
+
if (ext_pool) {
|
254
|
+
/* Return any extensions that are set. */
|
255
|
+
size_t count;
|
256
|
+
const upb_Message_Extension* ext = _upb_Message_Getexts(msg, &count);
|
257
|
+
if (i - n < count) {
|
258
|
+
ext += count - 1 - (i - n);
|
259
|
+
memcpy(out_val, &ext->data, sizeof(*out_val));
|
260
|
+
*out_f = _upb_DefPool_FindExtensionByMiniTable(ext_pool, ext->ext);
|
261
|
+
*iter = i;
|
262
|
+
return true;
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
*iter = i;
|
267
|
+
return false;
|
268
|
+
}
|
269
|
+
|
270
|
+
bool _upb_Message_DiscardUnknown(upb_Message* msg, const upb_MessageDef* m,
|
271
|
+
int depth) {
|
272
|
+
size_t iter = kUpb_Message_Begin;
|
273
|
+
const upb_FieldDef* f;
|
274
|
+
upb_MessageValue val;
|
275
|
+
bool ret = true;
|
276
|
+
|
277
|
+
if (--depth == 0) return false;
|
278
|
+
|
279
|
+
_upb_Message_DiscardUnknown_shallow(msg);
|
280
|
+
|
281
|
+
while (upb_Message_Next(msg, m, NULL /*ext_pool*/, &f, &val, &iter)) {
|
282
|
+
const upb_MessageDef* subm = upb_FieldDef_MessageSubDef(f);
|
283
|
+
if (!subm) continue;
|
284
|
+
if (upb_FieldDef_IsMap(f)) {
|
285
|
+
const upb_FieldDef* val_f = upb_MessageDef_FindFieldByNumber(subm, 2);
|
286
|
+
const upb_MessageDef* val_m = upb_FieldDef_MessageSubDef(val_f);
|
287
|
+
upb_Map* map = (upb_Map*)val.map_val;
|
288
|
+
size_t iter = kUpb_Map_Begin;
|
289
|
+
|
290
|
+
if (!val_m) continue;
|
291
|
+
|
292
|
+
while (upb_MapIterator_Next(map, &iter)) {
|
293
|
+
upb_MessageValue map_val = upb_MapIterator_Value(map, iter);
|
294
|
+
if (!_upb_Message_DiscardUnknown((upb_Message*)map_val.msg_val, val_m,
|
295
|
+
depth)) {
|
296
|
+
ret = false;
|
297
|
+
}
|
298
|
+
}
|
299
|
+
} else if (upb_FieldDef_IsRepeated(f)) {
|
300
|
+
const upb_Array* arr = val.array_val;
|
301
|
+
size_t i, n = upb_Array_Size(arr);
|
302
|
+
for (i = 0; i < n; i++) {
|
303
|
+
upb_MessageValue elem = upb_Array_Get(arr, i);
|
304
|
+
if (!_upb_Message_DiscardUnknown((upb_Message*)elem.msg_val, subm,
|
305
|
+
depth)) {
|
306
|
+
ret = false;
|
307
|
+
}
|
308
|
+
}
|
309
|
+
} else {
|
310
|
+
if (!_upb_Message_DiscardUnknown((upb_Message*)val.msg_val, subm,
|
311
|
+
depth)) {
|
312
|
+
ret = false;
|
313
|
+
}
|
314
|
+
}
|
315
|
+
}
|
316
|
+
|
317
|
+
return ret;
|
318
|
+
}
|
319
|
+
|
320
|
+
bool upb_Message_DiscardUnknown(upb_Message* msg, const upb_MessageDef* m,
|
321
|
+
int maxdepth) {
|
322
|
+
return _upb_Message_DiscardUnknown(msg, m, maxdepth);
|
323
|
+
}
|