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,37 @@
1
+
2
+ # How to Contribute
3
+
4
+ We'd love to accept your patches and contributions to this project. There are
5
+ just a few small guidelines you need to follow.
6
+
7
+ ## Get in touch
8
+
9
+ If your idea will take you more than, say, 30 minutes to
10
+ implement, please get in touch first via the issue tracker
11
+ to touch base about your plan. That will give an
12
+ opportunity for early feedback and help avoid wasting your
13
+ time.
14
+
15
+ ## Contributor License Agreement
16
+
17
+ Contributions to this project must be accompanied by a Contributor License
18
+ Agreement. You (or your employer) retain the copyright to your contribution;
19
+ this simply gives us permission to use and redistribute your contributions as
20
+ part of the project. Head over to <https://cla.developers.google.com/> to see
21
+ your current agreements on file or to sign a new one.
22
+
23
+ You generally only need to submit a CLA once, so if you've already submitted one
24
+ (even if it was for a different project), you probably don't need to do it
25
+ again.
26
+
27
+ ## Code Reviews
28
+
29
+ All submissions, including submissions by project members, require review. We
30
+ use GitHub pull requests for this purpose. Consult
31
+ [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
32
+ information on using pull requests.
33
+
34
+ ## Community Guidelines
35
+
36
+ This project follows [Google's Open Source Community
37
+ Guidelines](https://opensource.google/conduct/).
@@ -0,0 +1,201 @@
1
+
2
+ # upb Design
3
+
4
+ upb aims to be a minimal C protobuf kernel. It has a C API, but its primary
5
+ goal is to be the core runtime for a higher-level API.
6
+
7
+ ## Design goals
8
+
9
+ - Full protobuf conformance
10
+ - Small code size
11
+ - Fast performance (without compromising code size)
12
+ - Easy to wrap in language runtimes
13
+ - Easy to adapt to different memory management schemes (refcounting, GC, etc)
14
+
15
+ ## Design parameters
16
+
17
+ - C99
18
+ - 32 or 64-bit CPU (assumes 4 or 8 byte pointers)
19
+ - Uses pointer tagging, but avoids other implementation-defined behavior
20
+ - Aims to never invoke undefined behavior (tests with ASAN, UBSAN, etc)
21
+ - No global state, fully re-entrant
22
+
23
+
24
+ ## Overall Structure
25
+
26
+ The upb library is divided into two main parts:
27
+
28
+ - A core message representation, which supports binary format parsing
29
+ and serialization.
30
+ - `upb/upb.h`: arena allocator (`upb_arena`)
31
+ - `upb/msg_internal.h`: core message representation and parse tables
32
+ - `upb/msg.h`: accessing metadata common to all messages, like unknown fields
33
+ - `upb/decode.h`: binary format parsing
34
+ - `upb/encode.h`: binary format serialization
35
+ - `upb/table_internal.h`: hash table (used for maps)
36
+ - `upbc/protoc-gen-upbc.cc`: compiler that generates `.upb.h`/`.upb.c` APIs for
37
+ accessing messages without reflection.
38
+ - A reflection add-on library that supports JSON and text format.
39
+ - `upb/def.h`: schema representation and loading from descriptors
40
+ - `upb/reflection.h`: reflective access to message data.
41
+ - `upb/json_encode.h`: JSON encoding
42
+ - `upb/json_decode.h`: JSON decoding
43
+ - `upb/text_encode.h`: text format encoding
44
+ - `upbc/protoc-gen-upbdefs.cc`: compiler that generates `.upbdefs.h`/`.upbdefs.c`
45
+ APIs for loading reflection.
46
+
47
+ ## Core Message Representation
48
+
49
+ The representation for each message consists of:
50
+ - One pointer (`upb_msg_internaldata*`) for unknown fields and extensions. This
51
+ pointer is `NULL` when no unknown fields or extensions are present.
52
+ - Hasbits for any optional/required fields.
53
+ - Case integers for each oneof.
54
+ - Data for each field.
55
+
56
+ For example, a layout for a message with two `optional int32` fields would end
57
+ up looking something like this:
58
+
59
+ ```c
60
+ // For illustration only, upb does not actually generate structs.
61
+ typedef struct {
62
+ upb_msg_internaldata* internal; // Unknown fields and extensions.
63
+ uint32_t hasbits; // We are only using two hasbits.
64
+ int32_t field1;
65
+ int32_t field2;
66
+ } package_name_MessageName;
67
+ ```
68
+
69
+ Note in particular that messages do *not* have:
70
+ - A pointer to reflection or a parse table (upb messages are not self-describing).
71
+ - A pointer to an arena (the arena must be explicitly passed into any function that
72
+ allocates).
73
+
74
+ The upb compiler computes a layout for each message, and determines the offset for
75
+ each field using normal alignment rules (each data member must be aligned to a
76
+ multiple of its size). This layout is then embedded into the generated `.upb.h`
77
+ and `.upb.c` headers in two different forms. First as inline accessors that expect
78
+ the data at a given offset:
79
+
80
+ ```c
81
+ // Example of a generated accessor, from foo.upb.h
82
+ UPB_INLINE int32_t package_name_MessageName_field1(
83
+ const upb_test_MessageName *msg) {
84
+ return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t);
85
+ }
86
+ ```
87
+
88
+ Secondly, the layout is emitted as a table which is used by the parser and serializer.
89
+ We call these tables "mini-tables" to distinguish them from the larger and more
90
+ optimized "fast tables" used in `upb/decode_fast.c` (an experimental parser that is
91
+ 2-3x the speed of the main parser, though the main parser is already quite fast).
92
+
93
+ ```c
94
+ // Definition of mini-table structure, from upb/msg_internal.h
95
+ typedef struct {
96
+ uint32_t number;
97
+ uint16_t offset;
98
+ int16_t presence; /* If >0, hasbit_index. If <0, ~oneof_index. */
99
+ uint16_t submsg_index; /* undefined if descriptortype != MESSAGE or GROUP. */
100
+ uint8_t descriptortype;
101
+ int8_t mode; /* upb_fieldmode, with flags from upb_labelflags */
102
+ } upb_msglayout_field;
103
+
104
+ typedef enum {
105
+ _UPB_MODE_MAP = 0,
106
+ _UPB_MODE_ARRAY = 1,
107
+ _UPB_MODE_SCALAR = 2,
108
+ } upb_fieldmode;
109
+
110
+ typedef struct {
111
+ const struct upb_msglayout *const* submsgs;
112
+ const upb_msglayout_field *fields;
113
+ uint16_t size;
114
+ uint16_t field_count;
115
+ bool extendable;
116
+ uint8_t dense_below;
117
+ uint8_t table_mask;
118
+ } upb_msglayout;
119
+
120
+ // Example of a generated mini-table, from foo.upb.c
121
+ static const upb_msglayout_field upb_test_MessageName__fields[2] = {
122
+ {1, UPB_SIZE(4, 4), 1, 0, 5, _UPB_MODE_SCALAR},
123
+ {2, UPB_SIZE(8, 8), 2, 0, 5, _UPB_MODE_SCALAR},
124
+ };
125
+
126
+ const upb_msglayout upb_test_MessageName_msginit = {
127
+ NULL,
128
+ &upb_test_MessageName__fields[0],
129
+ UPB_SIZE(16, 16), 2, false, 2, 255,
130
+ };
131
+ ```
132
+
133
+ The upb compiler computes separate layouts for 32 and 64 bit modes, since the
134
+ pointer size will be 4 or 8 bytes respectively. The upb compiler embeds both
135
+ sizes into the source code, using a `UPB_SIZE(size32, size64)` macro that can
136
+ choose the appropriate size at build time based on the size of `UINTPTR_MAX`.
137
+
138
+ Note that `.upb.c` files contain data tables only. There is no "generated code"
139
+ except for the inline accessors in the `.upb.h` files: the entire footprint
140
+ of `.upb.c` files is in `.rodata`, none in `.text` or `.data`.
141
+
142
+ ## Memory Management Model
143
+
144
+ All memory management in upb is built around arenas. A message is never
145
+ considered to "own" the strings or sub-messages contained within it. Instead a
146
+ message and all of its sub-messages/strings/etc. are all owned by an arena and
147
+ are freed when the arena is freed. An entire message tree will probably be
148
+ owned by a single arena, but this is not required or enforced. As far as upb is
149
+ concerned, it is up to the client how to partition its arenas. upb only requires
150
+ that when you ask it to serialize a message, that all reachable messages are
151
+ still alive.
152
+
153
+ The arena supports both a user-supplied initial block and a custom allocation
154
+ callback, so there is a lot of flexibility in memory allocation strategy. The
155
+ allocation callback can even be `NULL` for heap-free operation. The main
156
+ constraint of the arena is that all of the memory in each arena must be freed
157
+ together.
158
+
159
+ `upb_arena` supports a novel operation called "fuse". When two arenas are fused
160
+ together, their lifetimes are irreversibly joined, such that none of the arena
161
+ blocks in either arena will be freed until *both* arenas are freed with
162
+ `upb_arena_free()`. This is useful when joining two messages from separate
163
+ arenas (making one a sub-message of the other). Fuse is a very cheap
164
+ operation, and an unlimited number of arenas can be fused together efficiently.
165
+
166
+ ## Reflection and Descriptors
167
+
168
+ upb offers a fully-featured reflection library. There are two main ways of
169
+ using reflection:
170
+
171
+ 1. You can load descriptors from strings using `upb_symtab_addfile()`.
172
+ The upb runtime will dynamically create mini-tables like what the upb compiler
173
+ would have created if you had compiled this type into a `.upb.c` file.
174
+ 2. You can load descriptors using generated `.upbdefs.h` interfaces.
175
+ This will load reflection that references the corresponding `.upb.c`
176
+ mini-tables instead of building a new mini-table on the fly. This lets
177
+ you reflect on generated types that are linked into your program.
178
+
179
+ upb's design for descriptors is similar to protobuf C++ in many ways, with
180
+ the following correspondences:
181
+
182
+ | C++ Type | upb type |
183
+ | ---------| ---------|
184
+ | `google::protobuf::DescriptorPool` | `upb_symtab`
185
+ | `google::protobuf::Descriptor` | `upb_msgdef`
186
+ | `google::protobuf::FieldDescriptor` | `upb_fielddef`
187
+ | `google::protobuf::OneofDescriptor` | `upb_oneofdef`
188
+ | `google::protobuf::EnumDescriptor` | `upb_enumdef`
189
+ | `google::protobuf::FileDescriptor` | `upb_filedef`
190
+ | `google::protobuf::ServiceDescriptor` | `upb_servicedef`
191
+ | `google::protobuf::MethodDescriptor` | `upb_methoddef`
192
+
193
+ Like in C++ descriptors (defs) are created by loading a
194
+ `google_protobuf_FileDescriptorProto` into a `upb_symtab`. This creates and
195
+ links all of the def objects corresponding to that `.proto` file, and inserts
196
+ the names into a symbol table so they can be looked up by name.
197
+
198
+ Once you have loaded some descriptors into a `upb_symtab`, you can create and
199
+ manipulate messages using the interfaces defined in `upb/reflection.h`. If your
200
+ descriptors are linked to your generated layouts using option (2) above, you can
201
+ safely access the same messages using both reflection and generated interfaces.
@@ -0,0 +1,26 @@
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
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of Google LLC nor the names of any other
14
+ contributors may be used to endorse or promote products
15
+ derived from this software without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY EXPRESS OR IMPLIED
18
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20
+ EVENT SHALL GOOGLE LLC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
24
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26
+ POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,78 @@
1
+
2
+ # μpb: small, fast C protos
3
+
4
+ μpb (often written 'upb') is a small
5
+ [protobuf](https://github.com/protocolbuffers/protobuf) implementation written
6
+ in C.
7
+
8
+ upb is the core runtime for protobuf languages extensions in
9
+ [Ruby](https://github.com/protocolbuffers/protobuf/tree/master/ruby),
10
+ [PHP](https://github.com/protocolbuffers/protobuf/tree/master/php), and (soon)
11
+ Python.
12
+
13
+ While upb offers a C API, the C API & ABI **are not stable**. For this reason,
14
+ upb is not generally offered as a C library for direct consumption, and there
15
+ are no releases.
16
+
17
+ ## Features
18
+
19
+ upb has comparable speed to protobuf C++, but is an order of magnitude smaller
20
+ in code size.
21
+
22
+ Like the main protobuf implementation in C++, it supports:
23
+
24
+ - a generated API (in C)
25
+ - reflection
26
+ - binary & JSON wire formats
27
+ - text format serialization
28
+ - all standard features of protobufs (oneofs, maps, unknown fields, extensions,
29
+ etc.)
30
+ - full conformance with the protobuf conformance tests
31
+
32
+ upb also supports some features that C++ does not:
33
+
34
+ - **optional reflection:** generated messages are agnostic to whether
35
+ reflection will be linked in or not.
36
+ - **no global state:** no pre-main registration or other global state.
37
+ - **fast reflection-based parsing:** messages loaded at runtime parse
38
+ just as fast as compiled-in messages.
39
+
40
+ However there are a few features it does not support:
41
+
42
+ - text format parsing
43
+ - deep descriptor verification: upb's descriptor validation is not as exhaustive
44
+ as `protoc`.
45
+
46
+ ## Install
47
+
48
+ For Ruby, use [RubyGems](https://rubygems.org/gems/google-protobuf):
49
+
50
+ ```
51
+ $ gem install google-protobuf
52
+ ```
53
+
54
+ For PHP, use [PECL](https://pecl.php.net/package/protobuf):
55
+
56
+ ```
57
+ $ sudo pecl install protobuf
58
+ ```
59
+
60
+ Alternatively, you can build and install upb using
61
+ [vcpkg](https://github.com/microsoft/vcpkg/) dependency manager:
62
+
63
+ git clone https://github.com/Microsoft/vcpkg.git
64
+ cd vcpkg
65
+ ./bootstrap-vcpkg.sh
66
+ ./vcpkg integrate install
67
+ ./vcpkg install upb
68
+
69
+ The upb port in vcpkg is kept up to date by microsoft team members and community
70
+ contributors.
71
+
72
+ If the version is out of date, please
73
+ [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the
74
+ vcpkg repository.
75
+
76
+ ## Contributing
77
+
78
+ Please see [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,58 @@
1
+ workspace(name = "upb")
2
+
3
+ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
4
+ load("//bazel:workspace_deps.bzl", "upb_deps")
5
+
6
+ upb_deps()
7
+ register_toolchains("@system_python//:python_toolchain")
8
+
9
+ load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
10
+ protobuf_deps()
11
+
12
+ http_archive(
13
+ name = "lua",
14
+ build_file = "//bazel:lua.BUILD",
15
+ sha256 = "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b",
16
+ strip_prefix = "lua-5.2.4",
17
+ urls = [
18
+ "https://mirror.bazel.build/www.lua.org/ftp/lua-5.2.4.tar.gz",
19
+ "https://www.lua.org/ftp/lua-5.2.4.tar.gz",
20
+ ],
21
+ )
22
+
23
+ http_archive(
24
+ name = "com_google_googletest",
25
+ urls = ["https://github.com/google/googletest/archive/b6cd405286ed8635ece71c72f118e659f4ade3fb.zip"], # 2019-01-07
26
+ strip_prefix = "googletest-b6cd405286ed8635ece71c72f118e659f4ade3fb",
27
+ sha256 = "ff7a82736e158c077e76188232eac77913a15dac0b22508c390ab3f88e6d6d86",
28
+ )
29
+
30
+ http_archive(
31
+ name = "com_github_google_benchmark",
32
+ urls = ["https://github.com/google/benchmark/archive/0baacde3618ca617da95375e0af13ce1baadea47.zip"],
33
+ strip_prefix = "benchmark-0baacde3618ca617da95375e0af13ce1baadea47",
34
+ sha256 = "62e2f2e6d8a744d67e4bbc212fcfd06647080de4253c97ad5c6749e09faf2cb0",
35
+ )
36
+
37
+ http_archive(
38
+ name = "com_google_googleapis",
39
+ urls = ["https://github.com/googleapis/googleapis/archive/refs/heads/master.zip"],
40
+ build_file = "//benchmarks:BUILD.googleapis",
41
+ strip_prefix = "googleapis-master",
42
+ patch_cmds = ["find google -type f -name BUILD.bazel -delete"],
43
+ )
44
+
45
+ http_archive(
46
+ name = "rules_fuzzing",
47
+ sha256 = "23bb074064c6f488d12044934ab1b0631e8e6898d5cf2f6bde087adb01111573",
48
+ strip_prefix = "rules_fuzzing-0.3.1",
49
+ urls = ["https://github.com/bazelbuild/rules_fuzzing/archive/v0.3.1.zip"],
50
+ )
51
+
52
+ load("@rules_fuzzing//fuzzing:repositories.bzl", "rules_fuzzing_dependencies")
53
+
54
+ rules_fuzzing_dependencies()
55
+
56
+ load("@rules_fuzzing//fuzzing:init.bzl", "rules_fuzzing_init")
57
+
58
+ rules_fuzzing_init()
@@ -0,0 +1,53 @@
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" 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_skylib//:bzl_library.bzl", "bzl_library")
27
+
28
+ licenses(["notice"])
29
+
30
+ py_binary(
31
+ name = "amalgamate",
32
+ srcs = ["amalgamate.py"],
33
+ visibility = ["//:__pkg__"],
34
+ )
35
+
36
+ # py_proto_library() is private rule, only intended for internal use by upb.
37
+ # Hopefully py_proto_library() will eventually be availble in rules_proto or
38
+ # another upstream package.
39
+ bzl_library(
40
+ name = "py_proto_library_bzl",
41
+ srcs = ["py_proto_library.bzl"],
42
+ )
43
+
44
+ bzl_library(
45
+ name = "upb_proto_library_bzl",
46
+ srcs = ["upb_proto_library.bzl"],
47
+ visibility = ["//visibility:public"],
48
+ deps = [
49
+ "@bazel_skylib//lib:paths",
50
+ "@bazel_tools//tools/cpp:toolchain_utils.bzl",
51
+ "@rules_proto//proto:defs",
52
+ ],
53
+ )
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/python
2
+ #
3
+ # Copyright (c) 2009-2021, Google LLC
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above copyright
11
+ # notice, this list of conditions and the following disclaimer in the
12
+ # documentation and/or other materials provided with the distribution.
13
+ # * Neither the name of Google LLC nor the
14
+ # names of its contributors may be used to endorse or promote products
15
+ # derived from this software without specific prior written permission.
16
+ #
17
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ # DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
21
+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ import sys
29
+ import re
30
+ import os
31
+
32
+ INCLUDE_RE = re.compile('^#include "([^"]*)"$')
33
+
34
+ def parse_include(line):
35
+ match = INCLUDE_RE.match(line)
36
+ return match.groups()[0] if match else None
37
+
38
+ class Amalgamator:
39
+ def __init__(self, output_path, prefix):
40
+ self.include_paths = ["."]
41
+ self.included = set(["upb/port_def.inc", "upb/port_undef.inc"])
42
+ self.output_h = open(output_path + prefix + "upb.h", "w")
43
+ self.output_c = open(output_path + prefix + "upb.c", "w")
44
+
45
+ self.output_c.write("/* Amalgamated source file */\n")
46
+ self.output_c.write('#include "%supb.h"\n' % (prefix))
47
+ if prefix == "ruby-":
48
+ self.output_h.write("// Ruby is still using proto3 enum semantics for proto2\n")
49
+ self.output_h.write("#define UPB_DISABLE_PROTO2_ENUM_CHECKING\n")
50
+ self.output_c.write(open("upb/port_def.inc").read())
51
+
52
+ self.output_h.write("/* Amalgamated source file */\n")
53
+ self.output_h.write(open("upb/port_def.inc").read())
54
+
55
+ def add_include_path(self, path):
56
+ self.include_paths.append(path)
57
+
58
+ def finish(self):
59
+ self._add_header("upb/port_undef.inc")
60
+ self.add_src("upb/port_undef.inc")
61
+
62
+ def _process_file(self, infile_name, outfile):
63
+ file = None
64
+ for path in self.include_paths:
65
+ try:
66
+ full_path = os.path.join(path, infile_name)
67
+ file = open(full_path)
68
+ break
69
+ except IOError:
70
+ pass
71
+ if not file:
72
+ raise RuntimeError("Couldn't open file " + infile_name)
73
+
74
+ lines = file.readlines()
75
+
76
+ has_copyright = lines[1].startswith(" * Copyright")
77
+ if has_copyright:
78
+ while not lines[0].startswith(" */"):
79
+ lines.pop(0)
80
+ lines.pop(0)
81
+
82
+ lines.insert(0, "\n/** " + infile_name + " " + ("*" * 60) +"/");
83
+
84
+ for line in lines:
85
+ if not self._process_include(line, outfile):
86
+ outfile.write(line)
87
+
88
+ def _process_include(self, line, outfile):
89
+ include = parse_include(line)
90
+ if not include:
91
+ return False
92
+ if not (include.startswith("upb") or include.startswith("google")):
93
+ return False
94
+ if include.endswith("hpp"):
95
+ # Skip, we don't support the amalgamation from C++.
96
+ return True
97
+ else:
98
+ # Include this upb header inline.
99
+ if include not in self.included:
100
+ self.included.add(include)
101
+ self._add_header(include)
102
+ return True
103
+
104
+ def _add_header(self, filename):
105
+ self._process_file(filename, self.output_h)
106
+
107
+ def add_src(self, filename):
108
+ self._process_file(filename, self.output_c)
109
+
110
+ # ---- main ----
111
+
112
+ output_path = sys.argv[1]
113
+ prefix = sys.argv[2]
114
+ amalgamator = Amalgamator(output_path, prefix)
115
+ files = []
116
+
117
+ for arg in sys.argv[3:]:
118
+ arg = arg.strip()
119
+ if arg.startswith("-I"):
120
+ amalgamator.add_include_path(arg[2:])
121
+ elif arg.endswith(".h") or arg.endswith(".inc"):
122
+ pass
123
+ else:
124
+ files.append(arg)
125
+
126
+ for filename in files:
127
+ amalgamator.add_src(filename)
128
+
129
+ amalgamator.finish()