grpc 1.42.0 → 1.45.0

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