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,258 @@
1
+ /*
2
+ * Copyright (c) 2009-2021, Google LLC
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright
8
+ * notice, this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright
10
+ * notice, this list of conditions and the following disclaimer in the
11
+ * documentation and/or other materials provided with the distribution.
12
+ * * Neither the name of Google LLC nor the
13
+ * names of its contributors may be used to endorse or promote products
14
+ * derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ /*
29
+ * require("lua") -- A Lua extension for upb.
30
+ *
31
+ * Exposes only the core library
32
+ * (sub-libraries are exposed in other extensions).
33
+ *
34
+ * 64-bit woes: Lua can only represent numbers of type lua_Number (which is
35
+ * double unless the user specifically overrides this). Doubles can represent
36
+ * the entire range of 64-bit integers, but lose precision once the integers are
37
+ * greater than 2^53.
38
+ *
39
+ * Lua 5.3 is adding support for integers, which will allow for 64-bit
40
+ * integers (which can be interpreted as signed or unsigned).
41
+ *
42
+ * LuaJIT supports 64-bit signed and unsigned boxed representations
43
+ * through its "cdata" mechanism, but this is not portable to regular Lua.
44
+ *
45
+ * Hopefully Lua 5.3 will come soon enough that we can either use Lua 5.3
46
+ * integer support or LuaJIT 64-bit cdata for users that need the entire
47
+ * domain of [u]int64 values.
48
+ */
49
+
50
+ #include "upb/bindings/lua/upb.h"
51
+
52
+ #include <float.h>
53
+ #include <math.h>
54
+ #include <stdint.h>
55
+ #include <stdlib.h>
56
+ #include <string.h>
57
+
58
+ #include "lauxlib.h"
59
+ #include "upb/msg.h"
60
+
61
+ /* Lua compatibility code *****************************************************/
62
+
63
+ /* Shims for upcoming Lua 5.3 functionality. */
64
+ static bool lua_isinteger(lua_State* L, int argn) {
65
+ LUPB_UNUSED(L);
66
+ LUPB_UNUSED(argn);
67
+ return false;
68
+ }
69
+
70
+ /* Utility functions **********************************************************/
71
+
72
+ void lupb_checkstatus(lua_State* L, upb_Status* s) {
73
+ if (!upb_Status_IsOk(s)) {
74
+ lua_pushstring(L, upb_Status_ErrorMessage(s));
75
+ lua_error(L);
76
+ }
77
+ }
78
+
79
+ /* Pushes a new userdata with the given metatable. */
80
+ void* lupb_newuserdata(lua_State* L, size_t size, int n, const char* type) {
81
+ #if LUA_VERSION_NUM >= 504
82
+ void* ret = lua_newuserdatauv(L, size, n);
83
+ #else
84
+ void* ret = lua_newuserdata(L, size);
85
+ lua_createtable(L, 0, n);
86
+ lua_setuservalue(L, -2);
87
+ #endif
88
+
89
+ /* Set metatable. */
90
+ luaL_getmetatable(L, type);
91
+ assert(!lua_isnil(L, -1)); /* Should have been created by luaopen_upb. */
92
+ lua_setmetatable(L, -2);
93
+
94
+ return ret;
95
+ }
96
+
97
+ #if LUA_VERSION_NUM < 504
98
+ int lua_setiuservalue(lua_State* L, int index, int n) {
99
+ lua_getuservalue(L, index);
100
+ lua_insert(L, -2);
101
+ lua_rawseti(L, -2, n);
102
+ lua_pop(L, 1);
103
+ return 1;
104
+ }
105
+
106
+ int lua_getiuservalue(lua_State* L, int index, int n) {
107
+ lua_getuservalue(L, index);
108
+ lua_rawgeti(L, -1, n);
109
+ lua_replace(L, -2);
110
+ return 1;
111
+ }
112
+ #endif
113
+
114
+ /* We use this function as the __index metamethod when a type has both methods
115
+ * and an __index metamethod. */
116
+ int lupb_indexmm(lua_State* L) {
117
+ /* Look up in __index table (which is a closure param). */
118
+ lua_pushvalue(L, 2);
119
+ lua_rawget(L, lua_upvalueindex(1));
120
+ if (!lua_isnil(L, -1)) {
121
+ return 1;
122
+ }
123
+
124
+ /* Not found, chain to user __index metamethod. */
125
+ lua_pushvalue(L, lua_upvalueindex(2));
126
+ lua_pushvalue(L, 1);
127
+ lua_pushvalue(L, 2);
128
+ lua_call(L, 2, 1);
129
+ return 1;
130
+ }
131
+
132
+ void lupb_register_type(lua_State* L, const char* name, const luaL_Reg* m,
133
+ const luaL_Reg* mm) {
134
+ luaL_newmetatable(L, name);
135
+
136
+ if (mm) {
137
+ lupb_setfuncs(L, mm);
138
+ }
139
+
140
+ if (m) {
141
+ lua_createtable(L, 0, 0); /* __index table */
142
+ lupb_setfuncs(L, m);
143
+
144
+ /* Methods go in the mt's __index slot. If the user also specified an
145
+ * __index metamethod, use our custom lupb_indexmm() that can check both. */
146
+ lua_getfield(L, -2, "__index");
147
+ if (lua_isnil(L, -1)) {
148
+ lua_pop(L, 1);
149
+ } else {
150
+ lua_pushcclosure(L, &lupb_indexmm, 2);
151
+ }
152
+ lua_setfield(L, -2, "__index");
153
+ }
154
+
155
+ lua_pop(L, 1); /* The mt. */
156
+ }
157
+
158
+ /* Scalar type mapping ********************************************************/
159
+
160
+ /* Functions that convert scalar/primitive values (numbers, strings, bool)
161
+ * between Lua and C/upb. Handles type/range checking. */
162
+
163
+ bool lupb_checkbool(lua_State* L, int narg) {
164
+ if (!lua_isboolean(L, narg)) {
165
+ luaL_error(L, "must be true or false");
166
+ }
167
+ return lua_toboolean(L, narg);
168
+ }
169
+
170
+ /* Unlike luaL_checkstring(), this does not allow implicit conversion to
171
+ * string. */
172
+ const char* lupb_checkstring(lua_State* L, int narg, size_t* len) {
173
+ if (lua_type(L, narg) != LUA_TSTRING) {
174
+ luaL_error(L, "Expected string");
175
+ }
176
+
177
+ return lua_tolstring(L, narg, len);
178
+ }
179
+
180
+ /* Unlike luaL_checkinteger, these do not implicitly convert from string or
181
+ * round an existing double value. We allow floating-point input, but only if
182
+ * the actual value is integral. */
183
+ #define INTCHECK(type, ctype, min, max) \
184
+ ctype lupb_check##type(lua_State* L, int narg) { \
185
+ double n; \
186
+ if (lua_isinteger(L, narg)) { \
187
+ return lua_tointeger(L, narg); \
188
+ } \
189
+ \
190
+ /* Prevent implicit conversion from string. */ \
191
+ luaL_checktype(L, narg, LUA_TNUMBER); \
192
+ n = lua_tonumber(L, narg); \
193
+ \
194
+ /* Check this double has no fractional part and remains in bounds. \
195
+ * Consider INT64_MIN and INT64_MAX: \
196
+ * 1. INT64_MIN -(2^63) is a power of 2, so this converts to a double. \
197
+ * 2. INT64_MAX (2^63 - 1) is not a power of 2, and conversion of \
198
+ * out-of-range integer values to a double can lead to undefined behavior. \
199
+ * On some compilers, this conversion can return 0, but it also can return \
200
+ * the max value. To deal with this, we can first divide by 2 to prevent \
201
+ * the overflow, multiply it back, and add 1 to find the true limit. */ \
202
+ double i; \
203
+ double max_value = (((double)max / 2) * 2) + 1; \
204
+ if ((modf(n, &i) != 0.0) || n < min || n >= max_value) { \
205
+ luaL_error(L, "number %f was not an integer or out of range for " #type, \
206
+ n); \
207
+ } \
208
+ return (ctype)n; \
209
+ } \
210
+ void lupb_push##type(lua_State* L, ctype val) { \
211
+ /* TODO: push integer for Lua >= 5.3, 64-bit cdata for LuaJIT. */ \
212
+ /* This is lossy for some [u]int64 values, which isn't great, but */ \
213
+ /* crashing when we encounter these values seems worse. */ \
214
+ lua_pushnumber(L, val); \
215
+ }
216
+
217
+ INTCHECK(int64, int64_t, INT64_MIN, INT64_MAX)
218
+ INTCHECK(int32, int32_t, INT32_MIN, INT32_MAX)
219
+ INTCHECK(uint64, uint64_t, 0, UINT64_MAX)
220
+ INTCHECK(uint32, uint32_t, 0, UINT32_MAX)
221
+
222
+ double lupb_checkdouble(lua_State* L, int narg) {
223
+ /* If we were being really hard-nosed here, we'd check whether the input was
224
+ * an integer that has no precise double representation. But doubles aren't
225
+ * generally expected to be exact like integers are, and worse this could
226
+ * cause data-dependent runtime errors: one run of the program could work fine
227
+ * because the integer calculations happened to be exactly representable in
228
+ * double, while the next could crash because of subtly different input. */
229
+
230
+ luaL_checktype(L, narg, LUA_TNUMBER); /* lua_tonumber() auto-converts. */
231
+ return lua_tonumber(L, narg);
232
+ }
233
+
234
+ float lupb_checkfloat(lua_State* L, int narg) {
235
+ /* We don't worry about checking whether the input can be exactly converted to
236
+ * float -- see above. */
237
+
238
+ luaL_checktype(L, narg, LUA_TNUMBER); /* lua_tonumber() auto-converts. */
239
+ return lua_tonumber(L, narg);
240
+ }
241
+
242
+ void lupb_pushdouble(lua_State* L, double d) { lua_pushnumber(L, d); }
243
+
244
+ void lupb_pushfloat(lua_State* L, float d) { lua_pushnumber(L, d); }
245
+
246
+ /* Library entry point ********************************************************/
247
+
248
+ int luaopen_lupb(lua_State* L) {
249
+ #if LUA_VERSION_NUM == 501
250
+ const struct luaL_Reg funcs[] = {{NULL, NULL}};
251
+ luaL_register(L, "upb_c", funcs);
252
+ #else
253
+ lua_createtable(L, 0, 8);
254
+ #endif
255
+ lupb_def_registertypes(L);
256
+ lupb_msg_registertypes(L);
257
+ return 1; /* Return package table. */
258
+ }
@@ -0,0 +1,132 @@
1
+ /*
2
+ * Copyright (c) 2009-2021, Google LLC
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright
8
+ * notice, this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright
10
+ * notice, this list of conditions and the following disclaimer in the
11
+ * documentation and/or other materials provided with the distribution.
12
+ * * Neither the name of Google LLC nor the
13
+ * names of its contributors may be used to endorse or promote products
14
+ * derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
+ * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ /*
29
+ * Shared definitions for upb Lua modules.
30
+ */
31
+
32
+ #ifndef UPB_LUA_UPB_H_
33
+ #define UPB_LUA_UPB_H_
34
+
35
+ #include "lauxlib.h"
36
+ #include "upb/def.h"
37
+ #include "upb/msg.h"
38
+ #include "upb/reflection.h"
39
+
40
+ /* Lua changes its API in incompatible ways in every minor release.
41
+ * This is some shim code to paper over the differences. */
42
+
43
+ #if LUA_VERSION_NUM == 501
44
+ #define lua_rawlen lua_objlen
45
+ #define lua_setuservalue(L, idx) lua_setfenv(L, idx)
46
+ #define lua_getuservalue(L, idx) lua_getfenv(L, idx)
47
+ #define lupb_setfuncs(L, l) luaL_register(L, NULL, l)
48
+ #elif LUA_VERSION_NUM >= 502 && LUA_VERSION_NUM <= 504
49
+ #define lupb_setfuncs(L, l) luaL_setfuncs(L, l, 0)
50
+ #else
51
+ #error Only Lua 5.1-5.4 are supported
52
+ #endif
53
+
54
+ /* Create a new userdata with the given type and |n| uservals, which are popped
55
+ * from the stack to initialize the userdata. */
56
+ void* lupb_newuserdata(lua_State* L, size_t size, int n, const char* type);
57
+
58
+ #if LUA_VERSION_NUM < 504
59
+ /* Polyfills for this Lua 5.4 function. Pushes userval |n| for the userdata at
60
+ * |index|. */
61
+ int lua_setiuservalue(lua_State* L, int index, int n);
62
+ int lua_getiuservalue(lua_State* L, int index, int n);
63
+ #endif
64
+
65
+ /* Registers a type with the given name, methods, and metamethods. */
66
+ void lupb_register_type(lua_State* L, const char* name, const luaL_Reg* m,
67
+ const luaL_Reg* mm);
68
+
69
+ /* Checks the given upb_Status and throws a Lua error if it is not ok. */
70
+ void lupb_checkstatus(lua_State* L, upb_Status* s);
71
+
72
+ int luaopen_lupb(lua_State* L);
73
+
74
+ /* C <-> Lua value conversions. ***********************************************/
75
+
76
+ /* Custom check/push functions. Unlike the Lua equivalents, they are pinned to
77
+ * specific C types (instead of lua_Number, etc), and do not allow any implicit
78
+ * conversion or data loss. */
79
+ int64_t lupb_checkint64(lua_State* L, int narg);
80
+ int32_t lupb_checkint32(lua_State* L, int narg);
81
+ uint64_t lupb_checkuint64(lua_State* L, int narg);
82
+ uint32_t lupb_checkuint32(lua_State* L, int narg);
83
+ double lupb_checkdouble(lua_State* L, int narg);
84
+ float lupb_checkfloat(lua_State* L, int narg);
85
+ bool lupb_checkbool(lua_State* L, int narg);
86
+ const char* lupb_checkstring(lua_State* L, int narg, size_t* len);
87
+ const char* lupb_checkname(lua_State* L, int narg);
88
+
89
+ void lupb_pushint64(lua_State* L, int64_t val);
90
+ void lupb_pushint32(lua_State* L, int32_t val);
91
+ void lupb_pushuint64(lua_State* L, uint64_t val);
92
+ void lupb_pushuint32(lua_State* L, uint32_t val);
93
+
94
+ /** From def.c. ***************************************************************/
95
+
96
+ const upb_MessageDef* lupb_MessageDef_check(lua_State* L, int narg);
97
+ const upb_EnumDef* lupb_EnumDef_check(lua_State* L, int narg);
98
+ const upb_FieldDef* lupb_FieldDef_check(lua_State* L, int narg);
99
+ upb_DefPool* lupb_DefPool_check(lua_State* L, int narg);
100
+ void lupb_MessageDef_pushsubmsgdef(lua_State* L, const upb_FieldDef* f);
101
+
102
+ void lupb_def_registertypes(lua_State* L);
103
+
104
+ /** From msg.c. ***************************************************************/
105
+
106
+ void lupb_pushmsgval(lua_State* L, int container, upb_CType type,
107
+ upb_MessageValue val);
108
+ int lupb_MessageDef_call(lua_State* L);
109
+ upb_Arena* lupb_Arena_pushnew(lua_State* L);
110
+
111
+ void lupb_msg_registertypes(lua_State* L);
112
+
113
+ #define lupb_assert(L, predicate) \
114
+ if (!(predicate)) \
115
+ luaL_error(L, "internal error: %s, %s:%d ", #predicate, __FILE__, __LINE__);
116
+
117
+ #define LUPB_UNUSED(var) (void)var
118
+
119
+ #if defined(__GNUC__) || defined(__clang__)
120
+ #define LUPB_UNREACHABLE() \
121
+ do { \
122
+ assert(0); \
123
+ __builtin_unreachable(); \
124
+ } while (0)
125
+ #else
126
+ #define LUPB_UNREACHABLE() \
127
+ do { \
128
+ assert(0); \
129
+ } while (0)
130
+ #endif
131
+
132
+ #endif /* UPB_LUA_UPB_H_ */
@@ -0,0 +1,58 @@
1
+ --[[--------------------------------------------------------------------------
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
+ --]]--------------------------------------------------------------------------
29
+
30
+ local upb = require("lupb")
31
+
32
+ upb.generated_pool = upb.SymbolTable()
33
+
34
+ local module_metatable = {
35
+ __index = function(t, k)
36
+ local package = t._filedef:package()
37
+ if package then
38
+ k = package .. "." .. k
39
+ end
40
+ local pool = upb.generated_pool
41
+ local def = pool:lookup_msg(k) or pool:lookup_enum(k)
42
+ local v = nil
43
+ if def and def:file():name() == t._filedef:name() then
44
+ v = def
45
+ t[k] = v
46
+ end
47
+ return v
48
+ end
49
+ }
50
+
51
+ function upb._generated_module(desc_string)
52
+ local file = upb.generated_pool:add_file(desc_string)
53
+ local module = {_filedef = file}
54
+ setmetatable(module, module_metatable)
55
+ return module
56
+ end
57
+
58
+ return upb
@@ -0,0 +1,134 @@
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 "google/protobuf/compiler/code_generator.h"
27
+ #include "google/protobuf/compiler/plugin.h"
28
+ #include "google/protobuf/io/printer.h"
29
+ #include "google/protobuf/descriptor.pb.h"
30
+ #include "google/protobuf/descriptor.h"
31
+ #include "absl/strings/str_replace.h"
32
+ #include "absl/strings/string_view.h"
33
+ #include "absl/strings/substitute.h"
34
+
35
+ namespace protoc = ::google::protobuf::compiler;
36
+ namespace protobuf = ::google::protobuf;
37
+
38
+ class LuaGenerator : public protoc::CodeGenerator {
39
+ bool Generate(const protobuf::FileDescriptor* file,
40
+ const std::string& parameter, protoc::GeneratorContext* context,
41
+ std::string* error) const override;
42
+ };
43
+
44
+ static std::string StripExtension(absl::string_view fname) {
45
+ size_t lastdot = fname.find_last_of('.');
46
+ if (lastdot == std::string::npos) {
47
+ return std::string(fname);
48
+ }
49
+ return std::string(fname.substr(0, lastdot));
50
+ }
51
+
52
+ static std::string Filename(const protobuf::FileDescriptor* file) {
53
+ return StripExtension(file->name()) + "_pb.lua";
54
+ }
55
+
56
+ static std::string ModuleName(const protobuf::FileDescriptor* file) {
57
+ std::string ret = StripExtension(file->name()) + "_pb";
58
+ return absl::StrReplaceAll(ret, {{"/", "."}});
59
+ }
60
+
61
+ static void PrintHexDigit(char digit, protobuf::io::Printer* printer) {
62
+ char text;
63
+ if (digit < 10) {
64
+ text = '0' + digit;
65
+ } else {
66
+ text = 'A' + (digit - 10);
67
+ }
68
+ printer->WriteRaw(&text, 1);
69
+ }
70
+
71
+ static void PrintString(int max_cols, absl::string_view* str,
72
+ protobuf::io::Printer* printer) {
73
+ printer->Print("\'");
74
+ while (max_cols > 0 && !str->empty()) {
75
+ char ch = (*str)[0];
76
+ if (ch == '\\') {
77
+ printer->PrintRaw("\\\\");
78
+ max_cols--;
79
+ } else if (ch == '\'') {
80
+ printer->PrintRaw("\\'");
81
+ max_cols--;
82
+ } else if (isprint(ch)) {
83
+ printer->WriteRaw(&ch, 1);
84
+ max_cols--;
85
+ } else {
86
+ unsigned char byte = ch;
87
+ printer->PrintRaw("\\x");
88
+ PrintHexDigit(byte >> 4, printer);
89
+ PrintHexDigit(byte & 15, printer);
90
+ max_cols -= 4;
91
+ }
92
+ str->remove_prefix(1);
93
+ }
94
+ printer->Print("\'");
95
+ }
96
+
97
+ bool LuaGenerator::Generate(const protobuf::FileDescriptor* file,
98
+ const std::string& /* parameter */,
99
+ protoc::GeneratorContext* context,
100
+ std::string* /* error */) const {
101
+ std::string filename = Filename(file);
102
+ protobuf::io::ZeroCopyOutputStream* out = context->Open(filename);
103
+ protobuf::io::Printer printer(out, '$');
104
+
105
+ for (int i = 0; i < file->dependency_count(); i++) {
106
+ const protobuf::FileDescriptor* dep = file->dependency(i);
107
+ printer.Print("require('$name$')\n", "name", ModuleName(dep));
108
+ }
109
+
110
+ printer.Print("local upb = require('upb')\n");
111
+
112
+ protobuf::FileDescriptorProto file_proto;
113
+ file->CopyTo(&file_proto);
114
+ std::string file_data;
115
+ file_proto.SerializeToString(&file_data);
116
+
117
+ printer.Print("local descriptor = table.concat({\n");
118
+ absl::string_view data(file_data);
119
+ while (!data.empty()) {
120
+ printer.Print(" ");
121
+ PrintString(72, &data, &printer);
122
+ printer.Print(",\n");
123
+ }
124
+ printer.Print("})\n");
125
+
126
+ printer.Print("return upb._generated_module(descriptor)\n");
127
+
128
+ return true;
129
+ }
130
+
131
+ int main(int argc, char** argv) {
132
+ LuaGenerator generator;
133
+ return google::protobuf::compiler::PluginMain(argc, argv, &generator);
134
+ }