ruby_memprofiler_pprof 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,428 @@
|
|
|
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/msg.h"
|
|
29
|
+
|
|
30
|
+
#include "upb/msg_internal.h"
|
|
31
|
+
#include "upb/port_def.inc"
|
|
32
|
+
#include "upb/table_internal.h"
|
|
33
|
+
|
|
34
|
+
/** upb_Message ***************************************************************/
|
|
35
|
+
|
|
36
|
+
static const size_t overhead = sizeof(upb_Message_InternalData);
|
|
37
|
+
|
|
38
|
+
static const upb_Message_Internal* upb_Message_Getinternal_const(
|
|
39
|
+
const upb_Message* msg) {
|
|
40
|
+
ptrdiff_t size = sizeof(upb_Message_Internal);
|
|
41
|
+
return (upb_Message_Internal*)((char*)msg - size);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
upb_Message* _upb_Message_New(const upb_MiniTable* l, upb_Arena* a) {
|
|
45
|
+
return _upb_Message_New_inl(l, a);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void _upb_Message_Clear(upb_Message* msg, const upb_MiniTable* l) {
|
|
49
|
+
void* mem = UPB_PTR_AT(msg, -sizeof(upb_Message_Internal), char);
|
|
50
|
+
memset(mem, 0, upb_msg_sizeof(l));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static bool realloc_internal(upb_Message* msg, size_t need, upb_Arena* arena) {
|
|
54
|
+
upb_Message_Internal* in = upb_Message_Getinternal(msg);
|
|
55
|
+
if (!in->internal) {
|
|
56
|
+
/* No internal data, allocate from scratch. */
|
|
57
|
+
size_t size = UPB_MAX(128, _upb_Log2CeilingSize(need + overhead));
|
|
58
|
+
upb_Message_InternalData* internal = upb_Arena_Malloc(arena, size);
|
|
59
|
+
if (!internal) return false;
|
|
60
|
+
internal->size = size;
|
|
61
|
+
internal->unknown_end = overhead;
|
|
62
|
+
internal->ext_begin = size;
|
|
63
|
+
in->internal = internal;
|
|
64
|
+
} else if (in->internal->ext_begin - in->internal->unknown_end < need) {
|
|
65
|
+
/* Internal data is too small, reallocate. */
|
|
66
|
+
size_t new_size = _upb_Log2CeilingSize(in->internal->size + need);
|
|
67
|
+
size_t ext_bytes = in->internal->size - in->internal->ext_begin;
|
|
68
|
+
size_t new_ext_begin = new_size - ext_bytes;
|
|
69
|
+
upb_Message_InternalData* internal =
|
|
70
|
+
upb_Arena_Realloc(arena, in->internal, in->internal->size, new_size);
|
|
71
|
+
if (!internal) return false;
|
|
72
|
+
if (ext_bytes) {
|
|
73
|
+
/* Need to move extension data to the end. */
|
|
74
|
+
char* ptr = (char*)internal;
|
|
75
|
+
memmove(ptr + new_ext_begin, ptr + internal->ext_begin, ext_bytes);
|
|
76
|
+
}
|
|
77
|
+
internal->ext_begin = new_ext_begin;
|
|
78
|
+
internal->size = new_size;
|
|
79
|
+
in->internal = internal;
|
|
80
|
+
}
|
|
81
|
+
UPB_ASSERT(in->internal->ext_begin - in->internal->unknown_end >= need);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
bool _upb_Message_AddUnknown(upb_Message* msg, const char* data, size_t len,
|
|
86
|
+
upb_Arena* arena) {
|
|
87
|
+
if (!realloc_internal(msg, len, arena)) return false;
|
|
88
|
+
upb_Message_Internal* in = upb_Message_Getinternal(msg);
|
|
89
|
+
memcpy(UPB_PTR_AT(in->internal, in->internal->unknown_end, char), data, len);
|
|
90
|
+
in->internal->unknown_end += len;
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void _upb_Message_DiscardUnknown_shallow(upb_Message* msg) {
|
|
95
|
+
upb_Message_Internal* in = upb_Message_Getinternal(msg);
|
|
96
|
+
if (in->internal) {
|
|
97
|
+
in->internal->unknown_end = overhead;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const char* upb_Message_GetUnknown(const upb_Message* msg, size_t* len) {
|
|
102
|
+
const upb_Message_Internal* in = upb_Message_Getinternal_const(msg);
|
|
103
|
+
if (in->internal) {
|
|
104
|
+
*len = in->internal->unknown_end - overhead;
|
|
105
|
+
return (char*)(in->internal + 1);
|
|
106
|
+
} else {
|
|
107
|
+
*len = 0;
|
|
108
|
+
return NULL;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const upb_Message_Extension* _upb_Message_Getexts(const upb_Message* msg,
|
|
113
|
+
size_t* count) {
|
|
114
|
+
const upb_Message_Internal* in = upb_Message_Getinternal_const(msg);
|
|
115
|
+
if (in->internal) {
|
|
116
|
+
*count = (in->internal->size - in->internal->ext_begin) /
|
|
117
|
+
sizeof(upb_Message_Extension);
|
|
118
|
+
return UPB_PTR_AT(in->internal, in->internal->ext_begin, void);
|
|
119
|
+
} else {
|
|
120
|
+
*count = 0;
|
|
121
|
+
return NULL;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const upb_Message_Extension* _upb_Message_Getext(
|
|
126
|
+
const upb_Message* msg, const upb_MiniTable_Extension* e) {
|
|
127
|
+
size_t n;
|
|
128
|
+
const upb_Message_Extension* ext = _upb_Message_Getexts(msg, &n);
|
|
129
|
+
|
|
130
|
+
/* For now we use linear search exclusively to find extensions. If this
|
|
131
|
+
* becomes an issue due to messages with lots of extensions, we can introduce
|
|
132
|
+
* a table of some sort. */
|
|
133
|
+
for (size_t i = 0; i < n; i++) {
|
|
134
|
+
if (ext[i].ext == e) {
|
|
135
|
+
return &ext[i];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return NULL;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
void _upb_Message_Clearext(upb_Message* msg,
|
|
143
|
+
const upb_MiniTable_Extension* ext_l) {
|
|
144
|
+
upb_Message_Internal* in = upb_Message_Getinternal(msg);
|
|
145
|
+
if (!in->internal) return;
|
|
146
|
+
const upb_Message_Extension* base =
|
|
147
|
+
UPB_PTR_AT(in->internal, in->internal->ext_begin, void);
|
|
148
|
+
upb_Message_Extension* ext =
|
|
149
|
+
(upb_Message_Extension*)_upb_Message_Getext(msg, ext_l);
|
|
150
|
+
if (ext) {
|
|
151
|
+
*ext = *base;
|
|
152
|
+
in->internal->ext_begin += sizeof(upb_Message_Extension);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
upb_Message_Extension* _upb_Message_GetOrCreateExtension(
|
|
157
|
+
upb_Message* msg, const upb_MiniTable_Extension* e, upb_Arena* arena) {
|
|
158
|
+
upb_Message_Extension* ext =
|
|
159
|
+
(upb_Message_Extension*)_upb_Message_Getext(msg, e);
|
|
160
|
+
if (ext) return ext;
|
|
161
|
+
if (!realloc_internal(msg, sizeof(upb_Message_Extension), arena)) return NULL;
|
|
162
|
+
upb_Message_Internal* in = upb_Message_Getinternal(msg);
|
|
163
|
+
in->internal->ext_begin -= sizeof(upb_Message_Extension);
|
|
164
|
+
ext = UPB_PTR_AT(in->internal, in->internal->ext_begin, void);
|
|
165
|
+
memset(ext, 0, sizeof(upb_Message_Extension));
|
|
166
|
+
ext->ext = e;
|
|
167
|
+
return ext;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
size_t upb_Message_ExtensionCount(const upb_Message* msg) {
|
|
171
|
+
size_t count;
|
|
172
|
+
_upb_Message_Getexts(msg, &count);
|
|
173
|
+
return count;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** upb_Array *****************************************************************/
|
|
177
|
+
|
|
178
|
+
bool _upb_array_realloc(upb_Array* arr, size_t min_size, upb_Arena* arena) {
|
|
179
|
+
size_t new_size = UPB_MAX(arr->size, 4);
|
|
180
|
+
int elem_size_lg2 = arr->data & 7;
|
|
181
|
+
size_t old_bytes = arr->size << elem_size_lg2;
|
|
182
|
+
size_t new_bytes;
|
|
183
|
+
void* ptr = _upb_array_ptr(arr);
|
|
184
|
+
|
|
185
|
+
/* Log2 ceiling of size. */
|
|
186
|
+
while (new_size < min_size) new_size *= 2;
|
|
187
|
+
|
|
188
|
+
new_bytes = new_size << elem_size_lg2;
|
|
189
|
+
ptr = upb_Arena_Realloc(arena, ptr, old_bytes, new_bytes);
|
|
190
|
+
|
|
191
|
+
if (!ptr) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
arr->data = _upb_tag_arrptr(ptr, elem_size_lg2);
|
|
196
|
+
arr->size = new_size;
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
static upb_Array* getorcreate_array(upb_Array** arr_ptr, int elem_size_lg2,
|
|
201
|
+
upb_Arena* arena) {
|
|
202
|
+
upb_Array* arr = *arr_ptr;
|
|
203
|
+
if (!arr) {
|
|
204
|
+
arr = _upb_Array_New(arena, 4, elem_size_lg2);
|
|
205
|
+
if (!arr) return NULL;
|
|
206
|
+
*arr_ptr = arr;
|
|
207
|
+
}
|
|
208
|
+
return arr;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
void* _upb_Array_Resize_fallback(upb_Array** arr_ptr, size_t size,
|
|
212
|
+
int elem_size_lg2, upb_Arena* arena) {
|
|
213
|
+
upb_Array* arr = getorcreate_array(arr_ptr, elem_size_lg2, arena);
|
|
214
|
+
return arr && _upb_Array_Resize(arr, size, arena) ? _upb_array_ptr(arr)
|
|
215
|
+
: NULL;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
bool _upb_Array_Append_fallback(upb_Array** arr_ptr, const void* value,
|
|
219
|
+
int elem_size_lg2, upb_Arena* arena) {
|
|
220
|
+
upb_Array* arr = getorcreate_array(arr_ptr, elem_size_lg2, arena);
|
|
221
|
+
if (!arr) return false;
|
|
222
|
+
|
|
223
|
+
size_t elems = arr->len;
|
|
224
|
+
|
|
225
|
+
if (!_upb_Array_Resize(arr, elems + 1, arena)) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
char* data = _upb_array_ptr(arr);
|
|
230
|
+
memcpy(data + (elems << elem_size_lg2), value, 1 << elem_size_lg2);
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** upb_Map *******************************************************************/
|
|
235
|
+
|
|
236
|
+
upb_Map* _upb_Map_New(upb_Arena* a, size_t key_size, size_t value_size) {
|
|
237
|
+
upb_Map* map = upb_Arena_Malloc(a, sizeof(upb_Map));
|
|
238
|
+
|
|
239
|
+
if (!map) {
|
|
240
|
+
return NULL;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
upb_strtable_init(&map->table, 4, a);
|
|
244
|
+
map->key_size = key_size;
|
|
245
|
+
map->val_size = value_size;
|
|
246
|
+
|
|
247
|
+
return map;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
static void _upb_mapsorter_getkeys(const void* _a, const void* _b, void* a_key,
|
|
251
|
+
void* b_key, size_t size) {
|
|
252
|
+
const upb_tabent* const* a = _a;
|
|
253
|
+
const upb_tabent* const* b = _b;
|
|
254
|
+
upb_StringView a_tabkey = upb_tabstrview((*a)->key);
|
|
255
|
+
upb_StringView b_tabkey = upb_tabstrview((*b)->key);
|
|
256
|
+
_upb_map_fromkey(a_tabkey, a_key, size);
|
|
257
|
+
_upb_map_fromkey(b_tabkey, b_key, size);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
#define UPB_COMPARE_INTEGERS(a, b) ((a) < (b) ? -1 : ((a) == (b) ? 0 : 1))
|
|
261
|
+
|
|
262
|
+
static int _upb_mapsorter_cmpi64(const void* _a, const void* _b) {
|
|
263
|
+
int64_t a, b;
|
|
264
|
+
_upb_mapsorter_getkeys(_a, _b, &a, &b, 8);
|
|
265
|
+
return UPB_COMPARE_INTEGERS(a, b);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
static int _upb_mapsorter_cmpu64(const void* _a, const void* _b) {
|
|
269
|
+
uint64_t a, b;
|
|
270
|
+
_upb_mapsorter_getkeys(_a, _b, &a, &b, 8);
|
|
271
|
+
return UPB_COMPARE_INTEGERS(a, b);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static int _upb_mapsorter_cmpi32(const void* _a, const void* _b) {
|
|
275
|
+
int32_t a, b;
|
|
276
|
+
_upb_mapsorter_getkeys(_a, _b, &a, &b, 4);
|
|
277
|
+
return UPB_COMPARE_INTEGERS(a, b);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
static int _upb_mapsorter_cmpu32(const void* _a, const void* _b) {
|
|
281
|
+
uint32_t a, b;
|
|
282
|
+
_upb_mapsorter_getkeys(_a, _b, &a, &b, 4);
|
|
283
|
+
return UPB_COMPARE_INTEGERS(a, b);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
static int _upb_mapsorter_cmpbool(const void* _a, const void* _b) {
|
|
287
|
+
bool a, b;
|
|
288
|
+
_upb_mapsorter_getkeys(_a, _b, &a, &b, 1);
|
|
289
|
+
return UPB_COMPARE_INTEGERS(a, b);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
static int _upb_mapsorter_cmpstr(const void* _a, const void* _b) {
|
|
293
|
+
upb_StringView a, b;
|
|
294
|
+
_upb_mapsorter_getkeys(_a, _b, &a, &b, UPB_MAPTYPE_STRING);
|
|
295
|
+
size_t common_size = UPB_MIN(a.size, b.size);
|
|
296
|
+
int cmp = memcmp(a.data, b.data, common_size);
|
|
297
|
+
if (cmp) return -cmp;
|
|
298
|
+
return UPB_COMPARE_INTEGERS(a.size, b.size);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
#undef UPB_COMPARE_INTEGERS
|
|
302
|
+
|
|
303
|
+
bool _upb_mapsorter_pushmap(_upb_mapsorter* s, upb_FieldType key_type,
|
|
304
|
+
const upb_Map* map, _upb_sortedmap* sorted) {
|
|
305
|
+
int map_size = _upb_Map_Size(map);
|
|
306
|
+
sorted->start = s->size;
|
|
307
|
+
sorted->pos = sorted->start;
|
|
308
|
+
sorted->end = sorted->start + map_size;
|
|
309
|
+
|
|
310
|
+
/* Grow s->entries if necessary. */
|
|
311
|
+
if (sorted->end > s->cap) {
|
|
312
|
+
s->cap = _upb_Log2CeilingSize(sorted->end);
|
|
313
|
+
s->entries = realloc(s->entries, s->cap * sizeof(*s->entries));
|
|
314
|
+
if (!s->entries) return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
s->size = sorted->end;
|
|
318
|
+
|
|
319
|
+
/* Copy non-empty entries from the table to s->entries. */
|
|
320
|
+
upb_tabent const** dst = &s->entries[sorted->start];
|
|
321
|
+
const upb_tabent* src = map->table.t.entries;
|
|
322
|
+
const upb_tabent* end = src + upb_table_size(&map->table.t);
|
|
323
|
+
for (; src < end; src++) {
|
|
324
|
+
if (!upb_tabent_isempty(src)) {
|
|
325
|
+
*dst = src;
|
|
326
|
+
dst++;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
UPB_ASSERT(dst == &s->entries[sorted->end]);
|
|
330
|
+
|
|
331
|
+
/* Sort entries according to the key type. */
|
|
332
|
+
|
|
333
|
+
int (*compar)(const void*, const void*);
|
|
334
|
+
|
|
335
|
+
switch (key_type) {
|
|
336
|
+
case kUpb_FieldType_Int64:
|
|
337
|
+
case kUpb_FieldType_SFixed64:
|
|
338
|
+
case kUpb_FieldType_SInt64:
|
|
339
|
+
compar = _upb_mapsorter_cmpi64;
|
|
340
|
+
break;
|
|
341
|
+
case kUpb_FieldType_UInt64:
|
|
342
|
+
case kUpb_FieldType_Fixed64:
|
|
343
|
+
compar = _upb_mapsorter_cmpu64;
|
|
344
|
+
break;
|
|
345
|
+
case kUpb_FieldType_Int32:
|
|
346
|
+
case kUpb_FieldType_SInt32:
|
|
347
|
+
case kUpb_FieldType_SFixed32:
|
|
348
|
+
case kUpb_FieldType_Enum:
|
|
349
|
+
compar = _upb_mapsorter_cmpi32;
|
|
350
|
+
break;
|
|
351
|
+
case kUpb_FieldType_UInt32:
|
|
352
|
+
case kUpb_FieldType_Fixed32:
|
|
353
|
+
compar = _upb_mapsorter_cmpu32;
|
|
354
|
+
break;
|
|
355
|
+
case kUpb_FieldType_Bool:
|
|
356
|
+
compar = _upb_mapsorter_cmpbool;
|
|
357
|
+
break;
|
|
358
|
+
case kUpb_FieldType_String:
|
|
359
|
+
case kUpb_FieldType_Bytes:
|
|
360
|
+
compar = _upb_mapsorter_cmpstr;
|
|
361
|
+
break;
|
|
362
|
+
default:
|
|
363
|
+
UPB_UNREACHABLE();
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
qsort(&s->entries[sorted->start], map_size, sizeof(*s->entries), compar);
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** upb_ExtensionRegistry *****************************************************/
|
|
371
|
+
|
|
372
|
+
struct upb_ExtensionRegistry {
|
|
373
|
+
upb_Arena* arena;
|
|
374
|
+
upb_strtable exts; /* Key is upb_MiniTable* concatenated with fieldnum. */
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
#define EXTREG_KEY_SIZE (sizeof(upb_MiniTable*) + sizeof(uint32_t))
|
|
378
|
+
|
|
379
|
+
static void extreg_key(char* buf, const upb_MiniTable* l, uint32_t fieldnum) {
|
|
380
|
+
memcpy(buf, &l, sizeof(l));
|
|
381
|
+
memcpy(buf + sizeof(l), &fieldnum, sizeof(fieldnum));
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena) {
|
|
385
|
+
upb_ExtensionRegistry* r = upb_Arena_Malloc(arena, sizeof(*r));
|
|
386
|
+
if (!r) return NULL;
|
|
387
|
+
r->arena = arena;
|
|
388
|
+
if (!upb_strtable_init(&r->exts, 8, arena)) return NULL;
|
|
389
|
+
return r;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
bool _upb_extreg_add(upb_ExtensionRegistry* r,
|
|
393
|
+
const upb_MiniTable_Extension** e, size_t count) {
|
|
394
|
+
char buf[EXTREG_KEY_SIZE];
|
|
395
|
+
const upb_MiniTable_Extension** start = e;
|
|
396
|
+
const upb_MiniTable_Extension** end = UPB_PTRADD(e, count);
|
|
397
|
+
for (; e < end; e++) {
|
|
398
|
+
const upb_MiniTable_Extension* ext = *e;
|
|
399
|
+
extreg_key(buf, ext->extendee, ext->field.number);
|
|
400
|
+
if (!upb_strtable_insert(&r->exts, buf, EXTREG_KEY_SIZE,
|
|
401
|
+
upb_value_constptr(ext), r->arena)) {
|
|
402
|
+
goto failure;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return true;
|
|
406
|
+
|
|
407
|
+
failure:
|
|
408
|
+
/* Back out the entries previously added. */
|
|
409
|
+
for (end = e, e = start; e < end; e++) {
|
|
410
|
+
const upb_MiniTable_Extension* ext = *e;
|
|
411
|
+
extreg_key(buf, ext->extendee, ext->field.number);
|
|
412
|
+
upb_strtable_remove2(&r->exts, buf, EXTREG_KEY_SIZE, NULL);
|
|
413
|
+
}
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
const upb_MiniTable_Extension* _upb_extreg_get(const upb_ExtensionRegistry* r,
|
|
418
|
+
const upb_MiniTable* l,
|
|
419
|
+
uint32_t num) {
|
|
420
|
+
char buf[EXTREG_KEY_SIZE];
|
|
421
|
+
upb_value v;
|
|
422
|
+
extreg_key(buf, l, num);
|
|
423
|
+
if (upb_strtable_lookup2(&r->exts, buf, EXTREG_KEY_SIZE, &v)) {
|
|
424
|
+
return upb_value_getconstptr(v);
|
|
425
|
+
} else {
|
|
426
|
+
return NULL;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
/*
|
|
29
|
+
* Public APIs for message operations that do not require descriptors.
|
|
30
|
+
* These functions can be used even in build that does not want to depend on
|
|
31
|
+
* reflection or descriptors.
|
|
32
|
+
*
|
|
33
|
+
* Descriptor-based reflection functionality lives in reflection.h.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
#ifndef UPB_MSG_H_
|
|
37
|
+
#define UPB_MSG_H_
|
|
38
|
+
|
|
39
|
+
#include <stddef.h>
|
|
40
|
+
|
|
41
|
+
#include "upb/upb.h"
|
|
42
|
+
|
|
43
|
+
#ifdef __cplusplus
|
|
44
|
+
extern "C" {
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
/** upb_Message ***************************************************************/
|
|
48
|
+
|
|
49
|
+
typedef void upb_Message;
|
|
50
|
+
|
|
51
|
+
/* For users these are opaque. They can be obtained from
|
|
52
|
+
* upb_MessageDef_MiniTable() but users cannot access any of the members. */
|
|
53
|
+
struct upb_MiniTable;
|
|
54
|
+
typedef struct upb_MiniTable upb_MiniTable;
|
|
55
|
+
|
|
56
|
+
/* Adds unknown data (serialized protobuf data) to the given message. The data
|
|
57
|
+
* is copied into the message instance. */
|
|
58
|
+
void upb_Message_AddUnknown(upb_Message* msg, const char* data, size_t len,
|
|
59
|
+
upb_Arena* arena);
|
|
60
|
+
|
|
61
|
+
/* Returns a reference to the message's unknown data. */
|
|
62
|
+
const char* upb_Message_GetUnknown(const upb_Message* msg, size_t* len);
|
|
63
|
+
|
|
64
|
+
/* Returns the number of extensions present in this message. */
|
|
65
|
+
size_t upb_Message_ExtensionCount(const upb_Message* msg);
|
|
66
|
+
|
|
67
|
+
/** upb_ExtensionRegistry *****************************************************/
|
|
68
|
+
|
|
69
|
+
/* Extension registry: a dynamic data structure that stores a map of:
|
|
70
|
+
* (upb_MiniTable, number) -> extension info
|
|
71
|
+
*
|
|
72
|
+
* upb_decode() uses upb_ExtensionRegistry to look up extensions while parsing
|
|
73
|
+
* binary format.
|
|
74
|
+
*
|
|
75
|
+
* upb_ExtensionRegistry is part of the mini-table (msglayout) family of
|
|
76
|
+
* objects. Like all mini-table objects, it is suitable for reflection-less
|
|
77
|
+
* builds that do not want to expose names into the binary.
|
|
78
|
+
*
|
|
79
|
+
* Unlike most mini-table types, upb_ExtensionRegistry requires dynamic memory
|
|
80
|
+
* allocation and dynamic initialization:
|
|
81
|
+
* * If reflection is being used, then upb_DefPool will construct an appropriate
|
|
82
|
+
* upb_ExtensionRegistry automatically.
|
|
83
|
+
* * For a mini-table only build, the user must manually construct the
|
|
84
|
+
* upb_ExtensionRegistry and populate it with all of the extensions the user
|
|
85
|
+
* cares about.
|
|
86
|
+
* * A third alternative is to manually unpack relevant extensions after the
|
|
87
|
+
* main parse is complete, similar to how Any works. This is perhaps the
|
|
88
|
+
* nicest solution from the perspective of reducing dependencies, avoiding
|
|
89
|
+
* dynamic memory allocation, and avoiding the need to parse uninteresting
|
|
90
|
+
* extensions. The downsides are:
|
|
91
|
+
* (1) parse errors are not caught during the main parse
|
|
92
|
+
* (2) the CPU hit of parsing comes during access, which could cause an
|
|
93
|
+
* undesirable stutter in application performance.
|
|
94
|
+
*
|
|
95
|
+
* Users cannot directly get or put into this map. Users can only add the
|
|
96
|
+
* extensions from a generated module and pass the extension registry to the
|
|
97
|
+
* binary decoder.
|
|
98
|
+
*
|
|
99
|
+
* A upb_DefPool provides a upb_ExtensionRegistry, so any users who use
|
|
100
|
+
* reflection do not need to populate a upb_ExtensionRegistry directly.
|
|
101
|
+
*/
|
|
102
|
+
|
|
103
|
+
struct upb_ExtensionRegistry;
|
|
104
|
+
typedef struct upb_ExtensionRegistry upb_ExtensionRegistry;
|
|
105
|
+
|
|
106
|
+
/* Creates a upb_ExtensionRegistry in the given arena. The arena must outlive
|
|
107
|
+
* any use of the extreg. */
|
|
108
|
+
upb_ExtensionRegistry* upb_ExtensionRegistry_New(upb_Arena* arena);
|
|
109
|
+
|
|
110
|
+
#ifdef __cplusplus
|
|
111
|
+
} /* extern "C" */
|
|
112
|
+
#endif
|
|
113
|
+
|
|
114
|
+
#endif /* UPB_MSG_INT_H_ */
|