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.
Files changed (200) hide show
  1. checksums.yaml +7 -0
  2. data/ext/ruby_memprofiler_pprof/backtrace.c +429 -0
  3. data/ext/ruby_memprofiler_pprof/collector.c +1055 -0
  4. data/ext/ruby_memprofiler_pprof/compat.c +182 -0
  5. data/ext/ruby_memprofiler_pprof/extconf.rb +72 -0
  6. data/ext/ruby_memprofiler_pprof/pprof.upb.c +170 -0
  7. data/ext/ruby_memprofiler_pprof/pprof.upb.h +848 -0
  8. data/ext/ruby_memprofiler_pprof/pprof_out.c +285 -0
  9. data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.c +11 -0
  10. data/ext/ruby_memprofiler_pprof/ruby_memprofiler_pprof.h +301 -0
  11. data/ext/ruby_memprofiler_pprof/strtab.c +391 -0
  12. data/ext/ruby_memprofiler_pprof/vendor/upb/BUILD +719 -0
  13. data/ext/ruby_memprofiler_pprof/vendor/upb/CONTRIBUTING.md +37 -0
  14. data/ext/ruby_memprofiler_pprof/vendor/upb/DESIGN.md +201 -0
  15. data/ext/ruby_memprofiler_pprof/vendor/upb/LICENSE +26 -0
  16. data/ext/ruby_memprofiler_pprof/vendor/upb/README.md +78 -0
  17. data/ext/ruby_memprofiler_pprof/vendor/upb/WORKSPACE +58 -0
  18. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/BUILD +53 -0
  19. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/amalgamate.py +129 -0
  20. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/build_defs.bzl +160 -0
  21. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/lua.BUILD +127 -0
  22. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/protobuf.patch +54 -0
  23. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/py_proto_library.bzl +137 -0
  24. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/python_downloads.bzl +84 -0
  25. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/system_python.bzl +101 -0
  26. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/upb_proto_library.bzl +388 -0
  27. data/ext/ruby_memprofiler_pprof/vendor/upb/bazel/workspace_deps.bzl +89 -0
  28. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD +252 -0
  29. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/BUILD.googleapis +54 -0
  30. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/benchmark.cc +333 -0
  31. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/build_defs.bzl +88 -0
  32. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/compare.py +118 -0
  33. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor.proto +888 -0
  34. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/descriptor_sv.proto +890 -0
  35. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/empty.proto +6 -0
  36. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_protobuf_binary_cc.py +64 -0
  37. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_synthetic_protos.py +118 -0
  38. data/ext/ruby_memprofiler_pprof/vendor/upb/benchmarks/gen_upb_binary_c.py +65 -0
  39. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/BUILD.bazel +102 -0
  40. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/README.md +23 -0
  41. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/build_defs.bzl +73 -0
  42. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/make_cmakelists.py +340 -0
  43. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test.py +57 -0
  44. data/ext/ruby_memprofiler_pprof/vendor/upb/cmake/staleness_test_lib.py +186 -0
  45. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/render.py +43 -0
  46. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/style-guide.md +65 -0
  47. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/vs-cpp-protos.md +255 -0
  48. data/ext/ruby_memprofiler_pprof/vendor/upb/docs/wrapping-upb.md +444 -0
  49. data/ext/ruby_memprofiler_pprof/vendor/upb/python/BUILD +216 -0
  50. data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.c +394 -0
  51. data/ext/ruby_memprofiler_pprof/vendor/upb/python/convert.h +63 -0
  52. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.c +1694 -0
  53. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor.h +80 -0
  54. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.c +704 -0
  55. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_containers.h +114 -0
  56. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.c +650 -0
  57. data/ext/ruby_memprofiler_pprof/vendor/upb/python/descriptor_pool.h +48 -0
  58. data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/BUILD.bazel +193 -0
  59. data/ext/ruby_memprofiler_pprof/vendor/upb/python/dist/dist.bzl +190 -0
  60. data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.c +247 -0
  61. data/ext/ruby_memprofiler_pprof/vendor/upb/python/extension_dict.h +39 -0
  62. data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.c +522 -0
  63. data/ext/ruby_memprofiler_pprof/vendor/upb/python/map.h +66 -0
  64. data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.c +1909 -0
  65. data/ext/ruby_memprofiler_pprof/vendor/upb/python/message.h +101 -0
  66. data/ext/ruby_memprofiler_pprof/vendor/upb/python/minimal_test.py +183 -0
  67. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/BUILD +70 -0
  68. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/README.md +11 -0
  69. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_database_test_wrapper.py +30 -0
  70. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_pool_test_wrapper.py +45 -0
  71. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/descriptor_test_wrapper.py +46 -0
  72. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/generator_test_wrapper.py +30 -0
  73. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/json_format_test_wrapper.py +30 -0
  74. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/keywords_test_wrapper.py +30 -0
  75. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_factory_test_wrapper.py +37 -0
  76. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/message_test_wrapper.py +52 -0
  77. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/proto_builder_test_wrapper.py +32 -0
  78. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/pyproto_test_wrapper.bzl +36 -0
  79. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/reflection_test_wrapper.py +45 -0
  80. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/service_reflection_test_wrapper.py +30 -0
  81. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/symbol_database_test_wrapper.py +30 -0
  82. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_encoding_test_wrapper.py +30 -0
  83. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/text_format_test_wrapper.py +30 -0
  84. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/unknown_fields_test_wrapper.py +30 -0
  85. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/well_known_types_test_wrapper.py +36 -0
  86. data/ext/ruby_memprofiler_pprof/vendor/upb/python/pb_unit_tests/wire_format_test_wrapper.py +30 -0
  87. data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.c +350 -0
  88. data/ext/ruby_memprofiler_pprof/vendor/upb/python/protobuf.h +230 -0
  89. data/ext/ruby_memprofiler_pprof/vendor/upb/python/py_extension.bzl +55 -0
  90. data/ext/ruby_memprofiler_pprof/vendor/upb/python/python_api.h +61 -0
  91. data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.c +828 -0
  92. data/ext/ruby_memprofiler_pprof/vendor/upb/python/repeated.h +69 -0
  93. data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.c +404 -0
  94. data/ext/ruby_memprofiler_pprof/vendor/upb/python/unknown_fields.h +39 -0
  95. data/ext/ruby_memprofiler_pprof/vendor/upb/python/version_script.lds +6 -0
  96. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/LICENSE +32 -0
  97. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/README.google +9 -0
  98. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/console.lua +156 -0
  99. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/lunit/lunit.lua +725 -0
  100. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/BUILD +19 -0
  101. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/LICENSE +21 -0
  102. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/naive.c +92 -0
  103. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-neon.c +157 -0
  104. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/range2-sse.c +170 -0
  105. data/ext/ruby_memprofiler_pprof/vendor/upb/third_party/utf8_range/utf8_range.h +9 -0
  106. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/BUILD.bazel +129 -0
  107. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/README.md +8 -0
  108. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/def.c +939 -0
  109. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/lua_proto_library.bzl +138 -0
  110. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/main.c +83 -0
  111. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/msg.c +1118 -0
  112. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test.proto +69 -0
  113. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/test_upb.lua +846 -0
  114. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.c +258 -0
  115. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.h +132 -0
  116. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upb.lua +58 -0
  117. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/bindings/lua/upbc.cc +134 -0
  118. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.c +192 -0
  119. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/collections.h +174 -0
  120. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb.c +346 -0
  121. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/conformance_upb_failures.txt +1 -0
  122. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.c +1221 -0
  123. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode.h +94 -0
  124. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.c +1055 -0
  125. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_fast.h +153 -0
  126. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/decode_internal.h +211 -0
  127. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.c +3262 -0
  128. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.h +414 -0
  129. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/def.hpp +438 -0
  130. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/empty.proto +1 -0
  131. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.c +604 -0
  132. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/encode.h +71 -0
  133. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/BUILD +13 -0
  134. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/fuzz/file_descriptor_parsenew_fuzzer.cc +43 -0
  135. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.c +1509 -0
  136. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_decode.h +47 -0
  137. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.c +776 -0
  138. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/json_encode.h +62 -0
  139. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.c +1147 -0
  140. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.h +189 -0
  141. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table.hpp +112 -0
  142. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.c +363 -0
  143. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors.h +263 -0
  144. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_internal.h +59 -0
  145. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_accessors_test.cc +425 -0
  146. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/mini_table_test.cc +230 -0
  147. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.c +428 -0
  148. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg.h +114 -0
  149. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_internal.h +836 -0
  150. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.cc +491 -0
  151. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/msg_test.proto +195 -0
  152. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_def.inc +261 -0
  153. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/port_undef.inc +62 -0
  154. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.c +323 -0
  155. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.h +109 -0
  156. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/reflection.hpp +37 -0
  157. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table.c +926 -0
  158. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/table_internal.h +385 -0
  159. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test.proto +74 -0
  160. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.cc +186 -0
  161. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_cpp.proto +12 -0
  162. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_generated_code.cc +977 -0
  163. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/test_table.cc +580 -0
  164. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.c +472 -0
  165. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/text_encode.h +64 -0
  166. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.c +362 -0
  167. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.h +378 -0
  168. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb.hpp +115 -0
  169. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/upb_internal.h +68 -0
  170. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/BUILD +121 -0
  171. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/README.md +7 -0
  172. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.c +300 -0
  173. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare.h +66 -0
  174. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/compare_test.cc +236 -0
  175. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.c +572 -0
  176. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto.h +62 -0
  177. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_public_import_test.proto +32 -0
  178. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_regular_import_test.proto +36 -0
  179. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.cc +143 -0
  180. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_test.proto +119 -0
  181. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_weak_import_test.proto +28 -0
  182. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/def_to_proto_wweak_import_test.proto +28 -0
  183. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.c +311 -0
  184. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields.h +94 -0
  185. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.cc +202 -0
  186. data/ext/ruby_memprofiler_pprof/vendor/upb/upb/util/required_fields_test.proto +48 -0
  187. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/BUILD +78 -0
  188. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.cc +77 -0
  189. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/common.h +112 -0
  190. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upb.cc +1997 -0
  191. data/ext/ruby_memprofiler_pprof/vendor/upb/upbc/protoc-gen-upbdefs.cc +193 -0
  192. data/lib/ruby_memprofiler_pprof/atfork.rb +77 -0
  193. data/lib/ruby_memprofiler_pprof/block_flusher.rb +61 -0
  194. data/lib/ruby_memprofiler_pprof/file_flusher.rb +45 -0
  195. data/lib/ruby_memprofiler_pprof/profile_app.rb +30 -0
  196. data/lib/ruby_memprofiler_pprof/profile_data.rb +18 -0
  197. data/lib/ruby_memprofiler_pprof/version.rb +5 -0
  198. data/lib/ruby_memprofiler_pprof.rb +8 -0
  199. data/libexec/ruby_memprofiler_pprof_profile +16 -0
  200. metadata +257 -0
