grpc 1.42.0 → 1.46.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1531) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +425 -234
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc.h +40 -14
  8. data/include/grpc/grpc_posix.h +20 -19
  9. data/include/grpc/grpc_security.h +312 -195
  10. data/include/grpc/grpc_security_constants.h +1 -14
  11. data/include/grpc/impl/codegen/compression_types.h +0 -2
  12. data/include/grpc/impl/codegen/grpc_types.h +24 -21
  13. data/include/grpc/impl/codegen/port_platform.h +7 -3
  14. data/include/grpc/impl/codegen/slice.h +4 -1
  15. data/include/grpc/slice.h +0 -11
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  17. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
  18. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  19. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +5 -5
  20. data/src/core/ext/filters/client_channel/backend_metric.cc +9 -10
  21. data/src/core/ext/filters/client_channel/backend_metric.h +4 -3
  22. data/src/core/ext/filters/client_channel/backup_poller.cc +12 -8
  23. data/src/core/ext/filters/client_channel/channel_connectivity.cc +5 -5
  24. data/src/core/ext/filters/client_channel/client_channel.cc +367 -243
  25. data/src/core/ext/filters/client_channel/client_channel.h +45 -41
  26. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +6 -13
  27. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  28. data/src/core/ext/filters/client_channel/connector.h +1 -1
  29. data/src/core/ext/filters/client_channel/dynamic_filters.cc +5 -6
  30. data/src/core/ext/filters/client_channel/dynamic_filters.h +2 -2
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -22
  32. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -15
  33. data/src/core/ext/filters/client_channel/health/health_check_client.cc +126 -582
  34. data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -160
  35. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +22 -27
  36. data/src/core/ext/filters/client_channel/http_proxy.cc +88 -110
  37. data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  40. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +4 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +100 -81
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +15 -15
  47. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -4
  48. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +50 -32
  49. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +199 -150
  50. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +123 -76
  51. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +162 -122
  52. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  53. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  54. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +98 -63
  55. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +104 -145
  56. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  57. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +147 -70
  58. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +19 -10
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +323 -470
  60. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  61. data/src/core/ext/filters/client_channel/lb_policy.h +94 -62
  62. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +10 -16
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +287 -313
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  65. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  66. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +31 -50
  67. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +136 -226
  68. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  69. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  70. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +92 -255
  71. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -17
  72. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  73. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +84 -68
  74. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
  75. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
  76. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +40 -39
  77. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +476 -412
  78. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +8 -11
  79. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +13 -7
  80. data/src/core/ext/filters/client_channel/retry_filter.cc +253 -171
  81. data/src/core/ext/filters/client_channel/retry_service_config.cc +16 -18
  82. data/src/core/ext/filters/client_channel/retry_service_config.h +18 -12
  83. data/src/core/ext/filters/client_channel/retry_throttle.cc +9 -23
  84. data/src/core/ext/filters/client_channel/retry_throttle.h +11 -5
  85. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +8 -7
  86. data/src/core/ext/filters/client_channel/subchannel.cc +52 -59
  87. data/src/core/ext/filters/client_channel/subchannel.h +7 -7
  88. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
  89. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
  90. data/src/core/ext/filters/deadline/deadline_filter.cc +15 -14
  91. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  92. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +155 -400
  93. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
  94. data/src/core/ext/filters/fault_injection/service_config_parser.cc +11 -13
  95. data/src/core/ext/filters/fault_injection/service_config_parser.h +10 -4
  96. data/src/core/ext/filters/http/client/http_client_filter.cc +81 -544
  97. data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
  98. data/src/core/ext/filters/http/client_authority_filter.cc +31 -95
  99. data/src/core/ext/filters/http/client_authority_filter.h +24 -5
  100. data/src/core/ext/filters/http/http_filters_plugin.cc +22 -22
  101. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +43 -140
  102. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +15 -27
  103. data/src/core/ext/filters/http/server/http_server_filter.cc +36 -251
  104. data/src/core/ext/filters/message_size/message_size_filter.cc +27 -35
  105. data/src/core/ext/filters/message_size/message_size_filter.h +10 -3
  106. data/src/core/ext/filters/rbac/rbac_filter.cc +162 -0
  107. data/src/core/ext/filters/rbac/rbac_filter.h +76 -0
  108. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +606 -0
  109. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +75 -0
  110. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +61 -0
  111. data/src/core/ext/filters/server_config_selector/server_config_selector.h +71 -0
  112. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +143 -0
  113. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → filters/server_config_selector/server_config_selector_filter.h} +9 -7
  114. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +239 -20
  115. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  116. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +286 -108
  117. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +327 -303
  118. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +9 -4
  119. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  120. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  121. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -10
  122. data/src/core/ext/transport/chttp2/transport/flow_control.h +5 -5
  123. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  124. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  125. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -0
  126. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -0
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +361 -240
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +87 -145
  129. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  130. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  131. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +74 -149
  132. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  133. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  134. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  135. data/src/core/ext/transport/chttp2/transport/internal.h +16 -43
  136. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -9
  137. data/src/core/ext/transport/chttp2/transport/writing.cc +81 -136
  138. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  139. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -81
  140. data/src/core/ext/transport/inproc/inproc_transport.h +1 -4
  141. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +117 -0
  142. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +482 -0
  143. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +121 -0
  144. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +553 -0
  145. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +247 -209
  146. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1249 -684
  147. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  148. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +151 -0
  149. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +62 -0
  150. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +160 -0
  151. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  152. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +124 -0
  153. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  154. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +102 -0
  155. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  156. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +97 -0
  157. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +106 -0
  158. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +605 -0
  159. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  160. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +103 -0
  161. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +43 -0
  162. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +51 -0
  163. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +30 -4
  164. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +50 -17
  165. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +143 -116
  166. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +670 -385
  167. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +239 -199
  168. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1270 -663
  169. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +49 -28
  170. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +201 -90
  171. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +320 -271
  172. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1671 -826
  173. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +20 -7
  174. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +43 -23
  175. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +60 -27
  176. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +273 -98
  177. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +299 -0
  178. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1381 -0
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +74 -53
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +355 -189
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +21 -7
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +46 -24
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +213 -176
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1069 -581
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +105 -45
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +526 -166
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +19 -6
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +39 -23
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +16 -22
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +42 -100
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +151 -0
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +145 -117
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +769 -409
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +141 -92
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +737 -348
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +21 -8
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +58 -30
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +203 -125
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +993 -396
  201. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +17 -4
  202. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +29 -16
  203. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +27 -13
  204. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +84 -48
  205. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +22 -9
  206. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +76 -33
  207. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +26 -13
  208. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +94 -48
  209. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +21 -8
  210. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +47 -25
  211. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +51 -35
  212. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +195 -108
  213. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +74 -55
  214. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +350 -189
  215. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +70 -53
  216. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +358 -187
  217. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +19 -6
  218. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +35 -20
  219. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +98 -71
  220. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +504 -258
  221. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +104 -79
  222. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +561 -300
  223. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +31 -16
  224. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +105 -48
  225. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +24 -10
  226. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +66 -39
  227. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  228. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +136 -0
  229. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +82 -61
  230. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +414 -234
  231. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +86 -65
  232. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +407 -236
  233. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +127 -103
  234. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +563 -293
  235. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +53 -34
  236. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +272 -141
  237. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +663 -572
  238. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +3643 -1900
  239. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +38 -19
  240. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +149 -71
  241. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +222 -0
  242. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +1052 -0
  243. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  244. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +88 -0
  245. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  246. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +103 -0
  247. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +27 -13
  248. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +78 -45
  249. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  250. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +134 -0
  251. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +63 -0
  252. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +250 -0
  253. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  254. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +94 -0
  255. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  256. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +213 -0
  257. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +32 -0
  258. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +42 -0
  259. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  260. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +218 -0
  261. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  262. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +146 -0
  263. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +17 -4
  264. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +35 -23
  265. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +45 -28
  266. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +188 -111
  267. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +51 -36
  268. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +261 -131
  269. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +64 -0
  270. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +183 -0
  271. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +26 -13
  272. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +87 -42
  273. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +283 -223
  274. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1554 -733
  275. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +9 -0
  276. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -3
  277. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +105 -60
  278. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +555 -234
  279. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +41 -26
  280. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +157 -86
  281. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +126 -83
  282. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +623 -262
  283. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  284. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +160 -0
  285. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +15 -2
  286. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +22 -14
  287. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +91 -72
  288. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +475 -255
  289. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +31 -17
  290. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +108 -61
  291. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +73 -56
  292. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +348 -185
  293. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  294. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +112 -0
  295. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +34 -18
  296. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +124 -80
  297. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  298. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +214 -0
  299. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +28 -14
  300. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +100 -56
  301. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +21 -8
  302. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +51 -30
  303. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +20 -7
  304. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +49 -26
  305. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +19 -6
  306. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +39 -23
  307. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +35 -20
  308. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +118 -68
  309. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +31 -17
  310. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +124 -64
  311. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +26 -12
  312. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +86 -52
  313. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +37 -22
  314. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +151 -82
  315. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +50 -31
  316. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +230 -144
  317. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +53 -36
  318. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +236 -130
  319. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  320. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +201 -0
  321. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +9 -0
  322. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -0
  323. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  324. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +139 -0
  325. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +23 -9
  326. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +63 -35
  327. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +30 -15
  328. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +99 -51
  329. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  330. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  331. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +19 -6
  332. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +41 -18
  333. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  334. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +127 -0
  335. data/src/core/ext/upb-generated/google/api/annotations.upb.c +22 -0
  336. data/src/core/ext/upb-generated/google/api/annotations.upb.h +23 -0
  337. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +154 -125
  338. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +721 -381
  339. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +158 -126
  340. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +796 -401
  341. data/src/core/ext/upb-generated/google/api/http.upb.c +43 -28
  342. data/src/core/ext/upb-generated/google/api/http.upb.h +217 -114
  343. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  344. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +111 -0
  345. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +18 -5
  346. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +39 -21
  347. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +373 -282
  348. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2077 -1029
  349. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +18 -5
  350. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +37 -19
  351. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +15 -2
  352. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +22 -14
  353. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +47 -31
  354. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +178 -92
  355. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +18 -5
  356. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +37 -19
  357. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +57 -36
  358. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +241 -148
  359. data/src/core/ext/upb-generated/google/rpc/status.upb.c +21 -8
  360. data/src/core/ext/upb-generated/google/rpc/status.upb.h +53 -29
  361. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  362. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +319 -0
  363. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +32 -18
  364. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +104 -47
  365. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +135 -107
  366. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +686 -358
  367. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +27 -12
  368. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +77 -40
  369. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +22 -8
  370. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +57 -34
  371. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +81 -61
  372. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +399 -237
  373. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +34 -19
  374. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +116 -62
  375. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  376. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  377. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +75 -13
  378. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +194 -56
  379. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -5
  380. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +55 -17
  381. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +21 -0
  382. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +16 -0
  383. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +31 -5
  384. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +57 -19
  385. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +30 -4
  386. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +50 -17
  387. data/src/core/ext/upb-generated/validate/validate.upb.c +406 -310
  388. data/src/core/ext/upb-generated/validate/validate.upb.h +2730 -1164
  389. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  390. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +278 -0
  391. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  392. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +108 -0
  393. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  394. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +46 -0
  395. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +64 -17
  396. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +175 -67
  397. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  398. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +99 -0
  399. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +17 -4
  400. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +31 -18
  401. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +30 -16
  402. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +99 -54
  403. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +25 -11
  404. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +54 -29
  405. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  406. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +103 -0
  407. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +22 -9
  408. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +56 -29
  409. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +33 -19
  410. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +131 -69
  411. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +22 -9
  412. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +59 -29
  413. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +36 -21
  414. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +102 -45
  415. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +207 -0
  416. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +878 -0
  417. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  418. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +143 -0
  419. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  420. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +218 -0
  421. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +20 -7
  422. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +43 -23
  423. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  424. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  425. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  426. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  427. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +16 -61
  428. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +67 -67
  429. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  430. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  431. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +53 -0
  432. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  433. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  434. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  435. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  436. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  437. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  438. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  439. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  440. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  441. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  442. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  443. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +10 -8
  444. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +1 -1
  445. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +10 -13
  446. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +4 -4
  447. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +22 -52
  448. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +46 -46
  449. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +250 -281
  450. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +55 -55
  451. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +60 -62
  452. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +10 -10
  453. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +387 -426
  454. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +76 -76
  455. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +16 -18
  456. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +4 -4
  457. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +25 -23
  458. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +4 -4
  459. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  460. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  461. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +17 -32
  462. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +22 -22
  463. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +17 -19
  464. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +4 -4
  465. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +87 -133
  466. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +73 -73
  467. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +140 -116
  468. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +26 -16
  469. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +16 -19
  470. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +4 -4
  471. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +24 -43
  472. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +4 -9
  473. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  474. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  475. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +23 -51
  476. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +43 -43
  477. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +179 -187
  478. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +30 -25
  479. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +16 -19
  480. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +4 -4
  481. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +252 -254
  482. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +53 -43
  483. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +14 -16
  484. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +4 -4
  485. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +16 -20
  486. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +7 -7
  487. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +16 -18
  488. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +4 -4
  489. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +20 -22
  490. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +4 -4
  491. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +15 -18
  492. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +4 -4
  493. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +20 -28
  494. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +13 -13
  495. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +21 -33
  496. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +19 -19
  497. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +20 -30
  498. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +16 -16
  499. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +16 -18
  500. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +4 -4
  501. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +54 -62
  502. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +19 -19
  503. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +155 -166
  504. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +22 -22
  505. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +21 -23
  506. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +4 -4
  507. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +17 -21
  508. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +7 -7
  509. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  510. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  511. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +19 -35
  512. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +25 -25
  513. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +19 -37
  514. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +28 -28
  515. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +190 -0
  516. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  517. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +38 -38
  518. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +10 -10
  519. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +828 -914
  520. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +160 -160
  521. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +54 -48
  522. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +10 -10
  523. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +188 -0
  524. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +85 -0
  525. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  526. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  527. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  528. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  529. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +17 -21
  530. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +7 -7
  531. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  532. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  533. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  534. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  535. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  536. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  537. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  538. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  539. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +57 -0
  540. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  541. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  542. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  543. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  544. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  545. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +17 -18
  546. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +4 -4
  547. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +19 -29
  548. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +16 -16
  549. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +20 -26
  550. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +10 -10
  551. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +59 -0
  552. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  553. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +19 -20
  554. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +4 -4
  555. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +199 -215
  556. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +63 -58
  557. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +17 -13
  558. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +1 -1
  559. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +171 -157
  560. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +24 -19
  561. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +21 -27
  562. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +10 -10
  563. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +219 -216
  564. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +24 -19
  565. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  566. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  567. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +16 -18
  568. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +4 -4
  569. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +19 -33
  570. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +22 -22
  571. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +18 -22
  572. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +7 -7
  573. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +22 -32
  574. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +16 -16
  575. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  576. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  577. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +15 -23
  578. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +13 -13
  579. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  580. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  581. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +17 -21
  582. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +7 -7
  583. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +17 -19
  584. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +4 -4
  585. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +17 -19
  586. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +4 -4
  587. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +17 -19
  588. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +4 -4
  589. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +17 -23
  590. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +10 -10
  591. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +17 -21
  592. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +7 -7
  593. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +16 -21
  594. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +7 -7
  595. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +18 -24
  596. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +10 -10
  597. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +15 -29
  598. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +22 -22
  599. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +16 -26
  600. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +16 -16
  601. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  602. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  603. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +12 -10
  604. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +1 -1
  605. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  606. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  607. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +14 -19
  608. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +7 -7
  609. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +13 -19
  610. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +10 -10
  611. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  612. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  613. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +13 -16
  614. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +4 -4
  615. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  616. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  617. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +7 -7
  618. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +1 -1
  619. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  620. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  621. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  622. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  623. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +5 -14
  624. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +10 -10
  625. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  626. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  627. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +5 -10
  628. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +4 -4
  629. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +5 -62
  630. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +82 -82
  631. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +5 -10
  632. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +4 -4
  633. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +5 -10
  634. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +4 -4
  635. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +5 -16
  636. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +13 -13
  637. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +5 -10
  638. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +4 -4
  639. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +5 -26
  640. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +28 -28
  641. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +6 -11
  642. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +4 -4
  643. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  644. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  645. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  646. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  647. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +6 -15
  648. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +10 -10
  649. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +7 -12
  650. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +4 -4
  651. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -6
  652. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +1 -1
  653. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +6 -11
  654. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +4 -4
  655. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +6 -11
  656. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +4 -4
  657. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +8 -57
  658. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +70 -70
  659. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  660. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  661. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  662. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  663. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  664. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  665. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +6 -17
  666. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +13 -13
  667. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  668. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  669. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +7 -12
  670. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +4 -4
  671. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +9 -16
  672. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +7 -7
  673. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +6 -13
  674. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +7 -7
  675. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  676. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  677. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +8 -13
  678. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +4 -4
  679. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +8 -15
  680. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +7 -7
  681. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +8 -13
  682. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +4 -4
  683. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  684. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  685. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  686. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  687. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  688. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  689. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +7 -12
  690. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +4 -4
  691. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  692. data/src/core/ext/xds/certificate_provider_store.cc +8 -0
  693. data/src/core/ext/xds/certificate_provider_store.h +10 -1
  694. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -4
  695. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  696. data/src/core/ext/xds/upb_utils.h +67 -0
  697. data/src/core/ext/xds/xds_api.cc +182 -3417
  698. data/src/core/ext/xds/xds_api.h +60 -613
  699. data/src/core/ext/xds/xds_bootstrap.cc +222 -123
  700. data/src/core/ext/xds/xds_bootstrap.h +33 -15
  701. data/src/core/ext/xds/xds_certificate_provider.cc +2 -0
  702. data/src/core/ext/xds/xds_certificate_provider.h +10 -2
  703. data/src/core/ext/xds/xds_channel_stack_modifier.cc +16 -20
  704. data/src/core/ext/xds/xds_channel_stack_modifier.h +4 -3
  705. data/src/core/ext/xds/xds_client.cc +805 -1084
  706. data/src/core/ext/xds/xds_client.h +118 -150
  707. data/src/core/ext/xds/xds_client_stats.cc +15 -15
  708. data/src/core/ext/xds/xds_client_stats.h +5 -4
  709. data/src/core/ext/xds/xds_cluster.cc +453 -0
  710. data/src/core/ext/xds/xds_cluster.h +108 -0
  711. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  712. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  713. data/src/core/ext/xds/xds_common_types.cc +388 -0
  714. data/src/core/ext/xds/xds_common_types.h +95 -0
  715. data/src/core/ext/xds/xds_endpoint.cc +371 -0
  716. data/src/core/ext/xds/xds_endpoint.h +135 -0
  717. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -7
  718. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  719. data/src/core/ext/xds/xds_http_filters.cc +11 -5
  720. data/src/core/ext/xds/xds_http_filters.h +4 -4
  721. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  722. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  723. data/src/core/ext/xds/xds_listener.cc +1039 -0
  724. data/src/core/ext/xds/xds_listener.h +220 -0
  725. data/src/core/ext/xds/xds_resource_type.cc +33 -0
  726. data/src/core/ext/xds/xds_resource_type.h +98 -0
  727. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  728. data/src/core/ext/xds/xds_route_config.cc +1122 -0
  729. data/src/core/ext/xds/xds_route_config.h +218 -0
  730. data/src/core/ext/xds/xds_routing.cc +250 -0
  731. data/src/core/ext/xds/xds_routing.h +101 -0
  732. data/src/core/ext/xds/xds_server_config_fetcher.cc +1056 -286
  733. data/src/core/lib/address_utils/parse_address.cc +20 -0
  734. data/src/core/lib/address_utils/parse_address.h +5 -0
  735. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  736. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  737. data/src/core/lib/avl/avl.h +452 -88
  738. data/src/core/lib/backoff/backoff.cc +9 -38
  739. data/src/core/lib/backoff/backoff.h +11 -11
  740. data/src/core/lib/channel/call_finalization.h +86 -0
  741. data/src/core/lib/channel/call_tracer.h +4 -1
  742. data/src/core/lib/channel/channel_args.cc +166 -28
  743. data/src/core/lib/channel/channel_args.h +214 -10
  744. data/src/core/lib/channel/channel_args_preconditioning.cc +42 -0
  745. data/src/core/lib/channel/channel_args_preconditioning.h +61 -0
  746. data/src/core/lib/channel/channel_stack.cc +10 -3
  747. data/src/core/lib/channel/channel_stack.h +39 -6
  748. data/src/core/lib/channel/channel_stack_builder.cc +23 -272
  749. data/src/core/lib/channel/channel_stack_builder.h +118 -149
  750. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  751. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  752. data/src/core/lib/channel/channel_trace.cc +3 -6
  753. data/src/core/lib/channel/channelz.cc +2 -1
  754. data/src/core/lib/channel/connected_channel.cc +9 -4
  755. data/src/core/lib/channel/connected_channel.h +2 -1
  756. data/src/core/lib/channel/context.h +11 -0
  757. data/src/core/lib/channel/handshaker.cc +1 -1
  758. data/src/core/lib/channel/handshaker.h +1 -1
  759. data/src/core/lib/channel/promise_based_filter.cc +1002 -0
  760. data/src/core/lib/channel/promise_based_filter.h +437 -0
  761. data/src/core/lib/compression/compression.cc +20 -112
  762. data/src/core/lib/compression/compression_internal.cc +137 -203
  763. data/src/core/lib/compression/compression_internal.h +64 -69
  764. data/src/core/lib/compression/message_compress.cc +11 -11
  765. data/src/core/lib/compression/message_compress.h +2 -2
  766. data/src/core/lib/config/core_configuration.cc +11 -3
  767. data/src/core/lib/config/core_configuration.h +50 -0
  768. data/src/core/lib/debug/stats_data.cc +2 -6
  769. data/src/core/lib/debug/stats_data.h +18 -21
  770. data/src/core/lib/debug/trace.h +2 -2
  771. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  772. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  773. data/src/core/lib/event_engine/default_event_engine_factory.cc +27 -0
  774. data/src/core/lib/event_engine/event_engine.cc +21 -19
  775. data/src/core/lib/event_engine/event_engine_factory.h +36 -0
  776. data/src/core/lib/event_engine/memory_allocator.cc +66 -0
  777. data/src/core/lib/event_engine/resolved_address.cc +39 -0
  778. data/src/core/lib/gpr/sync_posix.cc +1 -0
  779. data/src/core/lib/gpr/time.cc +2 -1
  780. data/src/core/lib/gpr/tls.h +7 -0
  781. data/src/core/lib/gpr/useful.h +18 -0
  782. data/src/core/lib/gprpp/bitset.h +19 -0
  783. data/src/core/lib/gprpp/capture.h +76 -0
  784. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  785. data/src/core/lib/gprpp/cpp_impl_of.h +49 -0
  786. data/src/core/lib/gprpp/debug_location.h +2 -0
  787. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  788. data/src/core/lib/gprpp/global_config_env.h +2 -2
  789. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  790. data/src/core/lib/gprpp/orphanable.h +1 -1
  791. data/src/core/lib/gprpp/ref_counted.h +3 -1
  792. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  793. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  794. data/src/core/lib/gprpp/status_helper.cc +48 -40
  795. data/src/core/lib/gprpp/status_helper.h +6 -19
  796. data/src/core/lib/gprpp/table.h +24 -1
  797. data/src/core/lib/gprpp/time.cc +198 -0
  798. data/src/core/lib/gprpp/time.h +292 -0
  799. data/src/core/lib/http/format_request.cc +28 -25
  800. data/src/core/lib/http/format_request.h +7 -6
  801. data/src/core/lib/http/httpcli.cc +310 -238
  802. data/src/core/lib/http/httpcli.h +183 -88
  803. data/src/core/lib/http/httpcli_security_connector.cc +64 -75
  804. data/src/core/lib/http/httpcli_ssl_credentials.h +37 -0
  805. data/src/core/lib/http/parser.cc +80 -9
  806. data/src/core/lib/http/parser.h +15 -2
  807. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  808. data/src/core/lib/iomgr/buffer_list.h +18 -18
  809. data/src/core/lib/iomgr/call_combiner.cc +17 -7
  810. data/src/core/lib/iomgr/closure.h +29 -9
  811. data/src/core/lib/iomgr/combiner.cc +25 -3
  812. data/src/core/lib/iomgr/endpoint.h +0 -1
  813. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  814. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  815. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  816. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  817. data/src/core/lib/iomgr/error.cc +13 -10
  818. data/src/core/lib/iomgr/error.h +0 -2
  819. data/src/core/lib/iomgr/ev_apple.cc +6 -5
  820. data/src/core/lib/iomgr/ev_epoll1_linux.cc +8 -7
  821. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -7
  822. data/src/core/lib/iomgr/ev_posix.cc +9 -10
  823. data/src/core/lib/iomgr/ev_posix.h +1 -1
  824. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  825. data/src/core/lib/iomgr/event_engine/iomgr.cc +8 -27
  826. data/src/core/lib/iomgr/event_engine/pollset.cc +2 -3
  827. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  828. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  829. data/src/core/lib/iomgr/event_engine/resolver.cc +68 -49
  830. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  831. data/src/core/lib/iomgr/event_engine/tcp.cc +11 -8
  832. data/src/core/lib/iomgr/event_engine/timer.cc +7 -7
  833. data/src/core/lib/iomgr/exec_ctx.cc +25 -97
  834. data/src/core/lib/iomgr/exec_ctx.h +18 -34
  835. data/src/core/lib/iomgr/executor.cc +22 -16
  836. data/src/core/lib/iomgr/executor.h +1 -1
  837. data/src/core/lib/iomgr/fork_posix.cc +2 -1
  838. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  839. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  840. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  841. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  842. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  843. data/src/core/lib/iomgr/polling_entity.h +6 -0
  844. data/src/core/lib/iomgr/pollset.cc +1 -1
  845. data/src/core/lib/iomgr/pollset.h +4 -4
  846. data/src/core/lib/iomgr/pollset_windows.cc +2 -2
  847. data/src/core/lib/iomgr/port.h +6 -11
  848. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  849. data/src/core/lib/iomgr/resolve_address.h +47 -44
  850. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  851. data/src/core/lib/iomgr/resolve_address_posix.cc +83 -67
  852. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  853. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  854. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  855. data/src/core/lib/iomgr/resolved_address.h +39 -0
  856. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +62 -0
  857. data/src/core/lib/iomgr/socket_utils_common_posix.cc +0 -17
  858. data/src/core/lib/iomgr/tcp_client.cc +3 -5
  859. data/src/core/lib/iomgr/tcp_client.h +4 -5
  860. data/src/core/lib/iomgr/tcp_client_cfstream.cc +2 -10
  861. data/src/core/lib/iomgr/tcp_client_posix.cc +10 -26
  862. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  863. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -11
  864. data/src/core/lib/iomgr/tcp_posix.cc +120 -66
  865. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  866. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  867. data/src/core/lib/iomgr/tcp_server.h +6 -8
  868. data/src/core/lib/iomgr/tcp_server_posix.cc +43 -38
  869. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  870. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  871. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  872. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  873. data/src/core/lib/iomgr/tcp_windows.cc +19 -17
  874. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  875. data/src/core/lib/iomgr/timer.cc +2 -2
  876. data/src/core/lib/iomgr/timer.h +11 -6
  877. data/src/core/lib/iomgr/timer_generic.cc +96 -77
  878. data/src/core/lib/iomgr/timer_manager.cc +15 -14
  879. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  880. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  881. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  882. data/src/core/lib/iomgr/work_serializer.cc +120 -44
  883. data/src/core/lib/iomgr/work_serializer.h +16 -4
  884. data/src/core/lib/json/json_reader.cc +83 -35
  885. data/src/core/lib/json/json_util.cc +5 -5
  886. data/src/core/lib/json/json_util.h +5 -5
  887. data/src/core/lib/matchers/matchers.cc +1 -1
  888. data/src/core/lib/promise/activity.cc +121 -0
  889. data/src/core/lib/promise/activity.h +540 -0
  890. data/src/core/lib/promise/arena_promise.h +188 -0
  891. data/src/core/lib/promise/call_push_pull.h +144 -0
  892. data/src/core/lib/promise/context.h +86 -0
  893. data/src/core/lib/promise/detail/basic_seq.h +496 -0
  894. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  895. data/src/core/lib/promise/detail/promise_like.h +85 -0
  896. data/src/core/lib/promise/detail/status.h +50 -0
  897. data/src/core/lib/promise/detail/switch.h +1455 -0
  898. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  899. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  900. data/src/core/lib/promise/latch.h +104 -0
  901. data/src/core/lib/promise/loop.h +134 -0
  902. data/src/core/lib/promise/map.h +88 -0
  903. data/src/core/lib/promise/poll.h +66 -0
  904. data/src/core/lib/promise/promise.h +95 -0
  905. data/src/core/lib/promise/race.h +84 -0
  906. data/src/core/lib/promise/seq.h +89 -0
  907. data/src/core/lib/promise/sleep.cc +74 -0
  908. data/src/core/lib/promise/sleep.h +66 -0
  909. data/src/core/lib/promise/try_seq.h +157 -0
  910. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  911. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  912. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +32 -31
  913. data/src/core/lib/resolver/resolver_registry.cc +156 -0
  914. data/src/core/lib/resolver/resolver_registry.h +113 -0
  915. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  916. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  917. data/src/core/lib/resource_quota/api.cc +83 -0
  918. data/src/core/lib/resource_quota/api.h +40 -0
  919. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  920. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  921. data/src/core/lib/resource_quota/memory_quota.cc +478 -0
  922. data/src/core/lib/resource_quota/memory_quota.h +457 -0
  923. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  924. data/src/core/lib/resource_quota/resource_quota.h +66 -0
  925. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  926. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  927. data/src/core/lib/resource_quota/trace.cc +19 -0
  928. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/resource_quota/trace.h} +6 -8
  929. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  930. data/src/core/lib/security/authorization/evaluate_args.cc +37 -38
  931. data/src/core/lib/security/authorization/evaluate_args.h +3 -2
  932. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  933. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  934. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +106 -0
  935. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +50 -0
  936. data/src/core/lib/security/authorization/matchers.cc +227 -0
  937. data/src/core/lib/security/authorization/matchers.h +211 -0
  938. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  939. data/src/core/lib/security/authorization/rbac_policy.h +171 -0
  940. data/src/core/lib/security/context/security_context.cc +4 -2
  941. data/src/core/lib/security/context/security_context.h +9 -2
  942. data/src/core/lib/security/credentials/alts/alts_credentials.cc +6 -5
  943. data/src/core/lib/security/credentials/alts/alts_credentials.h +10 -0
  944. data/src/core/lib/security/credentials/call_creds_util.cc +87 -0
  945. data/src/core/lib/security/credentials/call_creds_util.h +42 -0
  946. data/src/core/lib/security/credentials/channel_creds_registry.h +97 -0
  947. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +70 -0
  948. data/src/core/lib/security/credentials/composite/composite_credentials.cc +24 -83
  949. data/src/core/lib/security/credentials/composite/composite_credentials.h +23 -10
  950. data/src/core/lib/security/credentials/credentials.cc +2 -3
  951. data/src/core/lib/security/credentials/credentials.h +74 -80
  952. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +48 -33
  953. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -0
  954. data/src/core/lib/security/credentials/external/external_account_credentials.cc +52 -35
  955. data/src/core/lib/security/credentials/external/external_account_credentials.h +5 -9
  956. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +0 -1
  957. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +33 -14
  958. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -0
  959. data/src/core/lib/security/credentials/fake/fake_credentials.cc +23 -27
  960. data/src/core/lib/security/credentials/fake/fake_credentials.h +22 -21
  961. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +21 -16
  962. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +9 -3
  963. data/src/core/lib/security/credentials/iam/iam_credentials.cc +21 -28
  964. data/src/core/lib/security/credentials/iam/iam_credentials.h +15 -9
  965. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +25 -26
  966. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  967. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  968. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +33 -45
  969. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +16 -12
  970. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +54 -43
  971. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  972. data/src/core/lib/security/credentials/local/local_credentials.cc +6 -6
  973. data/src/core/lib/security/credentials/local/local_credentials.h +10 -0
  974. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +157 -174
  975. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +60 -33
  976. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +96 -152
  977. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +56 -27
  978. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -14
  979. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +14 -3
  980. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  981. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +56 -8
  982. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +209 -0
  983. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +145 -0
  984. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +33 -87
  985. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +73 -149
  986. data/src/core/lib/security/credentials/tls/tls_credentials.cc +30 -16
  987. data/src/core/lib/security/credentials/tls/tls_credentials.h +6 -0
  988. data/src/core/lib/security/credentials/xds/xds_credentials.cc +51 -58
  989. data/src/core/lib/security/credentials/xds/xds_credentials.h +37 -6
  990. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +11 -17
  991. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +3 -3
  992. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -16
  993. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +0 -2
  994. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +8 -18
  995. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +11 -16
  996. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  997. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -19
  998. data/src/core/lib/security/security_connector/security_connector.cc +3 -15
  999. data/src/core/lib/security/security_connector/security_connector.h +25 -21
  1000. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +10 -13
  1001. data/src/core/lib/security/security_connector/ssl_utils.cc +38 -32
  1002. data/src/core/lib/security/security_connector/ssl_utils.h +14 -18
  1003. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +365 -206
  1004. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +70 -47
  1005. data/src/core/lib/security/transport/auth_filters.h +38 -5
  1006. data/src/core/lib/security/transport/client_auth_filter.cc +97 -360
  1007. data/src/core/lib/security/transport/secure_endpoint.cc +198 -129
  1008. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  1009. data/src/core/lib/security/transport/security_handshaker.cc +22 -12
  1010. data/src/core/lib/security/transport/server_auth_filter.cc +41 -35
  1011. data/src/core/lib/service_config/service_config.h +82 -0
  1012. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  1013. data/src/core/{ext/service_config/service_config.cc → lib/service_config/service_config_impl.cc} +20 -17
  1014. data/src/core/{ext/service_config/service_config.h → lib/service_config/service_config_impl.h} +16 -18
  1015. data/src/core/{ext → lib}/service_config/service_config_parser.cc +31 -27
  1016. data/src/core/{ext → lib}/service_config/service_config_parser.h +39 -30
  1017. data/src/core/lib/slice/percent_encoding.cc +30 -86
  1018. data/src/core/lib/slice/percent_encoding.h +5 -11
  1019. data/src/core/lib/slice/slice.cc +78 -181
  1020. data/src/core/lib/slice/slice.h +384 -0
  1021. data/src/core/lib/slice/slice_buffer.cc +4 -0
  1022. data/src/core/lib/slice/slice_internal.h +12 -31
  1023. data/src/core/lib/slice/slice_refcount.cc +18 -0
  1024. data/src/core/lib/slice/slice_refcount.h +8 -83
  1025. data/src/core/lib/slice/slice_refcount_base.h +21 -133
  1026. data/src/core/lib/surface/builtins.cc +6 -6
  1027. data/src/core/lib/surface/call.cc +1132 -1221
  1028. data/src/core/lib/surface/call.h +5 -19
  1029. data/src/core/lib/surface/channel.cc +68 -99
  1030. data/src/core/lib/surface/channel.h +12 -23
  1031. data/src/core/lib/surface/channel_init.cc +2 -3
  1032. data/src/core/lib/surface/channel_init.h +3 -7
  1033. data/src/core/lib/surface/completion_queue.cc +12 -11
  1034. data/src/core/lib/surface/init.cc +78 -10
  1035. data/src/core/lib/surface/init.h +0 -2
  1036. data/src/core/lib/surface/lame_client.cc +26 -19
  1037. data/src/core/lib/surface/server.cc +46 -85
  1038. data/src/core/lib/surface/server.h +14 -16
  1039. data/src/core/lib/surface/validate_metadata.cc +2 -2
  1040. data/src/core/lib/surface/version.cc +2 -2
  1041. data/src/core/lib/transport/bdp_estimator.cc +10 -11
  1042. data/src/core/lib/transport/bdp_estimator.h +2 -2
  1043. data/src/core/lib/transport/byte_stream.cc +6 -0
  1044. data/src/core/lib/transport/error_utils.cc +5 -3
  1045. data/src/core/lib/transport/error_utils.h +2 -1
  1046. data/src/core/lib/transport/metadata_batch.h +1131 -792
  1047. data/src/core/lib/transport/parsed_metadata.cc +37 -0
  1048. data/src/core/lib/transport/parsed_metadata.h +228 -90
  1049. data/src/core/lib/transport/pid_controller.cc +4 -4
  1050. data/src/core/lib/transport/status_conversion.cc +2 -2
  1051. data/src/core/lib/transport/status_conversion.h +1 -1
  1052. data/src/core/lib/transport/timeout_encoding.cc +204 -67
  1053. data/src/core/lib/transport/timeout_encoding.h +40 -10
  1054. data/src/core/lib/transport/transport.cc +7 -27
  1055. data/src/core/lib/transport/transport.h +103 -4
  1056. data/src/core/lib/transport/transport_impl.h +14 -0
  1057. data/src/core/lib/transport/transport_op_string.cc +5 -47
  1058. data/src/core/lib/uri/uri_parser.cc +237 -63
  1059. data/src/core/lib/uri/uri_parser.h +39 -23
  1060. data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -92
  1061. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +85 -0
  1062. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +28 -23
  1063. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  1064. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +21 -13
  1065. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -2
  1066. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  1067. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -2
  1068. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  1069. data/src/core/tsi/local_transport_security.cc +16 -24
  1070. data/src/core/tsi/local_transport_security.h +1 -4
  1071. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +141 -0
  1072. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  1073. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  1074. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  1075. data/src/core/tsi/ssl_transport_security.cc +210 -53
  1076. data/src/core/tsi/ssl_transport_security.h +47 -8
  1077. data/src/core/tsi/transport_security_interface.h +2 -0
  1078. data/src/ruby/ext/grpc/extconf.rb +10 -3
  1079. data/src/ruby/ext/grpc/rb_channel.c +5 -2
  1080. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +26 -34
  1081. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +39 -51
  1082. data/src/ruby/ext/grpc/rb_server.c +7 -4
  1083. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1084. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1085. data/src/ruby/lib/grpc/version.rb +1 -1
  1086. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  1087. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  1088. data/src/ruby/pb/test/client.rb +769 -0
  1089. data/src/ruby/pb/test/server.rb +252 -0
  1090. data/src/ruby/pb/test/xds_client.rb +415 -0
  1091. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  1092. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  1093. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  1094. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  1095. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  1096. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  1097. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  1098. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  1099. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  1100. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  1101. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  1102. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  1103. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  1104. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  1105. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  1106. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  1107. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  1108. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  1109. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  1110. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  1111. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  1112. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  1113. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  1114. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  1115. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  1116. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  1117. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  1118. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  1119. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  1120. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  1121. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  1122. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  1123. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  1124. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1125. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  1126. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  1127. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  1128. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  1129. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  1130. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  1131. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  1132. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  1133. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  1134. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  1135. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1136. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1137. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  1138. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  1139. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  1140. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  1141. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  1142. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  1143. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  1144. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  1145. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  1146. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  1147. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  1148. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  1149. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  1150. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  1151. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  1152. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  1153. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  1154. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  1155. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  1156. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1157. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1158. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1159. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  1160. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  1161. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1162. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  1163. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1164. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1165. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1166. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1167. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1168. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1169. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  1170. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1171. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1172. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  1173. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1174. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  1175. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  1176. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  1177. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1178. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1179. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1180. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1181. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  1182. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1183. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1184. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  1185. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  1186. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  1187. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  1188. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  1189. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  1190. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  1191. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1192. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  1193. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  1194. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  1195. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  1196. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  1197. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  1198. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  1199. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  1200. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  1201. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  1202. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  1203. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  1204. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1205. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  1206. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  1207. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  1208. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  1209. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1210. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1211. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1212. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1213. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  1214. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1215. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  1216. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1217. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  1218. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1219. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  1220. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  1221. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  1222. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1223. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  1224. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  1225. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  1226. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  1227. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  1228. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  1229. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1230. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  1231. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  1232. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  1233. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  1234. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  1235. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  1236. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  1237. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  1238. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  1239. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  1240. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  1241. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1242. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1243. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  1244. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1245. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  1246. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  1247. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  1248. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1249. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  1250. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  1251. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  1252. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  1253. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  1254. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  1255. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1256. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1257. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1258. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  1259. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  1260. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1261. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1262. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1263. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1264. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1265. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1269. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1270. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  1271. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1272. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1273. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1274. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1275. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1276. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  1277. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1278. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  1279. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  1280. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  1281. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  1282. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1283. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  1284. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1285. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  1286. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  1287. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  1288. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  1289. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  1290. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  1291. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  1292. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1293. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1294. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1295. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1296. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1297. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1298. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  1299. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1300. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -13
  1301. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1302. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1303. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  1304. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +29 -11
  1305. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  1306. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  1307. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  1308. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1309. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1310. data/third_party/cares/cares/{ares.h → include/ares.h} +73 -1
  1311. data/third_party/cares/cares/{ares_dns.h → include/ares_dns.h} +9 -0
  1312. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1313. data/third_party/cares/cares/{ares_version.h → include/ares_version.h} +3 -3
  1314. data/third_party/cares/cares/{ares__close_sockets.c → src/lib/ares__close_sockets.c} +2 -2
  1315. data/third_party/cares/cares/{ares__get_hostent.c → src/lib/ares__get_hostent.c} +1 -2
  1316. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1317. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1318. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1319. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1320. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1321. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1322. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1323. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1324. data/third_party/cares/cares/{ares_create_query.c → src/lib/ares_create_query.c} +8 -17
  1325. data/third_party/cares/cares/{ares_data.c → src/lib/ares_data.c} +18 -0
  1326. data/third_party/cares/cares/{ares_data.h → src/lib/ares_data.h} +2 -0
  1327. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1328. data/third_party/cares/cares/{ares_expand_name.c → src/lib/ares_expand_name.c} +114 -23
  1329. data/third_party/cares/cares/{ares_expand_string.c → src/lib/ares_expand_string.c} +2 -5
  1330. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1331. data/third_party/cares/cares/{ares_free_hostent.c → src/lib/ares_free_hostent.c} +6 -4
  1332. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  1333. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  1334. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  1335. data/third_party/cares/cares/{ares_getenv.c → src/lib/ares_getenv.c} +0 -2
  1336. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  1337. data/third_party/cares/cares/{ares_gethostbyaddr.c → src/lib/ares_gethostbyaddr.c} +2 -9
  1338. data/third_party/cares/cares/{ares_gethostbyname.c → src/lib/ares_gethostbyname.c} +25 -20
  1339. data/third_party/cares/cares/{ares_getnameinfo.c → src/lib/ares_getnameinfo.c} +4 -10
  1340. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  1341. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  1342. data/third_party/cares/cares/{ares_init.c → src/lib/ares_init.c} +79 -40
  1343. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  1344. data/third_party/cares/cares/{ares_ipv6.h → src/lib/ares_ipv6.h} +7 -0
  1345. data/third_party/cares/cares/{ares_library_init.c → src/lib/ares_library_init.c} +7 -2
  1346. data/third_party/cares/cares/{ares_library_init.h → src/lib/ares_library_init.h} +1 -1
  1347. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  1348. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  1349. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  1350. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  1351. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  1352. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  1353. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  1354. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  1355. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  1356. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  1357. data/third_party/cares/cares/{ares_parse_mx_reply.c → src/lib/ares_parse_mx_reply.c} +2 -8
  1358. data/third_party/cares/cares/{ares_parse_naptr_reply.c → src/lib/ares_parse_naptr_reply.c} +2 -13
  1359. data/third_party/cares/cares/{ares_parse_ns_reply.c → src/lib/ares_parse_ns_reply.c} +5 -11
  1360. data/third_party/cares/cares/{ares_parse_ptr_reply.c → src/lib/ares_parse_ptr_reply.c} +53 -46
  1361. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  1362. data/third_party/cares/cares/{ares_parse_srv_reply.c → src/lib/ares_parse_srv_reply.c} +2 -13
  1363. data/third_party/cares/cares/{ares_parse_txt_reply.c → src/lib/ares_parse_txt_reply.c} +3 -9
  1364. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  1365. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  1366. data/third_party/cares/cares/{ares_private.h → src/lib/ares_private.h} +52 -11
  1367. data/third_party/cares/cares/{ares_process.c → src/lib/ares_process.c} +127 -52
  1368. data/third_party/cares/cares/{ares_query.c → src/lib/ares_query.c} +3 -9
  1369. data/third_party/cares/cares/{ares_search.c → src/lib/ares_search.c} +5 -7
  1370. data/third_party/cares/cares/{ares_send.c → src/lib/ares_send.c} +2 -8
  1371. data/third_party/cares/cares/{ares_setup.h → src/lib/ares_setup.h} +4 -1
  1372. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  1373. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  1374. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  1375. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  1376. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  1377. data/third_party/cares/cares/{ares_strsplit.c → src/lib/ares_strsplit.c} +4 -0
  1378. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  1379. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  1380. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  1381. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  1382. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  1383. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  1384. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  1385. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  1386. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  1387. data/third_party/cares/cares/{inet_net_pton.c → src/lib/inet_net_pton.c} +2 -8
  1388. data/third_party/cares/cares/{inet_ntop.c → src/lib/inet_ntop.c} +2 -8
  1389. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  1390. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  1391. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  1392. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  1393. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  1394. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  1395. data/third_party/upb/upb/decode.c +732 -378
  1396. data/third_party/upb/upb/decode.h +43 -17
  1397. data/third_party/upb/upb/decode_fast.c +303 -301
  1398. data/third_party/upb/upb/decode_fast.h +18 -18
  1399. data/third_party/upb/upb/decode_internal.h +73 -55
  1400. data/third_party/upb/upb/def.c +2074 -981
  1401. data/third_party/upb/upb/def.h +332 -260
  1402. data/third_party/upb/upb/def.hpp +139 -169
  1403. data/third_party/upb/upb/encode.c +267 -174
  1404. data/third_party/upb/upb/encode.h +15 -17
  1405. data/third_party/upb/upb/json_encode.c +776 -0
  1406. data/third_party/upb/upb/json_encode.h +62 -0
  1407. data/third_party/upb/upb/msg.c +152 -121
  1408. data/third_party/upb/upb/msg.h +39 -33
  1409. data/third_party/upb/upb/msg_internal.h +395 -251
  1410. data/third_party/upb/upb/port_def.inc +8 -0
  1411. data/third_party/upb/upb/port_undef.inc +1 -0
  1412. data/third_party/upb/upb/reflection.c +292 -212
  1413. data/third_party/upb/upb/reflection.h +91 -67
  1414. data/third_party/upb/upb/reflection.hpp +6 -6
  1415. data/third_party/upb/upb/table.c +231 -147
  1416. data/third_party/upb/upb/table_internal.h +129 -95
  1417. data/third_party/upb/upb/text_encode.c +114 -91
  1418. data/third_party/upb/upb/text_encode.h +10 -10
  1419. data/third_party/upb/upb/upb.c +118 -71
  1420. data/third_party/upb/upb/upb.h +157 -151
  1421. data/third_party/upb/upb/upb.hpp +31 -28
  1422. data/third_party/upb/upb/upb_internal.h +21 -11
  1423. data/third_party/xxhash/xxhash.h +607 -352
  1424. data/third_party/zlib/crc32.c +966 -292
  1425. data/third_party/zlib/crc32.h +9441 -436
  1426. data/third_party/zlib/deflate.c +78 -30
  1427. data/third_party/zlib/deflate.h +12 -15
  1428. data/third_party/zlib/gzguts.h +3 -2
  1429. data/third_party/zlib/gzlib.c +5 -3
  1430. data/third_party/zlib/gzread.c +5 -7
  1431. data/third_party/zlib/gzwrite.c +25 -13
  1432. data/third_party/zlib/infback.c +2 -1
  1433. data/third_party/zlib/inffast.c +14 -14
  1434. data/third_party/zlib/inflate.c +39 -8
  1435. data/third_party/zlib/inflate.h +3 -2
  1436. data/third_party/zlib/inftrees.c +3 -3
  1437. data/third_party/zlib/trees.c +27 -48
  1438. data/third_party/zlib/zlib.h +123 -100
  1439. data/third_party/zlib/zutil.c +2 -2
  1440. data/third_party/zlib/zutil.h +12 -9
  1441. metadata +505 -221
  1442. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -44
  1443. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -83
  1444. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -195
  1445. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -89
  1446. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -264
  1447. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -560
  1448. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -119
  1449. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -95
  1450. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -189
  1451. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -53
  1452. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -83
  1453. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -125
  1454. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  1455. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1456. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1457. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1458. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +0 -27
  1459. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +0 -62
  1460. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -27
  1461. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +0 -62
  1462. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -27
  1463. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +0 -62
  1464. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -27
  1465. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +0 -62
  1466. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +0 -27
  1467. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +0 -62
  1468. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +0 -72
  1469. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +0 -35
  1470. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +0 -73
  1471. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +0 -35
  1472. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +0 -72
  1473. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +0 -35
  1474. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +0 -80
  1475. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +0 -35
  1476. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +0 -74
  1477. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +0 -35
  1478. data/src/core/lib/avl/avl.cc +0 -306
  1479. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1480. data/src/core/lib/compression/compression_args.cc +0 -138
  1481. data/src/core/lib/compression/compression_args.h +0 -56
  1482. data/src/core/lib/compression/stream_compression.cc +0 -81
  1483. data/src/core/lib/compression/stream_compression.h +0 -117
  1484. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1485. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  1486. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1487. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1488. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1654
  1489. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1490. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1491. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  1492. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  1493. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1494. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1495. data/src/core/lib/iomgr/pollset_custom.cc +0 -105
  1496. data/src/core/lib/iomgr/pollset_custom.h +0 -37
  1497. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -47
  1498. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  1499. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -169
  1500. data/src/core/lib/iomgr/resolve_address_custom.h +0 -44
  1501. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  1502. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1503. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1504. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -152
  1505. data/src/core/lib/iomgr/tcp_custom.cc +0 -377
  1506. data/src/core/lib/iomgr/tcp_custom.h +0 -86
  1507. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -467
  1508. data/src/core/lib/iomgr/timer_custom.cc +0 -96
  1509. data/src/core/lib/iomgr/timer_custom.h +0 -43
  1510. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +0 -171
  1511. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +0 -67
  1512. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  1513. data/src/core/lib/slice/slice_intern.cc +0 -367
  1514. data/src/core/lib/slice/slice_utils.h +0 -200
  1515. data/src/core/lib/slice/static_slice.cc +0 -529
  1516. data/src/core/lib/slice/static_slice.h +0 -331
  1517. data/src/core/lib/surface/init_secure.cc +0 -103
  1518. data/src/core/lib/transport/metadata.cc +0 -714
  1519. data/src/core/lib/transport/metadata.h +0 -449
  1520. data/src/core/lib/transport/metadata_batch.cc +0 -94
  1521. data/src/core/lib/transport/static_metadata.cc +0 -1117
  1522. data/src/core/lib/transport/static_metadata.h +0 -340
  1523. data/src/core/lib/transport/status_metadata.cc +0 -63
  1524. data/src/core/lib/transport/status_metadata.h +0 -48
  1525. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  1526. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  1527. data/third_party/cares/cares/ares_getopt.c +0 -122
  1528. data/third_party/cares/cares/ares_getopt.h +0 -53
  1529. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  1530. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  1531. data/third_party/cares/cares/ares_parse_soa_reply.c +0 -133
