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,378 @@
|
|
|
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
|
+
* This file contains shared definitions that are widely used across upb.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
#ifndef UPB_H_
|
|
33
|
+
#define UPB_H_
|
|
34
|
+
|
|
35
|
+
#include <assert.h>
|
|
36
|
+
#include <stdarg.h>
|
|
37
|
+
#include <stdbool.h>
|
|
38
|
+
#include <stddef.h>
|
|
39
|
+
#include <stdint.h>
|
|
40
|
+
#include <string.h>
|
|
41
|
+
|
|
42
|
+
#include "upb/port_def.inc"
|
|
43
|
+
|
|
44
|
+
#ifdef __cplusplus
|
|
45
|
+
extern "C" {
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
/* upb_Status *****************************************************************/
|
|
49
|
+
|
|
50
|
+
#define _kUpb_Status_MaxMessage 127
|
|
51
|
+
|
|
52
|
+
typedef struct {
|
|
53
|
+
bool ok;
|
|
54
|
+
char msg[_kUpb_Status_MaxMessage]; /* Error message; NULL-terminated. */
|
|
55
|
+
} upb_Status;
|
|
56
|
+
|
|
57
|
+
const char* upb_Status_ErrorMessage(const upb_Status* status);
|
|
58
|
+
bool upb_Status_IsOk(const upb_Status* status);
|
|
59
|
+
|
|
60
|
+
/* These are no-op if |status| is NULL. */
|
|
61
|
+
void upb_Status_Clear(upb_Status* status);
|
|
62
|
+
void upb_Status_SetErrorMessage(upb_Status* status, const char* msg);
|
|
63
|
+
void upb_Status_SetErrorFormat(upb_Status* status, const char* fmt, ...)
|
|
64
|
+
UPB_PRINTF(2, 3);
|
|
65
|
+
void upb_Status_VSetErrorFormat(upb_Status* status, const char* fmt,
|
|
66
|
+
va_list args) UPB_PRINTF(2, 0);
|
|
67
|
+
void upb_Status_VAppendErrorFormat(upb_Status* status, const char* fmt,
|
|
68
|
+
va_list args) UPB_PRINTF(2, 0);
|
|
69
|
+
|
|
70
|
+
/** upb_StringView ************************************************************/
|
|
71
|
+
|
|
72
|
+
typedef struct {
|
|
73
|
+
const char* data;
|
|
74
|
+
size_t size;
|
|
75
|
+
} upb_StringView;
|
|
76
|
+
|
|
77
|
+
UPB_INLINE upb_StringView upb_StringView_FromDataAndSize(const char* data,
|
|
78
|
+
size_t size) {
|
|
79
|
+
upb_StringView ret;
|
|
80
|
+
ret.data = data;
|
|
81
|
+
ret.size = size;
|
|
82
|
+
return ret;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
UPB_INLINE upb_StringView upb_StringView_FromString(const char* data) {
|
|
86
|
+
return upb_StringView_FromDataAndSize(data, strlen(data));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
UPB_INLINE bool upb_StringView_IsEqual(upb_StringView a, upb_StringView b) {
|
|
90
|
+
return a.size == b.size && memcmp(a.data, b.data, a.size) == 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#define UPB_STRINGVIEW_INIT(ptr, len) \
|
|
94
|
+
{ ptr, len }
|
|
95
|
+
|
|
96
|
+
#define UPB_STRINGVIEW_FORMAT "%.*s"
|
|
97
|
+
#define UPB_STRINGVIEW_ARGS(view) (int)(view).size, (view).data
|
|
98
|
+
|
|
99
|
+
/** upb_alloc *****************************************************************/
|
|
100
|
+
|
|
101
|
+
/* A upb_alloc is a possibly-stateful allocator object.
|
|
102
|
+
*
|
|
103
|
+
* It could either be an arena allocator (which doesn't require individual
|
|
104
|
+
* free() calls) or a regular malloc() (which does). The client must therefore
|
|
105
|
+
* free memory unless it knows that the allocator is an arena allocator. */
|
|
106
|
+
|
|
107
|
+
struct upb_alloc;
|
|
108
|
+
typedef struct upb_alloc upb_alloc;
|
|
109
|
+
|
|
110
|
+
/* A malloc()/free() function.
|
|
111
|
+
* If "size" is 0 then the function acts like free(), otherwise it acts like
|
|
112
|
+
* realloc(). Only "oldsize" bytes from a previous allocation are preserved. */
|
|
113
|
+
typedef void* upb_alloc_func(upb_alloc* alloc, void* ptr, size_t oldsize,
|
|
114
|
+
size_t size);
|
|
115
|
+
|
|
116
|
+
struct upb_alloc {
|
|
117
|
+
upb_alloc_func* func;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
UPB_INLINE void* upb_malloc(upb_alloc* alloc, size_t size) {
|
|
121
|
+
UPB_ASSERT(alloc);
|
|
122
|
+
return alloc->func(alloc, NULL, 0, size);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
UPB_INLINE void* upb_realloc(upb_alloc* alloc, void* ptr, size_t oldsize,
|
|
126
|
+
size_t size) {
|
|
127
|
+
UPB_ASSERT(alloc);
|
|
128
|
+
return alloc->func(alloc, ptr, oldsize, size);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
UPB_INLINE void upb_free(upb_alloc* alloc, void* ptr) {
|
|
132
|
+
assert(alloc);
|
|
133
|
+
alloc->func(alloc, ptr, 0, 0);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* The global allocator used by upb. Uses the standard malloc()/free(). */
|
|
137
|
+
|
|
138
|
+
extern upb_alloc upb_alloc_global;
|
|
139
|
+
|
|
140
|
+
/* Functions that hard-code the global malloc.
|
|
141
|
+
*
|
|
142
|
+
* We still get benefit because we can put custom logic into our global
|
|
143
|
+
* allocator, like injecting out-of-memory faults in debug/testing builds. */
|
|
144
|
+
|
|
145
|
+
UPB_INLINE void* upb_gmalloc(size_t size) {
|
|
146
|
+
return upb_malloc(&upb_alloc_global, size);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
UPB_INLINE void* upb_grealloc(void* ptr, size_t oldsize, size_t size) {
|
|
150
|
+
return upb_realloc(&upb_alloc_global, ptr, oldsize, size);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
UPB_INLINE void upb_gfree(void* ptr) { upb_free(&upb_alloc_global, ptr); }
|
|
154
|
+
|
|
155
|
+
/* upb_Arena ******************************************************************/
|
|
156
|
+
|
|
157
|
+
/* upb_Arena is a specific allocator implementation that uses arena allocation.
|
|
158
|
+
* The user provides an allocator that will be used to allocate the underlying
|
|
159
|
+
* arena blocks. Arenas by nature do not require the individual allocations
|
|
160
|
+
* to be freed. However the Arena does allow users to register cleanup
|
|
161
|
+
* functions that will run when the arena is destroyed.
|
|
162
|
+
*
|
|
163
|
+
* A upb_Arena is *not* thread-safe.
|
|
164
|
+
*
|
|
165
|
+
* You could write a thread-safe arena allocator that satisfies the
|
|
166
|
+
* upb_alloc interface, but it would not be as efficient for the
|
|
167
|
+
* single-threaded case. */
|
|
168
|
+
|
|
169
|
+
typedef void upb_CleanupFunc(void* ud);
|
|
170
|
+
|
|
171
|
+
struct upb_Arena;
|
|
172
|
+
typedef struct upb_Arena upb_Arena;
|
|
173
|
+
|
|
174
|
+
typedef struct {
|
|
175
|
+
/* We implement the allocator interface.
|
|
176
|
+
* This must be the first member of upb_Arena!
|
|
177
|
+
* TODO(haberman): remove once handlers are gone. */
|
|
178
|
+
upb_alloc alloc;
|
|
179
|
+
|
|
180
|
+
char *ptr, *end;
|
|
181
|
+
} _upb_ArenaHead;
|
|
182
|
+
|
|
183
|
+
/* Creates an arena from the given initial block (if any -- n may be 0).
|
|
184
|
+
* Additional blocks will be allocated from |alloc|. If |alloc| is NULL, this
|
|
185
|
+
* is a fixed-size arena and cannot grow. */
|
|
186
|
+
upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc);
|
|
187
|
+
void upb_Arena_Free(upb_Arena* a);
|
|
188
|
+
bool upb_Arena_AddCleanup(upb_Arena* a, void* ud, upb_CleanupFunc* func);
|
|
189
|
+
bool upb_Arena_Fuse(upb_Arena* a, upb_Arena* b);
|
|
190
|
+
void* _upb_Arena_SlowMalloc(upb_Arena* a, size_t size);
|
|
191
|
+
|
|
192
|
+
UPB_INLINE upb_alloc* upb_Arena_Alloc(upb_Arena* a) { return (upb_alloc*)a; }
|
|
193
|
+
|
|
194
|
+
UPB_INLINE size_t _upb_ArenaHas(upb_Arena* a) {
|
|
195
|
+
_upb_ArenaHead* h = (_upb_ArenaHead*)a;
|
|
196
|
+
return (size_t)(h->end - h->ptr);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
UPB_INLINE void* _upb_Arena_FastMalloc(upb_Arena* a, size_t size) {
|
|
200
|
+
_upb_ArenaHead* h = (_upb_ArenaHead*)a;
|
|
201
|
+
void* ret = h->ptr;
|
|
202
|
+
UPB_ASSERT(UPB_ALIGN_MALLOC((uintptr_t)ret) == (uintptr_t)ret);
|
|
203
|
+
UPB_ASSERT(UPB_ALIGN_MALLOC(size) == size);
|
|
204
|
+
UPB_UNPOISON_MEMORY_REGION(ret, size);
|
|
205
|
+
|
|
206
|
+
h->ptr += size;
|
|
207
|
+
|
|
208
|
+
#if UPB_ASAN
|
|
209
|
+
{
|
|
210
|
+
size_t guard_size = 32;
|
|
211
|
+
if (_upb_ArenaHas(a) >= guard_size) {
|
|
212
|
+
h->ptr += guard_size;
|
|
213
|
+
} else {
|
|
214
|
+
h->ptr = h->end;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
#endif
|
|
218
|
+
|
|
219
|
+
return ret;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
UPB_INLINE void* upb_Arena_Malloc(upb_Arena* a, size_t size) {
|
|
223
|
+
size = UPB_ALIGN_MALLOC(size);
|
|
224
|
+
|
|
225
|
+
if (UPB_UNLIKELY(_upb_ArenaHas(a) < size)) {
|
|
226
|
+
return _upb_Arena_SlowMalloc(a, size);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return _upb_Arena_FastMalloc(a, size);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Shrinks the last alloc from arena.
|
|
233
|
+
// REQUIRES: (ptr, oldsize) was the last malloc/realloc from this arena.
|
|
234
|
+
// We could also add a upb_Arena_TryShrinkLast() which is simply a no-op if
|
|
235
|
+
// this was not the last alloc.
|
|
236
|
+
UPB_INLINE void upb_Arena_ShrinkLast(upb_Arena* a, void* ptr, size_t oldsize,
|
|
237
|
+
size_t size) {
|
|
238
|
+
_upb_ArenaHead* h = (_upb_ArenaHead*)a;
|
|
239
|
+
oldsize = UPB_ALIGN_MALLOC(oldsize);
|
|
240
|
+
size = UPB_ALIGN_MALLOC(size);
|
|
241
|
+
UPB_ASSERT((char*)ptr + oldsize == h->ptr); // Must be the last alloc.
|
|
242
|
+
UPB_ASSERT(size <= oldsize);
|
|
243
|
+
h->ptr = (char*)ptr + size;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
UPB_INLINE void* upb_Arena_Realloc(upb_Arena* a, void* ptr, size_t oldsize,
|
|
247
|
+
size_t size) {
|
|
248
|
+
_upb_ArenaHead* h = (_upb_ArenaHead*)a;
|
|
249
|
+
oldsize = UPB_ALIGN_MALLOC(oldsize);
|
|
250
|
+
size = UPB_ALIGN_MALLOC(size);
|
|
251
|
+
bool is_most_recent_alloc = (uintptr_t)ptr + oldsize == (uintptr_t)h->ptr;
|
|
252
|
+
|
|
253
|
+
if (is_most_recent_alloc) {
|
|
254
|
+
ptrdiff_t diff = size - oldsize;
|
|
255
|
+
if ((ptrdiff_t)_upb_ArenaHas(a) >= diff) {
|
|
256
|
+
h->ptr += diff;
|
|
257
|
+
return ptr;
|
|
258
|
+
}
|
|
259
|
+
} else if (size <= oldsize) {
|
|
260
|
+
return ptr;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
void* ret = upb_Arena_Malloc(a, size);
|
|
264
|
+
|
|
265
|
+
if (ret && oldsize > 0) {
|
|
266
|
+
memcpy(ret, ptr, UPB_MIN(oldsize, size));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return ret;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
UPB_INLINE upb_Arena* upb_Arena_New(void) {
|
|
273
|
+
return upb_Arena_Init(NULL, 0, &upb_alloc_global);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* Constants ******************************************************************/
|
|
277
|
+
|
|
278
|
+
/* A list of types as they are encoded on-the-wire. */
|
|
279
|
+
typedef enum {
|
|
280
|
+
kUpb_WireType_Varint = 0,
|
|
281
|
+
kUpb_WireType_64Bit = 1,
|
|
282
|
+
kUpb_WireType_Delimited = 2,
|
|
283
|
+
kUpb_WireType_StartGroup = 3,
|
|
284
|
+
kUpb_WireType_EndGroup = 4,
|
|
285
|
+
kUpb_WireType_32Bit = 5
|
|
286
|
+
} upb_WireType;
|
|
287
|
+
|
|
288
|
+
/* The types a field can have. Note that this list is not identical to the
|
|
289
|
+
* types defined in descriptor.proto, which gives INT32 and SINT32 separate
|
|
290
|
+
* types (we distinguish the two with the "integer encoding" enum below). */
|
|
291
|
+
typedef enum {
|
|
292
|
+
kUpb_CType_Bool = 1,
|
|
293
|
+
kUpb_CType_Float = 2,
|
|
294
|
+
kUpb_CType_Int32 = 3,
|
|
295
|
+
kUpb_CType_UInt32 = 4,
|
|
296
|
+
kUpb_CType_Enum = 5, /* Enum values are int32. */
|
|
297
|
+
kUpb_CType_Message = 6,
|
|
298
|
+
kUpb_CType_Double = 7,
|
|
299
|
+
kUpb_CType_Int64 = 8,
|
|
300
|
+
kUpb_CType_UInt64 = 9,
|
|
301
|
+
kUpb_CType_String = 10,
|
|
302
|
+
kUpb_CType_Bytes = 11
|
|
303
|
+
} upb_CType;
|
|
304
|
+
|
|
305
|
+
/* The repeated-ness of each field; this matches descriptor.proto. */
|
|
306
|
+
typedef enum {
|
|
307
|
+
kUpb_Label_Optional = 1,
|
|
308
|
+
kUpb_Label_Required = 2,
|
|
309
|
+
kUpb_Label_Repeated = 3
|
|
310
|
+
} upb_Label;
|
|
311
|
+
|
|
312
|
+
/* Descriptor types, as defined in descriptor.proto. */
|
|
313
|
+
typedef enum {
|
|
314
|
+
kUpb_FieldType_Double = 1,
|
|
315
|
+
kUpb_FieldType_Float = 2,
|
|
316
|
+
kUpb_FieldType_Int64 = 3,
|
|
317
|
+
kUpb_FieldType_UInt64 = 4,
|
|
318
|
+
kUpb_FieldType_Int32 = 5,
|
|
319
|
+
kUpb_FieldType_Fixed64 = 6,
|
|
320
|
+
kUpb_FieldType_Fixed32 = 7,
|
|
321
|
+
kUpb_FieldType_Bool = 8,
|
|
322
|
+
kUpb_FieldType_String = 9,
|
|
323
|
+
kUpb_FieldType_Group = 10,
|
|
324
|
+
kUpb_FieldType_Message = 11,
|
|
325
|
+
kUpb_FieldType_Bytes = 12,
|
|
326
|
+
kUpb_FieldType_UInt32 = 13,
|
|
327
|
+
kUpb_FieldType_Enum = 14,
|
|
328
|
+
kUpb_FieldType_SFixed32 = 15,
|
|
329
|
+
kUpb_FieldType_SFixed64 = 16,
|
|
330
|
+
kUpb_FieldType_SInt32 = 17,
|
|
331
|
+
kUpb_FieldType_SInt64 = 18
|
|
332
|
+
} upb_FieldType;
|
|
333
|
+
|
|
334
|
+
#define kUpb_Map_Begin ((size_t)-1)
|
|
335
|
+
|
|
336
|
+
UPB_INLINE bool _upb_IsLittleEndian(void) {
|
|
337
|
+
int x = 1;
|
|
338
|
+
return *(char*)&x == 1;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
UPB_INLINE uint32_t _upb_BigEndian_Swap32(uint32_t val) {
|
|
342
|
+
if (_upb_IsLittleEndian()) {
|
|
343
|
+
return val;
|
|
344
|
+
} else {
|
|
345
|
+
return ((val & 0xff) << 24) | ((val & 0xff00) << 8) |
|
|
346
|
+
((val & 0xff0000) >> 8) | ((val & 0xff000000) >> 24);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
UPB_INLINE uint64_t _upb_BigEndian_Swap64(uint64_t val) {
|
|
351
|
+
if (_upb_IsLittleEndian()) {
|
|
352
|
+
return val;
|
|
353
|
+
} else {
|
|
354
|
+
return ((uint64_t)_upb_BigEndian_Swap32(val) << 32) |
|
|
355
|
+
_upb_BigEndian_Swap32(val >> 32);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
UPB_INLINE int _upb_Log2Ceiling(int x) {
|
|
360
|
+
if (x <= 1) return 0;
|
|
361
|
+
#ifdef __GNUC__
|
|
362
|
+
return 32 - __builtin_clz(x - 1);
|
|
363
|
+
#else
|
|
364
|
+
int lg2 = 0;
|
|
365
|
+
while (1 << lg2 < x) lg2++;
|
|
366
|
+
return lg2;
|
|
367
|
+
#endif
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
UPB_INLINE int _upb_Log2CeilingSize(int x) { return 1 << _upb_Log2Ceiling(x); }
|
|
371
|
+
|
|
372
|
+
#include "upb/port_undef.inc"
|
|
373
|
+
|
|
374
|
+
#ifdef __cplusplus
|
|
375
|
+
} /* extern "C" */
|
|
376
|
+
#endif
|
|
377
|
+
|
|
378
|
+
#endif /* UPB_H_ */
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// Copyright (c) 2009-2021, Google LLC
|
|
2
|
+
// All rights reserved.
|
|
3
|
+
//
|
|
4
|
+
// Redistribution and use in source and binary forms, with or without
|
|
5
|
+
// modification, are permitted provided that the following conditions are met:
|
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
|
8
|
+
// * Redistributions in binary form must reproduce the above copyright
|
|
9
|
+
// notice, this list of conditions and the following disclaimer in the
|
|
10
|
+
// documentation and/or other materials provided with the distribution.
|
|
11
|
+
// * Neither the name of Google LLC nor the
|
|
12
|
+
// names of its contributors may be used to endorse or promote products
|
|
13
|
+
// derived from this software without specific prior written permission.
|
|
14
|
+
//
|
|
15
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
16
|
+
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
17
|
+
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
18
|
+
// ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
|
|
19
|
+
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
20
|
+
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
21
|
+
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
22
|
+
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
23
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
24
|
+
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
25
|
+
|
|
26
|
+
#ifndef UPB_HPP_
|
|
27
|
+
#define UPB_HPP_
|
|
28
|
+
|
|
29
|
+
#include <memory>
|
|
30
|
+
|
|
31
|
+
#include "upb/upb.h"
|
|
32
|
+
|
|
33
|
+
namespace upb {
|
|
34
|
+
|
|
35
|
+
class Status {
|
|
36
|
+
public:
|
|
37
|
+
Status() { upb_Status_Clear(&status_); }
|
|
38
|
+
|
|
39
|
+
upb_Status* ptr() { return &status_; }
|
|
40
|
+
|
|
41
|
+
// Returns true if there is no error.
|
|
42
|
+
bool ok() const { return upb_Status_IsOk(&status_); }
|
|
43
|
+
|
|
44
|
+
// Guaranteed to be NULL-terminated.
|
|
45
|
+
const char* error_message() const {
|
|
46
|
+
return upb_Status_ErrorMessage(&status_);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The error message will be truncated if it is longer than
|
|
50
|
+
// _kUpb_Status_MaxMessage-4.
|
|
51
|
+
void SetErrorMessage(const char* msg) {
|
|
52
|
+
upb_Status_SetErrorMessage(&status_, msg);
|
|
53
|
+
}
|
|
54
|
+
void SetFormattedErrorMessage(const char* fmt, ...) {
|
|
55
|
+
va_list args;
|
|
56
|
+
va_start(args, fmt);
|
|
57
|
+
upb_Status_VSetErrorFormat(&status_, fmt, args);
|
|
58
|
+
va_end(args);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Resets the status to a successful state with no message.
|
|
62
|
+
void Clear() { upb_Status_Clear(&status_); }
|
|
63
|
+
|
|
64
|
+
private:
|
|
65
|
+
upb_Status status_;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
class Arena {
|
|
69
|
+
public:
|
|
70
|
+
// A simple arena with no initial memory block and the default allocator.
|
|
71
|
+
Arena() : ptr_(upb_Arena_New(), upb_Arena_Free) {}
|
|
72
|
+
Arena(char* initial_block, size_t size)
|
|
73
|
+
: ptr_(upb_Arena_Init(initial_block, size, &upb_alloc_global),
|
|
74
|
+
upb_Arena_Free) {}
|
|
75
|
+
|
|
76
|
+
upb_Arena* ptr() { return ptr_.get(); }
|
|
77
|
+
|
|
78
|
+
// Allows this arena to be used as a generic allocator.
|
|
79
|
+
//
|
|
80
|
+
// The arena does not need free() calls so when using Arena as an allocator
|
|
81
|
+
// it is safe to skip them. However they are no-ops so there is no harm in
|
|
82
|
+
// calling free() either.
|
|
83
|
+
upb_alloc* allocator() { return upb_Arena_Alloc(ptr_.get()); }
|
|
84
|
+
|
|
85
|
+
// Add a cleanup function to run when the arena is destroyed.
|
|
86
|
+
// Returns false on out-of-memory.
|
|
87
|
+
template <class T>
|
|
88
|
+
bool Own(T* obj) {
|
|
89
|
+
return upb_Arena_AddCleanup(ptr_.get(), obj,
|
|
90
|
+
[](void* obj) { delete static_cast<T*>(obj); });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void Fuse(Arena& other) { upb_Arena_Fuse(ptr(), other.ptr()); }
|
|
94
|
+
|
|
95
|
+
private:
|
|
96
|
+
std::unique_ptr<upb_Arena, decltype(&upb_Arena_Free)> ptr_;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// InlinedArena seeds the arenas with a predefined amount of memory. No
|
|
100
|
+
// heap memory will be allocated until the initial block is exceeded.
|
|
101
|
+
template <int N>
|
|
102
|
+
class InlinedArena : public Arena {
|
|
103
|
+
public:
|
|
104
|
+
InlinedArena() : Arena(initial_block_, N) {}
|
|
105
|
+
|
|
106
|
+
private:
|
|
107
|
+
InlinedArena(const InlinedArena*) = delete;
|
|
108
|
+
InlinedArena& operator=(const InlinedArena*) = delete;
|
|
109
|
+
|
|
110
|
+
char initial_block_[N];
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
} // namespace upb
|
|
114
|
+
|
|
115
|
+
#endif // UPB_HPP_
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
#ifndef UPB_INT_H_
|
|
29
|
+
#define UPB_INT_H_
|
|
30
|
+
|
|
31
|
+
#include "upb/upb.h"
|
|
32
|
+
|
|
33
|
+
struct mem_block;
|
|
34
|
+
typedef struct mem_block mem_block;
|
|
35
|
+
|
|
36
|
+
struct upb_Arena {
|
|
37
|
+
_upb_ArenaHead head;
|
|
38
|
+
/* Stores cleanup metadata for this arena.
|
|
39
|
+
* - a pointer to the current cleanup counter.
|
|
40
|
+
* - a boolean indicating if there is an unowned initial block. */
|
|
41
|
+
uintptr_t cleanup_metadata;
|
|
42
|
+
|
|
43
|
+
/* Allocator to allocate arena blocks. We are responsible for freeing these
|
|
44
|
+
* when we are destroyed. */
|
|
45
|
+
upb_alloc* block_alloc;
|
|
46
|
+
uint32_t last_size;
|
|
47
|
+
|
|
48
|
+
/* When multiple arenas are fused together, each arena points to a parent
|
|
49
|
+
* arena (root points to itself). The root tracks how many live arenas
|
|
50
|
+
* reference it. */
|
|
51
|
+
uint32_t refcount; /* Only used when a->parent == a */
|
|
52
|
+
struct upb_Arena* parent;
|
|
53
|
+
|
|
54
|
+
/* Linked list of blocks to free/cleanup. */
|
|
55
|
+
mem_block *freelist, *freelist_tail;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Encodes a float or double that is round-trippable, but as short as possible.
|
|
59
|
+
// These routines are not fully optimal (not guaranteed to be shortest), but are
|
|
60
|
+
// short-ish and match the implementation that has been used in protobuf since
|
|
61
|
+
// the beginning.
|
|
62
|
+
//
|
|
63
|
+
// The given buffer size must be at least kUpb_RoundTripBufferSize.
|
|
64
|
+
enum { kUpb_RoundTripBufferSize = 32 };
|
|
65
|
+
void _upb_EncodeRoundTripDouble(double val, char* buf, size_t size);
|
|
66
|
+
void _upb_EncodeRoundTripFloat(float val, char* buf, size_t size);
|
|
67
|
+
|
|
68
|
+
#endif /* UPB_INT_H_ */
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
load(
|
|
2
|
+
"//bazel:upb_proto_library.bzl",
|
|
3
|
+
"upb_proto_library",
|
|
4
|
+
"upb_proto_reflection_library",
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
licenses(["notice"])
|
|
8
|
+
|
|
9
|
+
# Def to Proto
|
|
10
|
+
|
|
11
|
+
cc_library(
|
|
12
|
+
name = "def_to_proto",
|
|
13
|
+
srcs = ["def_to_proto.c"],
|
|
14
|
+
hdrs = ["def_to_proto.h"],
|
|
15
|
+
visibility = ["//visibility:public"],
|
|
16
|
+
deps = [
|
|
17
|
+
"//:port",
|
|
18
|
+
"//:reflection",
|
|
19
|
+
],
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
proto_library(
|
|
23
|
+
name = "def_to_proto_test_proto",
|
|
24
|
+
srcs = [
|
|
25
|
+
"def_to_proto_public_import_test.proto",
|
|
26
|
+
"def_to_proto_regular_import_test.proto",
|
|
27
|
+
"def_to_proto_test.proto",
|
|
28
|
+
],
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
upb_proto_library(
|
|
32
|
+
name = "def_to_proto_test_upb_proto",
|
|
33
|
+
deps = ["def_to_proto_test_proto"],
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
upb_proto_reflection_library(
|
|
37
|
+
name = "def_to_proto_test_upb_proto_reflection",
|
|
38
|
+
deps = ["def_to_proto_test_proto"],
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
cc_test(
|
|
42
|
+
name = "def_to_proto_test",
|
|
43
|
+
srcs = ["def_to_proto_test.cc"],
|
|
44
|
+
deps = [
|
|
45
|
+
":def_to_proto",
|
|
46
|
+
":def_to_proto_test_upb_proto",
|
|
47
|
+
":def_to_proto_test_upb_proto_reflection",
|
|
48
|
+
"//:descriptor_upb_proto_reflection",
|
|
49
|
+
"//:reflection",
|
|
50
|
+
"//:upb",
|
|
51
|
+
"@com_google_absl//absl/strings",
|
|
52
|
+
"@com_google_googletest//:gtest_main",
|
|
53
|
+
"@com_google_protobuf//:protobuf",
|
|
54
|
+
],
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# Required fields
|
|
58
|
+
|
|
59
|
+
cc_library(
|
|
60
|
+
name = "required_fields",
|
|
61
|
+
srcs = ["required_fields.c"],
|
|
62
|
+
hdrs = ["required_fields.h"],
|
|
63
|
+
visibility = ["//visibility:public"],
|
|
64
|
+
deps = [
|
|
65
|
+
"//:port",
|
|
66
|
+
"//:reflection",
|
|
67
|
+
],
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
proto_library(
|
|
71
|
+
name = "required_fields_test_proto",
|
|
72
|
+
srcs = ["required_fields_test.proto"],
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
upb_proto_library(
|
|
76
|
+
name = "required_fields_test_upb_proto",
|
|
77
|
+
deps = ["required_fields_test_proto"],
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
upb_proto_reflection_library(
|
|
81
|
+
name = "required_fields_test_upb_proto_reflection",
|
|
82
|
+
deps = ["required_fields_test_proto"],
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
cc_test(
|
|
86
|
+
name = "required_fields_test",
|
|
87
|
+
srcs = ["required_fields_test.cc"],
|
|
88
|
+
deps = [
|
|
89
|
+
":required_fields",
|
|
90
|
+
":required_fields_test_upb_proto",
|
|
91
|
+
":required_fields_test_upb_proto_reflection",
|
|
92
|
+
"//:json",
|
|
93
|
+
"//:reflection",
|
|
94
|
+
"//:upb",
|
|
95
|
+
"@com_google_absl//absl/strings",
|
|
96
|
+
"@com_google_googletest//:gtest_main",
|
|
97
|
+
],
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Compare
|
|
101
|
+
|
|
102
|
+
cc_library(
|
|
103
|
+
name = "compare",
|
|
104
|
+
srcs = ["compare.c"],
|
|
105
|
+
hdrs = ["compare.h"],
|
|
106
|
+
visibility = ["//visibility:public"],
|
|
107
|
+
deps = [
|
|
108
|
+
"//:port",
|
|
109
|
+
"//:reflection",
|
|
110
|
+
],
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
cc_test(
|
|
114
|
+
name = "compare_test",
|
|
115
|
+
srcs = ["compare_test.cc"],
|
|
116
|
+
deps = [
|
|
117
|
+
":compare",
|
|
118
|
+
"@com_google_absl//absl/strings",
|
|
119
|
+
"@com_google_googletest//:gtest_main",
|
|
120
|
+
],
|
|
121
|
+
)
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
|
|
2
|
+
# upb util library
|
|
3
|
+
|
|
4
|
+
The libraries in this directory contain useful functionality that is layered
|
|
5
|
+
on top of the main upb APIs. In other words, the APIs in this directory have
|
|
6
|
+
no special access to upb internals; you could easily implement the same things
|
|
7
|
+
yourself.
|