@@ -0,0 +1,193 @@
1
+ # Copyright (c) 2009-2022, 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" AND
16
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ # DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
19
+ # DIRECT, 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
+ load("//bazel:py_proto_library.bzl", "py_proto_library")
27
+ load(":dist.bzl", "py_dist", "py_dist_module")
28
+ load("@bazel_skylib//lib:selects.bzl", "selects")
29
+ load("@com_google_protobuf//:protobuf_version.bzl", "PROTOBUF_PYTHON_VERSION")
30
+ load("@rules_python//python:packaging.bzl", "py_wheel")
31
+ load("@system_python//:version.bzl", "SYSTEM_PYTHON_VERSION")
32
+
33
+ licenses(["notice"])
34
+
35
+ py_dist_module(
36
+ name = "message_mod",
37
+ extension = "//python:_message_binary",
38
+ module_name = "google._upb._message",
39
+ )
40
+
41
+ py_proto_library(
42
+ name = "well_known_proto_py_pb2",
43
+ deps = [
44
+ "@com_google_protobuf//:any_proto",
45
+ "@com_google_protobuf//:api_proto",
46
+ "@com_google_protobuf//:compiler_plugin_proto",
47
+ "@com_google_protobuf//:descriptor_proto",
48
+ "@com_google_protobuf//:duration_proto",
49
+ "@com_google_protobuf//:empty_proto",
50
+ "@com_google_protobuf//:field_mask_proto",
51
+ "@com_google_protobuf//:source_context_proto",
52
+ "@com_google_protobuf//:struct_proto",
53
+ "@com_google_protobuf//:timestamp_proto",
54
+ "@com_google_protobuf//:type_proto",
55
+ "@com_google_protobuf//:wrappers_proto",
56
+ ],
57
+ )
58
+
59
+ config_setting(
60
+ name = "aarch64_cpu",
61
+ values = {"cpu": "linux-aarch_64"},
62
+ )
63
+
64
+ config_setting(
65
+ name = "x86_64_cpu",
66
+ values = {"cpu": "linux-x86_64"},
67
+ )
68
+
69
+ config_setting(
70
+ name = "osx-x86_64_cpu",
71
+ values = {"cpu": "osx-x86_64"},
72
+ )
73
+
74
+ config_setting(
75
+ name = "osx-aarch64_cpu",
76
+ values = {"cpu": "osx-aarch_64"},
77
+ )
78
+
79
+ config_setting(
80
+ name = "osx-universal2_cpu",
81
+ values = {"cpu": "osx-universal2"},
82
+ )
83
+
84
+ config_setting(
85
+ name = "win32_cpu",
86
+ values = {"cpu": "win32"},
87
+ )
88
+
89
+ config_setting(
90
+ name = "win64_cpu",
91
+ values = {"cpu": "win64"},
92
+ )
93
+
94
+ py_wheel(
95
+ name = "binary_wheel",
96
+ abi = select({
97
+ "//python:full_api_3.7": "cp37m",
98
+ "//python:full_api_3.8": "cp38",
99
+ "//python:full_api_3.9": "cp39",
100
+ "//conditions:default": "abi3",
101
+ }),
102
+ distribution = "protobuf",
103
+ platform = select({
104
+ ":x86_64_cpu": "manylinux2014_x86_64",
105
+ ":aarch64_cpu": "manylinux2014_aarch64",
106
+ ":osx-universal2_cpu": "macosx_10_9_universal2",
107
+ ":win32_cpu": "win32",
108
+ ":win64_cpu": "win_amd64",
109
+ "//conditions:default": "any",
110
+ }),
111
+ python_tag = selects.with_or({
112
+ ("//python:limited_api_3.7", "//python:full_api_3.7"): "cp37",
113
+ "//python:full_api_3.8": "cp38",
114
+ "//python:full_api_3.9": "cp39",
115
+ "//python:limited_api_3.10": "cp310",
116
+ "//conditions:default": "cp" + SYSTEM_PYTHON_VERSION,
117
+ }),
118
+ strip_path_prefixes = [
119
+ "python/dist/",
120
+ "python/",
121
+ ],
122
+ version = PROTOBUF_PYTHON_VERSION,
123
+ deps = [
124
+ ":message_mod",
125
+ ":well_known_proto_py_pb2",
126
+ "@com_google_protobuf//:python_srcs",
127
+ ],
128
+ )
129
+
130
+ py_wheel(
131
+ name = "pure_python_wheel",
132
+ abi = "none",
133
+ distribution = "protobuf",
134
+ platform = "any",
135
+ python_tag = "py3",
136
+ strip_path_prefixes = [
137
+ "python/",
138
+ ],
139
+ version = PROTOBUF_PYTHON_VERSION,
140
+ deps = [
141
+ ":well_known_proto_py_pb2",
142
+ "@com_google_protobuf//:python_srcs",
143
+ ],
144
+ )
145
+
146
+ py_wheel(
147
+ name = "test_wheel",
148
+ abi = "none",
149
+ distribution = "protobuftests",
150
+ platform = "any",
151
+ python_tag = "py3",
152
+ strip_path_prefixes = ["python/"],
153
+ version = PROTOBUF_PYTHON_VERSION,
154
+ deps = [
155
+ "//python/pb_unit_tests:test_files",
156
+ "@com_google_protobuf//:python_common_test_protos",
157
+ "@com_google_protobuf//:python_specific_test_protos",
158
+ "@com_google_protobuf//:python_test_srcs",
159
+ "@com_google_protobuf//:testdata",
160
+ ],
161
+ )
162
+
163
+ py_dist(
164
+ name = "dist",
165
+ binary_wheel = ":binary_wheel",
166
+ full_api_cpus = [
167
+ # TODO(b/231485326): fix win32 build
168
+ # "win32",
169
+ "win64",
170
+ ],
171
+ # Windows needs version-specific wheels until 3.10.
172
+ full_api_versions = [
173
+ "37",
174
+ "38",
175
+ "39",
176
+ ],
177
+ # Limited API: these wheels will satisfy any Python version >= the
178
+ # given version.
179
+ #
180
+ # Technically the limited API doesn't have the functions we need until
181
+ # 3.10, but on Linux we can get away with using 3.7 (see ../python_api.h for
182
+ # details).
183
+ limited_api_wheels = {
184
+ # TODO(b/231485326): fix win32 build
185
+ # "win32": "310",
186
+ "win64": "310",
187
+ "linux-x86_64": "37",
188
+ "linux-aarch_64": "37",
189
+ "osx-universal2": "37",
190
+ },
191
+ pure_python_wheel = ":pure_python_wheel",
192
+ tags = ["manual"],
193
+ )
@@ -0,0 +1,190 @@
1
+ """Rules to create python distribution files and properly name them"""
2
+
3
+ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
4
+ load("@system_python//:version.bzl", "SYSTEM_PYTHON_VERSION")
5
+
6
+ def _get_suffix(limited_api, python_version, cpu):
7
+ """Computes an ABI version tag for an extension module per PEP 3149."""
8
+ suffix = "pyd" if ("win" in cpu) else "so"
9
+
10
+ if limited_api == True:
11
+ if "win" not in cpu:
12
+ suffix = "abi3." + suffix
13
+ return "." + suffix
14
+
15
+ if "win32" in cpu or "win64" in cpu:
16
+ if "win32" in cpu:
17
+ abi = "win32"
18
+ elif "win64" in cpu:
19
+ abi = "win_amd64"
20
+ else:
21
+ fail("Unsupported CPU: " + cpu)
22
+ return ".cp{}-{}.{}".format(python_version, abi, suffix)
23
+
24
+ if python_version == "system":
25
+ python_version = SYSTEM_PYTHON_VERSION
26
+ if int(python_version) < 38:
27
+ python_version += "m"
28
+ abis = {
29
+ "darwin": "darwin",
30
+ "osx-x86_64": "darwin",
31
+ "osx-aarch_64": "darwin",
32
+ "linux-aarch_64": "aarch64-linux-gnu",
33
+ "linux-x86_64": "x86_64-linux-gnu",
34
+ "k8": "x86_64-linux-gnu",
35
+ }
36
+
37
+ return ".cpython-{}-{}.{}".format(python_version, abis[cpu], suffix)
38
+
39
+ fail("Unsupported combination of flags")
40
+
41
+ def _declare_module_file(ctx, module_name, python_version, limited_api):
42
+ """Declares an output file for a Python module with this name, version, and limited api."""
43
+ base_filename = module_name.replace(".", "/")
44
+ suffix = _get_suffix(
45
+ python_version = python_version,
46
+ limited_api = limited_api,
47
+ cpu = ctx.var["TARGET_CPU"],
48
+ )
49
+ filename = base_filename + suffix
50
+ return ctx.actions.declare_file(filename)
51
+
52
+ # --------------------------------------------------------------------------------------------------
53
+ # py_dist_module()
54
+ #
55
+ # Creates a Python binary extension module that is ready for distribution.
56
+ #
57
+ # py_dist_module(
58
+ # name = "message_mod",
59
+ # extension = "//python:_message_binary",
60
+ # module_name = "google._upb._message",
61
+ # )
62
+ #
63
+ # In the simple case, this simply involves copying the input file to the proper filename for
64
+ # our current configuration (module_name, cpu, python_version, limited_abi).
65
+ #
66
+ # For multiarch platforms (osx-universal2), we must combine binaries for multiple architectures
67
+ # into a single output binary using the "llvm-lipo" tool. A config transition depends on multiple
68
+ # architectures to get us the input files we need.
69
+
70
+ def _py_multiarch_transition_impl(settings, attr):
71
+ if settings["//command_line_option:cpu"] == "osx-universal2":
72
+ return [{"//command_line_option:cpu": cpu} for cpu in ["osx-aarch_64", "osx-x86_64"]]
73
+ else:
74
+ return settings
75
+
76
+ _py_multiarch_transition = transition(
77
+ implementation = _py_multiarch_transition_impl,
78
+ inputs = ["//command_line_option:cpu"],
79
+ outputs = ["//command_line_option:cpu"],
80
+ )
81
+
82
+ def _py_dist_module_impl(ctx):
83
+ output_file = _declare_module_file(
84
+ ctx = ctx,
85
+ module_name = ctx.attr.module_name,
86
+ python_version = ctx.attr._python_version[BuildSettingInfo].value,
87
+ limited_api = ctx.attr._limited_api[BuildSettingInfo].value,
88
+ )
89
+ if len(ctx.attr.extension) == 1:
90
+ src = ctx.attr.extension[0][DefaultInfo].files.to_list()[0]
91
+ ctx.actions.run(
92
+ executable = "cp",
93
+ arguments = [src.path, output_file.path],
94
+ inputs = [src],
95
+ outputs = [output_file],
96
+ )
97
+ return [
98
+ DefaultInfo(files = depset([output_file])),
99
+ ]
100
+ else:
101
+ srcs = [mod[DefaultInfo].files.to_list()[0] for mod in ctx.attr.extension]
102
+ ctx.actions.run(
103
+ executable = "/usr/local/bin/llvm-lipo",
104
+ arguments = ["-create", "-output", output_file.path] + [src.path for src in srcs],
105
+ inputs = srcs,
106
+ outputs = [output_file],
107
+ )
108
+ return [
109
+ DefaultInfo(files = depset([output_file])),
110
+ ]
111
+
112
+ py_dist_module = rule(
113
+ output_to_genfiles = True,
114
+ implementation = _py_dist_module_impl,
115
+ attrs = {
116
+ "module_name": attr.string(mandatory = True),
117
+ "extension": attr.label(
118
+ mandatory = True,
119
+ cfg = _py_multiarch_transition,
120
+ ),
121
+ "_limited_api": attr.label(default = "//python:limited_api"),
122
+ "_python_version": attr.label(default = "//python:python_version"),
123
+ "_allowlist_function_transition": attr.label(
124
+ default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
125
+ ),
126
+ },
127
+ )
128
+
129
+ # --------------------------------------------------------------------------------------------------
130
+ # py_dist()
131
+ #
132
+ # A rule that builds a collection of binary wheels, using transitions to depend on many different
133
+ # python versions and cpus.
134
+
135
+ def _py_dist_transition_impl(settings, attr):
136
+ _ignore = (settings) # @unused
137
+ transitions = []
138
+
139
+ for cpu, version in attr.limited_api_wheels.items():
140
+ transitions.append({
141
+ "//command_line_option:cpu": cpu,
142
+ "//python:python_version": version,
143
+ "//python:limited_api": True,
144
+ })
145
+
146
+ for version in attr.full_api_versions:
147
+ for cpu in attr.full_api_cpus:
148
+ transitions.append({
149
+ "//command_line_option:cpu": cpu,
150
+ "//python:python_version": version,
151
+ "//python:limited_api": False,
152
+ })
153
+
154
+ return transitions
155
+
156
+ _py_dist_transition = transition(
157
+ implementation = _py_dist_transition_impl,
158
+ inputs = [],
159
+ outputs = [
160
+ "//command_line_option:cpu",
161
+ "//python:python_version",
162
+ "//python:limited_api",
163
+ ],
164
+ )
165
+
166
+ def _py_dist_impl(ctx):
167
+ binary_files = [dep[DefaultInfo].files for dep in ctx.attr.binary_wheel]
168
+ pure_python_files = [ctx.attr.pure_python_wheel[DefaultInfo].files]
169
+ return [
170
+ DefaultInfo(files = depset(
171
+ transitive = binary_files + pure_python_files,
172
+ )),
173
+ ]
174
+
175
+ py_dist = rule(
176
+ implementation = _py_dist_impl,
177
+ attrs = {
178
+ "binary_wheel": attr.label(
179
+ mandatory = True,
180
+ cfg = _py_dist_transition,
181
+ ),
182
+ "pure_python_wheel": attr.label(mandatory = True),
183
+ "limited_api_wheels": attr.string_dict(),
184
+ "full_api_versions": attr.string_list(),
185
+ "full_api_cpus": attr.string_list(),
186
+ "_allowlist_function_transition": attr.label(
187
+ default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
188
+ ),
189
+ },
190
+ )
@@ -0,0 +1,247 @@
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/extension_dict.h"
29
+
30
+ #include "python/message.h"
31
+ #include "python/protobuf.h"
32
+
33
+ // -----------------------------------------------------------------------------
34
+ // ExtensionDict
35
+ // -----------------------------------------------------------------------------
36
+
37
+ typedef struct {
38
+ PyObject_HEAD;
39
+ PyObject* msg; // Owning ref to our parent pessage.
40
+ } PyUpb_ExtensionDict;
41
+
42
+ PyObject* PyUpb_ExtensionDict_New(PyObject* msg) {
43
+ PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
44
+ PyUpb_ExtensionDict* ext_dict =
45
+ (void*)PyType_GenericAlloc(state->extension_dict_type, 0);
46
+ ext_dict->msg = msg;
47
+ Py_INCREF(ext_dict->msg);
48
+ return &ext_dict->ob_base;
49
+ }
50
+
51
+ static PyObject* PyUpb_ExtensionDict_FindExtensionByName(PyObject* _self,
52
+ PyObject* key) {
53
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
54
+ const char* name = PyUpb_GetStrData(key);
55
+ const upb_MessageDef* m = PyUpb_CMessage_GetMsgdef(self->msg);
56
+ const upb_FileDef* file = upb_MessageDef_File(m);
57
+ const upb_DefPool* symtab = upb_FileDef_Pool(file);
58
+ const upb_FieldDef* ext = upb_DefPool_FindExtensionByName(symtab, name);
59
+ if (ext) {
60
+ return PyUpb_FieldDescriptor_Get(ext);
61
+ } else {
62
+ Py_RETURN_NONE;
63
+ }
64
+ }
65
+
66
+ static PyObject* PyUpb_ExtensionDict_FindExtensionByNumber(PyObject* _self,
67
+ PyObject* arg) {
68
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
69
+ const upb_MessageDef* m = PyUpb_CMessage_GetMsgdef(self->msg);
70
+ const upb_MiniTable* l = upb_MessageDef_MiniTable(m);
71
+ const upb_FileDef* file = upb_MessageDef_File(m);
72
+ const upb_DefPool* symtab = upb_FileDef_Pool(file);
73
+ const upb_ExtensionRegistry* reg = upb_DefPool_ExtensionRegistry(symtab);
74
+ int64_t number = PyLong_AsLong(arg);
75
+ const upb_MiniTable_Extension* ext =
76
+ (upb_MiniTable_Extension*)_upb_extreg_get(reg, l, number);
77
+ if (ext) {
78
+ const upb_FieldDef* f = _upb_DefPool_FindExtensionByMiniTable(symtab, ext);
79
+ return PyUpb_FieldDescriptor_Get(f);
80
+ } else {
81
+ Py_RETURN_NONE;
82
+ }
83
+ }
84
+
85
+ static void PyUpb_ExtensionDict_Dealloc(PyUpb_ExtensionDict* self) {
86
+ PyUpb_CMessage_ClearExtensionDict(self->msg);
87
+ Py_DECREF(self->msg);
88
+ PyUpb_Dealloc(self);
89
+ }
90
+
91
+ static PyObject* PyUpb_ExtensionDict_RichCompare(PyObject* _self,
92
+ PyObject* _other, int opid) {
93
+ // Only equality comparisons are implemented.
94
+ if (opid != Py_EQ && opid != Py_NE) {
95
+ Py_INCREF(Py_NotImplemented);
96
+ return Py_NotImplemented;
97
+ }
98
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
99
+ bool equals = false;
100
+ if (PyObject_TypeCheck(_other, Py_TYPE(_self))) {
101
+ PyUpb_ExtensionDict* other = (PyUpb_ExtensionDict*)_other;
102
+ equals = self->msg == other->msg;
103
+ }
104
+ bool ret = opid == Py_EQ ? equals : !equals;
105
+ return PyBool_FromLong(ret);
106
+ }
107
+
108
+ static int PyUpb_ExtensionDict_Contains(PyObject* _self, PyObject* key) {
109
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
110
+ const upb_FieldDef* f = PyUpb_CMessage_GetExtensionDef(self->msg, key);
111
+ if (!f) return -1;
112
+ upb_Message* msg = PyUpb_CMessage_GetIfReified(self->msg);
113
+ if (!msg) return 0;
114
+ if (upb_FieldDef_IsRepeated(f)) {
115
+ upb_MessageValue val = upb_Message_Get(msg, f);
116
+ return upb_Array_Size(val.array_val) > 0;
117
+ } else {
118
+ return upb_Message_Has(msg, f);
119
+ }
120
+ }
121
+
122
+ static Py_ssize_t PyUpb_ExtensionDict_Length(PyObject* _self) {
123
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
124
+ upb_Message* msg = PyUpb_CMessage_GetIfReified(self->msg);
125
+ return msg ? upb_Message_ExtensionCount(msg) : 0;
126
+ }
127
+
128
+ static PyObject* PyUpb_ExtensionDict_Subscript(PyObject* _self, PyObject* key) {
129
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
130
+ const upb_FieldDef* f = PyUpb_CMessage_GetExtensionDef(self->msg, key);
131
+ if (!f) return NULL;
132
+ return PyUpb_CMessage_GetFieldValue(self->msg, f);
133
+ }
134
+
135
+ static int PyUpb_ExtensionDict_AssignSubscript(PyObject* _self, PyObject* key,
136
+ PyObject* val) {
137
+ PyUpb_ExtensionDict* self = (PyUpb_ExtensionDict*)_self;
138
+ const upb_FieldDef* f = PyUpb_CMessage_GetExtensionDef(self->msg, key);
139
+ if (!f) return -1;
140
+ if (val) {
141
+ return PyUpb_CMessage_SetFieldValue(self->msg, f, val, PyExc_TypeError);
142
+ } else {
143
+ PyUpb_CMessage_DoClearField(self->msg, f);
144
+ return 0;
145
+ }
146
+ }
147
+
148
+ static PyObject* PyUpb_ExtensionIterator_New(PyObject* _ext_dict);
149
+
150
+ static PyMethodDef PyUpb_ExtensionDict_Methods[] = {
151
+ {"_FindExtensionByName", PyUpb_ExtensionDict_FindExtensionByName, METH_O,
152
+ "Finds an extension by name."},
153
+ {"_FindExtensionByNumber", PyUpb_ExtensionDict_FindExtensionByNumber,
154
+ METH_O, "Finds an extension by number."},
155
+ {NULL, NULL},
156
+ };
157
+
158
+ static PyType_Slot PyUpb_ExtensionDict_Slots[] = {
159
+ {Py_tp_dealloc, PyUpb_ExtensionDict_Dealloc},
160
+ {Py_tp_methods, PyUpb_ExtensionDict_Methods},
161
+ //{Py_tp_getset, PyUpb_ExtensionDict_Getters},
162
+ //{Py_tp_hash, PyObject_HashNotImplemented},
163
+ {Py_tp_richcompare, PyUpb_ExtensionDict_RichCompare},
164
+ {Py_tp_iter, PyUpb_ExtensionIterator_New},
165
+ {Py_sq_contains, PyUpb_ExtensionDict_Contains},
166
+ {Py_sq_length, PyUpb_ExtensionDict_Length},
167
+ {Py_mp_length, PyUpb_ExtensionDict_Length},
168
+ {Py_mp_subscript, PyUpb_ExtensionDict_Subscript},
169
+ {Py_mp_ass_subscript, PyUpb_ExtensionDict_AssignSubscript},
170
+ {0, NULL}};
171
+
172
+ static PyType_Spec PyUpb_ExtensionDict_Spec = {
173
+ PYUPB_MODULE_NAME ".ExtensionDict", // tp_name
174
+ sizeof(PyUpb_ExtensionDict), // tp_basicsize
175
+ 0, // tp_itemsize
176
+ Py_TPFLAGS_DEFAULT, // tp_flags
177
+ PyUpb_ExtensionDict_Slots,
178
+ };
179
+
180
+ // -----------------------------------------------------------------------------
181
+ // ExtensionIterator
182
+ // -----------------------------------------------------------------------------
183
+
184
+ typedef struct {
185
+ PyObject_HEAD;
186
+ PyObject* msg;
187
+ size_t iter;
188
+ } PyUpb_ExtensionIterator;
189
+
190
+ static PyObject* PyUpb_ExtensionIterator_New(PyObject* _ext_dict) {
191
+ PyUpb_ExtensionDict* ext_dict = (PyUpb_ExtensionDict*)_ext_dict;
192
+ PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
193
+ PyUpb_ExtensionIterator* iter =
194
+ (void*)PyType_GenericAlloc(state->extension_iterator_type, 0);
195
+ if (!iter) return NULL;
196
+ iter->msg = ext_dict->msg;
197
+ iter->iter = kUpb_Message_Begin;
198
+ Py_INCREF(iter->msg);
199
+ return &iter->ob_base;
200
+ }
201
+
202
+ static void PyUpb_ExtensionIterator_Dealloc(void* _self) {
203
+ PyUpb_ExtensionIterator* self = (PyUpb_ExtensionIterator*)_self;
204
+ Py_DECREF(self->msg);
205
+ PyUpb_Dealloc(_self);
206
+ }
207
+
208
+ PyObject* PyUpb_ExtensionIterator_IterNext(PyObject* _self) {
209
+ PyUpb_ExtensionIterator* self = (PyUpb_ExtensionIterator*)_self;
210
+ upb_Message* msg = PyUpb_CMessage_GetIfReified(self->msg);
211
+ if (!msg) return NULL;
212
+ const upb_MessageDef* m = PyUpb_CMessage_GetMsgdef(self->msg);
213
+ const upb_DefPool* symtab = upb_FileDef_Pool(upb_MessageDef_File(m));
214
+ while (true) {
215
+ const upb_FieldDef* f;
216
+ upb_MessageValue val;
217
+ if (!upb_Message_Next(msg, m, symtab, &f, &val, &self->iter)) return NULL;
218
+ if (upb_FieldDef_IsExtension(f)) return PyUpb_FieldDescriptor_Get(f);
219
+ }
220
+ }
221
+
222
+ static PyType_Slot PyUpb_ExtensionIterator_Slots[] = {
223
+ {Py_tp_dealloc, PyUpb_ExtensionIterator_Dealloc},
224
+ {Py_tp_iter, PyObject_SelfIter},
225
+ {Py_tp_iternext, PyUpb_ExtensionIterator_IterNext},
226
+ {0, NULL}};
227
+
228
+ static PyType_Spec PyUpb_ExtensionIterator_Spec = {
229
+ PYUPB_MODULE_NAME ".ExtensionIterator", // tp_name
230
+ sizeof(PyUpb_ExtensionIterator), // tp_basicsize
231
+ 0, // tp_itemsize
232
+ Py_TPFLAGS_DEFAULT, // tp_flags
233
+ PyUpb_ExtensionIterator_Slots,
234
+ };
235
+
236
+ // -----------------------------------------------------------------------------
237
+ // Top Level
238
+ // -----------------------------------------------------------------------------
239
+
240
+ bool PyUpb_InitExtensionDict(PyObject* m) {
241
+ PyUpb_ModuleState* s = PyUpb_ModuleState_GetFromModule(m);
242
+
243
+ s->extension_dict_type = PyUpb_AddClass(m, &PyUpb_ExtensionDict_Spec);
244
+ s->extension_iterator_type = PyUpb_AddClass(m, &PyUpb_ExtensionIterator_Spec);
245
+
246
+ return s->extension_dict_type && s->extension_iterator_type;
247
+ }
@@ -0,0 +1,39 @@
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_EXTENSION_DICT_H__
29
+ #define PYUPB_EXTENSION_DICT_H__
30
+
31
+ #include <stdbool.h>
32
+
33
+ #include "python/python_api.h"
34
+
35
+ PyObject* PyUpb_ExtensionDict_New(PyObject* msg);
36
+
37
+ bool PyUpb_InitExtensionDict(PyObject* m);
38
+
39
+ #endif // PYUPB_EXTENSION_DICT_H__