@@ -13,11 +13,11 @@
13
13
  * names of its contributors may be used to endorse or promote products
14
14
  * derived from this software without specific prior written permission.
15
15
  *
16
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
- * DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
20
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
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
21
  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
22
  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
23
  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
@@ -41,143 +41,267 @@
41
41
 
42
42
  typedef struct {
43
43
  size_t len;
44
- char str[1]; /* Null-terminated string data follows. */
44
+ char str[1]; /* Null-terminated string data follows. */
45
45
  } str_t;
46
46
 
47
- struct upb_fielddef {
48
- const upb_filedef *file;
49
- const upb_msgdef *msgdef;
50
- const char *full_name;
51
- const char *json_name;
47
+ /* The upb core does not generally have a concept of default instances. However
48
+ * for descriptor options we make an exception since the max size is known and
49
+ * modest (<200 bytes). All types can share a default instance since it is
50
+ * initialized to zeroes.
51
+ *
52
+ * We have to allocate an extra pointer for upb's internal metadata. */
53
+ static const char opt_default_buf[_UPB_MAXOPT_SIZE + sizeof(void*)] = {0};
54
+ static const char* opt_default = &opt_default_buf[sizeof(void*)];
55
+
56
+ struct upb_FieldDef {
57
+ const google_protobuf_FieldOptions* opts;
58
+ const upb_FileDef* file;
59
+ const upb_MessageDef* msgdef;
60
+ const char* full_name;
61
+ const char* json_name;
52
62
  union {
53
63
  int64_t sint;
54
64
  uint64_t uint;
55
65
  double dbl;
56
66
  float flt;
57
67
  bool boolean;
58
- str_t *str;
68
+ str_t* str;
59
69
  } defaultval;
60
- const upb_oneofdef *oneof;
61
70
  union {
62
- const upb_msgdef *msgdef;
63
- const upb_enumdef *enumdef;
64
- const google_protobuf_FieldDescriptorProto *unresolved;
71
+ const upb_OneofDef* oneof;
72
+ const upb_MessageDef* extension_scope;
73
+ } scope;
74
+ union {
75
+ const upb_MessageDef* msgdef;
76
+ const upb_EnumDef* enumdef;
77
+ const google_protobuf_FieldDescriptorProto* unresolved;
65
78
  } sub;
66
79
  uint32_t number_;
67
80
  uint16_t index_;
68
- uint16_t layout_index;
81
+ uint16_t layout_index; /* Index into msgdef->layout->fields or file->exts */
82
+ bool has_default;
69
83
  bool is_extension_;
70
- bool lazy_;
71
84
  bool packed_;
72
85
  bool proto3_optional_;
73
- upb_descriptortype_t type_;
74
- upb_label_t label_;
86
+ bool has_json_name_;
87
+ upb_FieldType type_;
88
+ upb_Label label_;
89
+ #if UINTPTR_MAX == 0xffffffff
90
+ uint32_t padding; // Increase size to a multiple of 8.
91
+ #endif
92
+ };
93
+
94
+ struct upb_ExtensionRange {
95
+ const google_protobuf_ExtensionRangeOptions* opts;
96
+ int32_t start;
97
+ int32_t end;
75
98
  };
76
99
 
77
- struct upb_msgdef {
78
- const upb_msglayout *layout;
79
- const upb_filedef *file;
80
- const char *full_name;
100
+ struct upb_MessageDef {
101
+ const google_protobuf_MessageOptions* opts;
102
+ const upb_MiniTable* layout;
103
+ const upb_FileDef* file;
104
+ const upb_MessageDef* containing_type;
105
+ const char* full_name;
81
106
 
82
107
  /* Tables for looking up fields by number and name. */
83
108
  upb_inttable itof;
84
109
  upb_strtable ntof;
85
110
 
86
- const upb_fielddef *fields;
87
- const upb_oneofdef *oneofs;
111
+ /* All nested defs.
112
+ * MEM: We could save some space here by putting nested defs in a contiguous
113
+ * region and calculating counts from offsets or vice-versa. */
114
+ const upb_FieldDef* fields;
115
+ const upb_OneofDef* oneofs;
116
+ const upb_ExtensionRange* ext_ranges;
117
+ const upb_MessageDef* nested_msgs;
118
+ const upb_EnumDef* nested_enums;
119
+ const upb_FieldDef* nested_exts;
88
120
  int field_count;
89
- int oneof_count;
90
121
  int real_oneof_count;
91
-
92
- /* Is this a map-entry message? */
93
- bool map_entry;
94
- upb_wellknowntype_t well_known_type;
95
-
96
- /* TODO(haberman): proper extension ranges (there can be multiple). */
122
+ int oneof_count;
123
+ int ext_range_count;
124
+ int nested_msg_count;
125
+ int nested_enum_count;
126
+ int nested_ext_count;
127
+ bool in_message_set;
128
+ upb_WellKnown well_known_type;
129
+ #if UINTPTR_MAX == 0xffffffff
130
+ uint32_t padding; // Increase size to a multiple of 8.
131
+ #endif
97
132
  };
98
133
 
99
- struct upb_enumdef {
100
- const upb_filedef *file;
101
- const char *full_name;
134
+ struct upb_EnumDef {
135
+ const google_protobuf_EnumOptions* opts;
136
+ const upb_MiniTable_Enum* layout; // Only for proto2.
137
+ const upb_FileDef* file;
138
+ const upb_MessageDef* containing_type; // Could be merged with "file".
139
+ const char* full_name;
102
140
  upb_strtable ntoi;
103
141
  upb_inttable iton;
142
+ const upb_EnumValueDef* values;
143
+ int value_count;
104
144
  int32_t defaultval;
145
+ #if UINTPTR_MAX == 0xffffffff
146
+ uint32_t padding; // Increase size to a multiple of 8.
147
+ #endif
105
148
  };
106
149
 
107
- struct upb_oneofdef {
108
- const upb_msgdef *parent;
109
- const char *full_name;
150
+ struct upb_EnumValueDef {
151
+ const google_protobuf_EnumValueOptions* opts;
152
+ const upb_EnumDef* parent;
153
+ const char* full_name;
154
+ int32_t number;
155
+ };
156
+
157
+ struct upb_OneofDef {
158
+ const google_protobuf_OneofOptions* opts;
159
+ const upb_MessageDef* parent;
160
+ const char* full_name;
110
161
  int field_count;
111
162
  bool synthetic;
112
- const upb_fielddef **fields;
163
+ const upb_FieldDef** fields;
113
164
  upb_strtable ntof;
114
165
  upb_inttable itof;
166
+ #if UINTPTR_MAX == 0xffffffff
167
+ uint32_t padding; // Increase size to a multiple of 8.
168
+ #endif
115
169
  };
116
170
 
117
- struct upb_filedef {
118
- const char *name;
119
- const char *package;
120
- const char *phpprefix;
121
- const char *phpnamespace;
122
-
123
- const upb_filedef **deps;
124
- const upb_msgdef *msgs;
125
- const upb_enumdef *enums;
126
- const upb_fielddef *exts;
127
- const upb_symtab *symtab;
171
+ struct upb_FileDef {
172
+ const google_protobuf_FileOptions* opts;
173
+ const char* name;
174
+ const char* package;
175
+
176
+ const upb_FileDef** deps;
177
+ const int32_t* public_deps;
178
+ const int32_t* weak_deps;
179
+ const upb_MessageDef* top_lvl_msgs;
180
+ const upb_EnumDef* top_lvl_enums;
181
+ const upb_FieldDef* top_lvl_exts;
182
+ const upb_ServiceDef* services;
183
+ const upb_MiniTable_Extension** ext_layouts;
184
+ const upb_DefPool* symtab;
128
185
 
129
186
  int dep_count;
130
- int msg_count;
131
- int enum_count;
132
- int ext_count;
133
- upb_syntax_t syntax;
187
+ int public_dep_count;
188
+ int weak_dep_count;
189
+ int top_lvl_msg_count;
190
+ int top_lvl_enum_count;
191
+ int top_lvl_ext_count;
192
+ int service_count;
193
+ int ext_count; /* All exts in the file. */
194
+ upb_Syntax syntax;
195
+ };
196
+
197
+ struct upb_MethodDef {
198
+ const google_protobuf_MethodOptions* opts;
199
+ upb_ServiceDef* service;
200
+ const char* full_name;
201
+ const upb_MessageDef* input_type;
202
+ const upb_MessageDef* output_type;
203
+ int index;
204
+ bool client_streaming;
205
+ bool server_streaming;
206
+ };
207
+
208
+ struct upb_ServiceDef {
209
+ const google_protobuf_ServiceOptions* opts;
210
+ const upb_FileDef* file;
211
+ const char* full_name;
212
+ upb_MethodDef* methods;
213
+ int method_count;
214
+ int index;
134
215
  };
135
216
 
136
- struct upb_symtab {
137
- upb_arena *arena;
217
+ struct upb_DefPool {
218
+ upb_Arena* arena;
138
219
  upb_strtable syms; /* full_name -> packed def ptr */
139
- upb_strtable files; /* file_name -> upb_filedef* */
220
+ upb_strtable files; /* file_name -> upb_FileDef* */
221
+ upb_inttable exts; /* upb_MiniTable_Extension* -> upb_FieldDef* */
222
+ upb_ExtensionRegistry* extreg;
140
223
  size_t bytes_loaded;
141
224
  };
142
225
 
143
226
  /* Inside a symtab we store tagged pointers to specific def types. */
144
227
  typedef enum {
145
- UPB_DEFTYPE_FIELD = 0,
228
+ UPB_DEFTYPE_MASK = 7,
146
229
 
147
230
  /* Only inside symtab table. */
231
+ UPB_DEFTYPE_EXT = 0,
148
232
  UPB_DEFTYPE_MSG = 1,
149
233
  UPB_DEFTYPE_ENUM = 2,
234
+ UPB_DEFTYPE_ENUMVAL = 3,
235
+ UPB_DEFTYPE_SERVICE = 4,
150
236
 
151
237
  /* Only inside message table. */
238
+ UPB_DEFTYPE_FIELD = 0,
152
239
  UPB_DEFTYPE_ONEOF = 1,
153
- UPB_DEFTYPE_FIELD_JSONNAME = 2
240
+ UPB_DEFTYPE_FIELD_JSONNAME = 2,
241
+
242
+ /* Only inside file table. */
243
+ UPB_DEFTYPE_FILE = 0,
244
+ UPB_DEFTYPE_LAYOUT = 1
154
245
  } upb_deftype_t;
155
246
 
156
- static const void *unpack_def(upb_value v, upb_deftype_t type) {
247
+ #define FIELD_TYPE_UNSPECIFIED 0
248
+
249
+ static upb_deftype_t deftype(upb_value v) {
157
250
  uintptr_t num = (uintptr_t)upb_value_getconstptr(v);
158
- return (num & 3) == type ? (const void*)(num & ~3) : NULL;
251
+ return num & UPB_DEFTYPE_MASK;
159
252
  }
160
253
 
161
- static upb_value pack_def(const void *ptr, upb_deftype_t type) {
162
- uintptr_t num = (uintptr_t)ptr | type;
254
+ static const void* unpack_def(upb_value v, upb_deftype_t type) {
255
+ uintptr_t num = (uintptr_t)upb_value_getconstptr(v);
256
+ return (num & UPB_DEFTYPE_MASK) == type
257
+ ? (const void*)(num & ~UPB_DEFTYPE_MASK)
258
+ : NULL;
259
+ }
260
+
261
+ static upb_value pack_def(const void* ptr, upb_deftype_t type) {
262
+ // Our 3-bit pointer tagging requires all pointers to be multiples of 8.
263
+ // The arena will always yield 8-byte-aligned addresses, however we put
264
+ // the defs into arrays. For each element in the array to be 8-byte-aligned,
265
+ // the sizes of each def type must also be a multiple of 8.
266
+ //
267
+ // If any of these asserts fail, we need to add or remove padding on 32-bit
268
+ // machines (64-bit machines will have 8-byte alignment already due to
269
+ // pointers, which all of these structs have).
270
+ UPB_ASSERT((sizeof(upb_FieldDef) & UPB_DEFTYPE_MASK) == 0);
271
+ UPB_ASSERT((sizeof(upb_MessageDef) & UPB_DEFTYPE_MASK) == 0);
272
+ UPB_ASSERT((sizeof(upb_EnumDef) & UPB_DEFTYPE_MASK) == 0);
273
+ UPB_ASSERT((sizeof(upb_EnumValueDef) & UPB_DEFTYPE_MASK) == 0);
274
+ UPB_ASSERT((sizeof(upb_ServiceDef) & UPB_DEFTYPE_MASK) == 0);
275
+ UPB_ASSERT((sizeof(upb_OneofDef) & UPB_DEFTYPE_MASK) == 0);
276
+ uintptr_t num = (uintptr_t)ptr;
277
+ UPB_ASSERT((num & UPB_DEFTYPE_MASK) == 0);
278
+ num |= type;
163
279
  return upb_value_constptr((const void*)num);
164
280
  }
165
281
 
166
282
  /* isalpha() etc. from <ctype.h> are locale-dependent, which we don't want. */
167
- static bool upb_isbetween(char c, char low, char high) {
283
+ static bool upb_isbetween(uint8_t c, uint8_t low, uint8_t high) {
168
284
  return c >= low && c <= high;
169
285
  }
170
286
 
287
+ static char upb_ascii_lower(char ch) {
288
+ // Per ASCII this will lower-case a letter. If the result is a letter, the
289
+ // input was definitely a letter. If the output is not a letter, this may
290
+ // have transformed the character unpredictably.
291
+ return ch | 0x20;
292
+ }
293
+
171
294
  static bool upb_isletter(char c) {
172
- return upb_isbetween(c, 'A', 'Z') || upb_isbetween(c, 'a', 'z') || c == '_';
295
+ char lower = upb_ascii_lower(c);
296
+ return upb_isbetween(lower, 'a', 'z') || c == '_';
173
297
  }
174
298
 
175
299
  static bool upb_isalphanum(char c) {
176
300
  return upb_isletter(c) || upb_isbetween(c, '0', '9');
177
301
  }
178
302
 
179
- static const char *shortdefname(const char *fullname) {
180
- const char *p;
303
+ static const char* shortdefname(const char* fullname) {
304
+ const char* p;
181
305
 
182
306
  if (fullname == NULL) {
183
307
  return NULL;
@@ -192,371 +316,417 @@ static const char *shortdefname(const char *fullname) {
192
316
 
193
317
  /* All submessage fields are lower than all other fields.
194
318
  * Secondly, fields are increasing in order. */
195
- uint32_t field_rank(const upb_fielddef *f) {
196
- uint32_t ret = upb_fielddef_number(f);
319
+ uint32_t field_rank(const upb_FieldDef* f) {
320
+ uint32_t ret = upb_FieldDef_Number(f);
197
321
  const uint32_t high_bit = 1 << 30;
198
322
  UPB_ASSERT(ret < high_bit);
199
- if (!upb_fielddef_issubmsg(f))
200
- ret |= high_bit;
323
+ if (!upb_FieldDef_IsSubMessage(f)) ret |= high_bit;
201
324
  return ret;
202
325
  }
203
326
 
204
- int cmp_fields(const void *p1, const void *p2) {
205
- const upb_fielddef *f1 = *(upb_fielddef*const*)p1;
206
- const upb_fielddef *f2 = *(upb_fielddef*const*)p2;
327
+ int cmp_fields(const void* p1, const void* p2) {
328
+ const upb_FieldDef* f1 = *(upb_FieldDef* const*)p1;
329
+ const upb_FieldDef* f2 = *(upb_FieldDef* const*)p2;
207
330
  return field_rank(f1) - field_rank(f2);
208
331
  }
209
332
 
210
- static void upb_status_setoom(upb_status *status) {
211
- upb_status_seterrmsg(status, "out of memory");
333
+ static void upb_Status_setoom(upb_Status* status) {
334
+ upb_Status_SetErrorMessage(status, "out of memory");
212
335
  }
213
336
 
214
- static void assign_msg_wellknowntype(upb_msgdef *m) {
215
- const char *name = upb_msgdef_fullname(m);
337
+ static void assign_msg_wellknowntype(upb_MessageDef* m) {
338
+ const char* name = upb_MessageDef_FullName(m);
216
339
  if (name == NULL) {
217
- m->well_known_type = UPB_WELLKNOWN_UNSPECIFIED;
340
+ m->well_known_type = kUpb_WellKnown_Unspecified;
218
341
  return;
219
342
  }
220
343
  if (!strcmp(name, "google.protobuf.Any")) {
221
- m->well_known_type = UPB_WELLKNOWN_ANY;
344
+ m->well_known_type = kUpb_WellKnown_Any;
222
345
  } else if (!strcmp(name, "google.protobuf.FieldMask")) {
223
- m->well_known_type = UPB_WELLKNOWN_FIELDMASK;
346
+ m->well_known_type = kUpb_WellKnown_FieldMask;
224
347
  } else if (!strcmp(name, "google.protobuf.Duration")) {
225
- m->well_known_type = UPB_WELLKNOWN_DURATION;
348
+ m->well_known_type = kUpb_WellKnown_Duration;
226
349
  } else if (!strcmp(name, "google.protobuf.Timestamp")) {
227
- m->well_known_type = UPB_WELLKNOWN_TIMESTAMP;
350
+ m->well_known_type = kUpb_WellKnown_Timestamp;
228
351
  } else if (!strcmp(name, "google.protobuf.DoubleValue")) {
229
- m->well_known_type = UPB_WELLKNOWN_DOUBLEVALUE;
352
+ m->well_known_type = kUpb_WellKnown_DoubleValue;
230
353
  } else if (!strcmp(name, "google.protobuf.FloatValue")) {
231
- m->well_known_type = UPB_WELLKNOWN_FLOATVALUE;
354
+ m->well_known_type = kUpb_WellKnown_FloatValue;
232
355
  } else if (!strcmp(name, "google.protobuf.Int64Value")) {
233
- m->well_known_type = UPB_WELLKNOWN_INT64VALUE;
356
+ m->well_known_type = kUpb_WellKnown_Int64Value;
234
357
  } else if (!strcmp(name, "google.protobuf.UInt64Value")) {
235
- m->well_known_type = UPB_WELLKNOWN_UINT64VALUE;
358
+ m->well_known_type = kUpb_WellKnown_UInt64Value;
236
359
  } else if (!strcmp(name, "google.protobuf.Int32Value")) {
237
- m->well_known_type = UPB_WELLKNOWN_INT32VALUE;
360
+ m->well_known_type = kUpb_WellKnown_Int32Value;
238
361
  } else if (!strcmp(name, "google.protobuf.UInt32Value")) {
239
- m->well_known_type = UPB_WELLKNOWN_UINT32VALUE;
362
+ m->well_known_type = kUpb_WellKnown_UInt32Value;
240
363
  } else if (!strcmp(name, "google.protobuf.BoolValue")) {
241
- m->well_known_type = UPB_WELLKNOWN_BOOLVALUE;
364
+ m->well_known_type = kUpb_WellKnown_BoolValue;
242
365
  } else if (!strcmp(name, "google.protobuf.StringValue")) {
243
- m->well_known_type = UPB_WELLKNOWN_STRINGVALUE;
366
+ m->well_known_type = kUpb_WellKnown_StringValue;
244
367
  } else if (!strcmp(name, "google.protobuf.BytesValue")) {
245
- m->well_known_type = UPB_WELLKNOWN_BYTESVALUE;
368
+ m->well_known_type = kUpb_WellKnown_BytesValue;
246
369
  } else if (!strcmp(name, "google.protobuf.Value")) {
247
- m->well_known_type = UPB_WELLKNOWN_VALUE;
370
+ m->well_known_type = kUpb_WellKnown_Value;
248
371
  } else if (!strcmp(name, "google.protobuf.ListValue")) {
249
- m->well_known_type = UPB_WELLKNOWN_LISTVALUE;
372
+ m->well_known_type = kUpb_WellKnown_ListValue;
250
373
  } else if (!strcmp(name, "google.protobuf.Struct")) {
251
- m->well_known_type = UPB_WELLKNOWN_STRUCT;
374
+ m->well_known_type = kUpb_WellKnown_Struct;
252
375
  } else {
253
- m->well_known_type = UPB_WELLKNOWN_UNSPECIFIED;
376
+ m->well_known_type = kUpb_WellKnown_Unspecified;
254
377
  }
255
378
  }
256
379
 
380
+ /* upb_EnumDef ****************************************************************/
257
381
 
258
- /* upb_enumdef ****************************************************************/
259
-
260
- const char *upb_enumdef_fullname(const upb_enumdef *e) {
261
- return e->full_name;
382
+ const google_protobuf_EnumOptions* upb_EnumDef_Options(const upb_EnumDef* e) {
383
+ return e->opts;
262
384
  }
263
385
 
264
- const char *upb_enumdef_name(const upb_enumdef *e) {
265
- return shortdefname(e->full_name);
386
+ bool upb_EnumDef_HasOptions(const upb_EnumDef* e) {
387
+ return e->opts != (void*)opt_default;
266
388
  }
267
389
 
268
- const upb_filedef *upb_enumdef_file(const upb_enumdef *e) {
269
- return e->file;
270
- }
390
+ const char* upb_EnumDef_FullName(const upb_EnumDef* e) { return e->full_name; }
271
391
 
272
- int32_t upb_enumdef_default(const upb_enumdef *e) {
273
- UPB_ASSERT(upb_enumdef_iton(e, e->defaultval));
274
- return e->defaultval;
392
+ const char* upb_EnumDef_Name(const upb_EnumDef* e) {
393
+ return shortdefname(e->full_name);
275
394
  }
276
395
 
277
- int upb_enumdef_numvals(const upb_enumdef *e) {
278
- return (int)upb_strtable_count(&e->ntoi);
396
+ const upb_FileDef* upb_EnumDef_File(const upb_EnumDef* e) { return e->file; }
397
+
398
+ const upb_MessageDef* upb_EnumDef_ContainingType(const upb_EnumDef* e) {
399
+ return e->containing_type;
279
400
  }
280
401
 
281
- void upb_enum_begin(upb_enum_iter *i, const upb_enumdef *e) {
282
- /* We iterate over the ntoi table, to account for duplicate numbers. */
283
- upb_strtable_begin(i, &e->ntoi);
402
+ int32_t upb_EnumDef_Default(const upb_EnumDef* e) {
403
+ UPB_ASSERT(upb_EnumDef_FindValueByNumber(e, e->defaultval));
404
+ return e->defaultval;
284
405
  }
285
406
 
286
- void upb_enum_next(upb_enum_iter *iter) { upb_strtable_next(iter); }
287
- bool upb_enum_done(upb_enum_iter *iter) { return upb_strtable_done(iter); }
407
+ int upb_EnumDef_ValueCount(const upb_EnumDef* e) { return e->value_count; }
288
408
 
289
- bool upb_enumdef_ntoi(const upb_enumdef *def, const char *name,
290
- size_t len, int32_t *num) {
409
+ const upb_EnumValueDef* upb_EnumDef_FindValueByNameWithSize(
410
+ const upb_EnumDef* def, const char* name, size_t len) {
291
411
  upb_value v;
292
- if (!upb_strtable_lookup2(&def->ntoi, name, len, &v)) {
293
- return false;
294
- }
295
- if (num) *num = upb_value_getint32(v);
296
- return true;
412
+ return upb_strtable_lookup2(&def->ntoi, name, len, &v)
413
+ ? upb_value_getconstptr(v)
414
+ : NULL;
297
415
  }
298
416
 
299
- const char *upb_enumdef_iton(const upb_enumdef *def, int32_t num) {
417
+ const upb_EnumValueDef* upb_EnumDef_FindValueByNumber(const upb_EnumDef* def,
418
+ int32_t num) {
300
419
  upb_value v;
301
- return upb_inttable_lookup(&def->iton, num, &v) ? upb_value_getcstr(v) : NULL;
420
+ return upb_inttable_lookup(&def->iton, num, &v) ? upb_value_getconstptr(v)
421
+ : NULL;
302
422
  }
303
423
 
304
- const char *upb_enum_iter_name(upb_enum_iter *iter) {
305
- return upb_strtable_iter_key(iter).data;
424
+ bool upb_EnumDef_CheckNumber(const upb_EnumDef* e, int32_t num) {
425
+ // We could use upb_EnumDef_FindValueByNumber(e, num) != NULL, but we expect
426
+ // this to be faster (especially for small numbers).
427
+ return upb_MiniTable_Enum_CheckValue(e->layout, num);
306
428
  }
307
429
 
308
- int32_t upb_enum_iter_number(upb_enum_iter *iter) {
309
- return upb_value_getint32(upb_strtable_iter_value(iter));
430
+ const upb_EnumValueDef* upb_EnumDef_Value(const upb_EnumDef* e, int i) {
431
+ UPB_ASSERT(0 <= i && i < e->value_count);
432
+ return &e->values[i];
310
433
  }
311
434
 
435
+ /* upb_EnumValueDef ***********************************************************/
312
436
 
313
- /* upb_fielddef ***************************************************************/
314
-
315
- const char *upb_fielddef_fullname(const upb_fielddef *f) {
316
- return f->full_name;
437
+ const google_protobuf_EnumValueOptions* upb_EnumValueDef_Options(
438
+ const upb_EnumValueDef* e) {
439
+ return e->opts;
317
440
  }
318
441
 
319
- upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f) {
320
- switch (f->type_) {
321
- case UPB_DESCRIPTOR_TYPE_DOUBLE:
322
- return UPB_TYPE_DOUBLE;
323
- case UPB_DESCRIPTOR_TYPE_FLOAT:
324
- return UPB_TYPE_FLOAT;
325
- case UPB_DESCRIPTOR_TYPE_INT64:
326
- case UPB_DESCRIPTOR_TYPE_SINT64:
327
- case UPB_DESCRIPTOR_TYPE_SFIXED64:
328
- return UPB_TYPE_INT64;
329
- case UPB_DESCRIPTOR_TYPE_INT32:
330
- case UPB_DESCRIPTOR_TYPE_SFIXED32:
331
- case UPB_DESCRIPTOR_TYPE_SINT32:
332
- return UPB_TYPE_INT32;
333
- case UPB_DESCRIPTOR_TYPE_UINT64:
334
- case UPB_DESCRIPTOR_TYPE_FIXED64:
335
- return UPB_TYPE_UINT64;
336
- case UPB_DESCRIPTOR_TYPE_UINT32:
337
- case UPB_DESCRIPTOR_TYPE_FIXED32:
338
- return UPB_TYPE_UINT32;
339
- case UPB_DESCRIPTOR_TYPE_ENUM:
340
- return UPB_TYPE_ENUM;
341
- case UPB_DESCRIPTOR_TYPE_BOOL:
342
- return UPB_TYPE_BOOL;
343
- case UPB_DESCRIPTOR_TYPE_STRING:
344
- return UPB_TYPE_STRING;
345
- case UPB_DESCRIPTOR_TYPE_BYTES:
346
- return UPB_TYPE_BYTES;
347
- case UPB_DESCRIPTOR_TYPE_GROUP:
348
- case UPB_DESCRIPTOR_TYPE_MESSAGE:
349
- return UPB_TYPE_MESSAGE;
350
- }
351
- UPB_UNREACHABLE();
442
+ bool upb_EnumValueDef_HasOptions(const upb_EnumValueDef* e) {
443
+ return e->opts != (void*)opt_default;
352
444
  }
353
445
 
354
- upb_descriptortype_t upb_fielddef_descriptortype(const upb_fielddef *f) {
355
- return f->type_;
446
+ const upb_EnumDef* upb_EnumValueDef_Enum(const upb_EnumValueDef* ev) {
447
+ return ev->parent;
356
448
  }
357
449
 
358
- uint32_t upb_fielddef_index(const upb_fielddef *f) {
359
- return f->index_;
450
+ const char* upb_EnumValueDef_FullName(const upb_EnumValueDef* ev) {
451
+ return ev->full_name;
360
452
  }
361
453
 
362
- upb_label_t upb_fielddef_label(const upb_fielddef *f) {
363
- return f->label_;
454
+ const char* upb_EnumValueDef_Name(const upb_EnumValueDef* ev) {
455
+ return shortdefname(ev->full_name);
364
456
  }
365
457
 
366
- uint32_t upb_fielddef_number(const upb_fielddef *f) {
367
- return f->number_;
458
+ int32_t upb_EnumValueDef_Number(const upb_EnumValueDef* ev) {
459
+ return ev->number;
368
460
  }
369
461
 
370
- bool upb_fielddef_isextension(const upb_fielddef *f) {
371
- return f->is_extension_;
462
+ uint32_t upb_EnumValueDef_Index(const upb_EnumValueDef* ev) {
463
+ // Compute index in our parent's array.
464
+ return ev - ev->parent->values;
372
465
  }
373
466
 
374
- bool upb_fielddef_lazy(const upb_fielddef *f) {
375
- return f->lazy_;
376
- }
467
+ /* upb_ExtensionRange
468
+ * ***************************************************************/
377
469
 
378
- bool upb_fielddef_packed(const upb_fielddef *f) {
379
- return f->packed_;
470
+ const google_protobuf_ExtensionRangeOptions* upb_ExtensionRange_Options(
471
+ const upb_ExtensionRange* r) {
472
+ return r->opts;
380
473
  }
381
474
 
382
- const char *upb_fielddef_name(const upb_fielddef *f) {
383
- return shortdefname(f->full_name);
475
+ bool upb_ExtensionRange_HasOptions(const upb_ExtensionRange* r) {
476
+ return r->opts != (void*)opt_default;
384
477
  }
385
478
 
386
- const char *upb_fielddef_jsonname(const upb_fielddef *f) {
387
- return f->json_name;
479
+ int32_t upb_ExtensionRange_Start(const upb_ExtensionRange* e) {
480
+ return e->start;
388
481
  }
389
482
 
390
- const upb_filedef *upb_fielddef_file(const upb_fielddef *f) {
391
- return f->file;
392
- }
483
+ int32_t upb_ExtensionRange_End(const upb_ExtensionRange* e) { return e->end; }
393
484
 
394
- const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f) {
395
- return f->msgdef;
485
+ /* upb_FieldDef ***************************************************************/
486
+
487
+ const google_protobuf_FieldOptions* upb_FieldDef_Options(
488
+ const upb_FieldDef* f) {
489
+ return f->opts;
396
490
  }
397
491
 
398
- const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f) {
399
- return f->oneof;
492
+ bool upb_FieldDef_HasOptions(const upb_FieldDef* f) {
493
+ return f->opts != (void*)opt_default;
400
494
  }
401
495
 
402
- const upb_oneofdef *upb_fielddef_realcontainingoneof(const upb_fielddef *f) {
403
- if (!f->oneof || upb_oneofdef_issynthetic(f->oneof)) return NULL;
404
- return f->oneof;
496
+ const char* upb_FieldDef_FullName(const upb_FieldDef* f) {
497
+ return f->full_name;
405
498
  }
406
499
 
407
- upb_msgval upb_fielddef_default(const upb_fielddef *f) {
408
- UPB_ASSERT(!upb_fielddef_issubmsg(f));
409
- upb_msgval ret;
410
- if (upb_fielddef_isstring(f)) {
411
- str_t *str = f->defaultval.str;
412
- if (str) {
413
- ret.str_val.data = str->str;
414
- ret.str_val.size = str->len;
415
- } else {
416
- ret.str_val.size = 0;
417
- }
418
- } else {
419
- memcpy(&ret, &f->defaultval, 8);
500
+ upb_CType upb_FieldDef_CType(const upb_FieldDef* f) {
501
+ switch (f->type_) {
502
+ case kUpb_FieldType_Double:
503
+ return kUpb_CType_Double;
504
+ case kUpb_FieldType_Float:
505
+ return kUpb_CType_Float;
506
+ case kUpb_FieldType_Int64:
507
+ case kUpb_FieldType_SInt64:
508
+ case kUpb_FieldType_SFixed64:
509
+ return kUpb_CType_Int64;
510
+ case kUpb_FieldType_Int32:
511
+ case kUpb_FieldType_SFixed32:
512
+ case kUpb_FieldType_SInt32:
513
+ return kUpb_CType_Int32;
514
+ case kUpb_FieldType_UInt64:
515
+ case kUpb_FieldType_Fixed64:
516
+ return kUpb_CType_UInt64;
517
+ case kUpb_FieldType_UInt32:
518
+ case kUpb_FieldType_Fixed32:
519
+ return kUpb_CType_UInt32;
520
+ case kUpb_FieldType_Enum:
521
+ return kUpb_CType_Enum;
522
+ case kUpb_FieldType_Bool:
523
+ return kUpb_CType_Bool;
524
+ case kUpb_FieldType_String:
525
+ return kUpb_CType_String;
526
+ case kUpb_FieldType_Bytes:
527
+ return kUpb_CType_Bytes;
528
+ case kUpb_FieldType_Group:
529
+ case kUpb_FieldType_Message:
530
+ return kUpb_CType_Message;
420
531
  }
421
- return ret;
532
+ UPB_UNREACHABLE();
422
533
  }
423
534
 
424
- static void chkdefaulttype(const upb_fielddef *f, int ctype) {
425
- UPB_UNUSED(f);
426
- UPB_UNUSED(ctype);
427
- }
535
+ upb_FieldType upb_FieldDef_Type(const upb_FieldDef* f) { return f->type_; }
428
536
 
429
- int64_t upb_fielddef_defaultint64(const upb_fielddef *f) {
430
- chkdefaulttype(f, UPB_TYPE_INT64);
431
- return f->defaultval.sint;
432
- }
537
+ uint32_t upb_FieldDef_Index(const upb_FieldDef* f) { return f->index_; }
433
538
 
434
- int32_t upb_fielddef_defaultint32(const upb_fielddef *f) {
435
- chkdefaulttype(f, UPB_TYPE_INT32);
436
- return (int32_t)f->defaultval.sint;
437
- }
539
+ upb_Label upb_FieldDef_Label(const upb_FieldDef* f) { return f->label_; }
438
540
 
439
- uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f) {
440
- chkdefaulttype(f, UPB_TYPE_UINT64);
441
- return f->defaultval.uint;
541
+ uint32_t upb_FieldDef_Number(const upb_FieldDef* f) { return f->number_; }
542
+
543
+ bool upb_FieldDef_IsExtension(const upb_FieldDef* f) {
544
+ return f->is_extension_;
442
545
  }
443
546
 
444
- uint32_t upb_fielddef_defaultuint32(const upb_fielddef *f) {
445
- chkdefaulttype(f, UPB_TYPE_UINT32);
446
- return (uint32_t)f->defaultval.uint;
547
+ bool upb_FieldDef_IsPacked(const upb_FieldDef* f) { return f->packed_; }
548
+
549
+ const char* upb_FieldDef_Name(const upb_FieldDef* f) {
550
+ return shortdefname(f->full_name);
447
551
  }
448
552
 
449
- bool upb_fielddef_defaultbool(const upb_fielddef *f) {
450
- chkdefaulttype(f, UPB_TYPE_BOOL);
451
- return f->defaultval.boolean;
553
+ const char* upb_FieldDef_JsonName(const upb_FieldDef* f) {
554
+ return f->json_name;
452
555
  }
453
556
 
454
- float upb_fielddef_defaultfloat(const upb_fielddef *f) {
455
- chkdefaulttype(f, UPB_TYPE_FLOAT);
456
- return f->defaultval.flt;
557
+ bool upb_FieldDef_HasJsonName(const upb_FieldDef* f) {
558
+ return f->has_json_name_;
457
559
  }
458
560
 
459
- double upb_fielddef_defaultdouble(const upb_fielddef *f) {
460
- chkdefaulttype(f, UPB_TYPE_DOUBLE);
461
- return f->defaultval.dbl;
561
+ const upb_FileDef* upb_FieldDef_File(const upb_FieldDef* f) { return f->file; }
562
+
563
+ const upb_MessageDef* upb_FieldDef_ContainingType(const upb_FieldDef* f) {
564
+ return f->msgdef;
462
565
  }
463
566
 
464
- const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len) {
465
- str_t *str = f->defaultval.str;
466
- UPB_ASSERT(upb_fielddef_type(f) == UPB_TYPE_STRING ||
467
- upb_fielddef_type(f) == UPB_TYPE_BYTES ||
468
- upb_fielddef_type(f) == UPB_TYPE_ENUM);
469
- if (str) {
470
- if (len) *len = str->len;
471
- return str->str;
472
- } else {
473
- if (len) *len = 0;
474
- return NULL;
567
+ const upb_MessageDef* upb_FieldDef_ExtensionScope(const upb_FieldDef* f) {
568
+ return f->is_extension_ ? f->scope.extension_scope : NULL;
569
+ }
570
+
571
+ const upb_OneofDef* upb_FieldDef_ContainingOneof(const upb_FieldDef* f) {
572
+ return f->is_extension_ ? NULL : f->scope.oneof;
573
+ }
574
+
575
+ const upb_OneofDef* upb_FieldDef_RealContainingOneof(const upb_FieldDef* f) {
576
+ const upb_OneofDef* oneof = upb_FieldDef_ContainingOneof(f);
577
+ if (!oneof || upb_OneofDef_IsSynthetic(oneof)) return NULL;
578
+ return oneof;
579
+ }
580
+
581
+ upb_MessageValue upb_FieldDef_Default(const upb_FieldDef* f) {
582
+ UPB_ASSERT(!upb_FieldDef_IsSubMessage(f));
583
+ upb_MessageValue ret;
584
+
585
+ switch (upb_FieldDef_CType(f)) {
586
+ case kUpb_CType_Bool:
587
+ return (upb_MessageValue){.bool_val = f->defaultval.boolean};
588
+ case kUpb_CType_Int64:
589
+ return (upb_MessageValue){.int64_val = f->defaultval.sint};
590
+ case kUpb_CType_UInt64:
591
+ return (upb_MessageValue){.uint64_val = f->defaultval.uint};
592
+ case kUpb_CType_Enum:
593
+ case kUpb_CType_Int32:
594
+ return (upb_MessageValue){.int32_val = (int32_t)f->defaultval.sint};
595
+ case kUpb_CType_UInt32:
596
+ return (upb_MessageValue){.uint32_val = (uint32_t)f->defaultval.uint};
597
+ case kUpb_CType_Float:
598
+ return (upb_MessageValue){.float_val = f->defaultval.flt};
599
+ case kUpb_CType_Double:
600
+ return (upb_MessageValue){.double_val = f->defaultval.dbl};
601
+ case kUpb_CType_String:
602
+ case kUpb_CType_Bytes: {
603
+ str_t* str = f->defaultval.str;
604
+ if (str) {
605
+ return (upb_MessageValue){
606
+ .str_val = (upb_StringView){.data = str->str, .size = str->len}};
607
+ } else {
608
+ return (upb_MessageValue){
609
+ .str_val = (upb_StringView){.data = NULL, .size = 0}};
610
+ }
611
+ }
612
+ default:
613
+ UPB_UNREACHABLE();
475
614
  }
615
+
616
+ return ret;
476
617
  }
477
618
 
478
- const upb_msgdef *upb_fielddef_msgsubdef(const upb_fielddef *f) {
479
- return upb_fielddef_type(f) == UPB_TYPE_MESSAGE ? f->sub.msgdef : NULL;
619
+ const upb_MessageDef* upb_FieldDef_MessageSubDef(const upb_FieldDef* f) {
620
+ return upb_FieldDef_CType(f) == kUpb_CType_Message ? f->sub.msgdef : NULL;
480
621
  }
481
622
 
482
- const upb_enumdef *upb_fielddef_enumsubdef(const upb_fielddef *f) {
483
- return upb_fielddef_type(f) == UPB_TYPE_ENUM ? f->sub.enumdef : NULL;
623
+ const upb_EnumDef* upb_FieldDef_EnumSubDef(const upb_FieldDef* f) {
624
+ return upb_FieldDef_CType(f) == kUpb_CType_Enum ? f->sub.enumdef : NULL;
484
625
  }
485
626
 
486
- const upb_msglayout_field *upb_fielddef_layout(const upb_fielddef *f) {
627
+ const upb_MiniTable_Field* upb_FieldDef_MiniTable(const upb_FieldDef* f) {
628
+ UPB_ASSERT(!upb_FieldDef_IsExtension(f));
487
629
  return &f->msgdef->layout->fields[f->layout_index];
488
630
  }
489
631
 
490
- bool upb_fielddef_issubmsg(const upb_fielddef *f) {
491
- return upb_fielddef_type(f) == UPB_TYPE_MESSAGE;
632
+ const upb_MiniTable_Extension* _upb_FieldDef_ExtensionMiniTable(
633
+ const upb_FieldDef* f) {
634
+ UPB_ASSERT(upb_FieldDef_IsExtension(f));
635
+ return f->file->ext_layouts[f->layout_index];
636
+ }
637
+
638
+ bool _upb_FieldDef_IsProto3Optional(const upb_FieldDef* f) {
639
+ return f->proto3_optional_;
492
640
  }
493
641
 
494
- bool upb_fielddef_isstring(const upb_fielddef *f) {
495
- return upb_fielddef_type(f) == UPB_TYPE_STRING ||
496
- upb_fielddef_type(f) == UPB_TYPE_BYTES;
642
+ bool upb_FieldDef_IsSubMessage(const upb_FieldDef* f) {
643
+ return upb_FieldDef_CType(f) == kUpb_CType_Message;
497
644
  }
498
645
 
499
- bool upb_fielddef_isseq(const upb_fielddef *f) {
500
- return upb_fielddef_label(f) == UPB_LABEL_REPEATED;
646
+ bool upb_FieldDef_IsString(const upb_FieldDef* f) {
647
+ return upb_FieldDef_CType(f) == kUpb_CType_String ||
648
+ upb_FieldDef_CType(f) == kUpb_CType_Bytes;
501
649
  }
502
650
 
503
- bool upb_fielddef_isprimitive(const upb_fielddef *f) {
504
- return !upb_fielddef_isstring(f) && !upb_fielddef_issubmsg(f);
651
+ bool upb_FieldDef_IsRepeated(const upb_FieldDef* f) {
652
+ return upb_FieldDef_Label(f) == kUpb_Label_Repeated;
505
653
  }
506
654
 
507
- bool upb_fielddef_ismap(const upb_fielddef *f) {
508
- return upb_fielddef_isseq(f) && upb_fielddef_issubmsg(f) &&
509
- upb_msgdef_mapentry(upb_fielddef_msgsubdef(f));
655
+ bool upb_FieldDef_IsPrimitive(const upb_FieldDef* f) {
656
+ return !upb_FieldDef_IsString(f) && !upb_FieldDef_IsSubMessage(f);
510
657
  }
511
658
 
512
- bool upb_fielddef_hassubdef(const upb_fielddef *f) {
513
- return upb_fielddef_issubmsg(f) || upb_fielddef_type(f) == UPB_TYPE_ENUM;
659
+ bool upb_FieldDef_IsMap(const upb_FieldDef* f) {
660
+ return upb_FieldDef_IsRepeated(f) && upb_FieldDef_IsSubMessage(f) &&
661
+ upb_MessageDef_IsMapEntry(upb_FieldDef_MessageSubDef(f));
662
+ }
663
+
664
+ bool upb_FieldDef_HasDefault(const upb_FieldDef* f) { return f->has_default; }
665
+
666
+ bool upb_FieldDef_HasSubDef(const upb_FieldDef* f) {
667
+ return upb_FieldDef_IsSubMessage(f) ||
668
+ upb_FieldDef_CType(f) == kUpb_CType_Enum;
514
669
  }
515
670
 
516
- bool upb_fielddef_haspresence(const upb_fielddef *f) {
517
- if (upb_fielddef_isseq(f)) return false;
518
- return upb_fielddef_issubmsg(f) || upb_fielddef_containingoneof(f) ||
519
- f->file->syntax == UPB_SYNTAX_PROTO2;
671
+ bool upb_FieldDef_HasPresence(const upb_FieldDef* f) {
672
+ if (upb_FieldDef_IsRepeated(f)) return false;
673
+ return upb_FieldDef_IsSubMessage(f) || upb_FieldDef_ContainingOneof(f) ||
674
+ f->file->syntax == kUpb_Syntax_Proto2;
520
675
  }
521
676
 
522
677
  static bool between(int32_t x, int32_t low, int32_t high) {
523
678
  return x >= low && x <= high;
524
679
  }
525
680
 
526
- bool upb_fielddef_checklabel(int32_t label) { return between(label, 1, 3); }
527
- bool upb_fielddef_checktype(int32_t type) { return between(type, 1, 11); }
528
- bool upb_fielddef_checkintfmt(int32_t fmt) { return between(fmt, 1, 3); }
681
+ bool upb_FieldDef_checklabel(int32_t label) { return between(label, 1, 3); }
682
+ bool upb_FieldDef_checktype(int32_t type) { return between(type, 1, 11); }
683
+ bool upb_FieldDef_checkintfmt(int32_t fmt) { return between(fmt, 1, 3); }
529
684
 
530
- bool upb_fielddef_checkdescriptortype(int32_t type) {
685
+ bool upb_FieldDef_checkdescriptortype(int32_t type) {
531
686
  return between(type, 1, 18);
532
687
  }
533
688
 
534
- /* upb_msgdef *****************************************************************/
689
+ /* upb_MessageDef
690
+ * *****************************************************************/
535
691
 
536
- const char *upb_msgdef_fullname(const upb_msgdef *m) {
692
+ const google_protobuf_MessageOptions* upb_MessageDef_Options(
693
+ const upb_MessageDef* m) {
694
+ return m->opts;
695
+ }
696
+
697
+ bool upb_MessageDef_HasOptions(const upb_MessageDef* m) {
698
+ return m->opts != (void*)opt_default;
699
+ }
700
+
701
+ const char* upb_MessageDef_FullName(const upb_MessageDef* m) {
537
702
  return m->full_name;
538
703
  }
539
704
 
540
- const upb_filedef *upb_msgdef_file(const upb_msgdef *m) {
705
+ const upb_FileDef* upb_MessageDef_File(const upb_MessageDef* m) {
541
706
  return m->file;
542
707
  }
543
708
 
544
- const char *upb_msgdef_name(const upb_msgdef *m) {
709
+ const upb_MessageDef* upb_MessageDef_ContainingType(const upb_MessageDef* m) {
710
+ return m->containing_type;
711
+ }
712
+
713
+ const char* upb_MessageDef_Name(const upb_MessageDef* m) {
545
714
  return shortdefname(m->full_name);
546
715
  }
547
716
 
548
- upb_syntax_t upb_msgdef_syntax(const upb_msgdef *m) {
717
+ upb_Syntax upb_MessageDef_Syntax(const upb_MessageDef* m) {
549
718
  return m->file->syntax;
550
719
  }
551
720
 
552
- const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i) {
721
+ const upb_FieldDef* upb_MessageDef_FindFieldByNumber(const upb_MessageDef* m,
722
+ uint32_t i) {
553
723
  upb_value val;
554
724
  return upb_inttable_lookup(&m->itof, i, &val) ? upb_value_getconstptr(val)
555
725
  : NULL;
556
726
  }
557
727
 
558
- const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name,
559
- size_t len) {
728
+ const upb_FieldDef* upb_MessageDef_FindFieldByNameWithSize(
729
+ const upb_MessageDef* m, const char* name, size_t len) {
560
730
  upb_value val;
561
731
 
562
732
  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
@@ -566,8 +736,8 @@ const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name,
566
736
  return unpack_def(val, UPB_DEFTYPE_FIELD);
567
737
  }
568
738
 
569
- const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name,
570
- size_t len) {
739
+ const upb_OneofDef* upb_MessageDef_FindOneofByNameWithSize(
740
+ const upb_MessageDef* m, const char* name, size_t len) {
571
741
  upb_value val;
572
742
 
573
743
  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
@@ -577,23 +747,27 @@ const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name,
577
747
  return unpack_def(val, UPB_DEFTYPE_ONEOF);
578
748
  }
579
749
 
580
- bool upb_msgdef_lookupname(const upb_msgdef *m, const char *name, size_t len,
581
- const upb_fielddef **f, const upb_oneofdef **o) {
750
+ bool upb_MessageDef_FindByNameWithSize(const upb_MessageDef* m,
751
+ const char* name, size_t len,
752
+ const upb_FieldDef** out_f,
753
+ const upb_OneofDef** out_o) {
582
754
  upb_value val;
583
755
 
584
756
  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
585
757
  return false;
586
758
  }
587
759
 
588
- *o = unpack_def(val, UPB_DEFTYPE_ONEOF);
589
- *f = unpack_def(val, UPB_DEFTYPE_FIELD);
590
- return *o || *f; /* False if this was a JSON name. */
760
+ const upb_FieldDef* f = unpack_def(val, UPB_DEFTYPE_FIELD);
761
+ const upb_OneofDef* o = unpack_def(val, UPB_DEFTYPE_ONEOF);
762
+ if (out_f) *out_f = f;
763
+ if (out_o) *out_o = o;
764
+ return f || o; /* False if this was a JSON name. */
591
765
  }
592
766
 
593
- const upb_fielddef *upb_msgdef_lookupjsonname(const upb_msgdef *m,
594
- const char *name, size_t len) {
767
+ const upb_FieldDef* upb_MessageDef_FindByJsonNameWithSize(
768
+ const upb_MessageDef* m, const char* name, size_t len) {
595
769
  upb_value val;
596
- const upb_fielddef* f;
770
+ const upb_FieldDef* f;
597
771
 
598
772
  if (!upb_strtable_lookup2(&m->ntof, name, len, &val)) {
599
773
  return NULL;
@@ -605,293 +779,465 @@ const upb_fielddef *upb_msgdef_lookupjsonname(const upb_msgdef *m,
605
779
  return f;
606
780
  }
607
781
 
608
- int upb_msgdef_numfields(const upb_msgdef *m) {
782
+ int upb_MessageDef_numfields(const upb_MessageDef* m) { return m->field_count; }
783
+
784
+ int upb_MessageDef_numoneofs(const upb_MessageDef* m) { return m->oneof_count; }
785
+
786
+ int upb_MessageDef_numrealoneofs(const upb_MessageDef* m) {
787
+ return m->real_oneof_count;
788
+ }
789
+
790
+ int upb_MessageDef_ExtensionRangeCount(const upb_MessageDef* m) {
791
+ return m->ext_range_count;
792
+ }
793
+
794
+ int upb_MessageDef_FieldCount(const upb_MessageDef* m) {
609
795
  return m->field_count;
610
796
  }
611
797
 
612
- int upb_msgdef_numoneofs(const upb_msgdef *m) {
798
+ int upb_MessageDef_OneofCount(const upb_MessageDef* m) {
613
799
  return m->oneof_count;
614
800
  }
615
801
 
616
- int upb_msgdef_numrealoneofs(const upb_msgdef *m) {
617
- return m->real_oneof_count;
802
+ int upb_MessageDef_NestedMessageCount(const upb_MessageDef* m) {
803
+ return m->nested_msg_count;
618
804
  }
619
805
 
620
- int upb_msgdef_fieldcount(const upb_msgdef *m) {
621
- return m->field_count;
806
+ int upb_MessageDef_NestedEnumCount(const upb_MessageDef* m) {
807
+ return m->nested_enum_count;
622
808
  }
623
809
 
624
- int upb_msgdef_oneofcount(const upb_msgdef *m) {
625
- return m->oneof_count;
810
+ int upb_MessageDef_NestedExtensionCount(const upb_MessageDef* m) {
811
+ return m->nested_ext_count;
626
812
  }
627
813
 
628
- int upb_msgdef_realoneofcount(const upb_msgdef *m) {
814
+ int upb_MessageDef_realoneofcount(const upb_MessageDef* m) {
629
815
  return m->real_oneof_count;
630
816
  }
631
817
 
632
- const upb_msglayout *upb_msgdef_layout(const upb_msgdef *m) {
818
+ const upb_MiniTable* upb_MessageDef_MiniTable(const upb_MessageDef* m) {
633
819
  return m->layout;
634
820
  }
635
821
 
636
- const upb_fielddef *upb_msgdef_field(const upb_msgdef *m, int i) {
637
- UPB_ASSERT(i >= 0 && i < m->field_count);
822
+ const upb_ExtensionRange* upb_MessageDef_ExtensionRange(const upb_MessageDef* m,
823
+ int i) {
824
+ UPB_ASSERT(0 <= i && i < m->ext_range_count);
825
+ return &m->ext_ranges[i];
826
+ }
827
+
828
+ const upb_FieldDef* upb_MessageDef_Field(const upb_MessageDef* m, int i) {
829
+ UPB_ASSERT(0 <= i && i < m->field_count);
638
830
  return &m->fields[i];
639
831
  }
640
832
 
641
- const upb_oneofdef *upb_msgdef_oneof(const upb_msgdef *m, int i) {
642
- UPB_ASSERT(i >= 0 && i < m->oneof_count);
833
+ const upb_OneofDef* upb_MessageDef_Oneof(const upb_MessageDef* m, int i) {
834
+ UPB_ASSERT(0 <= i && i < m->oneof_count);
643
835
  return &m->oneofs[i];
644
836
  }
645
837
 
646
- bool upb_msgdef_mapentry(const upb_msgdef *m) {
647
- return m->map_entry;
838
+ const upb_MessageDef* upb_MessageDef_NestedMessage(const upb_MessageDef* m,
839
+ int i) {
840
+ UPB_ASSERT(0 <= i && i < m->nested_msg_count);
841
+ return &m->nested_msgs[i];
648
842
  }
649
843
 
650
- upb_wellknowntype_t upb_msgdef_wellknowntype(const upb_msgdef *m) {
651
- return m->well_known_type;
844
+ const upb_EnumDef* upb_MessageDef_NestedEnum(const upb_MessageDef* m, int i) {
845
+ UPB_ASSERT(0 <= i && i < m->nested_enum_count);
846
+ return &m->nested_enums[i];
652
847
  }
653
848
 
654
- bool upb_msgdef_isnumberwrapper(const upb_msgdef *m) {
655
- upb_wellknowntype_t type = upb_msgdef_wellknowntype(m);
656
- return type >= UPB_WELLKNOWN_DOUBLEVALUE &&
657
- type <= UPB_WELLKNOWN_UINT32VALUE;
849
+ const upb_FieldDef* upb_MessageDef_NestedExtension(const upb_MessageDef* m,
850
+ int i) {
851
+ UPB_ASSERT(0 <= i && i < m->nested_ext_count);
852
+ return &m->nested_exts[i];
658
853
  }
659
854
 
660
- bool upb_msgdef_iswrapper(const upb_msgdef *m) {
661
- upb_wellknowntype_t type = upb_msgdef_wellknowntype(m);
662
- return type >= UPB_WELLKNOWN_DOUBLEVALUE &&
663
- type <= UPB_WELLKNOWN_BOOLVALUE;
855
+ upb_WellKnown upb_MessageDef_WellKnownType(const upb_MessageDef* m) {
856
+ return m->well_known_type;
664
857
  }
665
858
 
666
- void upb_msg_field_begin(upb_msg_field_iter *iter, const upb_msgdef *m) {
667
- upb_inttable_begin(iter, &m->itof);
859
+ /* upb_OneofDef ***************************************************************/
860
+
861
+ const google_protobuf_OneofOptions* upb_OneofDef_Options(
862
+ const upb_OneofDef* o) {
863
+ return o->opts;
668
864
  }
669
865
 
670
- void upb_msg_field_next(upb_msg_field_iter *iter) { upb_inttable_next(iter); }
866
+ bool upb_OneofDef_HasOptions(const upb_OneofDef* o) {
867
+ return o->opts != (void*)opt_default;
868
+ }
671
869
 
672
- bool upb_msg_field_done(const upb_msg_field_iter *iter) {
673
- return upb_inttable_done(iter);
870
+ const char* upb_OneofDef_Name(const upb_OneofDef* o) {
871
+ return shortdefname(o->full_name);
674
872
  }
675
873
 
676
- upb_fielddef *upb_msg_iter_field(const upb_msg_field_iter *iter) {
677
- return (upb_fielddef *)upb_value_getconstptr(upb_inttable_iter_value(iter));
874
+ const upb_MessageDef* upb_OneofDef_ContainingType(const upb_OneofDef* o) {
875
+ return o->parent;
678
876
  }
679
877
 
680
- void upb_msg_field_iter_setdone(upb_msg_field_iter *iter) {
681
- upb_inttable_iter_setdone(iter);
878
+ int upb_OneofDef_FieldCount(const upb_OneofDef* o) { return o->field_count; }
879
+
880
+ const upb_FieldDef* upb_OneofDef_Field(const upb_OneofDef* o, int i) {
881
+ UPB_ASSERT(i < o->field_count);
882
+ return o->fields[i];
682
883
  }
683
884
 
684
- bool upb_msg_field_iter_isequal(const upb_msg_field_iter * iter1,
685
- const upb_msg_field_iter * iter2) {
686
- return upb_inttable_iter_isequal(iter1, iter2);
885
+ int upb_OneofDef_numfields(const upb_OneofDef* o) { return o->field_count; }
886
+
887
+ uint32_t upb_OneofDef_Index(const upb_OneofDef* o) {
888
+ // Compute index in our parent's array.
889
+ return o - o->parent->oneofs;
687
890
  }
688
891
 
689
- void upb_msg_oneof_begin(upb_msg_oneof_iter *iter, const upb_msgdef *m) {
690
- upb_strtable_begin(iter, &m->ntof);
691
- /* We need to skip past any initial fields. */
692
- while (!upb_strtable_done(iter) &&
693
- !unpack_def(upb_strtable_iter_value(iter), UPB_DEFTYPE_ONEOF)) {
694
- upb_strtable_next(iter);
695
- }
892
+ bool upb_OneofDef_IsSynthetic(const upb_OneofDef* o) { return o->synthetic; }
893
+
894
+ const upb_FieldDef* upb_OneofDef_LookupNameWithSize(const upb_OneofDef* o,
895
+ const char* name,
896
+ size_t length) {
897
+ upb_value val;
898
+ return upb_strtable_lookup2(&o->ntof, name, length, &val)
899
+ ? upb_value_getptr(val)
900
+ : NULL;
696
901
  }
697
902
 
698
- void upb_msg_oneof_next(upb_msg_oneof_iter *iter) {
699
- /* We need to skip past fields to return only oneofs. */
700
- do {
701
- upb_strtable_next(iter);
702
- } while (!upb_strtable_done(iter) &&
703
- !unpack_def(upb_strtable_iter_value(iter), UPB_DEFTYPE_ONEOF));
903
+ const upb_FieldDef* upb_OneofDef_LookupNumber(const upb_OneofDef* o,
904
+ uint32_t num) {
905
+ upb_value val;
906
+ return upb_inttable_lookup(&o->itof, num, &val) ? upb_value_getptr(val)
907
+ : NULL;
704
908
  }
705
909
 
706
- bool upb_msg_oneof_done(const upb_msg_oneof_iter *iter) {
707
- return upb_strtable_done(iter);
910
+ /* upb_FileDef ****************************************************************/
911
+
912
+ const google_protobuf_FileOptions* upb_FileDef_Options(const upb_FileDef* f) {
913
+ return f->opts;
708
914
  }
709
915
 
710
- const upb_oneofdef *upb_msg_iter_oneof(const upb_msg_oneof_iter *iter) {
711
- return unpack_def(upb_strtable_iter_value(iter), UPB_DEFTYPE_ONEOF);
916
+ bool upb_FileDef_HasOptions(const upb_FileDef* f) {
917
+ return f->opts != (void*)opt_default;
712
918
  }
713
919
 
714
- void upb_msg_oneof_iter_setdone(upb_msg_oneof_iter *iter) {
715
- upb_strtable_iter_setdone(iter);
920
+ const char* upb_FileDef_Name(const upb_FileDef* f) { return f->name; }
921
+
922
+ const char* upb_FileDef_Package(const upb_FileDef* f) { return f->package; }
923
+
924
+ upb_Syntax upb_FileDef_Syntax(const upb_FileDef* f) { return f->syntax; }
925
+
926
+ int upb_FileDef_TopLevelMessageCount(const upb_FileDef* f) {
927
+ return f->top_lvl_msg_count;
716
928
  }
717
929
 
718
- bool upb_msg_oneof_iter_isequal(const upb_msg_oneof_iter *iter1,
719
- const upb_msg_oneof_iter *iter2) {
720
- return upb_strtable_iter_isequal(iter1, iter2);
930
+ int upb_FileDef_DependencyCount(const upb_FileDef* f) { return f->dep_count; }
931
+
932
+ int upb_FileDef_PublicDependencyCount(const upb_FileDef* f) {
933
+ return f->public_dep_count;
721
934
  }
722
935
 
723
- /* upb_oneofdef ***************************************************************/
936
+ int upb_FileDef_WeakDependencyCount(const upb_FileDef* f) {
937
+ return f->weak_dep_count;
938
+ }
724
939
 
725
- const char *upb_oneofdef_name(const upb_oneofdef *o) {
726
- return shortdefname(o->full_name);
940
+ const int32_t* _upb_FileDef_PublicDependencyIndexes(const upb_FileDef* f) {
941
+ return f->public_deps;
727
942
  }
728
943
 
729
- const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o) {
730
- return o->parent;
944
+ const int32_t* _upb_FileDef_WeakDependencyIndexes(const upb_FileDef* f) {
945
+ return f->weak_deps;
731
946
  }
732
947
 
733
- int upb_oneofdef_fieldcount(const upb_oneofdef *o) {
734
- return o->field_count;
948
+ int upb_FileDef_TopLevelEnumCount(const upb_FileDef* f) {
949
+ return f->top_lvl_enum_count;
735
950
  }
736
951
 
737
- const upb_fielddef *upb_oneofdef_field(const upb_oneofdef *o, int i) {
738
- UPB_ASSERT(i < o->field_count);
739
- return o->fields[i];
952
+ int upb_FileDef_TopLevelExtensionCount(const upb_FileDef* f) {
953
+ return f->top_lvl_ext_count;
740
954
  }
741
955
 
742
- int upb_oneofdef_numfields(const upb_oneofdef *o) {
743
- return o->field_count;
956
+ int upb_FileDef_ServiceCount(const upb_FileDef* f) { return f->service_count; }
957
+
958
+ const upb_FileDef* upb_FileDef_Dependency(const upb_FileDef* f, int i) {
959
+ UPB_ASSERT(0 <= i && i < f->dep_count);
960
+ return f->deps[i];
744
961
  }
745
962
 
746
- uint32_t upb_oneofdef_index(const upb_oneofdef *o) {
747
- return o - o->parent->oneofs;
963
+ const upb_FileDef* upb_FileDef_PublicDependency(const upb_FileDef* f, int i) {
964
+ UPB_ASSERT(0 <= i && i < f->public_dep_count);
965
+ return f->deps[f->public_deps[i]];
748
966
  }
749
967
 
750
- bool upb_oneofdef_issynthetic(const upb_oneofdef *o) {
751
- return o->synthetic;
968
+ const upb_FileDef* upb_FileDef_WeakDependency(const upb_FileDef* f, int i) {
969
+ UPB_ASSERT(0 <= i && i < f->public_dep_count);
970
+ return f->deps[f->weak_deps[i]];
752
971
  }
753
972
 
754
- const upb_fielddef *upb_oneofdef_ntof(const upb_oneofdef *o,
755
- const char *name, size_t length) {
756
- upb_value val;
757
- return upb_strtable_lookup2(&o->ntof, name, length, &val) ?
758
- upb_value_getptr(val) : NULL;
973
+ const upb_MessageDef* upb_FileDef_TopLevelMessage(const upb_FileDef* f, int i) {
974
+ UPB_ASSERT(0 <= i && i < f->top_lvl_msg_count);
975
+ return &f->top_lvl_msgs[i];
759
976
  }
760
977
 
761
- const upb_fielddef *upb_oneofdef_itof(const upb_oneofdef *o, uint32_t num) {
762
- upb_value val;
763
- return upb_inttable_lookup(&o->itof, num, &val) ? upb_value_getptr(val)
764
- : NULL;
978
+ const upb_EnumDef* upb_FileDef_TopLevelEnum(const upb_FileDef* f, int i) {
979
+ UPB_ASSERT(0 <= i && i < f->top_lvl_enum_count);
980
+ return &f->top_lvl_enums[i];
765
981
  }
766
982
 
767
- void upb_oneof_begin(upb_oneof_iter *iter, const upb_oneofdef *o) {
768
- upb_inttable_begin(iter, &o->itof);
983
+ const upb_FieldDef* upb_FileDef_TopLevelExtension(const upb_FileDef* f, int i) {
984
+ UPB_ASSERT(0 <= i && i < f->top_lvl_ext_count);
985
+ return &f->top_lvl_exts[i];
769
986
  }
770
987
 
771
- void upb_oneof_next(upb_oneof_iter *iter) {
772
- upb_inttable_next(iter);
988
+ const upb_ServiceDef* upb_FileDef_Service(const upb_FileDef* f, int i) {
989
+ UPB_ASSERT(0 <= i && i < f->service_count);
990
+ return &f->services[i];
773
991
  }
774
992
 
775
- bool upb_oneof_done(upb_oneof_iter *iter) {
776
- return upb_inttable_done(iter);
993
+ const upb_DefPool* upb_FileDef_Pool(const upb_FileDef* f) { return f->symtab; }
994
+
995
+ /* upb_MethodDef **************************************************************/
996
+
997
+ const google_protobuf_MethodOptions* upb_MethodDef_Options(
998
+ const upb_MethodDef* m) {
999
+ return m->opts;
777
1000
  }
778
1001
 
779
- upb_fielddef *upb_oneof_iter_field(const upb_oneof_iter *iter) {
780
- return (upb_fielddef *)upb_value_getconstptr(upb_inttable_iter_value(iter));
1002
+ bool upb_MethodDef_HasOptions(const upb_MethodDef* m) {
1003
+ return m->opts != (void*)opt_default;
781
1004
  }
782
1005
 
783
- void upb_oneof_iter_setdone(upb_oneof_iter *iter) {
784
- upb_inttable_iter_setdone(iter);
1006
+ const char* upb_MethodDef_FullName(const upb_MethodDef* m) {
1007
+ return m->full_name;
785
1008
  }
786
1009
 
787
- /* upb_filedef ****************************************************************/
1010
+ int upb_MethodDef_Index(const upb_MethodDef* m) { return m->index; }
1011
+
1012
+ const char* upb_MethodDef_Name(const upb_MethodDef* m) {
1013
+ return shortdefname(m->full_name);
1014
+ }
788
1015
 
789
- const char *upb_filedef_name(const upb_filedef *f) {
790
- return f->name;
1016
+ const upb_ServiceDef* upb_MethodDef_Service(const upb_MethodDef* m) {
1017
+ return m->service;
791
1018
  }
792
1019
 
793
- const char *upb_filedef_package(const upb_filedef *f) {
794
- return f->package;
1020
+ const upb_MessageDef* upb_MethodDef_InputType(const upb_MethodDef* m) {
1021
+ return m->input_type;
795
1022
  }
796
1023
 
797
- const char *upb_filedef_phpprefix(const upb_filedef *f) {
798
- return f->phpprefix;
1024
+ const upb_MessageDef* upb_MethodDef_OutputType(const upb_MethodDef* m) {
1025
+ return m->output_type;
799
1026
  }
800
1027
 
801
- const char *upb_filedef_phpnamespace(const upb_filedef *f) {
802
- return f->phpnamespace;
1028
+ bool upb_MethodDef_ClientStreaming(const upb_MethodDef* m) {
1029
+ return m->client_streaming;
803
1030
  }
804
1031
 
805
- upb_syntax_t upb_filedef_syntax(const upb_filedef *f) {
806
- return f->syntax;
1032
+ bool upb_MethodDef_ServerStreaming(const upb_MethodDef* m) {
1033
+ return m->server_streaming;
1034
+ }
1035
+
1036
+ /* upb_ServiceDef *************************************************************/
1037
+
1038
+ const google_protobuf_ServiceOptions* upb_ServiceDef_Options(
1039
+ const upb_ServiceDef* s) {
1040
+ return s->opts;
807
1041
  }
808
1042
 
809
- int upb_filedef_msgcount(const upb_filedef *f) {
810
- return f->msg_count;
1043
+ bool upb_ServiceDef_HasOptions(const upb_ServiceDef* s) {
1044
+ return s->opts != (void*)opt_default;
811
1045
  }
812
1046
 
813
- int upb_filedef_depcount(const upb_filedef *f) {
814
- return f->dep_count;
1047
+ const char* upb_ServiceDef_FullName(const upb_ServiceDef* s) {
1048
+ return s->full_name;
815
1049
  }
816
1050
 
817
- int upb_filedef_enumcount(const upb_filedef *f) {
818
- return f->enum_count;
1051
+ const char* upb_ServiceDef_Name(const upb_ServiceDef* s) {
1052
+ return shortdefname(s->full_name);
819
1053
  }
820
1054
 
821
- const upb_filedef *upb_filedef_dep(const upb_filedef *f, int i) {
822
- return i < 0 || i >= f->dep_count ? NULL : f->deps[i];
1055
+ int upb_ServiceDef_Index(const upb_ServiceDef* s) { return s->index; }
1056
+
1057
+ const upb_FileDef* upb_ServiceDef_File(const upb_ServiceDef* s) {
1058
+ return s->file;
823
1059
  }
824
1060
 
825
- const upb_msgdef *upb_filedef_msg(const upb_filedef *f, int i) {
826
- return i < 0 || i >= f->msg_count ? NULL : &f->msgs[i];
1061
+ int upb_ServiceDef_MethodCount(const upb_ServiceDef* s) {
1062
+ return s->method_count;
827
1063
  }
828
1064
 
829
- const upb_enumdef *upb_filedef_enum(const upb_filedef *f, int i) {
830
- return i < 0 || i >= f->enum_count ? NULL : &f->enums[i];
1065
+ const upb_MethodDef* upb_ServiceDef_Method(const upb_ServiceDef* s, int i) {
1066
+ return i < 0 || i >= s->method_count ? NULL : &s->methods[i];
831
1067
  }
832
1068
 
833
- const upb_symtab *upb_filedef_symtab(const upb_filedef *f) {
834
- return f->symtab;
1069
+ const upb_MethodDef* upb_ServiceDef_FindMethodByName(const upb_ServiceDef* s,
1070
+ const char* name) {
1071
+ for (int i = 0; i < s->method_count; i++) {
1072
+ if (strcmp(name, upb_MethodDef_Name(&s->methods[i])) == 0) {
1073
+ return &s->methods[i];
1074
+ }
1075
+ }
1076
+ return NULL;
835
1077
  }
836
1078
 
837
- void upb_symtab_free(upb_symtab *s) {
838
- upb_arena_free(s->arena);
1079
+ /* upb_DefPool ****************************************************************/
1080
+
1081
+ void upb_DefPool_Free(upb_DefPool* s) {
1082
+ upb_Arena_Free(s->arena);
839
1083
  upb_gfree(s);
840
1084
  }
841
1085
 
842
- upb_symtab *upb_symtab_new(void) {
843
- upb_symtab *s = upb_gmalloc(sizeof(*s));
1086
+ upb_DefPool* upb_DefPool_New(void) {
1087
+ upb_DefPool* s = upb_gmalloc(sizeof(*s));
844
1088
 
845
1089
  if (!s) {
846
1090
  return NULL;
847
1091
  }
848
1092
 
849
- s->arena = upb_arena_new();
1093
+ s->arena = upb_Arena_New();
850
1094
  s->bytes_loaded = 0;
851
1095
 
852
1096
  if (!upb_strtable_init(&s->syms, 32, s->arena) ||
853
- !upb_strtable_init(&s->files, 4, s->arena)) {
854
- upb_arena_free(s->arena);
855
- upb_gfree(s);
856
- s = NULL;
1097
+ !upb_strtable_init(&s->files, 4, s->arena) ||
1098
+ !upb_inttable_init(&s->exts, s->arena)) {
1099
+ goto err;
857
1100
  }
1101
+
1102
+ s->extreg = upb_ExtensionRegistry_New(s->arena);
1103
+ if (!s->extreg) goto err;
858
1104
  return s;
1105
+
1106
+ err:
1107
+ upb_Arena_Free(s->arena);
1108
+ upb_gfree(s);
1109
+ return NULL;
859
1110
  }
860
1111
 
861
- const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym) {
1112
+ static const void* symtab_lookup(const upb_DefPool* s, const char* sym,
1113
+ upb_deftype_t type) {
862
1114
  upb_value v;
863
- return upb_strtable_lookup(&s->syms, sym, &v) ?
864
- unpack_def(v, UPB_DEFTYPE_MSG) : NULL;
1115
+ return upb_strtable_lookup(&s->syms, sym, &v) ? unpack_def(v, type) : NULL;
865
1116
  }
866
1117
 
867
- const upb_msgdef *upb_symtab_lookupmsg2(const upb_symtab *s, const char *sym,
868
- size_t len) {
1118
+ static const void* symtab_lookup2(const upb_DefPool* s, const char* sym,
1119
+ size_t size, upb_deftype_t type) {
869
1120
  upb_value v;
870
- return upb_strtable_lookup2(&s->syms, sym, len, &v) ?
871
- unpack_def(v, UPB_DEFTYPE_MSG) : NULL;
1121
+ return upb_strtable_lookup2(&s->syms, sym, size, &v) ? unpack_def(v, type)
1122
+ : NULL;
1123
+ }
1124
+
1125
+ const upb_MessageDef* upb_DefPool_FindMessageByName(const upb_DefPool* s,
1126
+ const char* sym) {
1127
+ return symtab_lookup(s, sym, UPB_DEFTYPE_MSG);
1128
+ }
1129
+
1130
+ const upb_MessageDef* upb_DefPool_FindMessageByNameWithSize(
1131
+ const upb_DefPool* s, const char* sym, size_t len) {
1132
+ return symtab_lookup2(s, sym, len, UPB_DEFTYPE_MSG);
1133
+ }
1134
+
1135
+ const upb_EnumDef* upb_DefPool_FindEnumByName(const upb_DefPool* s,
1136
+ const char* sym) {
1137
+ return symtab_lookup(s, sym, UPB_DEFTYPE_ENUM);
872
1138
  }
873
1139
 
874
- const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym) {
1140
+ const upb_EnumValueDef* upb_DefPool_FindEnumByNameval(const upb_DefPool* s,
1141
+ const char* sym) {
1142
+ return symtab_lookup(s, sym, UPB_DEFTYPE_ENUMVAL);
1143
+ }
1144
+
1145
+ const upb_FileDef* upb_DefPool_FindFileByName(const upb_DefPool* s,
1146
+ const char* name) {
875
1147
  upb_value v;
876
- return upb_strtable_lookup(&s->syms, sym, &v) ?
877
- unpack_def(v, UPB_DEFTYPE_ENUM) : NULL;
1148
+ return upb_strtable_lookup(&s->files, name, &v)
1149
+ ? unpack_def(v, UPB_DEFTYPE_FILE)
1150
+ : NULL;
878
1151
  }
879
1152
 
880
- const upb_filedef *upb_symtab_lookupfile(const upb_symtab *s, const char *name) {
1153
+ const upb_FileDef* upb_DefPool_FindFileByNameWithSize(const upb_DefPool* s,
1154
+ const char* name,
1155
+ size_t len) {
881
1156
  upb_value v;
882
- return upb_strtable_lookup(&s->files, name, &v) ? upb_value_getconstptr(v)
883
- : NULL;
1157
+ return upb_strtable_lookup2(&s->files, name, len, &v)
1158
+ ? unpack_def(v, UPB_DEFTYPE_FILE)
1159
+ : NULL;
884
1160
  }
885
1161
 
886
- const upb_filedef *upb_symtab_lookupfile2(
887
- const upb_symtab *s, const char *name, size_t len) {
1162
+ const upb_FieldDef* upb_DefPool_FindExtensionByNameWithSize(
1163
+ const upb_DefPool* s, const char* name, size_t size) {
888
1164
  upb_value v;
889
- return upb_strtable_lookup2(&s->files, name, len, &v) ?
890
- upb_value_getconstptr(v) : NULL;
1165
+ if (!upb_strtable_lookup2(&s->syms, name, size, &v)) return NULL;
1166
+
1167
+ switch (deftype(v)) {
1168
+ case UPB_DEFTYPE_FIELD:
1169
+ return unpack_def(v, UPB_DEFTYPE_FIELD);
1170
+ case UPB_DEFTYPE_MSG: {
1171
+ const upb_MessageDef* m = unpack_def(v, UPB_DEFTYPE_MSG);
1172
+ return m->in_message_set ? &m->nested_exts[0] : NULL;
1173
+ }
1174
+ default:
1175
+ break;
1176
+ }
1177
+
1178
+ return NULL;
891
1179
  }
892
1180
 
893
- int upb_symtab_filecount(const upb_symtab *s) {
894
- return (int)upb_strtable_count(&s->files);
1181
+ const upb_FieldDef* upb_DefPool_FindExtensionByName(const upb_DefPool* s,
1182
+ const char* sym) {
1183
+ return upb_DefPool_FindExtensionByNameWithSize(s, sym, strlen(sym));
1184
+ }
1185
+
1186
+ const upb_ServiceDef* upb_DefPool_FindServiceByName(const upb_DefPool* s,
1187
+ const char* name) {
1188
+ return symtab_lookup(s, name, UPB_DEFTYPE_SERVICE);
1189
+ }
1190
+
1191
+ const upb_ServiceDef* upb_DefPool_FindServiceByNameWithSize(
1192
+ const upb_DefPool* s, const char* name, size_t size) {
1193
+ return symtab_lookup2(s, name, size, UPB_DEFTYPE_SERVICE);
1194
+ }
1195
+
1196
+ const upb_FileDef* upb_DefPool_FindFileContainingSymbol(const upb_DefPool* s,
1197
+ const char* name) {
1198
+ upb_value v;
1199
+ // TODO(haberman): non-extension fields and oneofs.
1200
+ if (upb_strtable_lookup(&s->syms, name, &v)) {
1201
+ switch (deftype(v)) {
1202
+ case UPB_DEFTYPE_EXT: {
1203
+ const upb_FieldDef* f = unpack_def(v, UPB_DEFTYPE_EXT);
1204
+ return upb_FieldDef_File(f);
1205
+ }
1206
+ case UPB_DEFTYPE_MSG: {
1207
+ const upb_MessageDef* m = unpack_def(v, UPB_DEFTYPE_MSG);
1208
+ return upb_MessageDef_File(m);
1209
+ }
1210
+ case UPB_DEFTYPE_ENUM: {
1211
+ const upb_EnumDef* e = unpack_def(v, UPB_DEFTYPE_ENUM);
1212
+ return upb_EnumDef_File(e);
1213
+ }
1214
+ case UPB_DEFTYPE_ENUMVAL: {
1215
+ const upb_EnumValueDef* ev = unpack_def(v, UPB_DEFTYPE_ENUMVAL);
1216
+ return upb_EnumDef_File(upb_EnumValueDef_Enum(ev));
1217
+ }
1218
+ case UPB_DEFTYPE_SERVICE: {
1219
+ const upb_ServiceDef* service = unpack_def(v, UPB_DEFTYPE_SERVICE);
1220
+ return upb_ServiceDef_File(service);
1221
+ }
1222
+ default:
1223
+ UPB_UNREACHABLE();
1224
+ }
1225
+ }
1226
+
1227
+ const char* last_dot = strrchr(name, '.');
1228
+ if (last_dot) {
1229
+ const upb_MessageDef* parent =
1230
+ upb_DefPool_FindMessageByNameWithSize(s, name, last_dot - name);
1231
+ if (parent) {
1232
+ const char* shortname = last_dot + 1;
1233
+ if (upb_MessageDef_FindByNameWithSize(parent, shortname,
1234
+ strlen(shortname), NULL, NULL)) {
1235
+ return upb_MessageDef_File(parent);
1236
+ }
1237
+ }
1238
+ }
1239
+
1240
+ return NULL;
895
1241
  }
896
1242
 
897
1243
  /* Code to build defs from descriptor protos. *********************************/
@@ -901,40 +1247,61 @@ int upb_symtab_filecount(const upb_symtab *s) {
901
1247
  * this code is used to directly build defs from Ruby (for example) we do need
902
1248
  * to validate important constraints like uniqueness of names and numbers. */
903
1249
 
904
- #define CHK_OOM(x) if (!(x)) { symtab_oomerr(ctx); }
1250
+ #define CHK_OOM(x) \
1251
+ if (!(x)) { \
1252
+ symtab_oomerr(ctx); \
1253
+ }
905
1254
 
906
1255
  typedef struct {
907
- upb_symtab *symtab;
908
- upb_filedef *file; /* File we are building. */
909
- upb_arena *arena; /* Allocate defs here. */
910
- const upb_msglayout **layouts; /* NULL if we should build layouts. */
911
- upb_status *status; /* Record errors here. */
912
- jmp_buf err; /* longjmp() on error. */
1256
+ upb_DefPool* symtab;
1257
+ upb_FileDef* file; /* File we are building. */
1258
+ upb_Arena* arena; /* Allocate defs here. */
1259
+ upb_Arena* tmp_arena; /* For temporary allocations. */
1260
+ const upb_MiniTable_File* layout; /* NULL if we should build layouts. */
1261
+ int enum_count; /* Count of enums built so far. */
1262
+ int msg_count; /* Count of messages built so far. */
1263
+ int ext_count; /* Count of extensions built so far. */
1264
+ upb_Status* status; /* Record errors here. */
1265
+ jmp_buf err; /* longjmp() on error. */
913
1266
  } symtab_addctx;
914
1267
 
915
- UPB_NORETURN UPB_NOINLINE UPB_PRINTF(2, 3)
916
- static void symtab_errf(symtab_addctx *ctx, const char *fmt, ...) {
1268
+ UPB_NORETURN UPB_NOINLINE UPB_PRINTF(2, 3) static void symtab_errf(
1269
+ symtab_addctx* ctx, const char* fmt, ...) {
917
1270
  va_list argp;
918
1271
  va_start(argp, fmt);
919
- upb_status_vseterrf(ctx->status, fmt, argp);
1272
+ upb_Status_VSetErrorFormat(ctx->status, fmt, argp);
920
1273
  va_end(argp);
921
1274
  UPB_LONGJMP(ctx->err, 1);
922
1275
  }
923
1276
 
924
- UPB_NORETURN UPB_NOINLINE
925
- static void symtab_oomerr(symtab_addctx *ctx) {
926
- upb_status_setoom(ctx->status);
1277
+ UPB_NORETURN UPB_NOINLINE static void symtab_oomerr(symtab_addctx* ctx) {
1278
+ upb_Status_setoom(ctx->status);
927
1279
  UPB_LONGJMP(ctx->err, 1);
928
1280
  }
929
1281
 
930
- void *symtab_alloc(symtab_addctx *ctx, size_t bytes) {
931
- void *ret = upb_arena_malloc(ctx->arena, bytes);
1282
+ void* symtab_alloc(symtab_addctx* ctx, size_t bytes) {
1283
+ if (bytes == 0) return NULL;
1284
+ void* ret = upb_Arena_Malloc(ctx->arena, bytes);
932
1285
  if (!ret) symtab_oomerr(ctx);
933
1286
  return ret;
934
1287
  }
935
1288
 
936
- static void check_ident(symtab_addctx *ctx, upb_strview name, bool full) {
937
- const char *str = name.data;
1289
+ // We want to copy the options verbatim into the destination options proto.
1290
+ // We use serialize+parse as our deep copy.
1291
+ #define SET_OPTIONS(target, desc_type, options_type, proto) \
1292
+ if (google_protobuf_##desc_type##_has_options(proto)) { \
1293
+ size_t size; \
1294
+ char* pb = google_protobuf_##options_type##_serialize( \
1295
+ google_protobuf_##desc_type##_options(proto), ctx->tmp_arena, &size); \
1296
+ CHK_OOM(pb); \
1297
+ target = google_protobuf_##options_type##_parse(pb, size, ctx->arena); \
1298
+ CHK_OOM(target); \
1299
+ } else { \
1300
+ target = (const google_protobuf_##options_type*)opt_default; \
1301
+ }
1302
+
1303
+ static void check_ident(symtab_addctx* ctx, upb_StringView name, bool full) {
1304
+ const char* str = name.data;
938
1305
  size_t len = name.size;
939
1306
  bool start = true;
940
1307
  size_t i;
@@ -965,158 +1332,223 @@ static void check_ident(symtab_addctx *ctx, upb_strview name, bool full) {
965
1332
  }
966
1333
  }
967
1334
 
968
- static size_t div_round_up(size_t n, size_t d) {
969
- return (n + d - 1) / d;
970
- }
1335
+ static size_t div_round_up(size_t n, size_t d) { return (n + d - 1) / d; }
971
1336
 
972
- static size_t upb_msgval_sizeof(upb_fieldtype_t type) {
1337
+ static size_t upb_MessageValue_sizeof(upb_CType type) {
973
1338
  switch (type) {
974
- case UPB_TYPE_DOUBLE:
975
- case UPB_TYPE_INT64:
976
- case UPB_TYPE_UINT64:
1339
+ case kUpb_CType_Double:
1340
+ case kUpb_CType_Int64:
1341
+ case kUpb_CType_UInt64:
977
1342
  return 8;
978
- case UPB_TYPE_ENUM:
979
- case UPB_TYPE_INT32:
980
- case UPB_TYPE_UINT32:
981
- case UPB_TYPE_FLOAT:
1343
+ case kUpb_CType_Enum:
1344
+ case kUpb_CType_Int32:
1345
+ case kUpb_CType_UInt32:
1346
+ case kUpb_CType_Float:
982
1347
  return 4;
983
- case UPB_TYPE_BOOL:
1348
+ case kUpb_CType_Bool:
984
1349
  return 1;
985
- case UPB_TYPE_MESSAGE:
1350
+ case kUpb_CType_Message:
986
1351
  return sizeof(void*);
987
- case UPB_TYPE_BYTES:
988
- case UPB_TYPE_STRING:
989
- return sizeof(upb_strview);
1352
+ case kUpb_CType_Bytes:
1353
+ case kUpb_CType_String:
1354
+ return sizeof(upb_StringView);
990
1355
  }
991
1356
  UPB_UNREACHABLE();
992
1357
  }
993
1358
 
994
- static uint8_t upb_msg_fielddefsize(const upb_fielddef *f) {
995
- if (upb_msgdef_mapentry(upb_fielddef_containingtype(f))) {
996
- upb_map_entry ent;
1359
+ static uint8_t upb_msg_fielddefsize(const upb_FieldDef* f) {
1360
+ if (upb_MessageDef_IsMapEntry(upb_FieldDef_ContainingType(f))) {
1361
+ upb_MapEntry ent;
997
1362
  UPB_ASSERT(sizeof(ent.k) == sizeof(ent.v));
998
1363
  return sizeof(ent.k);
999
- } else if (upb_fielddef_isseq(f)) {
1364
+ } else if (upb_FieldDef_IsRepeated(f)) {
1000
1365
  return sizeof(void*);
1001
1366
  } else {
1002
- return upb_msgval_sizeof(upb_fielddef_type(f));
1367
+ return upb_MessageValue_sizeof(upb_FieldDef_CType(f));
1003
1368
  }
1004
1369
  }
1005
1370
 
1006
- static uint32_t upb_msglayout_place(upb_msglayout *l, size_t size) {
1007
- uint32_t ret;
1371
+ static uint32_t upb_MiniTable_place(symtab_addctx* ctx, upb_MiniTable* l,
1372
+ size_t size, const upb_MessageDef* m) {
1373
+ size_t ofs = UPB_ALIGN_UP(l->size, size);
1374
+ size_t next = ofs + size;
1008
1375
 
1009
- l->size = UPB_ALIGN_UP(l->size, size);
1010
- ret = l->size;
1011
- l->size += size;
1012
- return ret;
1376
+ if (next > UINT16_MAX) {
1377
+ symtab_errf(ctx, "size of message %s exceeded max size of %zu bytes",
1378
+ upb_MessageDef_FullName(m), (size_t)UINT16_MAX);
1379
+ }
1380
+
1381
+ l->size = next;
1382
+ return ofs;
1013
1383
  }
1014
1384
 
1015
- static int field_number_cmp(const void *p1, const void *p2) {
1016
- const upb_msglayout_field *f1 = p1;
1017
- const upb_msglayout_field *f2 = p2;
1385
+ static int field_number_cmp(const void* p1, const void* p2) {
1386
+ const upb_MiniTable_Field* f1 = p1;
1387
+ const upb_MiniTable_Field* f2 = p2;
1018
1388
  return f1->number - f2->number;
1019
1389
  }
1020
1390
 
1021
- static void assign_layout_indices(const upb_msgdef *m, upb_msglayout *l,
1022
- upb_msglayout_field *fields) {
1391
+ static void assign_layout_indices(const upb_MessageDef* m, upb_MiniTable* l,
1392
+ upb_MiniTable_Field* fields) {
1023
1393
  int i;
1024
- int n = upb_msgdef_numfields(m);
1394
+ int n = upb_MessageDef_numfields(m);
1025
1395
  int dense_below = 0;
1026
1396
  for (i = 0; i < n; i++) {
1027
- upb_fielddef *f = (upb_fielddef*)upb_msgdef_itof(m, fields[i].number);
1397
+ upb_FieldDef* f =
1398
+ (upb_FieldDef*)upb_MessageDef_FindFieldByNumber(m, fields[i].number);
1028
1399
  UPB_ASSERT(f);
1029
1400
  f->layout_index = i;
1030
1401
  if (i < UINT8_MAX && fields[i].number == i + 1 &&
1031
- (i == 0 || fields[i-1].number == i)) {
1402
+ (i == 0 || fields[i - 1].number == i)) {
1032
1403
  dense_below = i + 1;
1033
1404
  }
1034
1405
  }
1035
1406
  l->dense_below = dense_below;
1036
1407
  }
1037
1408
 
1038
- static void fill_fieldlayout(upb_msglayout_field *field, const upb_fielddef *f) {
1039
- field->number = upb_fielddef_number(f);
1040
- field->descriptortype = upb_fielddef_descriptortype(f);
1041
-
1042
- if (field->descriptortype == UPB_DTYPE_STRING &&
1043
- f->file->syntax == UPB_SYNTAX_PROTO2) {
1044
- /* See TableDescriptorType() in upbc/generator.cc for details and
1045
- * rationale. */
1046
- field->descriptortype = UPB_DTYPE_BYTES;
1047
- }
1048
-
1049
- if (upb_fielddef_ismap(f)) {
1050
- field->mode = _UPB_MODE_MAP;
1051
- } else if (upb_fielddef_isseq(f)) {
1052
- field->mode = _UPB_MODE_ARRAY;
1409
+ static uint8_t map_descriptortype(const upb_FieldDef* f) {
1410
+ uint8_t type = upb_FieldDef_Type(f);
1411
+ /* See TableDescriptorType() in upbc/generator.cc for details and
1412
+ * rationale of these exceptions. */
1413
+ if (type == kUpb_FieldType_String && f->file->syntax == kUpb_Syntax_Proto2) {
1414
+ return kUpb_FieldType_Bytes;
1415
+ } else if (type == kUpb_FieldType_Enum &&
1416
+ (f->sub.enumdef->file->syntax == kUpb_Syntax_Proto3 ||
1417
+ UPB_TREAT_PROTO2_ENUMS_LIKE_PROTO3 ||
1418
+ // TODO(https://github.com/protocolbuffers/upb/issues/541):
1419
+ // fix map enum values to check for unknown enum values and put
1420
+ // them in the unknown field set.
1421
+ upb_MessageDef_IsMapEntry(upb_FieldDef_ContainingType(f)))) {
1422
+ return kUpb_FieldType_Int32;
1423
+ }
1424
+ return type;
1425
+ }
1426
+
1427
+ static void fill_fieldlayout(upb_MiniTable_Field* field,
1428
+ const upb_FieldDef* f) {
1429
+ field->number = upb_FieldDef_Number(f);
1430
+ field->descriptortype = map_descriptortype(f);
1431
+
1432
+ if (upb_FieldDef_IsMap(f)) {
1433
+ field->mode =
1434
+ kUpb_FieldMode_Map | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift);
1435
+ } else if (upb_FieldDef_IsRepeated(f)) {
1436
+ field->mode =
1437
+ kUpb_FieldMode_Array | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift);
1053
1438
  } else {
1054
- field->mode = _UPB_MODE_SCALAR;
1055
- }
1056
-
1057
- if (upb_fielddef_packed(f)) {
1058
- field->mode |= _UPB_MODE_IS_PACKED;
1439
+ /* Maps descriptor type -> elem_size_lg2. */
1440
+ static const uint8_t sizes[] = {
1441
+ -1, /* invalid descriptor type */
1442
+ kUpb_FieldRep_8Byte, /* DOUBLE */
1443
+ kUpb_FieldRep_4Byte, /* FLOAT */
1444
+ kUpb_FieldRep_8Byte, /* INT64 */
1445
+ kUpb_FieldRep_8Byte, /* UINT64 */
1446
+ kUpb_FieldRep_4Byte, /* INT32 */
1447
+ kUpb_FieldRep_8Byte, /* FIXED64 */
1448
+ kUpb_FieldRep_4Byte, /* FIXED32 */
1449
+ kUpb_FieldRep_1Byte, /* BOOL */
1450
+ kUpb_FieldRep_StringView, /* STRING */
1451
+ kUpb_FieldRep_Pointer, /* GROUP */
1452
+ kUpb_FieldRep_Pointer, /* MESSAGE */
1453
+ kUpb_FieldRep_StringView, /* BYTES */
1454
+ kUpb_FieldRep_4Byte, /* UINT32 */
1455
+ kUpb_FieldRep_4Byte, /* ENUM */
1456
+ kUpb_FieldRep_4Byte, /* SFIXED32 */
1457
+ kUpb_FieldRep_8Byte, /* SFIXED64 */
1458
+ kUpb_FieldRep_4Byte, /* SINT32 */
1459
+ kUpb_FieldRep_8Byte, /* SINT64 */
1460
+ };
1461
+ field->mode = kUpb_FieldMode_Scalar |
1462
+ (sizes[field->descriptortype] << kUpb_FieldRep_Shift);
1463
+ }
1464
+
1465
+ if (upb_FieldDef_IsPacked(f)) {
1466
+ field->mode |= kUpb_LabelFlags_IsPacked;
1467
+ }
1468
+
1469
+ if (upb_FieldDef_IsExtension(f)) {
1470
+ field->mode |= kUpb_LabelFlags_IsExtension;
1059
1471
  }
1060
1472
  }
1061
1473
 
1062
1474
  /* This function is the dynamic equivalent of message_layout.{cc,h} in upbc.
1063
1475
  * It computes a dynamic layout for all of the fields in |m|. */
1064
- static void make_layout(symtab_addctx *ctx, const upb_msgdef *m) {
1065
- upb_msglayout *l = (upb_msglayout*)m->layout;
1066
- upb_msg_field_iter it;
1067
- upb_msg_oneof_iter oit;
1068
- size_t hasbit;
1069
- size_t field_count = upb_msgdef_numfields(m);
1070
- size_t submsg_count = 0;
1071
- const upb_msglayout **submsgs;
1072
- upb_msglayout_field *fields;
1073
-
1074
- memset(l, 0, sizeof(*l) + sizeof(_upb_fasttable_entry));
1476
+ static void make_layout(symtab_addctx* ctx, const upb_MessageDef* m) {
1477
+ upb_MiniTable* l = (upb_MiniTable*)m->layout;
1478
+ size_t field_count = upb_MessageDef_numfields(m);
1479
+ size_t sublayout_count = 0;
1480
+ upb_MiniTable_Sub* subs;
1481
+ upb_MiniTable_Field* fields;
1482
+
1483
+ memset(l, 0, sizeof(*l) + sizeof(_upb_FastTable_Entry));
1075
1484
 
1076
1485
  /* Count sub-messages. */
1077
1486
  for (size_t i = 0; i < field_count; i++) {
1078
- if (upb_fielddef_issubmsg(&m->fields[i])) {
1079
- submsg_count++;
1487
+ const upb_FieldDef* f = &m->fields[i];
1488
+ if (upb_FieldDef_IsSubMessage(f)) {
1489
+ sublayout_count++;
1490
+ }
1491
+ if (upb_FieldDef_CType(f) == kUpb_CType_Enum &&
1492
+ f->sub.enumdef->file->syntax == kUpb_Syntax_Proto2) {
1493
+ sublayout_count++;
1080
1494
  }
1081
1495
  }
1082
1496
 
1083
1497
  fields = symtab_alloc(ctx, field_count * sizeof(*fields));
1084
- submsgs = symtab_alloc(ctx, submsg_count * sizeof(*submsgs));
1498
+ subs = symtab_alloc(ctx, sublayout_count * sizeof(*subs));
1085
1499
 
1086
- l->field_count = upb_msgdef_numfields(m);
1500
+ l->field_count = upb_MessageDef_numfields(m);
1087
1501
  l->fields = fields;
1088
- l->submsgs = submsgs;
1502
+ l->subs = subs;
1089
1503
  l->table_mask = 0;
1504
+ l->required_count = 0;
1505
+
1506
+ if (upb_MessageDef_ExtensionRangeCount(m) > 0) {
1507
+ if (google_protobuf_MessageOptions_message_set_wire_format(m->opts)) {
1508
+ l->ext = kUpb_ExtMode_IsMessageSet;
1509
+ } else {
1510
+ l->ext = kUpb_ExtMode_Extendable;
1511
+ }
1512
+ } else {
1513
+ l->ext = kUpb_ExtMode_NonExtendable;
1514
+ }
1090
1515
 
1091
1516
  /* TODO(haberman): initialize fast tables so that reflection-based parsing
1092
1517
  * can get the same speeds as linked-in types. */
1093
1518
  l->fasttable[0].field_parser = &fastdecode_generic;
1094
1519
  l->fasttable[0].field_data = 0;
1095
1520
 
1096
- if (upb_msgdef_mapentry(m)) {
1521
+ if (upb_MessageDef_IsMapEntry(m)) {
1097
1522
  /* TODO(haberman): refactor this method so this special case is more
1098
1523
  * elegant. */
1099
- const upb_fielddef *key = upb_msgdef_itof(m, 1);
1100
- const upb_fielddef *val = upb_msgdef_itof(m, 2);
1524
+ const upb_FieldDef* key = upb_MessageDef_FindFieldByNumber(m, 1);
1525
+ const upb_FieldDef* val = upb_MessageDef_FindFieldByNumber(m, 2);
1101
1526
  fields[0].number = 1;
1102
1527
  fields[1].number = 2;
1103
- fields[0].mode = _UPB_MODE_SCALAR;
1104
- fields[1].mode = _UPB_MODE_SCALAR;
1528
+ fields[0].mode = kUpb_FieldMode_Scalar;
1529
+ fields[1].mode = kUpb_FieldMode_Scalar;
1105
1530
  fields[0].presence = 0;
1106
1531
  fields[1].presence = 0;
1107
- fields[0].descriptortype = upb_fielddef_descriptortype(key);
1108
- fields[1].descriptortype = upb_fielddef_descriptortype(val);
1532
+ fields[0].descriptortype = map_descriptortype(key);
1533
+ fields[1].descriptortype = map_descriptortype(val);
1109
1534
  fields[0].offset = 0;
1110
- fields[1].offset = sizeof(upb_strview);
1535
+ fields[1].offset = sizeof(upb_StringView);
1111
1536
  fields[1].submsg_index = 0;
1112
1537
 
1113
- if (upb_fielddef_type(val) == UPB_TYPE_MESSAGE) {
1114
- submsgs[0] = upb_fielddef_msgsubdef(val)->layout;
1538
+ if (upb_FieldDef_CType(val) == kUpb_CType_Message) {
1539
+ subs[0].submsg = upb_FieldDef_MessageSubDef(val)->layout;
1115
1540
  }
1116
1541
 
1542
+ upb_FieldDef* fielddefs = (upb_FieldDef*)&m->fields[0];
1543
+ UPB_ASSERT(fielddefs[0].number_ == 1);
1544
+ UPB_ASSERT(fielddefs[1].number_ == 2);
1545
+ fielddefs[0].layout_index = 0;
1546
+ fielddefs[1].layout_index = 1;
1547
+
1117
1548
  l->field_count = 2;
1118
- l->size = 2 * sizeof(upb_strview);
1549
+ l->size = 2 * sizeof(upb_StringView);
1119
1550
  l->size = UPB_ALIGN_UP(l->size, 8);
1551
+ l->dense_below = 2;
1120
1552
  return;
1121
1553
  }
1122
1554
 
@@ -1129,23 +1561,44 @@ static void make_layout(symtab_addctx *ctx, const upb_msgdef *m) {
1129
1561
  * OPT: There is a lot of room for optimization here to minimize the size.
1130
1562
  */
1131
1563
 
1564
+ /* Assign hasbits for required fields first. */
1565
+ size_t hasbit = 0;
1566
+
1567
+ for (int i = 0; i < m->field_count; i++) {
1568
+ const upb_FieldDef* f = &m->fields[i];
1569
+ upb_MiniTable_Field* field = &fields[upb_FieldDef_Index(f)];
1570
+ if (upb_FieldDef_Label(f) == kUpb_Label_Required) {
1571
+ field->presence = ++hasbit;
1572
+ if (hasbit >= 63) {
1573
+ symtab_errf(ctx, "Message with >=63 required fields: %s",
1574
+ upb_MessageDef_FullName(m));
1575
+ }
1576
+ l->required_count++;
1577
+ }
1578
+ }
1579
+
1132
1580
  /* Allocate hasbits and set basic field attributes. */
1133
- submsg_count = 0;
1134
- for (upb_msg_field_begin(&it, m), hasbit = 0;
1135
- !upb_msg_field_done(&it);
1136
- upb_msg_field_next(&it)) {
1137
- upb_fielddef* f = upb_msg_iter_field(&it);
1138
- upb_msglayout_field *field = &fields[upb_fielddef_index(f)];
1581
+ sublayout_count = 0;
1582
+ for (int i = 0; i < m->field_count; i++) {
1583
+ const upb_FieldDef* f = &m->fields[i];
1584
+ upb_MiniTable_Field* field = &fields[upb_FieldDef_Index(f)];
1139
1585
 
1140
1586
  fill_fieldlayout(field, f);
1141
1587
 
1142
- if (upb_fielddef_issubmsg(f)) {
1143
- const upb_msgdef *subm = upb_fielddef_msgsubdef(f);
1144
- field->submsg_index = submsg_count++;
1145
- submsgs[field->submsg_index] = subm->layout;
1588
+ if (field->descriptortype == kUpb_FieldType_Message ||
1589
+ field->descriptortype == kUpb_FieldType_Group) {
1590
+ field->submsg_index = sublayout_count++;
1591
+ subs[field->submsg_index].submsg = upb_FieldDef_MessageSubDef(f)->layout;
1592
+ } else if (field->descriptortype == kUpb_FieldType_Enum) {
1593
+ field->submsg_index = sublayout_count++;
1594
+ subs[field->submsg_index].subenum = upb_FieldDef_EnumSubDef(f)->layout;
1595
+ UPB_ASSERT(subs[field->submsg_index].subenum);
1146
1596
  }
1147
1597
 
1148
- if (upb_fielddef_haspresence(f) && !upb_fielddef_realcontainingoneof(f)) {
1598
+ if (upb_FieldDef_Label(f) == kUpb_Label_Required) {
1599
+ /* Hasbit was already assigned. */
1600
+ } else if (upb_FieldDef_HasPresence(f) &&
1601
+ !upb_FieldDef_RealContainingOneof(f)) {
1149
1602
  /* We don't use hasbit 0, so that 0 can indicate "no presence" in the
1150
1603
  * table. This wastes one hasbit, but we don't worry about it for now. */
1151
1604
  field->presence = ++hasbit;
@@ -1155,55 +1608,51 @@ static void make_layout(symtab_addctx *ctx, const upb_msgdef *m) {
1155
1608
  }
1156
1609
 
1157
1610
  /* Account for space used by hasbits. */
1158
- l->size = div_round_up(hasbit, 8);
1611
+ l->size = hasbit ? div_round_up(hasbit + 1, 8) : 0;
1159
1612
 
1160
1613
  /* Allocate non-oneof fields. */
1161
- for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);
1162
- upb_msg_field_next(&it)) {
1163
- const upb_fielddef* f = upb_msg_iter_field(&it);
1614
+ for (int i = 0; i < m->field_count; i++) {
1615
+ const upb_FieldDef* f = &m->fields[i];
1164
1616
  size_t field_size = upb_msg_fielddefsize(f);
1165
- size_t index = upb_fielddef_index(f);
1617
+ size_t index = upb_FieldDef_Index(f);
1166
1618
 
1167
- if (upb_fielddef_realcontainingoneof(f)) {
1619
+ if (upb_FieldDef_RealContainingOneof(f)) {
1168
1620
  /* Oneofs are handled separately below. */
1169
1621
  continue;
1170
1622
  }
1171
1623
 
1172
- fields[index].offset = upb_msglayout_place(l, field_size);
1624
+ fields[index].offset = upb_MiniTable_place(ctx, l, field_size, m);
1173
1625
  }
1174
1626
 
1175
1627
  /* Allocate oneof fields. Each oneof field consists of a uint32 for the case
1176
1628
  * and space for the actual data. */
1177
- for (upb_msg_oneof_begin(&oit, m); !upb_msg_oneof_done(&oit);
1178
- upb_msg_oneof_next(&oit)) {
1179
- const upb_oneofdef* o = upb_msg_iter_oneof(&oit);
1180
- upb_oneof_iter fit;
1181
-
1182
- size_t case_size = sizeof(uint32_t); /* Could potentially optimize this. */
1629
+ for (int i = 0; i < m->oneof_count; i++) {
1630
+ const upb_OneofDef* o = &m->oneofs[i];
1631
+ size_t case_size = sizeof(uint32_t); /* Could potentially optimize this. */
1183
1632
  size_t field_size = 0;
1184
1633
  uint32_t case_offset;
1185
1634
  uint32_t data_offset;
1186
1635
 
1187
- if (upb_oneofdef_issynthetic(o)) continue;
1636
+ if (upb_OneofDef_IsSynthetic(o)) continue;
1637
+
1638
+ if (o->field_count == 0) {
1639
+ symtab_errf(ctx, "Oneof must have at least one field (%s)", o->full_name);
1640
+ }
1188
1641
 
1189
1642
  /* Calculate field size: the max of all field sizes. */
1190
- for (upb_oneof_begin(&fit, o);
1191
- !upb_oneof_done(&fit);
1192
- upb_oneof_next(&fit)) {
1193
- const upb_fielddef* f = upb_oneof_iter_field(&fit);
1643
+ for (int j = 0; j < o->field_count; j++) {
1644
+ const upb_FieldDef* f = o->fields[j];
1194
1645
  field_size = UPB_MAX(field_size, upb_msg_fielddefsize(f));
1195
1646
  }
1196
1647
 
1197
1648
  /* Align and allocate case offset. */
1198
- case_offset = upb_msglayout_place(l, case_size);
1199
- data_offset = upb_msglayout_place(l, field_size);
1649
+ case_offset = upb_MiniTable_place(ctx, l, case_size, m);
1650
+ data_offset = upb_MiniTable_place(ctx, l, field_size, m);
1200
1651
 
1201
- for (upb_oneof_begin(&fit, o);
1202
- !upb_oneof_done(&fit);
1203
- upb_oneof_next(&fit)) {
1204
- const upb_fielddef* f = upb_oneof_iter_field(&fit);
1205
- fields[upb_fielddef_index(f)].offset = data_offset;
1206
- fields[upb_fielddef_index(f)].presence = ~case_offset;
1652
+ for (int i = 0; i < o->field_count; i++) {
1653
+ const upb_FieldDef* f = o->fields[i];
1654
+ fields[upb_FieldDef_Index(f)].offset = data_offset;
1655
+ fields[upb_FieldDef_Index(f)].presence = ~case_offset;
1207
1656
  }
1208
1657
  }
1209
1658
 
@@ -1212,28 +1661,33 @@ static void make_layout(symtab_addctx *ctx, const upb_msgdef *m) {
1212
1661
  l->size = UPB_ALIGN_UP(l->size, 8);
1213
1662
 
1214
1663
  /* Sort fields by number. */
1215
- qsort(fields, upb_msgdef_numfields(m), sizeof(*fields), field_number_cmp);
1664
+ if (fields) {
1665
+ qsort(fields, upb_MessageDef_numfields(m), sizeof(*fields),
1666
+ field_number_cmp);
1667
+ }
1216
1668
  assign_layout_indices(m, l, fields);
1217
1669
  }
1218
1670
 
1219
- static char *strviewdup(symtab_addctx *ctx, upb_strview view) {
1220
- return upb_strdup2(view.data, view.size, ctx->arena);
1671
+ static char* strviewdup(symtab_addctx* ctx, upb_StringView view) {
1672
+ char* ret = upb_strdup2(view.data, view.size, ctx->arena);
1673
+ CHK_OOM(ret);
1674
+ return ret;
1221
1675
  }
1222
1676
 
1223
- static bool streql2(const char *a, size_t n, const char *b) {
1677
+ static bool streql2(const char* a, size_t n, const char* b) {
1224
1678
  return n == strlen(b) && memcmp(a, b, n) == 0;
1225
1679
  }
1226
1680
 
1227
- static bool streql_view(upb_strview view, const char *b) {
1681
+ static bool streql_view(upb_StringView view, const char* b) {
1228
1682
  return streql2(view.data, view.size, b);
1229
1683
  }
1230
1684
 
1231
- static const char *makefullname(symtab_addctx *ctx, const char *prefix,
1232
- upb_strview name) {
1685
+ static const char* makefullname(symtab_addctx* ctx, const char* prefix,
1686
+ upb_StringView name) {
1233
1687
  if (prefix) {
1234
1688
  /* ret = prefix + '.' + name; */
1235
1689
  size_t n = strlen(prefix);
1236
- char *ret = symtab_alloc(ctx, n + name.size + 2);
1690
+ char* ret = symtab_alloc(ctx, n + name.size + 2);
1237
1691
  strcpy(ret, prefix);
1238
1692
  ret[n] = '.';
1239
1693
  memcpy(&ret[n + 1], name.data, name.size);
@@ -1244,33 +1698,33 @@ static const char *makefullname(symtab_addctx *ctx, const char *prefix,
1244
1698
  }
1245
1699
  }
1246
1700
 
1247
- static void finalize_oneofs(symtab_addctx *ctx, upb_msgdef *m) {
1701
+ static void finalize_oneofs(symtab_addctx* ctx, upb_MessageDef* m) {
1248
1702
  int i;
1249
1703
  int synthetic_count = 0;
1250
- upb_oneofdef *mutable_oneofs = (upb_oneofdef*)m->oneofs;
1704
+ upb_OneofDef* mutable_oneofs = (upb_OneofDef*)m->oneofs;
1251
1705
 
1252
1706
  for (i = 0; i < m->oneof_count; i++) {
1253
- upb_oneofdef *o = &mutable_oneofs[i];
1707
+ upb_OneofDef* o = &mutable_oneofs[i];
1254
1708
 
1255
1709
  if (o->synthetic && o->field_count != 1) {
1256
1710
  symtab_errf(ctx, "Synthetic oneofs must have one field, not %d: %s",
1257
- o->field_count, upb_oneofdef_name(o));
1711
+ o->field_count, upb_OneofDef_Name(o));
1258
1712
  }
1259
1713
 
1260
1714
  if (o->synthetic) {
1261
1715
  synthetic_count++;
1262
1716
  } else if (synthetic_count != 0) {
1263
1717
  symtab_errf(ctx, "Synthetic oneofs must be after all other oneofs: %s",
1264
- upb_oneofdef_name(o));
1718
+ upb_OneofDef_Name(o));
1265
1719
  }
1266
1720
 
1267
- o->fields = symtab_alloc(ctx, sizeof(upb_fielddef *) * o->field_count);
1721
+ o->fields = symtab_alloc(ctx, sizeof(upb_FieldDef*) * o->field_count);
1268
1722
  o->field_count = 0;
1269
1723
  }
1270
1724
 
1271
1725
  for (i = 0; i < m->field_count; i++) {
1272
- const upb_fielddef *f = &m->fields[i];
1273
- upb_oneofdef *o = (upb_oneofdef*)f->oneof;
1726
+ const upb_FieldDef* f = &m->fields[i];
1727
+ upb_OneofDef* o = (upb_OneofDef*)upb_FieldDef_ContainingOneof(f);
1274
1728
  if (o) {
1275
1729
  o->fields[o->field_count++] = f;
1276
1730
  }
@@ -1279,14 +1733,16 @@ static void finalize_oneofs(symtab_addctx *ctx, upb_msgdef *m) {
1279
1733
  m->real_oneof_count = m->oneof_count - synthetic_count;
1280
1734
  }
1281
1735
 
1282
- size_t getjsonname(const char *name, char *buf, size_t len) {
1736
+ size_t getjsonname(const char* name, char* buf, size_t len) {
1283
1737
  size_t src, dst = 0;
1284
1738
  bool ucase_next = false;
1285
1739
 
1286
- #define WRITE(byte) \
1287
- ++dst; \
1288
- if (dst < len) buf[dst - 1] = byte; \
1289
- else if (dst == len) buf[dst - 1] = '\0'
1740
+ #define WRITE(byte) \
1741
+ ++dst; \
1742
+ if (dst < len) \
1743
+ buf[dst - 1] = byte; \
1744
+ else if (dst == len) \
1745
+ buf[dst - 1] = '\0'
1290
1746
 
1291
1747
  if (!name) {
1292
1748
  WRITE('\0');
@@ -1317,14 +1773,19 @@ size_t getjsonname(const char *name, char *buf, size_t len) {
1317
1773
  #undef WRITE
1318
1774
  }
1319
1775
 
1320
- static char* makejsonname(symtab_addctx *ctx, const char* name) {
1776
+ static char* makejsonname(symtab_addctx* ctx, const char* name) {
1321
1777
  size_t size = getjsonname(name, NULL, 0);
1322
1778
  char* json_name = symtab_alloc(ctx, size);
1323
1779
  getjsonname(name, json_name, size);
1324
1780
  return json_name;
1325
1781
  }
1326
1782
 
1327
- static void symtab_add(symtab_addctx *ctx, const char *name, upb_value v) {
1783
+ /* Adds a symbol |v| to the symtab, which must be a def pointer previously
1784
+ * packed with pack_def(). The def's pointer to upb_FileDef* must be set before
1785
+ * adding, so we know which entries to remove if building this file fails. */
1786
+ static void symtab_add(symtab_addctx* ctx, const char* name, upb_value v) {
1787
+ // TODO: table should support an operation "tryinsert" to avoid the double
1788
+ // lookup.
1328
1789
  if (upb_strtable_lookup(&ctx->symtab->syms, name, NULL)) {
1329
1790
  symtab_errf(ctx, "duplicate symbol '%s'", name);
1330
1791
  }
@@ -1333,83 +1794,269 @@ static void symtab_add(symtab_addctx *ctx, const char *name, upb_value v) {
1333
1794
  ctx->symtab->arena));
1334
1795
  }
1335
1796
 
1797
+ static bool remove_component(char* base, size_t* len) {
1798
+ if (*len == 0) return false;
1799
+
1800
+ for (size_t i = *len - 1; i > 0; i--) {
1801
+ if (base[i] == '.') {
1802
+ *len = i;
1803
+ return true;
1804
+ }
1805
+ }
1806
+
1807
+ *len = 0;
1808
+ return true;
1809
+ }
1810
+
1336
1811
  /* Given a symbol and the base symbol inside which it is defined, find the
1337
1812
  * symbol's definition in t. */
1338
- static const void *symtab_resolve(symtab_addctx *ctx, const upb_fielddef *f,
1339
- const char *base, upb_strview sym,
1340
- upb_deftype_t type) {
1341
- const upb_strtable *t = &ctx->symtab->syms;
1342
- if(sym.size == 0) goto notfound;
1343
- if(sym.data[0] == '.') {
1813
+ static const void* symtab_resolveany(symtab_addctx* ctx,
1814
+ const char* from_name_dbg,
1815
+ const char* base, upb_StringView sym,
1816
+ upb_deftype_t* type) {
1817
+ const upb_strtable* t = &ctx->symtab->syms;
1818
+ if (sym.size == 0) goto notfound;
1819
+ upb_value v;
1820
+ if (sym.data[0] == '.') {
1344
1821
  /* Symbols starting with '.' are absolute, so we do a single lookup.
1345
1822
  * Slice to omit the leading '.' */
1346
- upb_value v;
1347
1823
  if (!upb_strtable_lookup2(t, sym.data + 1, sym.size - 1, &v)) {
1348
1824
  goto notfound;
1349
1825
  }
1350
-
1351
- const void *ret = unpack_def(v, type);
1352
- if (!ret) {
1353
- symtab_errf(ctx, "type mismatch when resolving field %s, name %s",
1354
- f->full_name, sym.data);
1355
- }
1356
- return ret;
1357
1826
  } else {
1358
- /* Remove components from base until we find an entry or run out.
1359
- * TODO: This branch is totally broken, but currently not used. */
1360
- (void)base;
1361
- UPB_ASSERT(false);
1362
- goto notfound;
1827
+ /* Remove components from base until we find an entry or run out. */
1828
+ size_t baselen = base ? strlen(base) : 0;
1829
+ char* tmp = malloc(sym.size + baselen + 1);
1830
+ while (1) {
1831
+ char* p = tmp;
1832
+ if (baselen) {
1833
+ memcpy(p, base, baselen);
1834
+ p[baselen] = '.';
1835
+ p += baselen + 1;
1836
+ }
1837
+ memcpy(p, sym.data, sym.size);
1838
+ p += sym.size;
1839
+ if (upb_strtable_lookup2(t, tmp, p - tmp, &v)) {
1840
+ break;
1841
+ }
1842
+ if (!remove_component(tmp, &baselen)) {
1843
+ free(tmp);
1844
+ goto notfound;
1845
+ }
1846
+ }
1847
+ free(tmp);
1363
1848
  }
1364
1849
 
1850
+ *type = deftype(v);
1851
+ return unpack_def(v, *type);
1852
+
1365
1853
  notfound:
1366
- symtab_errf(ctx, "couldn't resolve name '" UPB_STRVIEW_FORMAT "'",
1367
- UPB_STRVIEW_ARGS(sym));
1854
+ symtab_errf(ctx, "couldn't resolve name '" UPB_STRINGVIEW_FORMAT "'",
1855
+ UPB_STRINGVIEW_ARGS(sym));
1856
+ }
1857
+
1858
+ static const void* symtab_resolve(symtab_addctx* ctx, const char* from_name_dbg,
1859
+ const char* base, upb_StringView sym,
1860
+ upb_deftype_t type) {
1861
+ upb_deftype_t found_type;
1862
+ const void* ret =
1863
+ symtab_resolveany(ctx, from_name_dbg, base, sym, &found_type);
1864
+ if (ret && found_type != type) {
1865
+ symtab_errf(ctx,
1866
+ "type mismatch when resolving %s: couldn't find "
1867
+ "name " UPB_STRINGVIEW_FORMAT " with type=%d",
1868
+ from_name_dbg, UPB_STRINGVIEW_ARGS(sym), (int)type);
1869
+ }
1870
+ return ret;
1368
1871
  }
1369
1872
 
1370
1873
  static void create_oneofdef(
1371
- symtab_addctx *ctx, upb_msgdef *m,
1372
- const google_protobuf_OneofDescriptorProto *oneof_proto) {
1373
- upb_oneofdef *o;
1374
- upb_strview name = google_protobuf_OneofDescriptorProto_name(oneof_proto);
1874
+ symtab_addctx* ctx, upb_MessageDef* m,
1875
+ const google_protobuf_OneofDescriptorProto* oneof_proto,
1876
+ const upb_OneofDef* _o) {
1877
+ upb_OneofDef* o = (upb_OneofDef*)_o;
1878
+ upb_StringView name = google_protobuf_OneofDescriptorProto_name(oneof_proto);
1375
1879
  upb_value v;
1376
1880
 
1377
- o = (upb_oneofdef*)&m->oneofs[m->oneof_count++];
1378
1881
  o->parent = m;
1379
1882
  o->full_name = makefullname(ctx, m->full_name, name);
1380
1883
  o->field_count = 0;
1381
1884
  o->synthetic = false;
1382
1885
 
1886
+ SET_OPTIONS(o->opts, OneofDescriptorProto, OneofOptions, oneof_proto);
1887
+
1888
+ upb_value existing_v;
1889
+ if (upb_strtable_lookup2(&m->ntof, name.data, name.size, &existing_v)) {
1890
+ symtab_errf(ctx, "duplicate oneof name (%s)", o->full_name);
1891
+ }
1892
+
1383
1893
  v = pack_def(o, UPB_DEFTYPE_ONEOF);
1384
- symtab_add(ctx, o->full_name, v);
1385
1894
  CHK_OOM(upb_strtable_insert(&m->ntof, name.data, name.size, v, ctx->arena));
1386
1895
 
1387
1896
  CHK_OOM(upb_inttable_init(&o->itof, ctx->arena));
1388
1897
  CHK_OOM(upb_strtable_init(&o->ntof, 4, ctx->arena));
1389
1898
  }
1390
1899
 
1391
- static str_t *newstr(symtab_addctx *ctx, const char *data, size_t len) {
1392
- str_t *ret = symtab_alloc(ctx, sizeof(*ret) + len);
1393
- if (!ret) return NULL;
1900
+ static str_t* newstr(symtab_addctx* ctx, const char* data, size_t len) {
1901
+ str_t* ret = symtab_alloc(ctx, sizeof(*ret) + len);
1902
+ CHK_OOM(ret);
1394
1903
  ret->len = len;
1395
1904
  if (len) memcpy(ret->str, data, len);
1396
1905
  ret->str[len] = '\0';
1397
1906
  return ret;
1398
1907
  }
1399
1908
 
1400
- static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1401
- upb_fielddef *f) {
1402
- char *end;
1909
+ static bool upb_DefPool_TryGetChar(const char** src, const char* end,
1910
+ char* ch) {
1911
+ if (*src == end) return false;
1912
+ *ch = **src;
1913
+ *src += 1;
1914
+ return true;
1915
+ }
1916
+
1917
+ static char upb_DefPool_TryGetHexDigit(symtab_addctx* ctx,
1918
+ const upb_FieldDef* f, const char** src,
1919
+ const char* end) {
1920
+ char ch;
1921
+ if (!upb_DefPool_TryGetChar(src, end, &ch)) return -1;
1922
+ if ('0' <= ch && ch <= '9') {
1923
+ return ch - '0';
1924
+ }
1925
+ ch = upb_ascii_lower(ch);
1926
+ if ('a' <= ch && ch <= 'f') {
1927
+ return ch - 'a' + 0xa;
1928
+ }
1929
+ *src -= 1; // Char wasn't actually a hex digit.
1930
+ return -1;
1931
+ }
1932
+
1933
+ static char upb_DefPool_ParseHexEscape(symtab_addctx* ctx,
1934
+ const upb_FieldDef* f, const char** src,
1935
+ const char* end) {
1936
+ char hex_digit = upb_DefPool_TryGetHexDigit(ctx, f, src, end);
1937
+ if (hex_digit < 0) {
1938
+ symtab_errf(ctx,
1939
+ "\\x cannot be followed by non-hex digit in field '%s' default",
1940
+ upb_FieldDef_FullName(f));
1941
+ return 0;
1942
+ }
1943
+ unsigned int ret = hex_digit;
1944
+ while ((hex_digit = upb_DefPool_TryGetHexDigit(ctx, f, src, end)) >= 0) {
1945
+ ret = (ret << 4) | hex_digit;
1946
+ }
1947
+ if (ret > 0xff) {
1948
+ symtab_errf(ctx, "Value of hex escape in field %s exceeds 8 bits",
1949
+ upb_FieldDef_FullName(f));
1950
+ return 0;
1951
+ }
1952
+ return ret;
1953
+ }
1954
+
1955
+ char upb_DefPool_TryGetOctalDigit(const char** src, const char* end) {
1956
+ char ch;
1957
+ if (!upb_DefPool_TryGetChar(src, end, &ch)) return -1;
1958
+ if ('0' <= ch && ch <= '7') {
1959
+ return ch - '0';
1960
+ }
1961
+ *src -= 1; // Char wasn't actually an octal digit.
1962
+ return -1;
1963
+ }
1964
+
1965
+ static char upb_DefPool_ParseOctalEscape(symtab_addctx* ctx,
1966
+ const upb_FieldDef* f,
1967
+ const char** src, const char* end) {
1968
+ char ch = 0;
1969
+ for (int i = 0; i < 3; i++) {
1970
+ char digit;
1971
+ if ((digit = upb_DefPool_TryGetOctalDigit(src, end)) >= 0) {
1972
+ ch = (ch << 3) | digit;
1973
+ }
1974
+ }
1975
+ return ch;
1976
+ }
1977
+
1978
+ static char upb_DefPool_ParseEscape(symtab_addctx* ctx, const upb_FieldDef* f,
1979
+ const char** src, const char* end) {
1980
+ char ch;
1981
+ if (!upb_DefPool_TryGetChar(src, end, &ch)) {
1982
+ symtab_errf(ctx, "unterminated escape sequence in field %s",
1983
+ upb_FieldDef_FullName(f));
1984
+ return 0;
1985
+ }
1986
+ switch (ch) {
1987
+ case 'a':
1988
+ return '\a';
1989
+ case 'b':
1990
+ return '\b';
1991
+ case 'f':
1992
+ return '\f';
1993
+ case 'n':
1994
+ return '\n';
1995
+ case 'r':
1996
+ return '\r';
1997
+ case 't':
1998
+ return '\t';
1999
+ case 'v':
2000
+ return '\v';
2001
+ case '\\':
2002
+ return '\\';
2003
+ case '\'':
2004
+ return '\'';
2005
+ case '\"':
2006
+ return '\"';
2007
+ case '?':
2008
+ return '\?';
2009
+ case 'x':
2010
+ case 'X':
2011
+ return upb_DefPool_ParseHexEscape(ctx, f, src, end);
2012
+ case '0':
2013
+ case '1':
2014
+ case '2':
2015
+ case '3':
2016
+ case '4':
2017
+ case '5':
2018
+ case '6':
2019
+ case '7':
2020
+ *src -= 1;
2021
+ return upb_DefPool_ParseOctalEscape(ctx, f, src, end);
2022
+ }
2023
+ symtab_errf(ctx, "Unknown escape sequence: \\%c", ch);
2024
+ }
2025
+
2026
+ static str_t* unescape(symtab_addctx* ctx, const upb_FieldDef* f,
2027
+ const char* data, size_t len) {
2028
+ // Size here is an upper bound; escape sequences could ultimately shrink it.
2029
+ str_t* ret = symtab_alloc(ctx, sizeof(*ret) + len);
2030
+ char* dst = &ret->str[0];
2031
+ const char* src = data;
2032
+ const char* end = data + len;
2033
+
2034
+ while (src < end) {
2035
+ if (*src == '\\') {
2036
+ src++;
2037
+ *dst++ = upb_DefPool_ParseEscape(ctx, f, &src, end);
2038
+ } else {
2039
+ *dst++ = *src++;
2040
+ }
2041
+ }
2042
+
2043
+ ret->len = dst - &ret->str[0];
2044
+ return ret;
2045
+ }
2046
+
2047
+ static void parse_default(symtab_addctx* ctx, const char* str, size_t len,
2048
+ upb_FieldDef* f) {
2049
+ char* end;
1403
2050
  char nullz[64];
1404
2051
  errno = 0;
1405
2052
 
1406
- switch (upb_fielddef_type(f)) {
1407
- case UPB_TYPE_INT32:
1408
- case UPB_TYPE_INT64:
1409
- case UPB_TYPE_UINT32:
1410
- case UPB_TYPE_UINT64:
1411
- case UPB_TYPE_DOUBLE:
1412
- case UPB_TYPE_FLOAT:
2053
+ switch (upb_FieldDef_CType(f)) {
2054
+ case kUpb_CType_Int32:
2055
+ case kUpb_CType_Int64:
2056
+ case kUpb_CType_UInt32:
2057
+ case kUpb_CType_UInt64:
2058
+ case kUpb_CType_Double:
2059
+ case kUpb_CType_Float:
1413
2060
  /* Standard C number parsing functions expect null-terminated strings. */
1414
2061
  if (len >= sizeof(nullz) - 1) {
1415
2062
  symtab_errf(ctx, "Default too long: %.*s", (int)len, str);
@@ -1422,8 +2069,8 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1422
2069
  break;
1423
2070
  }
1424
2071
 
1425
- switch (upb_fielddef_type(f)) {
1426
- case UPB_TYPE_INT32: {
2072
+ switch (upb_FieldDef_CType(f)) {
2073
+ case kUpb_CType_Int32: {
1427
2074
  long val = strtol(str, &end, 0);
1428
2075
  if (val > INT32_MAX || val < INT32_MIN || errno == ERANGE || *end) {
1429
2076
  goto invalid;
@@ -1431,16 +2078,17 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1431
2078
  f->defaultval.sint = val;
1432
2079
  break;
1433
2080
  }
1434
- case UPB_TYPE_ENUM: {
1435
- const upb_enumdef *e = f->sub.enumdef;
1436
- int32_t val;
1437
- if (!upb_enumdef_ntoi(e, str, len, &val)) {
2081
+ case kUpb_CType_Enum: {
2082
+ const upb_EnumDef* e = f->sub.enumdef;
2083
+ const upb_EnumValueDef* ev =
2084
+ upb_EnumDef_FindValueByNameWithSize(e, str, len);
2085
+ if (!ev) {
1438
2086
  goto invalid;
1439
2087
  }
1440
- f->defaultval.sint = val;
2088
+ f->defaultval.sint = ev->number;
1441
2089
  break;
1442
2090
  }
1443
- case UPB_TYPE_INT64: {
2091
+ case kUpb_CType_Int64: {
1444
2092
  long long val = strtoll(str, &end, 0);
1445
2093
  if (val > INT64_MAX || val < INT64_MIN || errno == ERANGE || *end) {
1446
2094
  goto invalid;
@@ -1448,7 +2096,7 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1448
2096
  f->defaultval.sint = val;
1449
2097
  break;
1450
2098
  }
1451
- case UPB_TYPE_UINT32: {
2099
+ case kUpb_CType_UInt32: {
1452
2100
  unsigned long val = strtoul(str, &end, 0);
1453
2101
  if (val > UINT32_MAX || errno == ERANGE || *end) {
1454
2102
  goto invalid;
@@ -1456,7 +2104,7 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1456
2104
  f->defaultval.uint = val;
1457
2105
  break;
1458
2106
  }
1459
- case UPB_TYPE_UINT64: {
2107
+ case kUpb_CType_UInt64: {
1460
2108
  unsigned long long val = strtoull(str, &end, 0);
1461
2109
  if (val > UINT64_MAX || errno == ERANGE || *end) {
1462
2110
  goto invalid;
@@ -1464,7 +2112,7 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1464
2112
  f->defaultval.uint = val;
1465
2113
  break;
1466
2114
  }
1467
- case UPB_TYPE_DOUBLE: {
2115
+ case kUpb_CType_Double: {
1468
2116
  double val = strtod(str, &end);
1469
2117
  if (errno == ERANGE || *end) {
1470
2118
  goto invalid;
@@ -1472,7 +2120,7 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1472
2120
  f->defaultval.dbl = val;
1473
2121
  break;
1474
2122
  }
1475
- case UPB_TYPE_FLOAT: {
2123
+ case kUpb_CType_Float: {
1476
2124
  float val = strtof(str, &end);
1477
2125
  if (errno == ERANGE || *end) {
1478
2126
  goto invalid;
@@ -1480,75 +2128,78 @@ static void parse_default(symtab_addctx *ctx, const char *str, size_t len,
1480
2128
  f->defaultval.flt = val;
1481
2129
  break;
1482
2130
  }
1483
- case UPB_TYPE_BOOL: {
2131
+ case kUpb_CType_Bool: {
1484
2132
  if (streql2(str, len, "false")) {
1485
2133
  f->defaultval.boolean = false;
1486
2134
  } else if (streql2(str, len, "true")) {
1487
2135
  f->defaultval.boolean = true;
1488
2136
  } else {
2137
+ goto invalid;
1489
2138
  }
1490
2139
  break;
1491
2140
  }
1492
- case UPB_TYPE_STRING:
2141
+ case kUpb_CType_String:
1493
2142
  f->defaultval.str = newstr(ctx, str, len);
1494
2143
  break;
1495
- case UPB_TYPE_BYTES:
1496
- /* XXX: need to interpret the C-escaped value. */
1497
- f->defaultval.str = newstr(ctx, str, len);
2144
+ case kUpb_CType_Bytes:
2145
+ f->defaultval.str = unescape(ctx, f, str, len);
1498
2146
  break;
1499
- case UPB_TYPE_MESSAGE:
2147
+ case kUpb_CType_Message:
1500
2148
  /* Should not have a default value. */
1501
2149
  symtab_errf(ctx, "Message should not have a default (%s)",
1502
- upb_fielddef_fullname(f));
2150
+ upb_FieldDef_FullName(f));
1503
2151
  }
1504
2152
 
1505
2153
  return;
1506
2154
 
1507
2155
  invalid:
1508
- symtab_errf(ctx, "Invalid default '%.*s' for field %s", (int)len, str,
1509
- upb_fielddef_fullname(f));
2156
+ symtab_errf(ctx, "Invalid default '%.*s' for field %s of type %d", (int)len,
2157
+ str, upb_FieldDef_FullName(f), (int)upb_FieldDef_Type(f));
1510
2158
  }
1511
2159
 
1512
- static void set_default_default(symtab_addctx *ctx, upb_fielddef *f) {
1513
- switch (upb_fielddef_type(f)) {
1514
- case UPB_TYPE_INT32:
1515
- case UPB_TYPE_INT64:
1516
- case UPB_TYPE_ENUM:
2160
+ static void set_default_default(symtab_addctx* ctx, upb_FieldDef* f) {
2161
+ switch (upb_FieldDef_CType(f)) {
2162
+ case kUpb_CType_Int32:
2163
+ case kUpb_CType_Int64:
1517
2164
  f->defaultval.sint = 0;
1518
2165
  break;
1519
- case UPB_TYPE_UINT64:
1520
- case UPB_TYPE_UINT32:
2166
+ case kUpb_CType_UInt64:
2167
+ case kUpb_CType_UInt32:
1521
2168
  f->defaultval.uint = 0;
1522
2169
  break;
1523
- case UPB_TYPE_DOUBLE:
1524
- case UPB_TYPE_FLOAT:
2170
+ case kUpb_CType_Double:
2171
+ case kUpb_CType_Float:
1525
2172
  f->defaultval.dbl = 0;
1526
2173
  break;
1527
- case UPB_TYPE_STRING:
1528
- case UPB_TYPE_BYTES:
2174
+ case kUpb_CType_String:
2175
+ case kUpb_CType_Bytes:
1529
2176
  f->defaultval.str = newstr(ctx, NULL, 0);
1530
2177
  break;
1531
- case UPB_TYPE_BOOL:
2178
+ case kUpb_CType_Bool:
1532
2179
  f->defaultval.boolean = false;
1533
2180
  break;
1534
- case UPB_TYPE_MESSAGE:
2181
+ case kUpb_CType_Enum:
2182
+ f->defaultval.sint = f->sub.enumdef->values[0].number;
2183
+ case kUpb_CType_Message:
1535
2184
  break;
1536
2185
  }
1537
2186
  }
1538
2187
 
1539
2188
  static void create_fielddef(
1540
- symtab_addctx *ctx, const char *prefix, upb_msgdef *m,
1541
- const google_protobuf_FieldDescriptorProto *field_proto) {
1542
- upb_fielddef *f;
1543
- const google_protobuf_FieldOptions *options;
1544
- upb_strview name;
1545
- const char *full_name;
1546
- const char *json_name;
1547
- const char *shortname;
1548
- uint32_t field_number;
2189
+ symtab_addctx* ctx, const char* prefix, upb_MessageDef* m,
2190
+ const google_protobuf_FieldDescriptorProto* field_proto,
2191
+ const upb_FieldDef* _f, bool is_extension) {
2192
+ upb_FieldDef* f = (upb_FieldDef*)_f;
2193
+ upb_StringView name;
2194
+ const char* full_name;
2195
+ const char* json_name;
2196
+ const char* shortname;
2197
+ int32_t field_number;
2198
+
2199
+ f->file = ctx->file; /* Must happen prior to symtab_add(). */
1549
2200
 
1550
2201
  if (!google_protobuf_FieldDescriptorProto_has_name(field_proto)) {
1551
- symtab_errf(ctx, "field has no name (%s)", upb_msgdef_fullname(m));
2202
+ symtab_errf(ctx, "field has no name");
1552
2203
  }
1553
2204
 
1554
2205
  name = google_protobuf_FieldDescriptorProto_name(field_proto);
@@ -1559,57 +2210,94 @@ static void create_fielddef(
1559
2210
  if (google_protobuf_FieldDescriptorProto_has_json_name(field_proto)) {
1560
2211
  json_name = strviewdup(
1561
2212
  ctx, google_protobuf_FieldDescriptorProto_json_name(field_proto));
2213
+ f->has_json_name_ = true;
1562
2214
  } else {
1563
2215
  json_name = makejsonname(ctx, shortname);
2216
+ f->has_json_name_ = false;
1564
2217
  }
1565
2218
 
1566
2219
  field_number = google_protobuf_FieldDescriptorProto_number(field_proto);
1567
2220
 
1568
- if (field_number == 0 || field_number > UPB_MAX_FIELDNUMBER) {
1569
- symtab_errf(ctx, "invalid field number (%u)", field_number);
1570
- }
2221
+ f->full_name = full_name;
2222
+ f->json_name = json_name;
2223
+ f->label_ = (int)google_protobuf_FieldDescriptorProto_label(field_proto);
2224
+ f->number_ = field_number;
2225
+ f->scope.oneof = NULL;
2226
+ f->proto3_optional_ =
2227
+ google_protobuf_FieldDescriptorProto_proto3_optional(field_proto);
1571
2228
 
1572
- if (m) {
1573
- /* direct message field. */
1574
- upb_value v, field_v, json_v;
1575
- size_t json_size;
2229
+ bool has_type = google_protobuf_FieldDescriptorProto_has_type(field_proto);
2230
+ bool has_type_name =
2231
+ google_protobuf_FieldDescriptorProto_has_type_name(field_proto);
1576
2232
 
1577
- f = (upb_fielddef*)&m->fields[m->field_count];
1578
- f->index_ = m->field_count++;
1579
- f->msgdef = m;
1580
- f->is_extension_ = false;
2233
+ f->type_ = (int)google_protobuf_FieldDescriptorProto_type(field_proto);
1581
2234
 
1582
- if (upb_strtable_lookup(&m->ntof, shortname, NULL)) {
1583
- symtab_errf(ctx, "duplicate field name (%s)", shortname);
2235
+ if (has_type) {
2236
+ switch (f->type_) {
2237
+ case kUpb_FieldType_Message:
2238
+ case kUpb_FieldType_Group:
2239
+ case kUpb_FieldType_Enum:
2240
+ if (!has_type_name) {
2241
+ symtab_errf(ctx, "field of type %d requires type name (%s)",
2242
+ (int)f->type_, full_name);
2243
+ }
2244
+ break;
2245
+ default:
2246
+ if (has_type_name) {
2247
+ symtab_errf(ctx, "invalid type for field with type_name set (%s, %d)",
2248
+ full_name, (int)f->type_);
2249
+ }
1584
2250
  }
2251
+ } else if (has_type_name) {
2252
+ f->type_ =
2253
+ FIELD_TYPE_UNSPECIFIED; // We'll fill this in in resolve_fielddef().
2254
+ }
1585
2255
 
1586
- if (upb_strtable_lookup(&m->ntof, json_name, NULL)) {
1587
- symtab_errf(ctx, "duplicate json_name (%s)", json_name);
1588
- }
2256
+ if (!is_extension) {
2257
+ /* direct message field. */
2258
+ upb_value v, field_v, json_v, existing_v;
2259
+ size_t json_size;
1589
2260
 
1590
- if (upb_inttable_lookup(&m->itof, field_number, NULL)) {
1591
- symtab_errf(ctx, "duplicate field number (%u)", field_number);
2261
+ if (field_number <= 0 || field_number > kUpb_MaxFieldNumber) {
2262
+ symtab_errf(ctx, "invalid field number (%u)", field_number);
1592
2263
  }
1593
2264
 
2265
+ f->index_ = f - m->fields;
2266
+ f->msgdef = m;
2267
+ f->is_extension_ = false;
2268
+
1594
2269
  field_v = pack_def(f, UPB_DEFTYPE_FIELD);
1595
2270
  json_v = pack_def(f, UPB_DEFTYPE_FIELD_JSONNAME);
1596
2271
  v = upb_value_constptr(f);
1597
2272
  json_size = strlen(json_name);
1598
2273
 
2274
+ if (upb_strtable_lookup(&m->ntof, shortname, &existing_v)) {
2275
+ symtab_errf(ctx, "duplicate field name (%s)", shortname);
2276
+ }
2277
+
1599
2278
  CHK_OOM(upb_strtable_insert(&m->ntof, name.data, name.size, field_v,
1600
2279
  ctx->arena));
1601
- CHK_OOM(upb_inttable_insert(&m->itof, field_number, v, ctx->arena));
1602
2280
 
1603
2281
  if (strcmp(shortname, json_name) != 0) {
1604
- upb_strtable_insert(&m->ntof, json_name, json_size, json_v, ctx->arena);
2282
+ if (upb_strtable_lookup(&m->ntof, json_name, &v)) {
2283
+ symtab_errf(ctx, "duplicate json_name (%s)", json_name);
2284
+ } else {
2285
+ CHK_OOM(upb_strtable_insert(&m->ntof, json_name, json_size, json_v,
2286
+ ctx->arena));
2287
+ }
2288
+ }
2289
+
2290
+ if (upb_inttable_lookup(&m->itof, field_number, NULL)) {
2291
+ symtab_errf(ctx, "duplicate field number (%u)", field_number);
1605
2292
  }
1606
2293
 
1607
- if (ctx->layouts) {
1608
- const upb_msglayout_field *fields = m->layout->fields;
2294
+ CHK_OOM(upb_inttable_insert(&m->itof, field_number, v, ctx->arena));
2295
+
2296
+ if (ctx->layout) {
2297
+ const upb_MiniTable_Field* fields = m->layout->fields;
1609
2298
  int count = m->layout->field_count;
1610
2299
  bool found = false;
1611
- int i;
1612
- for (i = 0; i < count; i++) {
2300
+ for (int i = 0; i < count; i++) {
1613
2301
  if (fields[i].number == field_number) {
1614
2302
  f->layout_index = i;
1615
2303
  found = true;
@@ -1620,37 +2308,42 @@ static void create_fielddef(
1620
2308
  }
1621
2309
  } else {
1622
2310
  /* extension field. */
1623
- f = (upb_fielddef*)&ctx->file->exts[ctx->file->ext_count++];
1624
2311
  f->is_extension_ = true;
1625
- symtab_add(ctx, full_name, pack_def(f, UPB_DEFTYPE_FIELD));
2312
+ f->scope.extension_scope = m;
2313
+ symtab_add(ctx, full_name, pack_def(f, UPB_DEFTYPE_EXT));
2314
+ f->layout_index = ctx->ext_count++;
2315
+ if (ctx->layout) {
2316
+ UPB_ASSERT(ctx->file->ext_layouts[f->layout_index]->field.number ==
2317
+ field_number);
2318
+ }
1626
2319
  }
1627
2320
 
1628
- f->full_name = full_name;
1629
- f->json_name = json_name;
1630
- f->file = ctx->file;
1631
- f->type_ = (int)google_protobuf_FieldDescriptorProto_type(field_proto);
1632
- f->label_ = (int)google_protobuf_FieldDescriptorProto_label(field_proto);
1633
- f->number_ = field_number;
1634
- f->oneof = NULL;
1635
- f->proto3_optional_ =
1636
- google_protobuf_FieldDescriptorProto_proto3_optional(field_proto);
2321
+ if (f->type_ < kUpb_FieldType_Double || f->type_ > kUpb_FieldType_SInt64) {
2322
+ symtab_errf(ctx, "invalid type for field %s (%d)", f->full_name, f->type_);
2323
+ }
2324
+
2325
+ if (f->label_ < kUpb_Label_Optional || f->label_ > kUpb_Label_Repeated) {
2326
+ symtab_errf(ctx, "invalid label for field %s (%d)", f->full_name,
2327
+ f->label_);
2328
+ }
1637
2329
 
1638
2330
  /* We can't resolve the subdef or (in the case of extensions) the containing
1639
2331
  * message yet, because it may not have been defined yet. We stash a pointer
1640
2332
  * to the field_proto until later when we can properly resolve it. */
1641
2333
  f->sub.unresolved = field_proto;
1642
2334
 
1643
- if (f->label_ == UPB_LABEL_REQUIRED && f->file->syntax == UPB_SYNTAX_PROTO3) {
2335
+ if (f->label_ == kUpb_Label_Required &&
2336
+ f->file->syntax == kUpb_Syntax_Proto3) {
1644
2337
  symtab_errf(ctx, "proto3 fields cannot be required (%s)", f->full_name);
1645
2338
  }
1646
2339
 
1647
2340
  if (google_protobuf_FieldDescriptorProto_has_oneof_index(field_proto)) {
1648
2341
  int oneof_index =
1649
2342
  google_protobuf_FieldDescriptorProto_oneof_index(field_proto);
1650
- upb_oneofdef *oneof;
2343
+ upb_OneofDef* oneof;
1651
2344
  upb_value v = upb_value_constptr(f);
1652
2345
 
1653
- if (upb_fielddef_label(f) != UPB_LABEL_OPTIONAL) {
2346
+ if (upb_FieldDef_Label(f) != kUpb_Label_Optional) {
1654
2347
  symtab_errf(ctx, "fields in oneof must have OPTIONAL label (%s)",
1655
2348
  f->full_name);
1656
2349
  }
@@ -1664,8 +2357,8 @@ static void create_fielddef(
1664
2357
  symtab_errf(ctx, "oneof_index out of range (%s)", f->full_name);
1665
2358
  }
1666
2359
 
1667
- oneof = (upb_oneofdef *)&m->oneofs[oneof_index];
1668
- f->oneof = oneof;
2360
+ oneof = (upb_OneofDef*)&m->oneofs[oneof_index];
2361
+ f->scope.oneof = oneof;
1669
2362
 
1670
2363
  oneof->field_count++;
1671
2364
  if (f->proto3_optional_) {
@@ -1675,43 +2368,184 @@ static void create_fielddef(
1675
2368
  CHK_OOM(
1676
2369
  upb_strtable_insert(&oneof->ntof, name.data, name.size, v, ctx->arena));
1677
2370
  } else {
1678
- f->oneof = NULL;
1679
2371
  if (f->proto3_optional_) {
1680
2372
  symtab_errf(ctx, "field with proto3_optional was not in a oneof (%s)",
1681
2373
  f->full_name);
1682
2374
  }
1683
2375
  }
1684
2376
 
1685
- options = google_protobuf_FieldDescriptorProto_has_options(field_proto) ?
1686
- google_protobuf_FieldDescriptorProto_options(field_proto) : NULL;
2377
+ SET_OPTIONS(f->opts, FieldDescriptorProto, FieldOptions, field_proto);
1687
2378
 
1688
- if (options && google_protobuf_FieldOptions_has_packed(options)) {
1689
- f->packed_ = google_protobuf_FieldOptions_packed(options);
2379
+ if (google_protobuf_FieldOptions_has_packed(f->opts)) {
2380
+ f->packed_ = google_protobuf_FieldOptions_packed(f->opts);
1690
2381
  } else {
1691
2382
  /* Repeated fields default to packed for proto3 only. */
1692
- f->packed_ = upb_fielddef_isprimitive(f) &&
1693
- f->label_ == UPB_LABEL_REPEATED && f->file->syntax == UPB_SYNTAX_PROTO3;
2383
+ f->packed_ = upb_FieldDef_IsPrimitive(f) &&
2384
+ f->label_ == kUpb_Label_Repeated &&
2385
+ f->file->syntax == kUpb_Syntax_Proto3;
2386
+ }
2387
+ }
2388
+
2389
+ static void create_service(
2390
+ symtab_addctx* ctx, const google_protobuf_ServiceDescriptorProto* svc_proto,
2391
+ const upb_ServiceDef* _s) {
2392
+ upb_ServiceDef* s = (upb_ServiceDef*)_s;
2393
+ upb_StringView name;
2394
+ const google_protobuf_MethodDescriptorProto* const* methods;
2395
+ size_t i, n;
2396
+
2397
+ s->file = ctx->file; /* Must happen prior to symtab_add. */
2398
+
2399
+ name = google_protobuf_ServiceDescriptorProto_name(svc_proto);
2400
+ check_ident(ctx, name, false);
2401
+ s->full_name = makefullname(ctx, ctx->file->package, name);
2402
+ symtab_add(ctx, s->full_name, pack_def(s, UPB_DEFTYPE_SERVICE));
2403
+
2404
+ methods = google_protobuf_ServiceDescriptorProto_method(svc_proto, &n);
2405
+
2406
+ s->method_count = n;
2407
+ s->methods = symtab_alloc(ctx, sizeof(*s->methods) * n);
2408
+
2409
+ SET_OPTIONS(s->opts, ServiceDescriptorProto, ServiceOptions, svc_proto);
2410
+
2411
+ for (i = 0; i < n; i++) {
2412
+ const google_protobuf_MethodDescriptorProto* method_proto = methods[i];
2413
+ upb_MethodDef* m = (upb_MethodDef*)&s->methods[i];
2414
+ upb_StringView name =
2415
+ google_protobuf_MethodDescriptorProto_name(method_proto);
2416
+
2417
+ m->service = s;
2418
+ m->full_name = makefullname(ctx, s->full_name, name);
2419
+ m->index = i;
2420
+ m->client_streaming =
2421
+ google_protobuf_MethodDescriptorProto_client_streaming(method_proto);
2422
+ m->server_streaming =
2423
+ google_protobuf_MethodDescriptorProto_server_streaming(method_proto);
2424
+ m->input_type = symtab_resolve(
2425
+ ctx, m->full_name, m->full_name,
2426
+ google_protobuf_MethodDescriptorProto_input_type(method_proto),
2427
+ UPB_DEFTYPE_MSG);
2428
+ m->output_type = symtab_resolve(
2429
+ ctx, m->full_name, m->full_name,
2430
+ google_protobuf_MethodDescriptorProto_output_type(method_proto),
2431
+ UPB_DEFTYPE_MSG);
2432
+
2433
+ SET_OPTIONS(m->opts, MethodDescriptorProto, MethodOptions, method_proto);
2434
+ }
2435
+ }
2436
+
2437
+ static int count_bits_debug(uint64_t x) {
2438
+ // For assertions only, speed does not matter.
2439
+ int n = 0;
2440
+ while (x) {
2441
+ if (x & 1) n++;
2442
+ x >>= 1;
2443
+ }
2444
+ return n;
2445
+ }
2446
+
2447
+ static int compare_int32(const void* a_ptr, const void* b_ptr) {
2448
+ int32_t a = *(int32_t*)a_ptr;
2449
+ int32_t b = *(int32_t*)b_ptr;
2450
+ return a < b ? -1 : (a == b ? 0 : 1);
2451
+ }
2452
+
2453
+ upb_MiniTable_Enum* create_enumlayout(symtab_addctx* ctx,
2454
+ const upb_EnumDef* e) {
2455
+ int n = 0;
2456
+ uint64_t mask = 0;
2457
+
2458
+ for (int i = 0; i < e->value_count; i++) {
2459
+ uint32_t val = (uint32_t)e->values[i].number;
2460
+ if (val < 64) {
2461
+ mask |= 1ULL << val;
2462
+ } else {
2463
+ n++;
2464
+ }
1694
2465
  }
1695
2466
 
1696
- if (options) {
1697
- f->lazy_ = google_protobuf_FieldOptions_lazy(options);
1698
- } else {
1699
- f->lazy_ = false;
2467
+ int32_t* values = symtab_alloc(ctx, sizeof(*values) * n);
2468
+
2469
+ if (n) {
2470
+ int32_t* p = values;
2471
+
2472
+ // Add values outside the bitmask range to the list, as described in the
2473
+ // comments for upb_MiniTable_Enum.
2474
+ for (int i = 0; i < e->value_count; i++) {
2475
+ int32_t val = e->values[i].number;
2476
+ if ((uint32_t)val >= 64) {
2477
+ *p++ = val;
2478
+ }
2479
+ }
2480
+ UPB_ASSERT(p == values + n);
2481
+ }
2482
+
2483
+ // Enums can have duplicate values; we must sort+uniq them.
2484
+ if (values) qsort(values, n, sizeof(*values), &compare_int32);
2485
+
2486
+ int dst = 0;
2487
+ for (int i = 0; i < n; dst++) {
2488
+ int32_t val = values[i];
2489
+ while (i < n && values[i] == val) i++; // Skip duplicates.
2490
+ values[dst] = val;
2491
+ }
2492
+ n = dst;
2493
+
2494
+ UPB_ASSERT(upb_inttable_count(&e->iton) == n + count_bits_debug(mask));
2495
+
2496
+ upb_MiniTable_Enum* layout = symtab_alloc(ctx, sizeof(*layout));
2497
+ layout->value_count = n;
2498
+ layout->mask = mask;
2499
+ layout->values = values;
2500
+
2501
+ return layout;
2502
+ }
2503
+
2504
+ static void create_enumvaldef(
2505
+ symtab_addctx* ctx, const char* prefix,
2506
+ const google_protobuf_EnumValueDescriptorProto* val_proto, upb_EnumDef* e,
2507
+ int i) {
2508
+ upb_EnumValueDef* val = (upb_EnumValueDef*)&e->values[i];
2509
+ upb_StringView name =
2510
+ google_protobuf_EnumValueDescriptorProto_name(val_proto);
2511
+ upb_value v = upb_value_constptr(val);
2512
+
2513
+ val->parent = e; /* Must happen prior to symtab_add(). */
2514
+ val->full_name = makefullname(ctx, prefix, name);
2515
+ val->number = google_protobuf_EnumValueDescriptorProto_number(val_proto);
2516
+ symtab_add(ctx, val->full_name, pack_def(val, UPB_DEFTYPE_ENUMVAL));
2517
+
2518
+ SET_OPTIONS(val->opts, EnumValueDescriptorProto, EnumValueOptions, val_proto);
2519
+
2520
+ if (i == 0 && e->file->syntax == kUpb_Syntax_Proto3 && val->number != 0) {
2521
+ symtab_errf(ctx, "for proto3, the first enum value must be zero (%s)",
2522
+ e->full_name);
2523
+ }
2524
+
2525
+ CHK_OOM(upb_strtable_insert(&e->ntoi, name.data, name.size, v, ctx->arena));
2526
+
2527
+ // Multiple enumerators can have the same number, first one wins.
2528
+ if (!upb_inttable_lookup(&e->iton, val->number, NULL)) {
2529
+ CHK_OOM(upb_inttable_insert(&e->iton, val->number, v, ctx->arena));
1700
2530
  }
1701
2531
  }
1702
2532
 
1703
2533
  static void create_enumdef(
1704
- symtab_addctx *ctx, const char *prefix,
1705
- const google_protobuf_EnumDescriptorProto *enum_proto) {
1706
- upb_enumdef *e;
1707
- const google_protobuf_EnumValueDescriptorProto *const *values;
1708
- upb_strview name;
2534
+ symtab_addctx* ctx, const char* prefix,
2535
+ const google_protobuf_EnumDescriptorProto* enum_proto,
2536
+ const upb_MessageDef* containing_type, const upb_EnumDef* _e) {
2537
+ upb_EnumDef* e = (upb_EnumDef*)_e;
2538
+ ;
2539
+ const google_protobuf_EnumValueDescriptorProto* const* values;
2540
+ upb_StringView name;
1709
2541
  size_t i, n;
1710
2542
 
2543
+ e->file = ctx->file; /* Must happen prior to symtab_add() */
2544
+ e->containing_type = containing_type;
2545
+
1711
2546
  name = google_protobuf_EnumDescriptorProto_name(enum_proto);
1712
2547
  check_ident(ctx, name, false);
1713
2548
 
1714
- e = (upb_enumdef*)&ctx->file->enums[ctx->file->enum_count++];
1715
2549
  e->full_name = makefullname(ctx, prefix, name);
1716
2550
  symtab_add(ctx, e->full_name, pack_def(e, UPB_DEFTYPE_ENUM));
1717
2551
 
@@ -1719,225 +2553,371 @@ static void create_enumdef(
1719
2553
  CHK_OOM(upb_strtable_init(&e->ntoi, n, ctx->arena));
1720
2554
  CHK_OOM(upb_inttable_init(&e->iton, ctx->arena));
1721
2555
 
1722
- e->file = ctx->file;
1723
2556
  e->defaultval = 0;
2557
+ e->value_count = n;
2558
+ e->values = symtab_alloc(ctx, sizeof(*e->values) * n);
1724
2559
 
1725
2560
  if (n == 0) {
1726
2561
  symtab_errf(ctx, "enums must contain at least one value (%s)",
1727
2562
  e->full_name);
1728
2563
  }
1729
2564
 
1730
- for (i = 0; i < n; i++) {
1731
- const google_protobuf_EnumValueDescriptorProto *value = values[i];
1732
- upb_strview name = google_protobuf_EnumValueDescriptorProto_name(value);
1733
- char *name2 = strviewdup(ctx, name);
1734
- int32_t num = google_protobuf_EnumValueDescriptorProto_number(value);
1735
- upb_value v = upb_value_int32(num);
1736
-
1737
- if (i == 0 && e->file->syntax == UPB_SYNTAX_PROTO3 && num != 0) {
1738
- symtab_errf(ctx, "for proto3, the first enum value must be zero (%s)",
1739
- e->full_name);
1740
- }
2565
+ SET_OPTIONS(e->opts, EnumDescriptorProto, EnumOptions, enum_proto);
1741
2566
 
1742
- if (upb_strtable_lookup(&e->ntoi, name2, NULL)) {
1743
- symtab_errf(ctx, "duplicate enum label '%s'", name2);
1744
- }
2567
+ for (i = 0; i < n; i++) {
2568
+ create_enumvaldef(ctx, prefix, values[i], e, i);
2569
+ }
1745
2570
 
1746
- CHK_OOM(name2)
1747
- CHK_OOM(upb_strtable_insert(&e->ntoi, name2, strlen(name2), v, ctx->arena));
2571
+ upb_inttable_compact(&e->iton, ctx->arena);
1748
2572
 
1749
- if (!upb_inttable_lookup(&e->iton, num, NULL)) {
1750
- upb_value v = upb_value_cstr(name2);
1751
- CHK_OOM(upb_inttable_insert(&e->iton, num, v, ctx->arena));
2573
+ if (e->file->syntax == kUpb_Syntax_Proto2) {
2574
+ if (ctx->layout) {
2575
+ UPB_ASSERT(ctx->enum_count < ctx->layout->enum_count);
2576
+ e->layout = ctx->layout->enums[ctx->enum_count++];
2577
+ UPB_ASSERT(upb_inttable_count(&e->iton) ==
2578
+ e->layout->value_count + count_bits_debug(e->layout->mask));
2579
+ } else {
2580
+ e->layout = create_enumlayout(ctx, e);
1752
2581
  }
2582
+ } else {
2583
+ e->layout = NULL;
1753
2584
  }
1754
-
1755
- upb_inttable_compact(&e->iton, ctx->arena);
1756
2585
  }
1757
2586
 
1758
- static void create_msgdef(symtab_addctx *ctx, const char *prefix,
1759
- const google_protobuf_DescriptorProto *msg_proto) {
1760
- upb_msgdef *m;
1761
- const google_protobuf_MessageOptions *options;
1762
- const google_protobuf_OneofDescriptorProto *const *oneofs;
1763
- const google_protobuf_FieldDescriptorProto *const *fields;
1764
- const google_protobuf_EnumDescriptorProto *const *enums;
1765
- const google_protobuf_DescriptorProto *const *msgs;
1766
- size_t i, n_oneof, n_field, n;
1767
- upb_strview name;
2587
+ static void msgdef_create_nested(
2588
+ symtab_addctx* ctx, const google_protobuf_DescriptorProto* msg_proto,
2589
+ upb_MessageDef* m);
2590
+
2591
+ static void create_msgdef(symtab_addctx* ctx, const char* prefix,
2592
+ const google_protobuf_DescriptorProto* msg_proto,
2593
+ const upb_MessageDef* containing_type,
2594
+ const upb_MessageDef* _m) {
2595
+ upb_MessageDef* m = (upb_MessageDef*)_m;
2596
+ const google_protobuf_OneofDescriptorProto* const* oneofs;
2597
+ const google_protobuf_FieldDescriptorProto* const* fields;
2598
+ const google_protobuf_DescriptorProto_ExtensionRange* const* ext_ranges;
2599
+ size_t i, n_oneof, n_field, n_ext_range;
2600
+ upb_StringView name;
2601
+
2602
+ m->file = ctx->file; /* Must happen prior to symtab_add(). */
2603
+ m->containing_type = containing_type;
1768
2604
 
1769
2605
  name = google_protobuf_DescriptorProto_name(msg_proto);
1770
2606
  check_ident(ctx, name, false);
1771
2607
 
1772
- m = (upb_msgdef*)&ctx->file->msgs[ctx->file->msg_count++];
1773
2608
  m->full_name = makefullname(ctx, prefix, name);
1774
2609
  symtab_add(ctx, m->full_name, pack_def(m, UPB_DEFTYPE_MSG));
1775
2610
 
1776
2611
  oneofs = google_protobuf_DescriptorProto_oneof_decl(msg_proto, &n_oneof);
1777
2612
  fields = google_protobuf_DescriptorProto_field(msg_proto, &n_field);
2613
+ ext_ranges =
2614
+ google_protobuf_DescriptorProto_extension_range(msg_proto, &n_ext_range);
1778
2615
 
1779
2616
  CHK_OOM(upb_inttable_init(&m->itof, ctx->arena));
1780
2617
  CHK_OOM(upb_strtable_init(&m->ntof, n_oneof + n_field, ctx->arena));
1781
2618
 
1782
- m->file = ctx->file;
1783
- m->map_entry = false;
1784
-
1785
- options = google_protobuf_DescriptorProto_options(msg_proto);
1786
-
1787
- if (options) {
1788
- m->map_entry = google_protobuf_MessageOptions_map_entry(options);
1789
- }
1790
-
1791
- if (ctx->layouts) {
1792
- m->layout = *ctx->layouts;
1793
- ctx->layouts++;
2619
+ if (ctx->layout) {
2620
+ /* create_fielddef() below depends on this being set. */
2621
+ UPB_ASSERT(ctx->msg_count < ctx->layout->msg_count);
2622
+ m->layout = ctx->layout->msgs[ctx->msg_count++];
2623
+ UPB_ASSERT(n_field == m->layout->field_count);
1794
2624
  } else {
1795
2625
  /* Allocate now (to allow cross-linking), populate later. */
1796
- m->layout = symtab_alloc(
1797
- ctx, sizeof(*m->layout) + sizeof(_upb_fasttable_entry));
2626
+ m->layout =
2627
+ symtab_alloc(ctx, sizeof(*m->layout) + sizeof(_upb_FastTable_Entry));
1798
2628
  }
1799
2629
 
1800
- m->oneof_count = 0;
2630
+ SET_OPTIONS(m->opts, DescriptorProto, MessageOptions, msg_proto);
2631
+
2632
+ m->oneof_count = n_oneof;
1801
2633
  m->oneofs = symtab_alloc(ctx, sizeof(*m->oneofs) * n_oneof);
1802
2634
  for (i = 0; i < n_oneof; i++) {
1803
- create_oneofdef(ctx, m, oneofs[i]);
2635
+ create_oneofdef(ctx, m, oneofs[i], &m->oneofs[i]);
1804
2636
  }
1805
2637
 
1806
- m->field_count = 0;
2638
+ m->field_count = n_field;
1807
2639
  m->fields = symtab_alloc(ctx, sizeof(*m->fields) * n_field);
1808
2640
  for (i = 0; i < n_field; i++) {
1809
- create_fielddef(ctx, m->full_name, m, fields[i]);
2641
+ create_fielddef(ctx, m->full_name, m, fields[i], &m->fields[i],
2642
+ /* is_extension= */ false);
2643
+ }
2644
+
2645
+ m->ext_range_count = n_ext_range;
2646
+ m->ext_ranges = symtab_alloc(ctx, sizeof(*m->ext_ranges) * n_ext_range);
2647
+ for (i = 0; i < n_ext_range; i++) {
2648
+ const google_protobuf_DescriptorProto_ExtensionRange* r = ext_ranges[i];
2649
+ upb_ExtensionRange* r_def = (upb_ExtensionRange*)&m->ext_ranges[i];
2650
+ int32_t start = google_protobuf_DescriptorProto_ExtensionRange_start(r);
2651
+ int32_t end = google_protobuf_DescriptorProto_ExtensionRange_end(r);
2652
+ int32_t max =
2653
+ google_protobuf_MessageOptions_message_set_wire_format(m->opts)
2654
+ ? INT32_MAX
2655
+ : kUpb_MaxFieldNumber + 1;
2656
+
2657
+ // A full validation would also check that each range is disjoint, and that
2658
+ // none of the fields overlap with the extension ranges, but we are just
2659
+ // sanity checking here.
2660
+ if (start < 1 || end <= start || end > max) {
2661
+ symtab_errf(ctx, "Extension range (%d, %d) is invalid, message=%s\n",
2662
+ (int)start, (int)end, m->full_name);
2663
+ }
2664
+
2665
+ r_def->start = start;
2666
+ r_def->end = end;
2667
+ SET_OPTIONS(r_def->opts, DescriptorProto_ExtensionRange,
2668
+ ExtensionRangeOptions, r);
1810
2669
  }
1811
2670
 
1812
2671
  finalize_oneofs(ctx, m);
1813
2672
  assign_msg_wellknowntype(m);
1814
2673
  upb_inttable_compact(&m->itof, ctx->arena);
1815
-
1816
- /* This message is built. Now build nested messages and enums. */
1817
-
1818
- enums = google_protobuf_DescriptorProto_enum_type(msg_proto, &n);
1819
- for (i = 0; i < n; i++) {
1820
- create_enumdef(ctx, m->full_name, enums[i]);
1821
- }
1822
-
1823
- msgs = google_protobuf_DescriptorProto_nested_type(msg_proto, &n);
1824
- for (i = 0; i < n; i++) {
1825
- create_msgdef(ctx, m->full_name, msgs[i]);
1826
- }
1827
- }
1828
-
1829
- static void count_types_in_msg(const google_protobuf_DescriptorProto *msg_proto,
1830
- upb_filedef *file) {
1831
- const google_protobuf_DescriptorProto *const *msgs;
1832
- size_t i, n;
1833
-
1834
- file->msg_count++;
1835
-
1836
- msgs = google_protobuf_DescriptorProto_nested_type(msg_proto, &n);
1837
- for (i = 0; i < n; i++) {
1838
- count_types_in_msg(msgs[i], file);
2674
+ msgdef_create_nested(ctx, msg_proto, m);
2675
+ }
2676
+
2677
+ static void msgdef_create_nested(
2678
+ symtab_addctx* ctx, const google_protobuf_DescriptorProto* msg_proto,
2679
+ upb_MessageDef* m) {
2680
+ size_t n;
2681
+
2682
+ const google_protobuf_EnumDescriptorProto* const* enums =
2683
+ google_protobuf_DescriptorProto_enum_type(msg_proto, &n);
2684
+ m->nested_enum_count = n;
2685
+ m->nested_enums = symtab_alloc(ctx, sizeof(*m->nested_enums) * n);
2686
+ for (size_t i = 0; i < n; i++) {
2687
+ m->nested_enum_count = i + 1;
2688
+ create_enumdef(ctx, m->full_name, enums[i], m, &m->nested_enums[i]);
2689
+ }
2690
+
2691
+ const google_protobuf_FieldDescriptorProto* const* exts =
2692
+ google_protobuf_DescriptorProto_extension(msg_proto, &n);
2693
+ m->nested_ext_count = n;
2694
+ m->nested_exts = symtab_alloc(ctx, sizeof(*m->nested_exts) * n);
2695
+ for (size_t i = 0; i < n; i++) {
2696
+ create_fielddef(ctx, m->full_name, m, exts[i], &m->nested_exts[i],
2697
+ /* is_extension= */ true);
2698
+ ((upb_FieldDef*)&m->nested_exts[i])->index_ = i;
2699
+ }
2700
+
2701
+ const google_protobuf_DescriptorProto* const* msgs =
2702
+ google_protobuf_DescriptorProto_nested_type(msg_proto, &n);
2703
+ m->nested_msg_count = n;
2704
+ m->nested_msgs = symtab_alloc(ctx, sizeof(*m->nested_msgs) * n);
2705
+ for (size_t i = 0; i < n; i++) {
2706
+ create_msgdef(ctx, m->full_name, msgs[i], m, &m->nested_msgs[i]);
2707
+ }
2708
+ }
2709
+
2710
+ static void resolve_subdef(symtab_addctx* ctx, const char* prefix,
2711
+ upb_FieldDef* f) {
2712
+ const google_protobuf_FieldDescriptorProto* field_proto = f->sub.unresolved;
2713
+ upb_StringView name =
2714
+ google_protobuf_FieldDescriptorProto_type_name(field_proto);
2715
+ bool has_name =
2716
+ google_protobuf_FieldDescriptorProto_has_type_name(field_proto);
2717
+ switch ((int)f->type_) {
2718
+ case FIELD_TYPE_UNSPECIFIED: {
2719
+ // Type was not specified and must be inferred.
2720
+ UPB_ASSERT(has_name);
2721
+ upb_deftype_t type;
2722
+ const void* def =
2723
+ symtab_resolveany(ctx, f->full_name, prefix, name, &type);
2724
+ switch (type) {
2725
+ case UPB_DEFTYPE_ENUM:
2726
+ f->sub.enumdef = def;
2727
+ f->type_ = kUpb_FieldType_Enum;
2728
+ break;
2729
+ case UPB_DEFTYPE_MSG:
2730
+ f->sub.msgdef = def;
2731
+ f->type_ = kUpb_FieldType_Message; // It appears there is no way of
2732
+ // this being a group.
2733
+ break;
2734
+ default:
2735
+ symtab_errf(ctx, "Couldn't resolve type name for field %s",
2736
+ f->full_name);
2737
+ }
2738
+ }
2739
+ case kUpb_FieldType_Message:
2740
+ case kUpb_FieldType_Group:
2741
+ UPB_ASSERT(has_name);
2742
+ f->sub.msgdef =
2743
+ symtab_resolve(ctx, f->full_name, prefix, name, UPB_DEFTYPE_MSG);
2744
+ break;
2745
+ case kUpb_FieldType_Enum:
2746
+ UPB_ASSERT(has_name);
2747
+ f->sub.enumdef =
2748
+ symtab_resolve(ctx, f->full_name, prefix, name, UPB_DEFTYPE_ENUM);
2749
+ break;
2750
+ default:
2751
+ // No resolution necessary.
2752
+ break;
1839
2753
  }
1840
-
1841
- google_protobuf_DescriptorProto_enum_type(msg_proto, &n);
1842
- file->enum_count += n;
1843
-
1844
- google_protobuf_DescriptorProto_extension(msg_proto, &n);
1845
- file->ext_count += n;
1846
2754
  }
1847
2755
 
1848
- static void count_types_in_file(
1849
- const google_protobuf_FileDescriptorProto *file_proto,
1850
- upb_filedef *file) {
1851
- const google_protobuf_DescriptorProto *const *msgs;
1852
- size_t i, n;
1853
-
1854
- msgs = google_protobuf_FileDescriptorProto_message_type(file_proto, &n);
1855
- for (i = 0; i < n; i++) {
1856
- count_types_in_msg(msgs[i], file);
2756
+ static void resolve_extension(
2757
+ symtab_addctx* ctx, const char* prefix, upb_FieldDef* f,
2758
+ const google_protobuf_FieldDescriptorProto* field_proto) {
2759
+ if (!google_protobuf_FieldDescriptorProto_has_extendee(field_proto)) {
2760
+ symtab_errf(ctx, "extension for field '%s' had no extendee", f->full_name);
1857
2761
  }
1858
2762
 
1859
- google_protobuf_FileDescriptorProto_enum_type(file_proto, &n);
1860
- file->enum_count += n;
2763
+ upb_StringView name =
2764
+ google_protobuf_FieldDescriptorProto_extendee(field_proto);
2765
+ const upb_MessageDef* m =
2766
+ symtab_resolve(ctx, f->full_name, prefix, name, UPB_DEFTYPE_MSG);
2767
+ f->msgdef = m;
1861
2768
 
1862
- google_protobuf_FileDescriptorProto_extension(file_proto, &n);
1863
- file->ext_count += n;
1864
- }
2769
+ bool found = false;
1865
2770
 
1866
- static void resolve_fielddef(symtab_addctx *ctx, const char *prefix,
1867
- upb_fielddef *f) {
1868
- upb_strview name;
1869
- const google_protobuf_FieldDescriptorProto *field_proto = f->sub.unresolved;
1870
-
1871
- if (f->is_extension_) {
1872
- if (!google_protobuf_FieldDescriptorProto_has_extendee(field_proto)) {
1873
- symtab_errf(ctx, "extension for field '%s' had no extendee",
1874
- f->full_name);
2771
+ for (int i = 0, n = m->ext_range_count; i < n; i++) {
2772
+ const upb_ExtensionRange* r = &m->ext_ranges[i];
2773
+ if (r->start <= f->number_ && f->number_ < r->end) {
2774
+ found = true;
2775
+ break;
1875
2776
  }
1876
-
1877
- name = google_protobuf_FieldDescriptorProto_extendee(field_proto);
1878
- f->msgdef = symtab_resolve(ctx, f, prefix, name, UPB_DEFTYPE_MSG);
1879
2777
  }
1880
2778
 
1881
- if ((upb_fielddef_issubmsg(f) || f->type_ == UPB_DESCRIPTOR_TYPE_ENUM) &&
1882
- !google_protobuf_FieldDescriptorProto_has_type_name(field_proto)) {
1883
- symtab_errf(ctx, "field '%s' is missing type name", f->full_name);
2779
+ if (!found) {
2780
+ symtab_errf(ctx,
2781
+ "field number %u in extension %s has no extension range in "
2782
+ "message %s",
2783
+ (unsigned)f->number_, f->full_name, f->msgdef->full_name);
1884
2784
  }
1885
2785
 
1886
- name = google_protobuf_FieldDescriptorProto_type_name(field_proto);
1887
-
1888
- if (upb_fielddef_issubmsg(f)) {
1889
- f->sub.msgdef = symtab_resolve(ctx, f, prefix, name, UPB_DEFTYPE_MSG);
1890
- } else if (f->type_ == UPB_DESCRIPTOR_TYPE_ENUM) {
1891
- f->sub.enumdef = symtab_resolve(ctx, f, prefix, name, UPB_DEFTYPE_ENUM);
2786
+ const upb_MiniTable_Extension* ext = ctx->file->ext_layouts[f->layout_index];
2787
+ if (ctx->layout) {
2788
+ UPB_ASSERT(upb_FieldDef_Number(f) == ext->field.number);
2789
+ } else {
2790
+ upb_MiniTable_Extension* mut_ext = (upb_MiniTable_Extension*)ext;
2791
+ fill_fieldlayout(&mut_ext->field, f);
2792
+ mut_ext->field.presence = 0;
2793
+ mut_ext->field.offset = 0;
2794
+ mut_ext->field.submsg_index = 0;
2795
+ mut_ext->extendee = f->msgdef->layout;
2796
+ mut_ext->sub.submsg = f->sub.msgdef->layout;
1892
2797
  }
1893
2798
 
1894
- /* Have to delay resolving of the default value until now because of the enum
1895
- * case, since enum defaults are specified with a label. */
2799
+ CHK_OOM(upb_inttable_insert(&ctx->symtab->exts, (uintptr_t)ext,
2800
+ upb_value_constptr(f), ctx->arena));
2801
+ }
2802
+
2803
+ static void resolve_default(
2804
+ symtab_addctx* ctx, upb_FieldDef* f,
2805
+ const google_protobuf_FieldDescriptorProto* field_proto) {
2806
+ // Have to delay resolving of the default value until now because of the enum
2807
+ // case, since enum defaults are specified with a label.
1896
2808
  if (google_protobuf_FieldDescriptorProto_has_default_value(field_proto)) {
1897
- upb_strview defaultval =
2809
+ upb_StringView defaultval =
1898
2810
  google_protobuf_FieldDescriptorProto_default_value(field_proto);
1899
2811
 
1900
- if (f->file->syntax == UPB_SYNTAX_PROTO3) {
2812
+ if (f->file->syntax == kUpb_Syntax_Proto3) {
1901
2813
  symtab_errf(ctx, "proto3 fields cannot have explicit defaults (%s)",
1902
2814
  f->full_name);
1903
2815
  }
1904
2816
 
1905
- if (upb_fielddef_issubmsg(f)) {
2817
+ if (upb_FieldDef_IsSubMessage(f)) {
1906
2818
  symtab_errf(ctx, "message fields cannot have explicit defaults (%s)",
1907
2819
  f->full_name);
1908
2820
  }
1909
2821
 
1910
2822
  parse_default(ctx, defaultval.data, defaultval.size, f);
2823
+ f->has_default = true;
1911
2824
  } else {
1912
2825
  set_default_default(ctx, f);
2826
+ f->has_default = false;
2827
+ }
2828
+ }
2829
+
2830
+ static void resolve_fielddef(symtab_addctx* ctx, const char* prefix,
2831
+ upb_FieldDef* f) {
2832
+ // We have to stash this away since resolve_subdef() may overwrite it.
2833
+ const google_protobuf_FieldDescriptorProto* field_proto = f->sub.unresolved;
2834
+
2835
+ resolve_subdef(ctx, prefix, f);
2836
+ resolve_default(ctx, f, field_proto);
2837
+
2838
+ if (f->is_extension_) {
2839
+ resolve_extension(ctx, prefix, f, field_proto);
2840
+ }
2841
+ }
2842
+
2843
+ static void resolve_msgdef(symtab_addctx* ctx, upb_MessageDef* m) {
2844
+ for (int i = 0; i < m->field_count; i++) {
2845
+ resolve_fielddef(ctx, m->full_name, (upb_FieldDef*)&m->fields[i]);
2846
+ }
2847
+
2848
+ m->in_message_set = false;
2849
+ for (int i = 0; i < m->nested_ext_count; i++) {
2850
+ upb_FieldDef* ext = (upb_FieldDef*)&m->nested_exts[i];
2851
+ resolve_fielddef(ctx, m->full_name, ext);
2852
+ if (ext->type_ == kUpb_FieldType_Message &&
2853
+ ext->label_ == kUpb_Label_Optional && ext->sub.msgdef == m &&
2854
+ google_protobuf_MessageOptions_message_set_wire_format(
2855
+ ext->msgdef->opts)) {
2856
+ m->in_message_set = true;
2857
+ }
2858
+ }
2859
+
2860
+ if (!ctx->layout) make_layout(ctx, m);
2861
+
2862
+ for (int i = 0; i < m->nested_msg_count; i++) {
2863
+ resolve_msgdef(ctx, (upb_MessageDef*)&m->nested_msgs[i]);
1913
2864
  }
1914
2865
  }
1915
2866
 
2867
+ static int count_exts_in_msg(const google_protobuf_DescriptorProto* msg_proto) {
2868
+ size_t n;
2869
+ google_protobuf_DescriptorProto_extension(msg_proto, &n);
2870
+ int ext_count = n;
2871
+
2872
+ const google_protobuf_DescriptorProto* const* nested_msgs =
2873
+ google_protobuf_DescriptorProto_nested_type(msg_proto, &n);
2874
+ for (size_t i = 0; i < n; i++) {
2875
+ ext_count += count_exts_in_msg(nested_msgs[i]);
2876
+ }
2877
+
2878
+ return ext_count;
2879
+ }
2880
+
1916
2881
  static void build_filedef(
1917
- symtab_addctx *ctx, upb_filedef *file,
1918
- const google_protobuf_FileDescriptorProto *file_proto) {
1919
- const google_protobuf_FileOptions *file_options_proto;
1920
- const google_protobuf_DescriptorProto *const *msgs;
1921
- const google_protobuf_EnumDescriptorProto *const *enums;
1922
- const google_protobuf_FieldDescriptorProto *const *exts;
1923
- const upb_strview* strs;
2882
+ symtab_addctx* ctx, upb_FileDef* file,
2883
+ const google_protobuf_FileDescriptorProto* file_proto) {
2884
+ const google_protobuf_DescriptorProto* const* msgs;
2885
+ const google_protobuf_EnumDescriptorProto* const* enums;
2886
+ const google_protobuf_FieldDescriptorProto* const* exts;
2887
+ const google_protobuf_ServiceDescriptorProto* const* services;
2888
+ const upb_StringView* strs;
2889
+ const int32_t* public_deps;
2890
+ const int32_t* weak_deps;
1924
2891
  size_t i, n;
1925
2892
 
1926
2893
  file->symtab = ctx->symtab;
1927
2894
 
1928
- /* One pass to count and allocate. */
1929
- file->msg_count = 0;
1930
- file->enum_count = 0;
1931
- file->ext_count = 0;
1932
- count_types_in_file(file_proto, file);
1933
- file->msgs = symtab_alloc(ctx, sizeof(*file->msgs) * file->msg_count);
1934
- file->enums = symtab_alloc(ctx, sizeof(*file->enums) * file->enum_count);
1935
- file->exts = symtab_alloc(ctx, sizeof(*file->exts) * file->ext_count);
2895
+ /* Count all extensions in the file, to build a flat array of layouts. */
2896
+ google_protobuf_FileDescriptorProto_extension(file_proto, &n);
2897
+ int ext_count = n;
2898
+ msgs = google_protobuf_FileDescriptorProto_message_type(file_proto, &n);
2899
+ for (int i = 0; i < n; i++) {
2900
+ ext_count += count_exts_in_msg(msgs[i]);
2901
+ }
2902
+ file->ext_count = ext_count;
1936
2903
 
1937
- /* In the second pass we increment these as defs are added. */
1938
- file->msg_count = 0;
1939
- file->enum_count = 0;
1940
- file->ext_count = 0;
2904
+ if (ctx->layout) {
2905
+ /* We are using the ext layouts that were passed in. */
2906
+ file->ext_layouts = ctx->layout->exts;
2907
+ if (ctx->layout->ext_count != file->ext_count) {
2908
+ symtab_errf(ctx, "Extension count did not match layout (%d vs %d)",
2909
+ ctx->layout->ext_count, file->ext_count);
2910
+ }
2911
+ } else {
2912
+ /* We are building ext layouts from scratch. */
2913
+ file->ext_layouts =
2914
+ symtab_alloc(ctx, sizeof(*file->ext_layouts) * file->ext_count);
2915
+ upb_MiniTable_Extension* ext =
2916
+ symtab_alloc(ctx, sizeof(*ext) * file->ext_count);
2917
+ for (int i = 0; i < file->ext_count; i++) {
2918
+ file->ext_layouts[i] = &ext[i];
2919
+ }
2920
+ }
1941
2921
 
1942
2922
  if (!google_protobuf_FileDescriptorProto_has_name(file_proto)) {
1943
2923
  symtab_errf(ctx, "File has no name");
@@ -1945,11 +2925,9 @@ static void build_filedef(
1945
2925
 
1946
2926
  file->name =
1947
2927
  strviewdup(ctx, google_protobuf_FileDescriptorProto_name(file_proto));
1948
- file->phpprefix = NULL;
1949
- file->phpnamespace = NULL;
1950
2928
 
1951
2929
  if (google_protobuf_FileDescriptorProto_has_package(file_proto)) {
1952
- upb_strview package =
2930
+ upb_StringView package =
1953
2931
  google_protobuf_FileDescriptorProto_package(file_proto);
1954
2932
  check_ident(ctx, package, true);
1955
2933
  file->package = strviewdup(ctx, package);
@@ -1958,133 +2936,189 @@ static void build_filedef(
1958
2936
  }
1959
2937
 
1960
2938
  if (google_protobuf_FileDescriptorProto_has_syntax(file_proto)) {
1961
- upb_strview syntax =
2939
+ upb_StringView syntax =
1962
2940
  google_protobuf_FileDescriptorProto_syntax(file_proto);
1963
2941
 
1964
2942
  if (streql_view(syntax, "proto2")) {
1965
- file->syntax = UPB_SYNTAX_PROTO2;
2943
+ file->syntax = kUpb_Syntax_Proto2;
1966
2944
  } else if (streql_view(syntax, "proto3")) {
1967
- file->syntax = UPB_SYNTAX_PROTO3;
2945
+ file->syntax = kUpb_Syntax_Proto3;
1968
2946
  } else {
1969
- symtab_errf(ctx, "Invalid syntax '" UPB_STRVIEW_FORMAT "'",
1970
- UPB_STRVIEW_ARGS(syntax));
2947
+ symtab_errf(ctx, "Invalid syntax '" UPB_STRINGVIEW_FORMAT "'",
2948
+ UPB_STRINGVIEW_ARGS(syntax));
1971
2949
  }
1972
2950
  } else {
1973
- file->syntax = UPB_SYNTAX_PROTO2;
2951
+ file->syntax = kUpb_Syntax_Proto2;
1974
2952
  }
1975
2953
 
1976
2954
  /* Read options. */
1977
- file_options_proto = google_protobuf_FileDescriptorProto_options(file_proto);
1978
- if (file_options_proto) {
1979
- if (google_protobuf_FileOptions_has_php_class_prefix(file_options_proto)) {
1980
- file->phpprefix = strviewdup(
1981
- ctx,
1982
- google_protobuf_FileOptions_php_class_prefix(file_options_proto));
1983
- }
1984
- if (google_protobuf_FileOptions_has_php_namespace(file_options_proto)) {
1985
- file->phpnamespace = strviewdup(
1986
- ctx, google_protobuf_FileOptions_php_namespace(file_options_proto));
1987
- }
1988
- }
2955
+ SET_OPTIONS(file->opts, FileDescriptorProto, FileOptions, file_proto);
1989
2956
 
1990
2957
  /* Verify dependencies. */
1991
2958
  strs = google_protobuf_FileDescriptorProto_dependency(file_proto, &n);
2959
+ file->dep_count = n;
1992
2960
  file->deps = symtab_alloc(ctx, sizeof(*file->deps) * n);
1993
2961
 
1994
2962
  for (i = 0; i < n; i++) {
1995
- upb_strview dep_name = strs[i];
1996
- upb_value v;
1997
- if (!upb_strtable_lookup2(&ctx->symtab->files, dep_name.data,
1998
- dep_name.size, &v)) {
2963
+ upb_StringView str = strs[i];
2964
+ file->deps[i] =
2965
+ upb_DefPool_FindFileByNameWithSize(ctx->symtab, str.data, str.size);
2966
+ if (!file->deps[i]) {
1999
2967
  symtab_errf(ctx,
2000
- "Depends on file '" UPB_STRVIEW_FORMAT
2968
+ "Depends on file '" UPB_STRINGVIEW_FORMAT
2001
2969
  "', but it has not been loaded",
2002
- UPB_STRVIEW_ARGS(dep_name));
2970
+ UPB_STRINGVIEW_ARGS(str));
2003
2971
  }
2004
- file->deps[i] = upb_value_getconstptr(v);
2005
2972
  }
2006
2973
 
2007
- /* Create messages. */
2008
- msgs = google_protobuf_FileDescriptorProto_message_type(file_proto, &n);
2974
+ public_deps =
2975
+ google_protobuf_FileDescriptorProto_public_dependency(file_proto, &n);
2976
+ file->public_dep_count = n;
2977
+ file->public_deps = symtab_alloc(ctx, sizeof(*file->public_deps) * n);
2978
+ int32_t* mutable_public_deps = (int32_t*)file->public_deps;
2009
2979
  for (i = 0; i < n; i++) {
2010
- create_msgdef(ctx, file->package, msgs[i]);
2980
+ if (public_deps[i] >= file->dep_count) {
2981
+ symtab_errf(ctx, "public_dep %d is out of range", (int)public_deps[i]);
2982
+ }
2983
+ mutable_public_deps[i] = public_deps[i];
2984
+ }
2985
+
2986
+ weak_deps =
2987
+ google_protobuf_FileDescriptorProto_weak_dependency(file_proto, &n);
2988
+ file->weak_dep_count = n;
2989
+ file->weak_deps = symtab_alloc(ctx, sizeof(*file->weak_deps) * n);
2990
+ int32_t* mutable_weak_deps = (int32_t*)file->weak_deps;
2991
+ for (i = 0; i < n; i++) {
2992
+ if (weak_deps[i] >= file->dep_count) {
2993
+ symtab_errf(ctx, "weak_dep %d is out of range", (int)weak_deps[i]);
2994
+ }
2995
+ mutable_weak_deps[i] = weak_deps[i];
2011
2996
  }
2012
2997
 
2013
2998
  /* Create enums. */
2014
2999
  enums = google_protobuf_FileDescriptorProto_enum_type(file_proto, &n);
3000
+ file->top_lvl_enum_count = n;
3001
+ file->top_lvl_enums = symtab_alloc(ctx, sizeof(*file->top_lvl_enums) * n);
2015
3002
  for (i = 0; i < n; i++) {
2016
- create_enumdef(ctx, file->package, enums[i]);
3003
+ create_enumdef(ctx, file->package, enums[i], NULL, &file->top_lvl_enums[i]);
2017
3004
  }
2018
3005
 
2019
3006
  /* Create extensions. */
2020
3007
  exts = google_protobuf_FileDescriptorProto_extension(file_proto, &n);
2021
- file->exts = symtab_alloc(ctx, sizeof(*file->exts) * n);
3008
+ file->top_lvl_ext_count = n;
3009
+ file->top_lvl_exts = symtab_alloc(ctx, sizeof(*file->top_lvl_exts) * n);
2022
3010
  for (i = 0; i < n; i++) {
2023
- create_fielddef(ctx, file->package, NULL, exts[i]);
3011
+ create_fielddef(ctx, file->package, NULL, exts[i], &file->top_lvl_exts[i],
3012
+ /* is_extension= */ true);
3013
+ ((upb_FieldDef*)&file->top_lvl_exts[i])->index_ = i;
2024
3014
  }
2025
3015
 
2026
- /* Now that all names are in the table, build layouts and resolve refs. */
2027
- for (i = 0; i < (size_t)file->ext_count; i++) {
2028
- resolve_fielddef(ctx, file->package, (upb_fielddef*)&file->exts[i]);
3016
+ /* Create messages. */
3017
+ msgs = google_protobuf_FileDescriptorProto_message_type(file_proto, &n);
3018
+ file->top_lvl_msg_count = n;
3019
+ file->top_lvl_msgs = symtab_alloc(ctx, sizeof(*file->top_lvl_msgs) * n);
3020
+ for (i = 0; i < n; i++) {
3021
+ create_msgdef(ctx, file->package, msgs[i], NULL, &file->top_lvl_msgs[i]);
2029
3022
  }
2030
3023
 
2031
- for (i = 0; i < (size_t)file->msg_count; i++) {
2032
- const upb_msgdef *m = &file->msgs[i];
2033
- int j;
2034
- for (j = 0; j < m->field_count; j++) {
2035
- resolve_fielddef(ctx, m->full_name, (upb_fielddef*)&m->fields[j]);
2036
- }
3024
+ /* Create services. */
3025
+ services = google_protobuf_FileDescriptorProto_service(file_proto, &n);
3026
+ file->service_count = n;
3027
+ file->services = symtab_alloc(ctx, sizeof(*file->services) * n);
3028
+ for (i = 0; i < n; i++) {
3029
+ create_service(ctx, services[i], &file->services[i]);
3030
+ ((upb_ServiceDef*)&file->services[i])->index = i;
2037
3031
  }
2038
3032
 
2039
- if (!ctx->layouts) {
2040
- for (i = 0; i < (size_t)file->msg_count; i++) {
2041
- const upb_msgdef *m = &file->msgs[i];
2042
- make_layout(ctx, m);
2043
- }
3033
+ /* Now that all names are in the table, build layouts and resolve refs. */
3034
+ for (i = 0; i < (size_t)file->top_lvl_ext_count; i++) {
3035
+ resolve_fielddef(ctx, file->package, (upb_FieldDef*)&file->top_lvl_exts[i]);
2044
3036
  }
2045
- }
2046
3037
 
2047
- static void remove_filedef(upb_symtab *s, upb_filedef *file) {
2048
- int i;
2049
- for (i = 0; i < file->msg_count; i++) {
2050
- const char *name = file->msgs[i].full_name;
2051
- upb_strtable_remove(&s->syms, name, strlen(name), NULL);
3038
+ for (i = 0; i < (size_t)file->top_lvl_msg_count; i++) {
3039
+ resolve_msgdef(ctx, (upb_MessageDef*)&file->top_lvl_msgs[i]);
2052
3040
  }
2053
- for (i = 0; i < file->enum_count; i++) {
2054
- const char *name = file->enums[i].full_name;
2055
- upb_strtable_remove(&s->syms, name, strlen(name), NULL);
3041
+
3042
+ if (file->ext_count) {
3043
+ CHK_OOM(_upb_extreg_add(ctx->symtab->extreg, file->ext_layouts,
3044
+ file->ext_count));
2056
3045
  }
2057
- for (i = 0; i < file->ext_count; i++) {
2058
- const char *name = file->exts[i].full_name;
2059
- upb_strtable_remove(&s->syms, name, strlen(name), NULL);
3046
+ }
3047
+
3048
+ static void remove_filedef(upb_DefPool* s, upb_FileDef* file) {
3049
+ intptr_t iter = UPB_INTTABLE_BEGIN;
3050
+ upb_StringView key;
3051
+ upb_value val;
3052
+ while (upb_strtable_next2(&s->syms, &key, &val, &iter)) {
3053
+ const upb_FileDef* f;
3054
+ switch (deftype(val)) {
3055
+ case UPB_DEFTYPE_EXT:
3056
+ f = upb_FieldDef_File(unpack_def(val, UPB_DEFTYPE_EXT));
3057
+ break;
3058
+ case UPB_DEFTYPE_MSG:
3059
+ f = upb_MessageDef_File(unpack_def(val, UPB_DEFTYPE_MSG));
3060
+ break;
3061
+ case UPB_DEFTYPE_ENUM:
3062
+ f = upb_EnumDef_File(unpack_def(val, UPB_DEFTYPE_ENUM));
3063
+ break;
3064
+ case UPB_DEFTYPE_ENUMVAL:
3065
+ f = upb_EnumDef_File(
3066
+ upb_EnumValueDef_Enum(unpack_def(val, UPB_DEFTYPE_ENUMVAL)));
3067
+ break;
3068
+ case UPB_DEFTYPE_SERVICE:
3069
+ f = upb_ServiceDef_File(unpack_def(val, UPB_DEFTYPE_SERVICE));
3070
+ break;
3071
+ default:
3072
+ UPB_UNREACHABLE();
3073
+ }
3074
+
3075
+ if (f == file) upb_strtable_removeiter(&s->syms, &iter);
2060
3076
  }
2061
3077
  }
2062
3078
 
2063
- static const upb_filedef *_upb_symtab_addfile(
2064
- upb_symtab *s, const google_protobuf_FileDescriptorProto *file_proto,
2065
- const upb_msglayout **layouts, upb_status *status) {
3079
+ static const upb_FileDef* _upb_DefPool_AddFile(
3080
+ upb_DefPool* s, const google_protobuf_FileDescriptorProto* file_proto,
3081
+ const upb_MiniTable_File* layout, upb_Status* status) {
2066
3082
  symtab_addctx ctx;
2067
- upb_strview name = google_protobuf_FileDescriptorProto_name(file_proto);
3083
+ upb_StringView name = google_protobuf_FileDescriptorProto_name(file_proto);
3084
+ upb_value v;
2068
3085
 
2069
- if (upb_strtable_lookup2(&s->files, name.data, name.size, NULL)) {
2070
- upb_status_seterrf(status, "duplicate file name (%.*s)",
2071
- UPB_STRVIEW_ARGS(name));
2072
- return NULL;
3086
+ if (upb_strtable_lookup2(&s->files, name.data, name.size, &v)) {
3087
+ if (unpack_def(v, UPB_DEFTYPE_FILE)) {
3088
+ upb_Status_SetErrorFormat(status, "duplicate file name (%.*s)",
3089
+ UPB_STRINGVIEW_ARGS(name));
3090
+ return NULL;
3091
+ }
3092
+ const upb_MiniTable_File* registered = unpack_def(v, UPB_DEFTYPE_LAYOUT);
3093
+ UPB_ASSERT(registered);
3094
+ if (layout && layout != registered) {
3095
+ upb_Status_SetErrorFormat(
3096
+ status, "tried to build with a different layout (filename=%.*s)",
3097
+ UPB_STRINGVIEW_ARGS(name));
3098
+ return NULL;
3099
+ }
3100
+ layout = registered;
2073
3101
  }
2074
3102
 
2075
3103
  ctx.symtab = s;
2076
- ctx.layouts = layouts;
3104
+ ctx.layout = layout;
3105
+ ctx.msg_count = 0;
3106
+ ctx.enum_count = 0;
3107
+ ctx.ext_count = 0;
2077
3108
  ctx.status = status;
2078
3109
  ctx.file = NULL;
2079
- ctx.arena = upb_arena_new();
3110
+ ctx.arena = upb_Arena_New();
3111
+ ctx.tmp_arena = upb_Arena_New();
2080
3112
 
2081
- if (!ctx.arena) {
2082
- upb_status_setoom(status);
3113
+ if (!ctx.arena || !ctx.tmp_arena) {
3114
+ if (ctx.arena) upb_Arena_Free(ctx.arena);
3115
+ if (ctx.tmp_arena) upb_Arena_Free(ctx.tmp_arena);
3116
+ upb_Status_setoom(status);
2083
3117
  return NULL;
2084
3118
  }
2085
3119
 
2086
3120
  if (UPB_UNLIKELY(UPB_SETJMP(ctx.err))) {
2087
- UPB_ASSERT(!upb_ok(status));
3121
+ UPB_ASSERT(!upb_Status_IsOk(status));
2088
3122
  if (ctx.file) {
2089
3123
  remove_filedef(s, ctx.file);
2090
3124
  ctx.file = NULL;
@@ -2093,51 +3127,53 @@ static const upb_filedef *_upb_symtab_addfile(
2093
3127
  ctx.file = symtab_alloc(&ctx, sizeof(*ctx.file));
2094
3128
  build_filedef(&ctx, ctx.file, file_proto);
2095
3129
  upb_strtable_insert(&s->files, name.data, name.size,
2096
- upb_value_constptr(ctx.file), ctx.arena);
2097
- UPB_ASSERT(upb_ok(status));
2098
- upb_arena_fuse(s->arena, ctx.arena);
3130
+ pack_def(ctx.file, UPB_DEFTYPE_FILE), ctx.arena);
3131
+ UPB_ASSERT(upb_Status_IsOk(status));
3132
+ upb_Arena_Fuse(s->arena, ctx.arena);
2099
3133
  }
2100
3134
 
2101
- upb_arena_free(ctx.arena);
3135
+ upb_Arena_Free(ctx.arena);
3136
+ upb_Arena_Free(ctx.tmp_arena);
2102
3137
  return ctx.file;
2103
3138
  }
2104
3139
 
2105
- const upb_filedef *upb_symtab_addfile(
2106
- upb_symtab *s, const google_protobuf_FileDescriptorProto *file_proto,
2107
- upb_status *status) {
2108
- return _upb_symtab_addfile(s, file_proto, NULL, status);
3140
+ const upb_FileDef* upb_DefPool_AddFile(
3141
+ upb_DefPool* s, const google_protobuf_FileDescriptorProto* file_proto,
3142
+ upb_Status* status) {
3143
+ return _upb_DefPool_AddFile(s, file_proto, NULL, status);
2109
3144
  }
2110
3145
 
2111
3146
  /* Include here since we want most of this file to be stdio-free. */
2112
3147
  #include <stdio.h>
2113
3148
 
2114
- bool _upb_symtab_loaddefinit(upb_symtab *s, const upb_def_init *init) {
3149
+ bool _upb_DefPool_LoadDefInitEx(upb_DefPool* s, const _upb_DefPool_Init* init,
3150
+ bool rebuild_minitable) {
2115
3151
  /* Since this function should never fail (it would indicate a bug in upb) we
2116
3152
  * print errors to stderr instead of returning error status to the user. */
2117
- upb_def_init **deps = init->deps;
2118
- google_protobuf_FileDescriptorProto *file;
2119
- upb_arena *arena;
2120
- upb_status status;
3153
+ _upb_DefPool_Init** deps = init->deps;
3154
+ google_protobuf_FileDescriptorProto* file;
3155
+ upb_Arena* arena;
3156
+ upb_Status status;
2121
3157
 
2122
- upb_status_clear(&status);
3158
+ upb_Status_Clear(&status);
2123
3159
 
2124
- if (upb_strtable_lookup(&s->files, init->filename, NULL)) {
3160
+ if (upb_DefPool_FindFileByName(s, init->filename)) {
2125
3161
  return true;
2126
3162
  }
2127
3163
 
2128
- arena = upb_arena_new();
3164
+ arena = upb_Arena_New();
2129
3165
 
2130
3166
  for (; *deps; deps++) {
2131
- if (!_upb_symtab_loaddefinit(s, *deps)) goto err;
3167
+ if (!_upb_DefPool_LoadDefInitEx(s, *deps, rebuild_minitable)) goto err;
2132
3168
  }
2133
3169
 
2134
3170
  file = google_protobuf_FileDescriptorProto_parse_ex(
2135
- init->descriptor.data, init->descriptor.size, NULL, UPB_DECODE_ALIAS,
2136
- arena);
3171
+ init->descriptor.data, init->descriptor.size, NULL,
3172
+ kUpb_DecodeOption_AliasString, arena);
2137
3173
  s->bytes_loaded += init->descriptor.size;
2138
3174
 
2139
3175
  if (!file) {
2140
- upb_status_seterrf(
3176
+ upb_Status_SetErrorFormat(
2141
3177
  &status,
2142
3178
  "Failed to parse compiled-in descriptor for file '%s'. This should "
2143
3179
  "never happen.",
@@ -2145,24 +3181,81 @@ bool _upb_symtab_loaddefinit(upb_symtab *s, const upb_def_init *init) {
2145
3181
  goto err;
2146
3182
  }
2147
3183
 
2148
- if (!_upb_symtab_addfile(s, file, init->layouts, &status)) goto err;
3184
+ const upb_MiniTable_File* mt = rebuild_minitable ? NULL : init->layout;
3185
+ if (!_upb_DefPool_AddFile(s, file, mt, &status)) {
3186
+ goto err;
3187
+ }
2149
3188
 
2150
- upb_arena_free(arena);
3189
+ upb_Arena_Free(arena);
2151
3190
  return true;
2152
3191
 
2153
3192
  err:
2154
- fprintf(stderr, "Error loading compiled-in descriptor: %s\n",
2155
- upb_status_errmsg(&status));
2156
- upb_arena_free(arena);
3193
+ fprintf(stderr,
3194
+ "Error loading compiled-in descriptor for file '%s' (this should "
3195
+ "never happen): %s\n",
3196
+ init->filename, upb_Status_ErrorMessage(&status));
3197
+ upb_Arena_Free(arena);
2157
3198
  return false;
2158
3199
  }
2159
3200
 
2160
- size_t _upb_symtab_bytesloaded(const upb_symtab *s) {
3201
+ size_t _upb_DefPool_BytesLoaded(const upb_DefPool* s) {
2161
3202
  return s->bytes_loaded;
2162
3203
  }
2163
3204
 
2164
- upb_arena *_upb_symtab_arena(const upb_symtab *s) {
2165
- return s->arena;
3205
+ upb_Arena* _upb_DefPool_Arena(const upb_DefPool* s) { return s->arena; }
3206
+
3207
+ const upb_FieldDef* _upb_DefPool_FindExtensionByMiniTable(
3208
+ const upb_DefPool* s, const upb_MiniTable_Extension* ext) {
3209
+ upb_value v;
3210
+ bool ok = upb_inttable_lookup(&s->exts, (uintptr_t)ext, &v);
3211
+ UPB_ASSERT(ok);
3212
+ return upb_value_getconstptr(v);
3213
+ }
3214
+
3215
+ const upb_FieldDef* upb_DefPool_FindExtensionByNumber(const upb_DefPool* s,
3216
+ const upb_MessageDef* m,
3217
+ int32_t fieldnum) {
3218
+ const upb_MiniTable* l = upb_MessageDef_MiniTable(m);
3219
+ const upb_MiniTable_Extension* ext = _upb_extreg_get(s->extreg, l, fieldnum);
3220
+ return ext ? _upb_DefPool_FindExtensionByMiniTable(s, ext) : NULL;
3221
+ }
3222
+
3223
+ bool _upb_DefPool_registerlayout(upb_DefPool* s, const char* filename,
3224
+ const upb_MiniTable_File* file) {
3225
+ if (upb_DefPool_FindFileByName(s, filename)) return false;
3226
+ upb_value v = pack_def(file, UPB_DEFTYPE_LAYOUT);
3227
+ return upb_strtable_insert(&s->files, filename, strlen(filename), v,
3228
+ s->arena);
3229
+ }
3230
+
3231
+ const upb_ExtensionRegistry* upb_DefPool_ExtensionRegistry(
3232
+ const upb_DefPool* s) {
3233
+ return s->extreg;
3234
+ }
3235
+
3236
+ const upb_FieldDef** upb_DefPool_GetAllExtensions(const upb_DefPool* s,
3237
+ const upb_MessageDef* m,
3238
+ size_t* count) {
3239
+ size_t n = 0;
3240
+ intptr_t iter = UPB_INTTABLE_BEGIN;
3241
+ uintptr_t key;
3242
+ upb_value val;
3243
+ // This is O(all exts) instead of O(exts for m). If we need this to be
3244
+ // efficient we may need to make extreg into a two-level table, or have a
3245
+ // second per-message index.
3246
+ while (upb_inttable_next2(&s->exts, &key, &val, &iter)) {
3247
+ const upb_FieldDef* f = upb_value_getconstptr(val);
3248
+ if (upb_FieldDef_ContainingType(f) == m) n++;
3249
+ }
3250
+ const upb_FieldDef** exts = malloc(n * sizeof(*exts));
3251
+ iter = UPB_INTTABLE_BEGIN;
3252
+ size_t i = 0;
3253
+ while (upb_inttable_next2(&s->exts, &key, &val, &iter)) {
3254
+ const upb_FieldDef* f = upb_value_getconstptr(val);
3255
+ if (upb_FieldDef_ContainingType(f) == m) exts[i++] = f;
3256
+ }
3257
+ *count = n;
3258
+ return exts;
2166
3259
  }
2167
3260
 
2168
3261
  #undef CHK_OOM