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,350 @@
|
|
|
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 "python/protobuf.h"
|
|
29
|
+
|
|
30
|
+
#include "python/descriptor.h"
|
|
31
|
+
#include "python/descriptor_containers.h"
|
|
32
|
+
#include "python/descriptor_pool.h"
|
|
33
|
+
#include "python/extension_dict.h"
|
|
34
|
+
#include "python/map.h"
|
|
35
|
+
#include "python/message.h"
|
|
36
|
+
#include "python/repeated.h"
|
|
37
|
+
#include "python/unknown_fields.h"
|
|
38
|
+
|
|
39
|
+
static void PyUpb_ModuleDealloc(void* module) {
|
|
40
|
+
PyUpb_ModuleState* s = PyModule_GetState(module);
|
|
41
|
+
PyUpb_WeakMap_Free(s->obj_cache);
|
|
42
|
+
if (s->c_descriptor_symtab) {
|
|
43
|
+
upb_DefPool_Free(s->c_descriptor_symtab);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
PyObject* PyUpb_SetAllowOversizeProtos(PyObject* m, PyObject* arg) {
|
|
48
|
+
if (!arg || !PyBool_Check(arg)) {
|
|
49
|
+
PyErr_SetString(PyExc_TypeError,
|
|
50
|
+
"Argument to SetAllowOversizeProtos must be boolean");
|
|
51
|
+
return NULL;
|
|
52
|
+
}
|
|
53
|
+
PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
|
|
54
|
+
state->allow_oversize_protos = PyObject_IsTrue(arg);
|
|
55
|
+
Py_INCREF(arg);
|
|
56
|
+
return arg;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static PyMethodDef PyUpb_ModuleMethods[] = {
|
|
60
|
+
{"SetAllowOversizeProtos", PyUpb_SetAllowOversizeProtos, METH_O,
|
|
61
|
+
"Enable/disable oversize proto parsing."},
|
|
62
|
+
{NULL, NULL}};
|
|
63
|
+
|
|
64
|
+
static struct PyModuleDef module_def = {PyModuleDef_HEAD_INIT,
|
|
65
|
+
PYUPB_MODULE_NAME,
|
|
66
|
+
"Protobuf Module",
|
|
67
|
+
sizeof(PyUpb_ModuleState),
|
|
68
|
+
PyUpb_ModuleMethods, // m_methods
|
|
69
|
+
NULL, // m_slots
|
|
70
|
+
NULL, // m_traverse
|
|
71
|
+
NULL, // m_clear
|
|
72
|
+
PyUpb_ModuleDealloc};
|
|
73
|
+
|
|
74
|
+
// -----------------------------------------------------------------------------
|
|
75
|
+
// ModuleState
|
|
76
|
+
// -----------------------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
PyUpb_ModuleState* PyUpb_ModuleState_MaybeGet(void) {
|
|
79
|
+
PyObject* module = PyState_FindModule(&module_def);
|
|
80
|
+
return module ? PyModule_GetState(module) : NULL;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
PyUpb_ModuleState* PyUpb_ModuleState_GetFromModule(PyObject* module) {
|
|
84
|
+
PyUpb_ModuleState* state = PyModule_GetState(module);
|
|
85
|
+
assert(state);
|
|
86
|
+
assert(PyModule_GetDef(module) == &module_def);
|
|
87
|
+
return state;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
PyUpb_ModuleState* PyUpb_ModuleState_Get(void) {
|
|
91
|
+
PyObject* module = PyState_FindModule(&module_def);
|
|
92
|
+
assert(module);
|
|
93
|
+
return PyUpb_ModuleState_GetFromModule(module);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
PyObject* PyUpb_GetWktBases(PyUpb_ModuleState* state) {
|
|
97
|
+
if (!state->wkt_bases) {
|
|
98
|
+
PyObject* wkt_module = PyImport_ImportModule(PYUPB_PROTOBUF_INTERNAL_PACKAGE
|
|
99
|
+
".well_known_types");
|
|
100
|
+
|
|
101
|
+
if (wkt_module == NULL) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
state->wkt_bases = PyObject_GetAttrString(wkt_module, "WKTBASES");
|
|
106
|
+
PyObject* m = PyState_FindModule(&module_def);
|
|
107
|
+
// Reparent ownership to m.
|
|
108
|
+
PyModule_AddObject(m, "__internal_wktbases", state->wkt_bases);
|
|
109
|
+
Py_DECREF(wkt_module);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return state->wkt_bases;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// -----------------------------------------------------------------------------
|
|
116
|
+
// WeakMap
|
|
117
|
+
// -----------------------------------------------------------------------------
|
|
118
|
+
|
|
119
|
+
struct PyUpb_WeakMap {
|
|
120
|
+
upb_inttable table;
|
|
121
|
+
upb_Arena* arena;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
PyUpb_WeakMap* PyUpb_WeakMap_New(void) {
|
|
125
|
+
upb_Arena* arena = upb_Arena_New();
|
|
126
|
+
PyUpb_WeakMap* map = upb_Arena_Malloc(arena, sizeof(*map));
|
|
127
|
+
map->arena = arena;
|
|
128
|
+
upb_inttable_init(&map->table, map->arena);
|
|
129
|
+
return map;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
void PyUpb_WeakMap_Free(PyUpb_WeakMap* map) { upb_Arena_Free(map->arena); }
|
|
133
|
+
|
|
134
|
+
uintptr_t PyUpb_WeakMap_GetKey(const void* key) {
|
|
135
|
+
uintptr_t n = (uintptr_t)key;
|
|
136
|
+
assert((n & 7) == 0);
|
|
137
|
+
return n >> 3;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
void PyUpb_WeakMap_Add(PyUpb_WeakMap* map, const void* key, PyObject* py_obj) {
|
|
141
|
+
upb_inttable_insert(&map->table, PyUpb_WeakMap_GetKey(key),
|
|
142
|
+
upb_value_ptr(py_obj), map->arena);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
void PyUpb_WeakMap_Delete(PyUpb_WeakMap* map, const void* key) {
|
|
146
|
+
upb_value val;
|
|
147
|
+
bool removed =
|
|
148
|
+
upb_inttable_remove(&map->table, PyUpb_WeakMap_GetKey(key), &val);
|
|
149
|
+
(void)removed;
|
|
150
|
+
assert(removed);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
void PyUpb_WeakMap_TryDelete(PyUpb_WeakMap* map, const void* key) {
|
|
154
|
+
upb_inttable_remove(&map->table, PyUpb_WeakMap_GetKey(key), NULL);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
PyObject* PyUpb_WeakMap_Get(PyUpb_WeakMap* map, const void* key) {
|
|
158
|
+
upb_value val;
|
|
159
|
+
if (upb_inttable_lookup(&map->table, PyUpb_WeakMap_GetKey(key), &val)) {
|
|
160
|
+
PyObject* ret = upb_value_getptr(val);
|
|
161
|
+
Py_INCREF(ret);
|
|
162
|
+
return ret;
|
|
163
|
+
} else {
|
|
164
|
+
return NULL;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
bool PyUpb_WeakMap_Next(PyUpb_WeakMap* map, const void** key, PyObject** obj,
|
|
169
|
+
intptr_t* iter) {
|
|
170
|
+
uintptr_t u_key;
|
|
171
|
+
upb_value val;
|
|
172
|
+
if (!upb_inttable_next2(&map->table, &u_key, &val, iter)) return false;
|
|
173
|
+
*key = (void*)(u_key << 3);
|
|
174
|
+
*obj = upb_value_getptr(val);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
void PyUpb_WeakMap_DeleteIter(PyUpb_WeakMap* map, intptr_t* iter) {
|
|
179
|
+
upb_inttable_removeiter(&map->table, iter);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// -----------------------------------------------------------------------------
|
|
183
|
+
// ObjCache
|
|
184
|
+
// -----------------------------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
PyUpb_WeakMap* PyUpb_ObjCache_Instance(void) {
|
|
187
|
+
PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
|
|
188
|
+
return state->obj_cache;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
void PyUpb_ObjCache_Add(const void* key, PyObject* py_obj) {
|
|
192
|
+
PyUpb_WeakMap_Add(PyUpb_ObjCache_Instance(), key, py_obj);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
void PyUpb_ObjCache_Delete(const void* key) {
|
|
196
|
+
PyUpb_ModuleState* state = PyUpb_ModuleState_MaybeGet();
|
|
197
|
+
if (!state) {
|
|
198
|
+
// During the shutdown sequence, our object's Dealloc() methods can be
|
|
199
|
+
// called *after* our module Dealloc() method has been called. At that
|
|
200
|
+
// point our state will be NULL and there is nothing to delete out of the
|
|
201
|
+
// map.
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
PyUpb_WeakMap_Delete(state->obj_cache, key);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
PyObject* PyUpb_ObjCache_Get(const void* key) {
|
|
208
|
+
return PyUpb_WeakMap_Get(PyUpb_ObjCache_Instance(), key);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// -----------------------------------------------------------------------------
|
|
212
|
+
// Arena
|
|
213
|
+
// -----------------------------------------------------------------------------
|
|
214
|
+
|
|
215
|
+
typedef struct {
|
|
216
|
+
PyObject_HEAD;
|
|
217
|
+
upb_Arena* arena;
|
|
218
|
+
} PyUpb_Arena;
|
|
219
|
+
|
|
220
|
+
PyObject* PyUpb_Arena_New(void) {
|
|
221
|
+
PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
|
|
222
|
+
PyUpb_Arena* arena = (void*)PyType_GenericAlloc(state->arena_type, 0);
|
|
223
|
+
arena->arena = upb_Arena_New();
|
|
224
|
+
return &arena->ob_base;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
static void PyUpb_Arena_Dealloc(PyObject* self) {
|
|
228
|
+
upb_Arena_Free(PyUpb_Arena_Get(self));
|
|
229
|
+
PyUpb_Dealloc(self);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
upb_Arena* PyUpb_Arena_Get(PyObject* arena) {
|
|
233
|
+
return ((PyUpb_Arena*)arena)->arena;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
static PyType_Slot PyUpb_Arena_Slots[] = {
|
|
237
|
+
{Py_tp_dealloc, PyUpb_Arena_Dealloc},
|
|
238
|
+
{0, NULL},
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
static PyType_Spec PyUpb_Arena_Spec = {
|
|
242
|
+
PYUPB_MODULE_NAME ".Arena",
|
|
243
|
+
sizeof(PyUpb_Arena),
|
|
244
|
+
0, // itemsize
|
|
245
|
+
Py_TPFLAGS_DEFAULT,
|
|
246
|
+
PyUpb_Arena_Slots,
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
static bool PyUpb_InitArena(PyObject* m) {
|
|
250
|
+
PyUpb_ModuleState* state = PyUpb_ModuleState_GetFromModule(m);
|
|
251
|
+
state->arena_type = PyUpb_AddClass(m, &PyUpb_Arena_Spec);
|
|
252
|
+
return state->arena_type;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// -----------------------------------------------------------------------------
|
|
256
|
+
// Utilities
|
|
257
|
+
// -----------------------------------------------------------------------------
|
|
258
|
+
|
|
259
|
+
PyTypeObject* AddObject(PyObject* m, const char* name, PyType_Spec* spec) {
|
|
260
|
+
PyObject* type = PyType_FromSpec(spec);
|
|
261
|
+
return type && PyModule_AddObject(m, name, type) == 0 ? (PyTypeObject*)type
|
|
262
|
+
: NULL;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
static const char* PyUpb_GetClassName(PyType_Spec* spec) {
|
|
266
|
+
// spec->name contains a fully-qualified name, like:
|
|
267
|
+
// google.protobuf.pyext._message.FooBar
|
|
268
|
+
//
|
|
269
|
+
// Find the rightmost '.' to get "FooBar".
|
|
270
|
+
const char* name = strrchr(spec->name, '.');
|
|
271
|
+
assert(name);
|
|
272
|
+
return name + 1;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
PyTypeObject* PyUpb_AddClass(PyObject* m, PyType_Spec* spec) {
|
|
276
|
+
PyObject* type = PyType_FromSpec(spec);
|
|
277
|
+
const char* name = PyUpb_GetClassName(spec);
|
|
278
|
+
if (PyModule_AddObject(m, name, type) < 0) {
|
|
279
|
+
Py_XDECREF(type);
|
|
280
|
+
return NULL;
|
|
281
|
+
}
|
|
282
|
+
return (PyTypeObject*)type;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
PyTypeObject* PyUpb_AddClassWithBases(PyObject* m, PyType_Spec* spec,
|
|
286
|
+
PyObject* bases) {
|
|
287
|
+
PyObject* type = PyType_FromSpecWithBases(spec, bases);
|
|
288
|
+
const char* name = PyUpb_GetClassName(spec);
|
|
289
|
+
if (PyModule_AddObject(m, name, type) < 0) {
|
|
290
|
+
Py_XDECREF(type);
|
|
291
|
+
return NULL;
|
|
292
|
+
}
|
|
293
|
+
return (PyTypeObject*)type;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const char* PyUpb_GetStrData(PyObject* obj) {
|
|
297
|
+
if (PyUnicode_Check(obj)) {
|
|
298
|
+
return PyUnicode_AsUTF8AndSize(obj, NULL);
|
|
299
|
+
} else if (PyBytes_Check(obj)) {
|
|
300
|
+
return PyBytes_AsString(obj);
|
|
301
|
+
} else {
|
|
302
|
+
return NULL;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const char* PyUpb_VerifyStrData(PyObject* obj) {
|
|
307
|
+
const char* ret = PyUpb_GetStrData(obj);
|
|
308
|
+
if (ret) return ret;
|
|
309
|
+
PyErr_Format(PyExc_TypeError, "Expected string: %S", obj);
|
|
310
|
+
return NULL;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
PyObject* PyUpb_Forbidden_New(PyObject* cls, PyObject* args, PyObject* kwds) {
|
|
314
|
+
PyObject* name = PyObject_GetAttrString(cls, "__name__");
|
|
315
|
+
PyErr_Format(PyExc_RuntimeError,
|
|
316
|
+
"Objects of type %U may not be created directly.", name);
|
|
317
|
+
Py_XDECREF(name);
|
|
318
|
+
return NULL;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// -----------------------------------------------------------------------------
|
|
322
|
+
// Module Entry Point
|
|
323
|
+
// -----------------------------------------------------------------------------
|
|
324
|
+
|
|
325
|
+
__attribute__((visibility("default"))) PyMODINIT_FUNC PyInit__message(void) {
|
|
326
|
+
PyObject* m = PyModule_Create(&module_def);
|
|
327
|
+
if (!m) return NULL;
|
|
328
|
+
|
|
329
|
+
PyUpb_ModuleState* state = PyUpb_ModuleState_GetFromModule(m);
|
|
330
|
+
|
|
331
|
+
state->allow_oversize_protos = false;
|
|
332
|
+
state->wkt_bases = NULL;
|
|
333
|
+
state->obj_cache = PyUpb_WeakMap_New();
|
|
334
|
+
state->c_descriptor_symtab = NULL;
|
|
335
|
+
|
|
336
|
+
if (!PyUpb_InitDescriptorContainers(m) || !PyUpb_InitDescriptorPool(m) ||
|
|
337
|
+
!PyUpb_InitDescriptor(m) || !PyUpb_InitArena(m) ||
|
|
338
|
+
!PyUpb_InitExtensionDict(m) || !PyUpb_Map_Init(m) ||
|
|
339
|
+
!PyUpb_InitMessage(m) || !PyUpb_Repeated_Init(m) ||
|
|
340
|
+
!PyUpb_UnknownFields_Init(m)) {
|
|
341
|
+
Py_DECREF(m);
|
|
342
|
+
return NULL;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Temporary: an cookie we can use in the tests to ensure we are testing upb
|
|
346
|
+
// and not another protobuf library on the system.
|
|
347
|
+
PyModule_AddIntConstant(m, "_IS_UPB", 1);
|
|
348
|
+
|
|
349
|
+
return m;
|
|
350
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
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 PYUPB_PROTOBUF_H__
|
|
29
|
+
#define PYUPB_PROTOBUF_H__
|
|
30
|
+
|
|
31
|
+
#include <stdbool.h>
|
|
32
|
+
|
|
33
|
+
#include "python/descriptor.h"
|
|
34
|
+
#include "python/python_api.h"
|
|
35
|
+
#include "upb/table_internal.h"
|
|
36
|
+
|
|
37
|
+
// begin:github_only
|
|
38
|
+
#define PYUPB_PROTOBUF_PUBLIC_PACKAGE "google.protobuf"
|
|
39
|
+
#define PYUPB_PROTOBUF_INTERNAL_PACKAGE "google.protobuf.internal"
|
|
40
|
+
#define PYUPB_DESCRIPTOR_PROTO_PACKAGE "google.protobuf"
|
|
41
|
+
#define PYUPB_DESCRIPTOR_MODULE "google.protobuf.descriptor_pb2"
|
|
42
|
+
#define PYUPB_MODULE_NAME "google._upb._message"
|
|
43
|
+
// end:github_only
|
|
44
|
+
|
|
45
|
+
// begin:google_only
|
|
46
|
+
// #define PYUPB_PROTOBUF_PUBLIC_PACKAGE "google3.net.proto2.python.public"
|
|
47
|
+
// #define PYUPB_PROTOBUF_INTERNAL_PACKAGE "google3.net.proto2.python.internal"
|
|
48
|
+
// #define PYUPB_DESCRIPTOR_PROTO_PACKAGE "proto2"
|
|
49
|
+
// #define PYUPB_DESCRIPTOR_MODULE "google3.net.proto2.proto.descriptor_pb2"
|
|
50
|
+
// #define PYUPB_MODULE_NAME "google3.third_party.upb.python._message"
|
|
51
|
+
// end:google_only
|
|
52
|
+
|
|
53
|
+
#define PYUPB_RETURN_OOM return PyErr_SetNone(PyExc_MemoryError), NULL
|
|
54
|
+
|
|
55
|
+
struct PyUpb_WeakMap;
|
|
56
|
+
typedef struct PyUpb_WeakMap PyUpb_WeakMap;
|
|
57
|
+
|
|
58
|
+
// -----------------------------------------------------------------------------
|
|
59
|
+
// ModuleState
|
|
60
|
+
// -----------------------------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
// We store all "global" state in this struct instead of using (C) global
|
|
63
|
+
// variables. This makes this extension compatible with sub-interpreters.
|
|
64
|
+
|
|
65
|
+
typedef struct {
|
|
66
|
+
// From descriptor.c
|
|
67
|
+
PyTypeObject* descriptor_types[kPyUpb_Descriptor_Count];
|
|
68
|
+
|
|
69
|
+
// From descriptor_containers.c
|
|
70
|
+
PyTypeObject* by_name_map_type;
|
|
71
|
+
PyTypeObject* by_number_map_type;
|
|
72
|
+
PyTypeObject* descriptor_iterator_type;
|
|
73
|
+
PyTypeObject* generic_sequence_type;
|
|
74
|
+
|
|
75
|
+
// From descriptor_pool.c
|
|
76
|
+
PyObject* default_pool;
|
|
77
|
+
|
|
78
|
+
// From descriptor_pool.c
|
|
79
|
+
PyTypeObject* descriptor_pool_type;
|
|
80
|
+
upb_DefPool* c_descriptor_symtab;
|
|
81
|
+
|
|
82
|
+
// From extension_dict.c
|
|
83
|
+
PyTypeObject* extension_dict_type;
|
|
84
|
+
PyTypeObject* extension_iterator_type;
|
|
85
|
+
|
|
86
|
+
// From map.c
|
|
87
|
+
PyTypeObject* map_iterator_type;
|
|
88
|
+
PyTypeObject* message_map_container_type;
|
|
89
|
+
PyTypeObject* scalar_map_container_type;
|
|
90
|
+
|
|
91
|
+
// From message.c
|
|
92
|
+
PyObject* decode_error_class;
|
|
93
|
+
PyObject* descriptor_string;
|
|
94
|
+
PyObject* encode_error_class;
|
|
95
|
+
PyObject* enum_type_wrapper_class;
|
|
96
|
+
PyObject* message_class;
|
|
97
|
+
PyTypeObject* cmessage_type;
|
|
98
|
+
PyTypeObject* message_meta_type;
|
|
99
|
+
PyObject* listfields_item_key;
|
|
100
|
+
|
|
101
|
+
// From protobuf.c
|
|
102
|
+
bool allow_oversize_protos;
|
|
103
|
+
PyObject* wkt_bases;
|
|
104
|
+
PyTypeObject* arena_type;
|
|
105
|
+
PyUpb_WeakMap* obj_cache;
|
|
106
|
+
|
|
107
|
+
// From repeated.c
|
|
108
|
+
PyTypeObject* repeated_composite_container_type;
|
|
109
|
+
PyTypeObject* repeated_scalar_container_type;
|
|
110
|
+
|
|
111
|
+
// From unknown_fields.c
|
|
112
|
+
PyTypeObject* unknown_fields_type;
|
|
113
|
+
PyObject* unknown_field_type;
|
|
114
|
+
} PyUpb_ModuleState;
|
|
115
|
+
|
|
116
|
+
// Returns the global state object from the current interpreter. The current
|
|
117
|
+
// interpreter is looked up from thread-local state.
|
|
118
|
+
PyUpb_ModuleState* PyUpb_ModuleState_Get(void);
|
|
119
|
+
PyUpb_ModuleState* PyUpb_ModuleState_GetFromModule(PyObject* module);
|
|
120
|
+
|
|
121
|
+
// Returns NULL if module state is not yet available (during startup).
|
|
122
|
+
// Any use of the module state during startup needs to be passed explicitly.
|
|
123
|
+
PyUpb_ModuleState* PyUpb_ModuleState_MaybeGet(void);
|
|
124
|
+
|
|
125
|
+
// Returns:
|
|
126
|
+
// from google.protobuf.internal.well_known_types import WKTBASES
|
|
127
|
+
//
|
|
128
|
+
// This has to be imported lazily rather than at module load time, because
|
|
129
|
+
// otherwise it would cause a circular import.
|
|
130
|
+
PyObject* PyUpb_GetWktBases(PyUpb_ModuleState* state);
|
|
131
|
+
|
|
132
|
+
// -----------------------------------------------------------------------------
|
|
133
|
+
// WeakMap
|
|
134
|
+
// -----------------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
// A WeakMap maps C pointers to the corresponding Python wrapper object. We
|
|
137
|
+
// want a consistent Python wrapper object for each C object, both to save
|
|
138
|
+
// memory and to provide object stability (ie. x is x).
|
|
139
|
+
//
|
|
140
|
+
// Each wrapped object should add itself to the map when it is constructed and
|
|
141
|
+
// remove itself from the map when it is destroyed. The map is weak so it does
|
|
142
|
+
// not take references to the cached objects.
|
|
143
|
+
|
|
144
|
+
PyUpb_WeakMap* PyUpb_WeakMap_New(void);
|
|
145
|
+
void PyUpb_WeakMap_Free(PyUpb_WeakMap* map);
|
|
146
|
+
|
|
147
|
+
// Adds the given object to the map, indexed by the given key.
|
|
148
|
+
void PyUpb_WeakMap_Add(PyUpb_WeakMap* map, const void* key, PyObject* py_obj);
|
|
149
|
+
|
|
150
|
+
// Removes the given key from the cache. It must exist in the cache currently.
|
|
151
|
+
void PyUpb_WeakMap_Delete(PyUpb_WeakMap* map, const void* key);
|
|
152
|
+
void PyUpb_WeakMap_TryDelete(PyUpb_WeakMap* map, const void* key);
|
|
153
|
+
|
|
154
|
+
// Returns a new reference to an object if it exists, otherwise returns NULL.
|
|
155
|
+
PyObject* PyUpb_WeakMap_Get(PyUpb_WeakMap* map, const void* key);
|
|
156
|
+
|
|
157
|
+
#define PYUPB_WEAKMAP_BEGIN UPB_INTTABLE_BEGIN
|
|
158
|
+
|
|
159
|
+
// Iteration over the weak map, eg.
|
|
160
|
+
//
|
|
161
|
+
// intptr_t it = PYUPB_WEAKMAP_BEGIN;
|
|
162
|
+
// while (PyUpb_WeakMap_Next(map, &key, &obj, &it)) {
|
|
163
|
+
// // ...
|
|
164
|
+
// }
|
|
165
|
+
//
|
|
166
|
+
// Note that the callee does not own a ref on the returned `obj`.
|
|
167
|
+
bool PyUpb_WeakMap_Next(PyUpb_WeakMap* map, const void** key, PyObject** obj,
|
|
168
|
+
intptr_t* iter);
|
|
169
|
+
void PyUpb_WeakMap_DeleteIter(PyUpb_WeakMap* map, intptr_t* iter);
|
|
170
|
+
|
|
171
|
+
// -----------------------------------------------------------------------------
|
|
172
|
+
// ObjCache
|
|
173
|
+
// -----------------------------------------------------------------------------
|
|
174
|
+
|
|
175
|
+
// The object cache is a global WeakMap for mapping upb objects to the
|
|
176
|
+
// corresponding wrapper.
|
|
177
|
+
void PyUpb_ObjCache_Add(const void* key, PyObject* py_obj);
|
|
178
|
+
void PyUpb_ObjCache_Delete(const void* key);
|
|
179
|
+
PyObject* PyUpb_ObjCache_Get(const void* key); // returns NULL if not present.
|
|
180
|
+
PyUpb_WeakMap* PyUpb_ObjCache_Instance(void);
|
|
181
|
+
|
|
182
|
+
// -----------------------------------------------------------------------------
|
|
183
|
+
// Arena
|
|
184
|
+
// -----------------------------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
PyObject* PyUpb_Arena_New(void);
|
|
187
|
+
upb_Arena* PyUpb_Arena_Get(PyObject* arena);
|
|
188
|
+
|
|
189
|
+
// -----------------------------------------------------------------------------
|
|
190
|
+
// Utilities
|
|
191
|
+
// -----------------------------------------------------------------------------
|
|
192
|
+
|
|
193
|
+
PyTypeObject* AddObject(PyObject* m, const char* name, PyType_Spec* spec);
|
|
194
|
+
|
|
195
|
+
// Creates a Python type from `spec` and adds it to the given module `m`.
|
|
196
|
+
PyTypeObject* PyUpb_AddClass(PyObject* m, PyType_Spec* spec);
|
|
197
|
+
|
|
198
|
+
// Like PyUpb_AddClass(), but allows you to specify a tuple of base classes
|
|
199
|
+
// in `bases`.
|
|
200
|
+
PyTypeObject* PyUpb_AddClassWithBases(PyObject* m, PyType_Spec* spec,
|
|
201
|
+
PyObject* bases);
|
|
202
|
+
|
|
203
|
+
// A function that implements the tp_new slot for types that we do not allow
|
|
204
|
+
// users to create directly. This will immediately fail with an error message.
|
|
205
|
+
PyObject* PyUpb_Forbidden_New(PyObject* cls, PyObject* args, PyObject* kwds);
|
|
206
|
+
|
|
207
|
+
// Our standard dealloc func. It follows the guidance defined in:
|
|
208
|
+
// https://docs.python.org/3/c-api/typeobj.html#c.PyTypeObject.tp_dealloc
|
|
209
|
+
// However it tests Py_TPFLAGS_HEAPTYPE dynamically so that a single dealloc
|
|
210
|
+
// function can work for any type.
|
|
211
|
+
static inline void PyUpb_Dealloc(void* self) {
|
|
212
|
+
PyTypeObject* tp = Py_TYPE(self);
|
|
213
|
+
assert(PyType_GetFlags(tp) & Py_TPFLAGS_HEAPTYPE);
|
|
214
|
+
freefunc tp_free = (freefunc)PyType_GetSlot(tp, Py_tp_free);
|
|
215
|
+
tp_free(self);
|
|
216
|
+
Py_DECREF(tp);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Equivalent to the Py_NewRef() function introduced in Python 3.10. If/when we
|
|
220
|
+
// drop support for Python <3.10, we can remove this function and replace all
|
|
221
|
+
// callers with Py_NewRef().
|
|
222
|
+
static inline PyObject* PyUpb_NewRef(PyObject* obj) {
|
|
223
|
+
Py_INCREF(obj);
|
|
224
|
+
return obj;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const char* PyUpb_GetStrData(PyObject* obj);
|
|
228
|
+
const char* PyUpb_VerifyStrData(PyObject* obj);
|
|
229
|
+
|
|
230
|
+
#endif // PYUPB_PROTOBUF_H__
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Macro to support py_extension """
|
|
2
|
+
|
|
3
|
+
load("@bazel_skylib//lib:selects.bzl", "selects")
|
|
4
|
+
|
|
5
|
+
def py_extension(name, srcs, copts, deps = []):
|
|
6
|
+
"""Creates a C++ library to extend python
|
|
7
|
+
|
|
8
|
+
Args:
|
|
9
|
+
name: Name of the target
|
|
10
|
+
srcs: List of source files to create the target
|
|
11
|
+
copts: List of C++ compile options to use
|
|
12
|
+
deps: Libraries that the target depends on
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
native.cc_binary(
|
|
16
|
+
name = name + "_binary",
|
|
17
|
+
srcs = srcs,
|
|
18
|
+
copts = copts + ["-fvisibility=hidden"],
|
|
19
|
+
linkopts = selects.with_or({
|
|
20
|
+
("//python/dist:osx-x86_64_cpu", "//python/dist:osx-aarch64_cpu"): ["-undefined", "dynamic_lookup"],
|
|
21
|
+
"//conditions:default": [],
|
|
22
|
+
}),
|
|
23
|
+
linkshared = True,
|
|
24
|
+
linkstatic = True,
|
|
25
|
+
deps = deps + select({
|
|
26
|
+
"//python:limited_api_3.7": ["@python-3.7.0//:python_headers"],
|
|
27
|
+
"//python:full_api_3.7_win32": ["@nuget_python_i686_3.7.0//:python_full_api"],
|
|
28
|
+
"//python:full_api_3.7_win64": ["@nuget_python_x86-64_3.7.0//:python_full_api"],
|
|
29
|
+
"//python:full_api_3.8_win32": ["@nuget_python_i686_3.8.0//:python_full_api"],
|
|
30
|
+
"//python:full_api_3.8_win64": ["@nuget_python_x86-64_3.8.0//:python_full_api"],
|
|
31
|
+
"//python:full_api_3.9_win32": ["@nuget_python_i686_3.9.0//:python_full_api"],
|
|
32
|
+
"//python:full_api_3.9_win64": ["@nuget_python_x86-64_3.9.0//:python_full_api"],
|
|
33
|
+
"//python:limited_api_3.10_win32": ["@nuget_python_i686_3.10.0//:python_limited_api"],
|
|
34
|
+
"//python:limited_api_3.10_win64": ["@nuget_python_x86-64_3.10.0//:python_limited_api"],
|
|
35
|
+
"//conditions:default": ["@system_python//:python_headers"],
|
|
36
|
+
}),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
EXT_SUFFIX = ".abi3.so"
|
|
40
|
+
output_file = "google/_upb/" + name + EXT_SUFFIX
|
|
41
|
+
|
|
42
|
+
native.genrule(
|
|
43
|
+
name = "copy" + name,
|
|
44
|
+
srcs = [":" + name + "_binary"],
|
|
45
|
+
outs = [output_file],
|
|
46
|
+
cmd = "cp $< $@",
|
|
47
|
+
visibility = ["//python:__subpackages__"],
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
native.py_library(
|
|
51
|
+
name = name,
|
|
52
|
+
data = [output_file],
|
|
53
|
+
imports = ["."],
|
|
54
|
+
visibility = ["//python:__subpackages__"],
|
|
55
|
+
)
|
|
@@ -0,0 +1,61 @@
|
|
|
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 PYUPB_PYTHON_H__
|
|
29
|
+
#define PYUPB_PYTHON_H__
|
|
30
|
+
|
|
31
|
+
// We restrict ourselves to the limited API, so that a single build can be
|
|
32
|
+
// ABI-compatible with a wide range of Python versions.
|
|
33
|
+
//
|
|
34
|
+
// The build system will define Py_LIMITED_API as appropriate (see BUILD). We
|
|
35
|
+
// only want to define it for our distribution packages, since we can do some
|
|
36
|
+
// extra assertions when Py_LIMITED_API is not defined. Also Py_LIMITED_API is
|
|
37
|
+
// incompatible with Py_DEBUG.
|
|
38
|
+
|
|
39
|
+
// #define Py_LIMITED_API <val> // Defined by build system when appropriate.
|
|
40
|
+
|
|
41
|
+
#include "Python.h"
|
|
42
|
+
|
|
43
|
+
// Ideally we could restrict ourselves to the limited API of 3.7, but this is
|
|
44
|
+
// a very important function that was not officially added to the limited API
|
|
45
|
+
// until 3.10. Without this function, there is no way of getting data from a
|
|
46
|
+
// Python `str` object without a copy.
|
|
47
|
+
//
|
|
48
|
+
// While this function was not *officially* added to the limited API until
|
|
49
|
+
// Python 3.10, In practice it has been stable since Python 3.1.
|
|
50
|
+
// https://bugs.python.org/issue41784
|
|
51
|
+
//
|
|
52
|
+
// On Linux/ELF and macOS/Mach-O, we can get away with using this function with
|
|
53
|
+
// the limited API prior to 3.10.
|
|
54
|
+
|
|
55
|
+
#if (defined(__linux__) || defined(__APPLE__)) && defined(Py_LIMITED_API) && \
|
|
56
|
+
Py_LIMITED_API < 0x03100000
|
|
57
|
+
PyAPI_FUNC(const char*)
|
|
58
|
+
PyUnicode_AsUTF8AndSize(PyObject* unicode, Py_ssize_t* size);
|
|
59
|
+
#endif
|
|
60
|
+
|
|
61
|
+
#endif // PYUPB_PYTHON_H__
|