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,94 @@
1
+ /*
2
+ * Copyright (c) 2009-2021, Google LLC
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright
8
+ * notice, this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright
10
+ * notice, this list of conditions and the following disclaimer in the
11
+ * documentation and/or other materials provided with the distribution.
12
+ * * Neither the name of Google LLC nor the
13
+ * names of its contributors may be used to endorse or promote products
14
+ * derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #ifndef UPB_UTIL_REQUIRED_FIELDS_H_
29
+ #define UPB_UTIL_REQUIRED_FIELDS_H_
30
+
31
+ #include "upb/def.h"
32
+ #include "upb/reflection.h"
33
+
34
+ /* Must be last. */
35
+ #include "upb/port_def.inc"
36
+
37
+ #ifdef __cplusplus
38
+ extern "C" {
39
+ #endif
40
+
41
+ // A FieldPath can be encoded as an array of upb_FieldPathEntry, in the
42
+ // following format:
43
+ // { {.field = f1}, {.field = f2} } # f1.f2
44
+ // { {.field = f1}, {.index = 5}, {.field = f2} } # f1[5].f2
45
+ // { {.field = f1}, {.key = "abc"}, {.field = f2} } # f1["abc"].f2
46
+ //
47
+ // Users must look at the type of `field` to know if an index or map key
48
+ // follows.
49
+ //
50
+ // A field path may be NULL-terminated, in which case a NULL field indicates
51
+ // the end of the field path.
52
+ typedef union {
53
+ const upb_FieldDef* field;
54
+ size_t array_index;
55
+ upb_MessageValue map_key;
56
+ } upb_FieldPathEntry;
57
+
58
+ // Writes a string representing `*path` to `buf` in the following textual
59
+ // format:
60
+ // foo.bar # Regular fields
61
+ // repeated_baz[2].bar # Repeated field
62
+ // int32_msg_map[5].bar # Integer-keyed map
63
+ // string_msg_map["abc"] # String-keyed map
64
+ // bool_msg_map[true] # Bool-keyed map
65
+ //
66
+ // The input array `*path` must be NULL-terminated. The pointer `*path` will be
67
+ // updated to point to one past the terminating NULL pointer of the input array.
68
+ //
69
+ // The output buffer `buf` will always be NULL-terminated. If the output data
70
+ // (including NULL terminator) exceeds `size`, the result will be truncated.
71
+ // Returns the string length of the data we attempted to write, excluding the
72
+ // terminating NULL.
73
+ size_t upb_FieldPath_ToText(upb_FieldPathEntry** path, char* buf, size_t size);
74
+
75
+ // Checks whether `msg` or any of its children has unset required fields,
76
+ // returning `true` if any are found. `msg` may be NULL, in which case the
77
+ // message will be treated as empty.
78
+ //
79
+ // When this function returns true, `fields` is updated (if non-NULL) to point
80
+ // to a heap-allocated array encoding the field paths of the required fields
81
+ // that are missing. Each path is terminated with {.field = NULL}, and a final
82
+ // {.field = NULL} terminates the list of paths. The caller is responsible for
83
+ // freeing this array.
84
+ bool upb_util_HasUnsetRequired(const upb_Message* msg, const upb_MessageDef* m,
85
+ const upb_DefPool* ext_pool,
86
+ upb_FieldPathEntry** fields);
87
+
88
+ #ifdef __cplusplus
89
+ } /* extern "C" */
90
+ #endif
91
+
92
+ #include "upb/port_undef.inc"
93
+
94
+ #endif /* UPB_UTIL_REQUIRED_FIELDS_H_ */
@@ -0,0 +1,202 @@
1
+ /*
2
+ * Copyright (c) 2009-2021, Google LLC
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright
8
+ * notice, this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright
10
+ * notice, this list of conditions and the following disclaimer in the
11
+ * documentation and/or other materials provided with the distribution.
12
+ * * Neither the name of Google LLC nor the
13
+ * names of its contributors may be used to endorse or promote products
14
+ * derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #include "upb/util/required_fields.h"
29
+
30
+ #include "absl/strings/string_view.h"
31
+ #include "gmock/gmock.h"
32
+ #include "gtest/gtest.h"
33
+ #include "upb/def.hpp"
34
+ #include "upb/json_decode.h"
35
+ #include "upb/upb.hpp"
36
+ #include "upb/util/required_fields_test.upb.h"
37
+ #include "upb/util/required_fields_test.upbdefs.h"
38
+
39
+ std::vector<std::string> PathsToText(upb_FieldPathEntry* entry) {
40
+ std::vector<std::string> ret;
41
+ char buf[1024]; // Larger than anything we'll use in this test.
42
+ while (entry->field) {
43
+ upb_FieldPathEntry* before = entry;
44
+ size_t len = upb_FieldPath_ToText(&entry, buf, sizeof(buf));
45
+ EXPECT_LT(len, sizeof(buf));
46
+ assert(len <= sizeof(buf));
47
+ ret.push_back(buf);
48
+
49
+ // Ensure that we can have a short buffer and that it will be
50
+ // NULL-terminated.
51
+ char shortbuf[4];
52
+ size_t len2 = upb_FieldPath_ToText(&before, shortbuf, sizeof(shortbuf));
53
+ EXPECT_EQ(len, len2);
54
+ EXPECT_EQ(ret.back().substr(0, sizeof(shortbuf) - 1),
55
+ std::string(shortbuf));
56
+ }
57
+ return ret;
58
+ }
59
+
60
+ void CheckRequired(absl::string_view json,
61
+ const std::vector<std::string>& missing) {
62
+ upb::Arena arena;
63
+ upb::SymbolTable symtab;
64
+ upb_util_test_TestRequiredFields* test_msg =
65
+ upb_util_test_TestRequiredFields_new(arena.ptr());
66
+ upb::MessageDefPtr m(
67
+ upb_util_test_TestRequiredFields_getmsgdef(symtab.ptr()));
68
+ upb::Status status;
69
+ EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), test_msg, m.ptr(),
70
+ symtab.ptr(), 0, arena.ptr(), status.ptr()))
71
+ << status.error_message();
72
+ upb_FieldPathEntry* entries;
73
+ EXPECT_EQ(!missing.empty(), upb_util_HasUnsetRequired(
74
+ test_msg, m.ptr(), symtab.ptr(), &entries));
75
+ EXPECT_EQ(missing, PathsToText(entries));
76
+ free(entries);
77
+
78
+ // Verify that we can pass a NULL pointer to entries when we don't care about
79
+ // them.
80
+ EXPECT_EQ(!missing.empty(),
81
+ upb_util_HasUnsetRequired(test_msg, m.ptr(), symtab.ptr(), NULL));
82
+ }
83
+
84
+ // message HasRequiredField {
85
+ // required int32 required_int32 = 1;
86
+ // }
87
+ //
88
+ // message TestRequiredFields {
89
+ // required EmptyMessage required_message = 1;
90
+ // optional TestRequiredFields optional_message = 2;
91
+ // repeated HasRequiredField repeated_message = 3;
92
+ // map<int32, HasRequiredField> map_int32_message = 4;
93
+ // }
94
+ TEST(RequiredFieldsTest, TestRequired) {
95
+ CheckRequired(R"json({})json", {"required_message"});
96
+ CheckRequired(R"json({"required_message": {}}")json", {});
97
+ CheckRequired(
98
+ R"json(
99
+ {
100
+ "optional_message": {}
101
+ }
102
+ )json",
103
+ {"required_message", "optional_message.required_message"});
104
+
105
+ // Repeated field.
106
+ CheckRequired(
107
+ R"json(
108
+ {
109
+ "optional_message": {
110
+ "repeated_message": [
111
+ {"required_int32": 1},
112
+ {},
113
+ {"required_int32": 2}
114
+ ]
115
+ }
116
+ }
117
+ )json",
118
+ {"required_message", "optional_message.required_message",
119
+ "optional_message.repeated_message[1].required_int32"});
120
+
121
+ // Int32 map key.
122
+ CheckRequired(
123
+ R"json(
124
+ {
125
+ "required_message": {},
126
+ "map_int32_message": {
127
+ "1": {"required_int32": 1},
128
+ "5": {},
129
+ "9": {"required_int32": 1}
130
+ }
131
+ }
132
+ )json",
133
+ {"map_int32_message[5].required_int32"});
134
+
135
+ // Int64 map key.
136
+ CheckRequired(
137
+ R"json(
138
+ {
139
+ "required_message": {},
140
+ "map_int64_message": {
141
+ "1": {"required_int32": 1},
142
+ "5": {},
143
+ "9": {"required_int32": 1}
144
+ }
145
+ }
146
+ )json",
147
+ {"map_int64_message[5].required_int32"});
148
+
149
+ // Uint32 map key.
150
+ CheckRequired(
151
+ R"json(
152
+ {
153
+ "required_message": {},
154
+ "map_uint32_message": {
155
+ "1": {"required_int32": 1},
156
+ "5": {},
157
+ "9": {"required_int32": 1}
158
+ }
159
+ }
160
+ )json",
161
+ {"map_uint32_message[5].required_int32"});
162
+
163
+ // Uint64 map key.
164
+ CheckRequired(
165
+ R"json(
166
+ {
167
+ "required_message": {},
168
+ "map_uint64_message": {
169
+ "1": {"required_int32": 1},
170
+ "5": {},
171
+ "9": {"required_int32": 1}
172
+ }
173
+ }
174
+ )json",
175
+ {"map_uint64_message[5].required_int32"});
176
+
177
+ // Bool map key.
178
+ CheckRequired(
179
+ R"json(
180
+ {
181
+ "required_message": {},
182
+ "map_bool_message": {
183
+ "false": {"required_int32": 1},
184
+ "true": {}
185
+ }
186
+ }
187
+ )json",
188
+ {"map_bool_message[true].required_int32"});
189
+
190
+ // String map key.
191
+ CheckRequired(
192
+ R"json(
193
+ {
194
+ "required_message": {},
195
+ "map_string_message": {
196
+ "abc": {"required_int32": 1},
197
+ "d\"ef": {}
198
+ }
199
+ }
200
+ )json",
201
+ {R"(map_string_message["d\"ef"].required_int32)"});
202
+ }
@@ -0,0 +1,48 @@
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
+ syntax = "proto2";
29
+
30
+ package upb_util_test;
31
+
32
+ message EmptyMessage {}
33
+
34
+ message HasRequiredField {
35
+ required int32 required_int32 = 1;
36
+ }
37
+
38
+ message TestRequiredFields {
39
+ required EmptyMessage required_message = 1;
40
+ optional TestRequiredFields optional_message = 2;
41
+ repeated HasRequiredField repeated_message = 3;
42
+ map<int32, HasRequiredField> map_int32_message = 4;
43
+ map<int64, HasRequiredField> map_int64_message = 5;
44
+ map<uint32, HasRequiredField> map_uint32_message = 6;
45
+ map<uint64, HasRequiredField> map_uint64_message = 7;
46
+ map<bool, HasRequiredField> map_bool_message = 8;
47
+ map<string, HasRequiredField> map_string_message = 9;
48
+ }
@@ -0,0 +1,78 @@
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(
27
+ "//bazel:build_defs.bzl",
28
+ "UPB_DEFAULT_CPPOPTS",
29
+ )
30
+
31
+ licenses(["notice"])
32
+
33
+ cc_library(
34
+ name = "common",
35
+ srcs = ["common.cc"],
36
+ hdrs = ["common.h"],
37
+ copts = UPB_DEFAULT_CPPOPTS,
38
+ deps = [
39
+ "@com_google_absl//absl/strings",
40
+ "@com_google_protobuf//:protobuf",
41
+ ],
42
+ )
43
+
44
+ cc_binary(
45
+ name = "protoc-gen-upb",
46
+ srcs = ["protoc-gen-upb.cc"],
47
+ copts = UPB_DEFAULT_CPPOPTS,
48
+ visibility = ["//visibility:public"],
49
+ deps = [
50
+ ":common",
51
+ "//:mini_table",
52
+ "//:port",
53
+ "//:upb",
54
+ "@com_google_absl//absl/base:core_headers",
55
+ "@com_google_absl//absl/container:flat_hash_map",
56
+ "@com_google_absl//absl/container:flat_hash_set",
57
+ "@com_google_absl//absl/strings",
58
+ "@com_google_protobuf//:protobuf",
59
+ "@com_google_protobuf//:protoc_lib",
60
+ ],
61
+ )
62
+
63
+ cc_binary(
64
+ name = "protoc-gen-upbdefs",
65
+ srcs = [
66
+ "protoc-gen-upbdefs.cc",
67
+ ],
68
+ copts = UPB_DEFAULT_CPPOPTS,
69
+ visibility = ["//visibility:public"],
70
+ deps = [
71
+ ":common",
72
+ "@com_google_absl//absl/base:core_headers",
73
+ "@com_google_absl//absl/container:flat_hash_map",
74
+ "@com_google_absl//absl/strings",
75
+ "@com_google_protobuf//:protobuf",
76
+ "@com_google_protobuf//:protoc_lib",
77
+ ],
78
+ )
@@ -0,0 +1,77 @@
1
+ // Copyright (c) 2009-2021, Google LLC
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are met:
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above copyright
9
+ // notice, this list of conditions and the following disclaimer in the
10
+ // documentation and/or other materials provided with the distribution.
11
+ // * Neither the name of Google LLC nor the
12
+ // names of its contributors may be used to endorse or promote products
13
+ // derived from this software without specific prior written permission.
14
+ //
15
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
+ // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
+ // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
+ // ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
19
+ // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+
26
+ #include "upbc/common.h"
27
+
28
+ #include "absl/strings/str_replace.h"
29
+
30
+ namespace upbc {
31
+ namespace {
32
+
33
+ namespace protobuf = ::google::protobuf;
34
+
35
+ } // namespace
36
+
37
+ std::string StripExtension(absl::string_view fname) {
38
+ size_t lastdot = fname.find_last_of('.');
39
+ if (lastdot == std::string::npos) {
40
+ return std::string(fname);
41
+ }
42
+ return std::string(fname.substr(0, lastdot));
43
+ }
44
+
45
+ std::string ToCIdent(absl::string_view str) {
46
+ return absl::StrReplaceAll(str, {{".", "_"}, {"/", "_"}});
47
+ }
48
+
49
+ std::string ToPreproc(absl::string_view str) {
50
+ return absl::AsciiStrToUpper(ToCIdent(str));
51
+ }
52
+
53
+ void EmitFileWarning(const protobuf::FileDescriptor* file, Output& output) {
54
+ output(
55
+ "/* This file was generated by upbc (the upb compiler) from the input\n"
56
+ " * file:\n"
57
+ " *\n"
58
+ " * $0\n"
59
+ " *\n"
60
+ " * Do not edit -- your changes will be discarded when the file is\n"
61
+ " * regenerated. */\n\n",
62
+ file->name());
63
+ }
64
+
65
+ std::string MessageName(const protobuf::Descriptor* descriptor) {
66
+ return ToCIdent(descriptor->full_name());
67
+ }
68
+
69
+ std::string FileLayoutName(const google::protobuf::FileDescriptor* file) {
70
+ return ToCIdent(file->name()) + "_upb_file_layout";
71
+ }
72
+
73
+ std::string HeaderFilename(const google::protobuf::FileDescriptor* file) {
74
+ return StripExtension(file->name()) + ".upb.h";
75
+ }
76
+
77
+ } // namespace upbc
@@ -0,0 +1,112 @@
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 UPBC_COMMON_H
29
+ #define UPBC_COMMON_H
30
+
31
+ #include <vector>
32
+
33
+ #include "absl/strings/str_replace.h"
34
+ #include "absl/strings/substitute.h"
35
+ #include "google/protobuf/descriptor.h"
36
+ #include "google/protobuf/io/zero_copy_stream.h"
37
+
38
+ namespace upbc {
39
+
40
+ class Output {
41
+ public:
42
+ Output(google::protobuf::io::ZeroCopyOutputStream* stream)
43
+ : stream_(stream) {}
44
+ ~Output() { stream_->BackUp((int)size_); }
45
+
46
+ template <class... Arg>
47
+ void operator()(absl::string_view format, const Arg&... arg) {
48
+ Write(absl::Substitute(format, arg...));
49
+ }
50
+
51
+ private:
52
+ void Write(absl::string_view data) {
53
+ std::string stripped;
54
+ if (absl::StartsWith(data, "\n ")) {
55
+ size_t indent = data.substr(1).find_first_not_of(' ');
56
+ if (indent != absl::string_view::npos) {
57
+ // Remove indentation from all lines.
58
+ auto line_prefix = data.substr(0, indent + 1);
59
+ // The final line has an extra newline and is indented two less, eg.
60
+ // R"cc(
61
+ // UPB_INLINE $0 $1_$2(const $1 *msg) {
62
+ // return $1_has_$2(msg) ? *UPB_PTR_AT(msg, $3, $0) : $4;
63
+ // }
64
+ // )cc",
65
+ std::string last_line_prefix = std::string(line_prefix);
66
+ last_line_prefix.resize(last_line_prefix.size() - 2);
67
+ data.remove_prefix(line_prefix.size());
68
+ stripped = absl::StrReplaceAll(
69
+ data, {{line_prefix, "\n"}, {last_line_prefix, "\n"}});
70
+ data = stripped;
71
+ }
72
+ }
73
+ while (!data.empty()) {
74
+ RefreshOutput();
75
+ size_t to_write = std::min(data.size(), size_);
76
+ memcpy(ptr_, data.data(), to_write);
77
+ data.remove_prefix(to_write);
78
+ ptr_ += to_write;
79
+ size_ -= to_write;
80
+ }
81
+ }
82
+
83
+ void RefreshOutput() {
84
+ while (size_ == 0) {
85
+ void* ptr;
86
+ int size;
87
+ if (!stream_->Next(&ptr, &size)) {
88
+ fprintf(stderr, "upbc: Failed to write to to output\n");
89
+ abort();
90
+ }
91
+ ptr_ = static_cast<char*>(ptr);
92
+ size_ = size;
93
+ }
94
+ }
95
+
96
+ google::protobuf::io::ZeroCopyOutputStream* stream_;
97
+ char* ptr_ = nullptr;
98
+ size_t size_ = 0;
99
+ };
100
+
101
+ std::string StripExtension(absl::string_view fname);
102
+ std::string ToCIdent(absl::string_view str);
103
+ std::string ToPreproc(absl::string_view str);
104
+ void EmitFileWarning(const google::protobuf::FileDescriptor* file,
105
+ Output& output);
106
+ std::string MessageName(const google::protobuf::Descriptor* descriptor);
107
+ std::string FileLayoutName(const google::protobuf::FileDescriptor* file);
108
+ std::string HeaderFilename(const google::protobuf::FileDescriptor* file);
109
+
110
+ } // namespace upbc
111
+
112
+ #endif // UPBC_COMMON_H