grpc 1.40.0 → 1.41.0.pre2

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 (827) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +27 -36
  3. data/include/grpc/byte_buffer.h +1 -1
  4. data/include/grpc/byte_buffer_reader.h +1 -1
  5. data/include/grpc/event_engine/endpoint_config.h +6 -11
  6. data/include/grpc/event_engine/event_engine.h +63 -58
  7. data/include/grpc/event_engine/port.h +1 -3
  8. data/include/grpc/event_engine/slice_allocator.h +6 -1
  9. data/include/grpc/fork.h +1 -1
  10. data/include/grpc/grpc.h +10 -4
  11. data/include/grpc/grpc_posix.h +5 -2
  12. data/include/grpc/impl/codegen/atm.h +5 -3
  13. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  14. data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
  15. data/include/grpc/impl/codegen/atm_windows.h +2 -0
  16. data/include/grpc/impl/codegen/byte_buffer.h +2 -0
  17. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -0
  18. data/include/grpc/impl/codegen/compression_types.h +2 -0
  19. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  20. data/include/grpc/impl/codegen/fork.h +2 -0
  21. data/include/grpc/impl/codegen/gpr_slice.h +2 -0
  22. data/include/grpc/impl/codegen/gpr_types.h +2 -0
  23. data/include/grpc/impl/codegen/grpc_types.h +4 -5
  24. data/include/grpc/impl/codegen/log.h +2 -0
  25. data/include/grpc/impl/codegen/port_platform.h +26 -22
  26. data/include/grpc/impl/codegen/propagation_bits.h +2 -0
  27. data/include/grpc/impl/codegen/slice.h +2 -0
  28. data/include/grpc/impl/codegen/status.h +2 -0
  29. data/include/grpc/impl/codegen/sync.h +8 -5
  30. data/include/grpc/impl/codegen/sync_abseil.h +2 -0
  31. data/include/grpc/impl/codegen/sync_custom.h +2 -0
  32. data/include/grpc/impl/codegen/sync_generic.h +3 -0
  33. data/include/grpc/impl/codegen/sync_posix.h +4 -2
  34. data/include/grpc/impl/codegen/sync_windows.h +2 -0
  35. data/include/grpc/slice.h +1 -1
  36. data/include/grpc/status.h +1 -1
  37. data/include/grpc/support/atm.h +1 -1
  38. data/include/grpc/support/atm_gcc_atomic.h +1 -1
  39. data/include/grpc/support/atm_gcc_sync.h +1 -1
  40. data/include/grpc/support/atm_windows.h +1 -1
  41. data/include/grpc/support/log.h +1 -1
  42. data/include/grpc/support/port_platform.h +1 -1
  43. data/include/grpc/support/sync.h +1 -1
  44. data/include/grpc/support/sync_abseil.h +1 -1
  45. data/include/grpc/support/sync_custom.h +1 -1
  46. data/include/grpc/support/sync_generic.h +1 -1
  47. data/include/grpc/support/sync_posix.h +1 -1
  48. data/include/grpc/support/sync_windows.h +1 -1
  49. data/include/grpc/support/time.h +2 -2
  50. data/src/core/ext/filters/census/grpc_context.cc +1 -0
  51. data/src/core/ext/filters/client_channel/backend_metric.cc +0 -1
  52. data/src/core/ext/filters/client_channel/backup_poller.h +1 -0
  53. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -2
  54. data/src/core/ext/filters/client_channel/client_channel.cc +24 -52
  55. data/src/core/ext/filters/client_channel/client_channel.h +3 -3
  56. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -5
  57. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  58. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -0
  59. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -1
  60. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  61. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -6
  62. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -3
  63. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +8 -7
  64. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -2
  65. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -2
  66. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +2 -8
  67. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  68. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +2 -2
  69. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  70. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -1
  71. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -23
  72. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +1 -0
  73. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +2 -2
  74. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +2 -8
  75. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +15 -18
  76. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +10 -7
  77. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +2 -8
  78. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +2 -3
  79. data/src/core/ext/filters/client_channel/lb_policy.h +11 -44
  80. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -7
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -10
  82. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -3
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -5
  85. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +14 -19
  86. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -0
  87. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  88. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  89. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +5 -8
  90. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +2 -3
  91. data/src/core/ext/filters/client_idle/client_idle_filter.cc +36 -30
  92. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +8 -6
  93. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -13
  94. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -2
  95. data/src/core/ext/filters/http/client_authority_filter.cc +2 -1
  96. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +2 -1
  97. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +7 -8
  98. data/src/core/ext/filters/http/server/http_server_filter.cc +5 -3
  99. data/src/core/ext/filters/message_size/message_size_filter.cc +9 -13
  100. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
  101. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +29 -12
  102. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -0
  103. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -3
  104. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +10 -6
  105. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +2 -3
  106. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +60 -37
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -1
  108. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -6
  109. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +5 -9
  110. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -1
  111. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  112. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  113. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +4 -3
  114. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +2 -2
  115. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +24 -30
  116. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -1
  117. data/src/core/ext/transport/chttp2/transport/context_list.h +1 -2
  118. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -23
  119. data/src/core/ext/transport/chttp2/transport/flow_control.h +9 -3
  120. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -7
  121. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -0
  122. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -3
  123. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -0
  124. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  125. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -0
  126. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +3 -5
  127. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -0
  128. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +36 -5
  129. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -0
  130. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +12 -7
  131. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -0
  132. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +41 -0
  133. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +272 -666
  134. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +236 -70
  135. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +107 -0
  136. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +86 -0
  137. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +69 -0
  138. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +776 -1037
  139. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +48 -169
  140. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +159 -0
  141. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +130 -0
  142. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +46 -0
  143. data/src/core/ext/transport/chttp2/transport/hpack_utils.h +30 -0
  144. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  145. data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
  146. data/src/core/ext/transport/chttp2/transport/parsing.cc +20 -30
  147. data/src/core/ext/transport/chttp2/transport/popularity_count.h +60 -0
  148. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -2
  149. data/src/core/ext/transport/chttp2/transport/varint.cc +7 -3
  150. data/src/core/ext/transport/chttp2/transport/varint.h +39 -28
  151. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -28
  152. data/src/core/ext/transport/inproc/inproc_transport.cc +6 -4
  153. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +96 -96
  154. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +221 -89
  155. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +1 -1
  156. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -1
  157. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +3 -3
  158. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +11 -5
  159. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +48 -48
  160. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +151 -61
  161. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +99 -99
  162. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +171 -69
  163. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +15 -15
  164. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +31 -13
  165. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +126 -127
  166. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +229 -101
  167. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +4 -4
  168. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +11 -5
  169. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +23 -23
  170. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +11 -5
  171. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +28 -28
  172. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +71 -29
  173. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  174. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +11 -5
  175. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +82 -82
  176. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +201 -81
  177. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +24 -24
  178. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +51 -21
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +3 -3
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +11 -5
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +9 -9
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +21 -9
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +62 -62
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +131 -53
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +51 -51
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +81 -33
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +5 -5
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +11 -5
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +62 -62
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +141 -57
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +3 -3
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +11 -5
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +7 -7
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +21 -9
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +8 -8
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +11 -5
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +11 -5
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +11 -5
  201. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +16 -16
  202. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +31 -13
  203. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +57 -22
  204. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +174 -17
  205. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  206. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +51 -21
  207. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +3 -3
  208. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -5
  209. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -37
  210. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +61 -25
  211. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +40 -40
  212. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +71 -29
  213. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +9 -9
  214. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +11 -5
  215. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +5 -5
  216. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +21 -9
  217. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +30 -30
  218. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +81 -33
  219. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +41 -29
  220. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +141 -43
  221. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +46 -43
  222. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +88 -29
  223. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +18 -18
  224. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +31 -13
  225. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +281 -277
  226. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +569 -248
  227. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +10 -10
  228. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +31 -13
  229. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +6 -6
  230. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +21 -9
  231. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +3 -3
  232. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +11 -5
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +13 -13
  234. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +51 -21
  235. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +23 -23
  236. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +31 -13
  237. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
  238. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +11 -5
  239. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +115 -116
  240. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +191 -77
  241. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +1 -1
  242. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -1
  243. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +46 -32
  244. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +118 -34
  245. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +12 -12
  246. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +31 -13
  247. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +44 -42
  248. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +108 -55
  249. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +2 -2
  250. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +11 -5
  251. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +2 -2
  252. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +11 -5
  253. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +42 -42
  254. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +61 -25
  255. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +2 -2
  256. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +11 -5
  257. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +2 -2
  258. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +11 -5
  259. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +9 -9
  260. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +21 -9
  261. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +2 -2
  262. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +11 -5
  263. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +2 -2
  264. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +11 -5
  265. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +28 -28
  266. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +51 -21
  267. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  268. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +41 -17
  269. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +9 -8
  270. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -9
  271. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +4 -4
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +11 -5
  273. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +4 -4
  274. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +11 -5
  275. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +3 -3
  276. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +11 -5
  277. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +9 -9
  278. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +31 -13
  279. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +10 -10
  280. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +21 -9
  281. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +6 -6
  282. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +21 -9
  283. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +11 -11
  284. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +31 -13
  285. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +15 -15
  286. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +71 -29
  287. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +19 -19
  288. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +51 -21
  289. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +1 -1
  290. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -1
  291. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +6 -6
  292. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +21 -9
  293. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +10 -10
  294. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +31 -13
  295. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +5 -5
  296. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +11 -5
  297. data/src/core/ext/upb-generated/google/api/annotations.upb.c +1 -1
  298. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  299. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +58 -58
  300. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +111 -45
  301. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +68 -68
  302. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +121 -49
  303. data/src/core/ext/upb-generated/google/api/http.upb.c +18 -18
  304. data/src/core/ext/upb-generated/google/api/http.upb.h +31 -13
  305. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +4 -4
  306. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +11 -5
  307. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +153 -153
  308. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +271 -109
  309. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +4 -4
  310. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +11 -5
  311. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +2 -2
  312. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +11 -5
  313. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  314. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +31 -13
  315. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +4 -4
  316. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +11 -5
  317. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +19 -19
  318. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +91 -37
  319. data/src/core/ext/upb-generated/google/rpc/status.upb.c +5 -5
  320. data/src/core/ext/upb-generated/google/rpc/status.upb.h +11 -5
  321. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  322. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -5
  323. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +60 -60
  324. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +101 -41
  325. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +7 -7
  326. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -9
  327. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +5 -5
  328. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +21 -9
  329. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  330. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +91 -37
  331. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +8 -8
  332. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +31 -13
  333. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +4 -4
  334. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +11 -5
  335. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +1 -1
  336. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -1
  337. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +4 -4
  338. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +11 -5
  339. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +3 -3
  340. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +11 -5
  341. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +13 -13
  342. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +11 -5
  343. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +4 -4
  344. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +11 -5
  345. data/src/core/ext/upb-generated/validate/validate.upb.c +220 -220
  346. data/src/core/ext/upb-generated/validate/validate.upb.h +231 -93
  347. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +3 -3
  348. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +11 -5
  349. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  350. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +21 -9
  351. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +6 -6
  352. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +11 -5
  353. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +11 -5
  355. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +11 -11
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +21 -9
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +6 -6
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +11 -5
  359. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +384 -382
  360. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +94 -63
  361. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +10 -0
  362. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +30 -19
  363. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  364. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +791 -780
  365. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +96 -100
  366. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +133 -115
  367. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -0
  368. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +178 -173
  369. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +14 -13
  370. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +103 -103
  371. data/src/core/ext/xds/certificate_provider_registry.cc +2 -2
  372. data/src/core/ext/xds/xds_api.cc +788 -910
  373. data/src/core/ext/xds/xds_api.h +16 -33
  374. data/src/core/ext/xds/xds_bootstrap.cc +27 -52
  375. data/src/core/ext/xds/xds_client.cc +69 -30
  376. data/src/core/ext/xds/xds_client_stats.cc +16 -15
  377. data/src/core/ext/xds/xds_client_stats.h +6 -6
  378. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -3
  379. data/src/core/ext/xds/xds_http_fault_filter.h +3 -2
  380. data/src/core/ext/xds/xds_http_filters.cc +1 -0
  381. data/src/core/ext/xds/xds_server_config_fetcher.cc +10 -10
  382. data/src/core/lib/address_utils/parse_address.cc +4 -8
  383. data/src/core/lib/address_utils/sockaddr_utils.cc +2 -2
  384. data/src/core/lib/channel/channel_args.cc +2 -1
  385. data/src/core/lib/channel/channel_stack.cc +5 -3
  386. data/src/core/lib/channel/channel_stack_builder.cc +1 -11
  387. data/src/core/lib/channel/channel_stack_builder.h +0 -8
  388. data/src/core/lib/channel/channel_trace.cc +4 -3
  389. data/src/core/lib/channel/channel_trace.h +1 -0
  390. data/src/core/lib/channel/channelz.cc +40 -36
  391. data/src/core/lib/channel/channelz.h +27 -27
  392. data/src/core/lib/channel/channelz_registry.cc +7 -6
  393. data/src/core/lib/channel/connected_channel.cc +1 -0
  394. data/src/core/lib/channel/handshaker.cc +2 -1
  395. data/src/core/lib/channel/handshaker.h +1 -2
  396. data/src/core/lib/channel/handshaker_factory.h +10 -2
  397. data/src/core/lib/channel/handshaker_registry.cc +15 -70
  398. data/src/core/lib/channel/handshaker_registry.h +29 -12
  399. data/src/core/lib/channel/status_util.h +2 -2
  400. data/src/core/lib/compression/algorithm_metadata.h +1 -0
  401. data/src/core/lib/compression/compression_args.cc +2 -1
  402. data/src/core/lib/compression/compression_internal.cc +2 -4
  403. data/src/core/lib/compression/message_compress.cc +2 -2
  404. data/src/core/lib/compression/stream_compression.cc +2 -1
  405. data/src/core/lib/compression/stream_compression.h +2 -1
  406. data/src/core/lib/compression/stream_compression_gzip.cc +2 -1
  407. data/src/core/lib/compression/stream_compression_identity.cc +2 -1
  408. data/src/core/lib/config/core_configuration.cc +54 -0
  409. data/src/core/lib/config/core_configuration.h +108 -0
  410. data/src/core/lib/debug/stats.h +1 -0
  411. data/src/core/lib/debug/stats_data.cc +2 -1
  412. data/src/core/lib/debug/stats_data.h +1 -0
  413. data/src/core/lib/debug/trace.cc +1 -0
  414. data/src/core/lib/debug/trace.h +2 -1
  415. data/src/core/lib/event_engine/endpoint_config.cc +0 -1
  416. data/src/core/lib/event_engine/event_engine.cc +3 -3
  417. data/src/core/lib/event_engine/sockaddr.cc +3 -3
  418. data/src/core/lib/gpr/alloc.cc +4 -3
  419. data/src/core/lib/gpr/env_linux.cc +1 -2
  420. data/src/core/lib/gpr/env_posix.cc +2 -3
  421. data/src/core/lib/gpr/log.cc +3 -3
  422. data/src/core/lib/gpr/log_android.cc +3 -2
  423. data/src/core/lib/gpr/log_linux.cc +7 -4
  424. data/src/core/lib/gpr/log_posix.cc +6 -3
  425. data/src/core/lib/gpr/string.h +2 -2
  426. data/src/core/lib/gpr/sync.cc +2 -2
  427. data/src/core/lib/gpr/sync_abseil.cc +7 -6
  428. data/src/core/lib/gpr/sync_posix.cc +3 -3
  429. data/src/core/lib/gpr/time.cc +3 -2
  430. data/src/core/lib/gpr/time_windows.cc +3 -2
  431. data/src/core/lib/gpr/tls.h +120 -41
  432. data/src/core/lib/gpr/tmpfile_posix.cc +1 -2
  433. data/src/core/lib/gprpp/arena.cc +2 -1
  434. data/src/core/lib/gprpp/arena.h +5 -5
  435. data/src/core/lib/gprpp/atomic_utils.h +47 -0
  436. data/src/core/lib/gprpp/bitset.h +166 -0
  437. data/src/core/lib/gprpp/construct_destruct.h +39 -0
  438. data/src/core/lib/gprpp/dual_ref_counted.h +25 -26
  439. data/src/core/lib/gprpp/fork.cc +14 -12
  440. data/src/core/lib/gprpp/fork.h +4 -4
  441. data/src/core/lib/gprpp/global_config.h +1 -2
  442. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  443. data/src/core/lib/gprpp/global_config_generic.h +2 -2
  444. data/src/core/lib/gprpp/manual_constructor.h +8 -5
  445. data/src/core/lib/gprpp/match.h +73 -0
  446. data/src/core/lib/gprpp/memory.h +3 -3
  447. data/src/core/lib/gprpp/mpscq.cc +7 -7
  448. data/src/core/lib/gprpp/mpscq.h +6 -5
  449. data/src/core/lib/gprpp/orphanable.h +3 -3
  450. data/src/core/lib/gprpp/overload.h +59 -0
  451. data/src/core/lib/gprpp/ref_counted.h +18 -18
  452. data/src/core/lib/gprpp/status_helper.cc +4 -4
  453. data/src/core/lib/gprpp/sync.h +3 -1
  454. data/src/core/lib/gprpp/thd_posix.cc +5 -5
  455. data/src/core/lib/gprpp/thd_windows.cc +4 -11
  456. data/src/core/lib/gprpp/time_util.cc +2 -2
  457. data/src/core/lib/gprpp/time_util.h +2 -2
  458. data/src/core/lib/http/format_request.cc +1 -0
  459. data/src/core/lib/http/format_request.h +1 -0
  460. data/src/core/lib/http/httpcli.cc +9 -9
  461. data/src/core/lib/http/httpcli.h +3 -0
  462. data/src/core/lib/http/httpcli_security_connector.cc +5 -8
  463. data/src/core/lib/http/parser.h +1 -0
  464. data/src/core/lib/iomgr/buffer_list.cc +2 -1
  465. data/src/core/lib/iomgr/buffer_list.h +1 -2
  466. data/src/core/lib/iomgr/call_combiner.cc +1 -0
  467. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  468. data/src/core/lib/iomgr/combiner.cc +3 -2
  469. data/src/core/lib/iomgr/combiner.h +1 -0
  470. data/src/core/lib/iomgr/dualstack_socket_posix.cc +1 -0
  471. data/src/core/lib/iomgr/endpoint.cc +0 -4
  472. data/src/core/lib/iomgr/endpoint.h +1 -3
  473. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -20
  474. data/src/core/lib/iomgr/endpoint_cfstream.h +1 -1
  475. data/src/core/lib/iomgr/endpoint_pair.h +1 -0
  476. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +1 -2
  477. data/src/core/lib/iomgr/endpoint_pair_posix.cc +15 -11
  478. data/src/core/lib/iomgr/endpoint_pair_windows.cc +17 -9
  479. data/src/core/lib/iomgr/error.h +23 -9
  480. data/src/core/lib/iomgr/error_cfstream.cc +2 -2
  481. data/src/core/lib/iomgr/error_internal.h +1 -0
  482. data/src/core/lib/iomgr/ev_epoll1_linux.cc +14 -22
  483. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -22
  484. data/src/core/lib/iomgr/ev_poll_posix.cc +13 -25
  485. data/src/core/lib/iomgr/ev_posix.cc +1 -2
  486. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -22
  487. data/src/core/lib/iomgr/event_engine/endpoint.h +1 -2
  488. data/src/core/lib/iomgr/event_engine/iomgr.cc +17 -18
  489. data/src/core/lib/iomgr/event_engine/iomgr.h +20 -2
  490. data/src/core/lib/iomgr/event_engine/resolver.cc +2 -1
  491. data/src/core/lib/iomgr/event_engine/tcp.cc +53 -24
  492. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  493. data/src/core/lib/iomgr/exec_ctx.h +11 -19
  494. data/src/core/lib/iomgr/executor/mpmcqueue.cc +10 -9
  495. data/src/core/lib/iomgr/executor/mpmcqueue.h +4 -3
  496. data/src/core/lib/iomgr/executor/threadpool.cc +2 -2
  497. data/src/core/lib/iomgr/executor/threadpool.h +2 -1
  498. data/src/core/lib/iomgr/executor.cc +5 -6
  499. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
  500. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
  501. data/src/core/lib/iomgr/internal_errqueue.cc +3 -2
  502. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  503. data/src/core/lib/iomgr/iomgr.h +2 -2
  504. data/src/core/lib/iomgr/iomgr_custom.cc +2 -2
  505. data/src/core/lib/iomgr/iomgr_custom.h +2 -2
  506. data/src/core/lib/iomgr/iomgr_internal.cc +2 -1
  507. data/src/core/lib/iomgr/iomgr_windows.cc +1 -2
  508. data/src/core/lib/iomgr/is_epollexclusive_available.cc +4 -4
  509. data/src/core/lib/iomgr/polling_entity.cc +2 -2
  510. data/src/core/lib/iomgr/pollset_custom.cc +3 -4
  511. data/src/core/lib/iomgr/pollset_custom.h +2 -2
  512. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -2
  513. data/src/core/lib/iomgr/pollset_set_windows.cc +1 -0
  514. data/src/core/lib/iomgr/port.h +0 -5
  515. data/src/core/lib/iomgr/python_util.h +1 -0
  516. data/src/core/lib/iomgr/resolve_address.cc +2 -1
  517. data/src/core/lib/iomgr/resolve_address.h +0 -4
  518. data/src/core/lib/iomgr/resolve_address_custom.cc +4 -4
  519. data/src/core/lib/iomgr/resolve_address_custom.h +0 -1
  520. data/src/core/lib/iomgr/resolve_address_posix.cc +2 -4
  521. data/src/core/lib/iomgr/resolve_address_windows.cc +6 -8
  522. data/src/core/lib/iomgr/resource_quota.cc +127 -42
  523. data/src/core/lib/iomgr/resource_quota.h +66 -17
  524. data/src/core/lib/iomgr/sockaddr.h +1 -1
  525. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -3
  526. data/src/core/lib/iomgr/socket_factory_posix.h +1 -0
  527. data/src/core/lib/iomgr/socket_mutator.h +2 -2
  528. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -3
  529. data/src/core/lib/iomgr/socket_utils_linux.cc +4 -4
  530. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -2
  531. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  532. data/src/core/lib/iomgr/socket_utils_windows.cc +2 -2
  533. data/src/core/lib/iomgr/tcp_client.cc +4 -2
  534. data/src/core/lib/iomgr/tcp_client.h +4 -0
  535. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -19
  536. data/src/core/lib/iomgr/tcp_client_custom.cc +9 -17
  537. data/src/core/lib/iomgr/tcp_client_posix.cc +24 -9
  538. data/src/core/lib/iomgr/tcp_client_posix.h +5 -2
  539. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -6
  540. data/src/core/lib/iomgr/tcp_custom.cc +11 -23
  541. data/src/core/lib/iomgr/tcp_custom.h +2 -1
  542. data/src/core/lib/iomgr/tcp_posix.cc +29 -59
  543. data/src/core/lib/iomgr/tcp_posix.h +11 -12
  544. data/src/core/lib/iomgr/tcp_server.cc +6 -4
  545. data/src/core/lib/iomgr/tcp_server.h +12 -9
  546. data/src/core/lib/iomgr/tcp_server_custom.cc +15 -33
  547. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -13
  548. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  549. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -2
  550. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +3 -4
  551. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  552. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -9
  553. data/src/core/lib/iomgr/tcp_windows.cc +6 -25
  554. data/src/core/lib/iomgr/tcp_windows.h +2 -1
  555. data/src/core/lib/iomgr/timer.cc +1 -0
  556. data/src/core/lib/iomgr/timer.h +1 -2
  557. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  558. data/src/core/lib/iomgr/timer_generic.cc +8 -38
  559. data/src/core/lib/iomgr/timer_generic.h +1 -0
  560. data/src/core/lib/iomgr/timer_heap.cc +1 -2
  561. data/src/core/lib/iomgr/udp_server.cc +1 -2
  562. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -5
  563. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -3
  564. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -0
  565. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -3
  566. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -0
  567. data/src/core/lib/iomgr/work_serializer.cc +4 -4
  568. data/src/core/lib/iomgr/work_serializer.h +1 -1
  569. data/src/core/lib/json/json_reader.cc +9 -17
  570. data/src/core/lib/json/json_util.h +18 -26
  571. data/src/core/lib/matchers/matchers.h +0 -1
  572. data/src/core/lib/profiling/basic_timers.cc +8 -6
  573. data/src/core/lib/profiling/stap_timers.cc +2 -2
  574. data/src/core/lib/security/authorization/authorization_policy_provider.h +5 -4
  575. data/src/core/lib/security/authorization/evaluate_args.cc +2 -0
  576. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +159 -0
  577. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +67 -0
  578. data/src/core/lib/security/context/security_context.cc +7 -6
  579. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +2 -2
  580. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  581. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +2 -2
  582. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -3
  583. data/src/core/lib/security/credentials/credentials.cc +6 -6
  584. data/src/core/lib/security/credentials/credentials.h +1 -1
  585. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -3
  586. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +13 -26
  587. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -2
  588. data/src/core/lib/security/credentials/external/aws_request_signer.cc +3 -3
  589. data/src/core/lib/security/credentials/external/external_account_credentials.cc +13 -22
  590. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -4
  591. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -2
  592. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +55 -3
  593. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -1
  594. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  595. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  596. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +31 -14
  597. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
  598. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -2
  599. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
  600. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -7
  601. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -0
  602. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -4
  603. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +4 -4
  604. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -1
  605. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +3 -2
  606. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +10 -6
  607. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +2 -1
  608. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -5
  609. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +2 -2
  610. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +4 -6
  611. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +1 -0
  612. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -3
  613. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -7
  614. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +1 -2
  615. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -3
  616. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +9 -14
  617. data/src/core/lib/security/transport/auth_filters.h +1 -0
  618. data/src/core/lib/security/transport/client_auth_filter.cc +4 -6
  619. data/src/core/lib/security/transport/secure_endpoint.cc +4 -14
  620. data/src/core/lib/security/transport/secure_endpoint.h +1 -0
  621. data/src/core/lib/security/transport/security_handshaker.cc +5 -4
  622. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  623. data/src/core/lib/security/util/json_util.cc +6 -8
  624. data/src/core/lib/slice/percent_encoding.cc +73 -30
  625. data/src/core/lib/slice/percent_encoding.h +29 -28
  626. data/src/core/lib/slice/slice.cc +2 -3
  627. data/src/core/lib/slice/slice_buffer.cc +1 -2
  628. data/src/core/lib/slice/slice_intern.cc +2 -3
  629. data/src/core/lib/slice/slice_internal.h +2 -2
  630. data/src/core/lib/surface/api_trace.cc +2 -1
  631. data/src/core/lib/surface/api_trace.h +1 -0
  632. data/src/core/lib/surface/byte_buffer_reader.cc +1 -1
  633. data/src/core/lib/surface/call.cc +9 -8
  634. data/src/core/lib/surface/call.h +3 -3
  635. data/src/core/lib/surface/call_details.cc +2 -2
  636. data/src/core/lib/surface/call_log_batch.cc +2 -2
  637. data/src/core/lib/surface/channel.cc +22 -9
  638. data/src/core/lib/surface/channel.h +14 -2
  639. data/src/core/lib/surface/channel_ping.cc +1 -2
  640. data/src/core/lib/surface/channel_stack_type.cc +2 -1
  641. data/src/core/lib/surface/completion_queue.cc +54 -64
  642. data/src/core/lib/surface/completion_queue_factory.cc +2 -1
  643. data/src/core/lib/surface/completion_queue_factory.h +1 -0
  644. data/src/core/lib/surface/event_string.cc +1 -0
  645. data/src/core/lib/surface/init.cc +4 -9
  646. data/src/core/lib/surface/init.h +0 -1
  647. data/src/core/lib/surface/init_secure.cc +23 -4
  648. data/src/core/lib/surface/lame_client.cc +6 -5
  649. data/src/core/lib/surface/metadata_array.cc +2 -2
  650. data/src/core/lib/surface/server.cc +17 -33
  651. data/src/core/lib/surface/server.h +11 -13
  652. data/src/core/lib/surface/validate_metadata.cc +44 -16
  653. data/src/core/lib/surface/version.cc +2 -2
  654. data/src/core/lib/transport/byte_stream.h +1 -0
  655. data/src/core/lib/transport/connectivity_state.cc +8 -5
  656. data/src/core/lib/transport/connectivity_state.h +2 -2
  657. data/src/core/lib/transport/error_utils.cc +1 -0
  658. data/src/core/lib/transport/metadata.cc +10 -10
  659. data/src/core/lib/transport/metadata.h +13 -11
  660. data/src/core/lib/transport/metadata_batch.h +8 -0
  661. data/src/core/lib/transport/transport_op_string.cc +2 -2
  662. data/src/core/plugin_registry/grpc_plugin_registry.cc +14 -0
  663. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -2
  664. data/src/core/tsi/alts/crypt/gsec.h +2 -3
  665. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -2
  666. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +2 -3
  667. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +2 -2
  668. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -3
  669. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -2
  670. data/src/core/tsi/ssl_transport_security.cc +11 -9
  671. data/src/core/tsi/ssl_transport_security.h +3 -1
  672. data/src/core/tsi/transport_security.cc +3 -3
  673. data/src/core/tsi/transport_security_grpc.h +1 -0
  674. data/src/ruby/ext/grpc/extconf.rb +1 -1
  675. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -1
  676. data/src/ruby/ext/grpc/rb_call.c +5 -5
  677. data/src/ruby/ext/grpc/rb_call_credentials.c +5 -5
  678. data/src/ruby/ext/grpc/rb_channel.c +10 -8
  679. data/src/ruby/ext/grpc/rb_channel_args.c +2 -2
  680. data/src/ruby/ext/grpc/rb_channel_credentials.c +4 -4
  681. data/src/ruby/ext/grpc/rb_channel_credentials.h +1 -0
  682. data/src/ruby/ext/grpc/rb_completion_queue.c +3 -2
  683. data/src/ruby/ext/grpc/rb_compression_options.c +5 -4
  684. data/src/ruby/ext/grpc/rb_event_thread.c +4 -4
  685. data/src/ruby/ext/grpc/rb_grpc.c +5 -4
  686. data/src/ruby/ext/grpc/rb_grpc.h +1 -0
  687. data/src/ruby/ext/grpc/rb_server.c +6 -5
  688. data/src/ruby/ext/grpc/rb_server_credentials.c +3 -3
  689. data/src/ruby/ext/grpc/rb_server_credentials.h +1 -0
  690. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +8 -5
  691. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +3 -1
  692. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +6 -5
  693. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +3 -1
  694. data/src/ruby/lib/grpc/version.rb +1 -1
  695. data/third_party/boringssl-with-bazel/err_data.c +294 -292
  696. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +52 -47
  697. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  702. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +1 -1
  703. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +1 -1
  704. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_locl.h → internal.h} +20 -1
  705. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +1 -1
  706. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  707. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  708. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +1 -1
  709. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -1
  710. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +1 -1
  711. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +14 -3
  712. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +5 -3
  713. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +5 -6
  714. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  715. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +5 -9
  716. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  717. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +4 -6
  718. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +34 -0
  719. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +219 -121
  720. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +9 -2
  721. data/third_party/boringssl-with-bazel/src/crypto/internal.h +23 -2
  722. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +253 -0
  723. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +28 -23
  724. data/third_party/boringssl-with-bazel/src/crypto/mem.c +2 -0
  725. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +7 -3
  726. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +1 -1
  727. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +1 -0
  728. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +4 -0
  729. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +4 -0
  730. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +4 -0
  731. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +2 -2
  732. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +15 -11
  733. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +1 -1
  734. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -0
  735. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +45 -2
  736. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +4 -2
  737. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +10 -3
  738. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +6 -23
  739. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +2 -2
  740. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +1 -0
  741. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +25 -22
  742. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +0 -4
  743. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +1 -0
  744. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +1 -3
  745. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +9 -11
  746. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +2 -0
  747. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -3
  748. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +1 -3
  749. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +1 -0
  750. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +0 -2
  751. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -0
  752. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -11
  753. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -5
  754. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +160 -74
  755. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  756. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +8 -5
  757. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +3 -0
  758. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +6 -0
  759. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +25 -0
  760. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +14 -12
  761. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +4 -205
  762. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +3 -0
  763. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +5 -4
  764. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +58 -6
  765. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +184 -55
  766. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +0 -5
  767. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +9 -16
  768. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +44 -2
  769. data/third_party/boringssl-with-bazel/src/ssl/{t1_lib.cc → extensions.cc} +24 -11
  770. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -0
  771. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -68
  772. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +17 -9
  773. data/third_party/boringssl-with-bazel/src/ssl/internal.h +25 -6
  774. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +1 -2
  775. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +11 -5
  776. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +0 -49
  777. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +121 -65
  778. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -6
  779. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +9 -11
  780. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +2 -2
  781. data/third_party/upb/upb/decode.c +129 -60
  782. data/third_party/upb/upb/decode.h +32 -4
  783. data/third_party/upb/upb/decode_fast.c +513 -500
  784. data/third_party/upb/upb/decode_fast.h +27 -0
  785. data/third_party/upb/upb/{decode.int.h → decode_internal.h} +38 -8
  786. data/third_party/upb/upb/def.c +171 -181
  787. data/third_party/upb/upb/def.h +41 -19
  788. data/third_party/upb/upb/def.hpp +29 -0
  789. data/third_party/upb/upb/encode.c +49 -16
  790. data/third_party/upb/upb/encode.h +29 -2
  791. data/third_party/upb/upb/msg.c +169 -28
  792. data/third_party/upb/upb/msg.h +75 -580
  793. data/third_party/upb/upb/msg_internal.h +687 -0
  794. data/third_party/upb/upb/port_def.inc +85 -24
  795. data/third_party/upb/upb/port_undef.inc +38 -1
  796. data/third_party/upb/upb/reflection.c +29 -37
  797. data/third_party/upb/upb/reflection.h +36 -8
  798. data/third_party/upb/upb/reflection.hpp +37 -0
  799. data/third_party/upb/upb/table.c +211 -86
  800. data/third_party/upb/upb/{table.int.h → table_internal.h} +56 -180
  801. data/third_party/upb/upb/text_encode.c +32 -4
  802. data/third_party/upb/upb/text_encode.h +26 -0
  803. data/third_party/upb/upb/upb.c +59 -8
  804. data/third_party/upb/upb/upb.h +36 -6
  805. data/third_party/upb/upb/upb.hpp +24 -0
  806. data/third_party/upb/upb/upb_internal.h +58 -0
  807. metadata +64 -62
  808. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +0 -179
  809. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -38
  810. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +0 -243
  811. data/src/core/ext/transport/chttp2/transport/hpack_table.h +0 -148
  812. data/src/core/lib/gpr/tls_gcc.h +0 -52
  813. data/src/core/lib/gpr/tls_msvc.h +0 -54
  814. data/src/core/lib/gpr/tls_pthread.cc +0 -30
  815. data/src/core/lib/gpr/tls_pthread.h +0 -56
  816. data/src/core/lib/gpr/tls_stdcpp.h +0 -48
  817. data/src/core/lib/gprpp/atomic.h +0 -104
  818. data/src/core/lib/iomgr/endpoint_pair_uv.cc +0 -40
  819. data/src/core/lib/iomgr/iomgr_uv.cc +0 -43
  820. data/src/core/lib/iomgr/pollset_uv.cc +0 -95
  821. data/src/core/lib/iomgr/pollset_uv.h +0 -36
  822. data/src/core/lib/iomgr/sockaddr_custom.h +0 -54
  823. data/src/core/lib/iomgr/socket_utils_uv.cc +0 -49
  824. data/src/core/lib/iomgr/tcp_uv.cc +0 -421
  825. data/src/core/lib/iomgr/timer_uv.cc +0 -66
  826. data/third_party/upb/third_party/wyhash/wyhash.h +0 -145
  827. data/third_party/upb/upb/upb.int.h +0 -29
@@ -1,8 +1,35 @@
1
- // Fast decoder: ~3x the speed of decode.c, but x86-64 specific.
1
+ /*
2
+ * Copyright (c) 2009-2021, Google LLC
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ * * Redistributions of source code must retain the above copyright
8
+ * notice, this list of conditions and the following disclaimer.
9
+ * * Redistributions in binary form must reproduce the above copyright
10
+ * notice, this list of conditions and the following disclaimer in the
11
+ * documentation and/or other materials provided with the distribution.
12
+ * * Neither the name of Google LLC nor the
13
+ * names of its contributors may be used to endorse or promote products
14
+ * derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 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
21
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ // Fast decoder: ~3x the speed of decode.c, but requires x86-64/ARM64.
2
29
  // Also the table size grows by 2x.
3
30
  //
4
- // Could potentially be ported to ARM64 or other 64-bit archs that pass at
5
- // least six arguments in registers.
31
+ // Could potentially be ported to other 64-bit archs that pass at least six
32
+ // arguments in registers and have 8 unused high bits in pointers.
6
33
  //
7
34
  // The overall design is to create specialized functions for every possible
8
35
  // field type (eg. oneof boolean field with a 1 byte tag) and then dispatch
@@ -10,7 +37,7 @@
10
37
 
11
38
  #include "upb/decode_fast.h"
12
39
 
13
- #include "upb/decode.int.h"
40
+ #include "upb/decode_internal.h"
14
41
 
15
42
  /* Must be last. */
16
43
  #include "upb/port_def.inc"
@@ -25,8 +52,10 @@
25
52
 
26
53
  #define UPB_PARSE_ARGS d, ptr, msg, table, hasbits, data
27
54
 
28
- #define RETURN_GENERIC(m) \
29
- /* fprintf(stderr, m); */ \
55
+ #define RETURN_GENERIC(m) \
56
+ /* Uncomment either of these for debugging purposes. */ \
57
+ /* fprintf(stderr, m); */ \
58
+ /*__builtin_trap(); */ \
30
59
  return fastdecode_generic(d, ptr, msg, table, hasbits, 0);
31
60
 
32
61
  typedef enum {
@@ -37,21 +66,18 @@ typedef enum {
37
66
  } upb_card;
38
67
 
39
68
  UPB_NOINLINE
40
- static const char *fastdecode_isdonefallback(upb_decstate *d, const char *ptr,
41
- upb_msg *msg, intptr_t table,
42
- uint64_t hasbits, int overrun) {
69
+ static const char *fastdecode_isdonefallback(UPB_PARSE_PARAMS) {
70
+ int overrun = data;
43
71
  ptr = decode_isdonefallback_inl(d, ptr, overrun);
44
72
  if (ptr == NULL) {
45
73
  return fastdecode_err(d);
46
74
  }
47
- uint16_t tag = fastdecode_loadtag(ptr);
48
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, tag);
75
+ data = fastdecode_loadtag(ptr);
76
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS);
49
77
  }
50
78
 
51
79
  UPB_FORCEINLINE
52
- static const char *fastdecode_dispatch(upb_decstate *d, const char *ptr,
53
- upb_msg *msg, intptr_t table,
54
- uint64_t hasbits) {
80
+ static const char *fastdecode_dispatch(UPB_PARSE_PARAMS) {
55
81
  if (UPB_UNLIKELY(ptr >= d->limit_ptr)) {
56
82
  int overrun = ptr - d->end;
57
83
  if (UPB_LIKELY(overrun == d->limit)) {
@@ -59,21 +85,22 @@ static const char *fastdecode_dispatch(upb_decstate *d, const char *ptr,
59
85
  *(uint32_t*)msg |= hasbits; // Sync hasbits.
60
86
  return ptr;
61
87
  } else {
62
- return fastdecode_isdonefallback(d, ptr, msg, table, hasbits, overrun);
88
+ data = overrun;
89
+ UPB_MUSTTAIL return fastdecode_isdonefallback(UPB_PARSE_ARGS);
63
90
  }
64
91
  }
65
92
 
66
93
  // Read two bytes of tag data (for a one-byte tag, the high byte is junk).
67
- uint16_t tag = fastdecode_loadtag(ptr);
68
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, tag);
94
+ data = fastdecode_loadtag(ptr);
95
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS);
69
96
  }
70
97
 
71
98
  UPB_FORCEINLINE
72
- static bool fastdecode_checktag(uint64_t data, int tagbytes) {
99
+ static bool fastdecode_checktag(uint16_t data, int tagbytes) {
73
100
  if (tagbytes == 1) {
74
101
  return (data & 0xff) == 0;
75
102
  } else {
76
- return (data & 0xffff) == 0;
103
+ return data == 0;
77
104
  }
78
105
  }
79
106
 
@@ -297,6 +324,14 @@ static bool fastdecode_flippacked(uint64_t *data, int tagbytes) {
297
324
  return fastdecode_checktag(*data, tagbytes);
298
325
  }
299
326
 
327
+ #define FASTDECODE_CHECKPACKED(tagbytes, card, func) \
328
+ if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) { \
329
+ if (card == CARD_r && fastdecode_flippacked(&data, tagbytes)) { \
330
+ UPB_MUSTTAIL return func(UPB_PARSE_ARGS); \
331
+ } \
332
+ RETURN_GENERIC("packed check tag mismatch\n"); \
333
+ }
334
+
300
335
  /* varint fields **************************************************************/
301
336
 
302
337
  UPB_FORCEINLINE
@@ -339,57 +374,50 @@ done:
339
374
  return ptr;
340
375
  }
341
376
 
342
- UPB_FORCEINLINE
343
- static const char *fastdecode_unpackedvarint(UPB_PARSE_PARAMS, int tagbytes,
344
- int valbytes, upb_card card,
345
- bool zigzag,
346
- _upb_field_parser *packed) {
347
- uint64_t val;
348
- void *dst;
349
- fastdecode_arr farr;
350
-
351
- if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) {
352
- if (card == CARD_r && fastdecode_flippacked(&data, tagbytes)) {
353
- return packed(UPB_PARSE_ARGS);
354
- }
355
- RETURN_GENERIC("varint field tag mismatch\n");
356
- }
357
-
358
- dst =
359
- fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, valbytes, card);
360
- if (card == CARD_r) {
361
- if (UPB_UNLIKELY(!dst)) {
362
- RETURN_GENERIC("need array resize\n");
363
- }
364
- }
365
-
366
- again:
367
- if (card == CARD_r) {
368
- dst = fastdecode_resizearr(d, dst, &farr, valbytes);
369
- }
370
-
371
- ptr += tagbytes;
372
- ptr = fastdecode_varint64(ptr, &val);
373
- if (ptr == NULL) return fastdecode_err(d);
374
- val = fastdecode_munge(val, valbytes, zigzag);
375
- memcpy(dst, &val, valbytes);
376
-
377
- if (card == CARD_r) {
378
- fastdecode_nextret ret =
379
- fastdecode_nextrepeated(d, dst, &ptr, &farr, data, tagbytes, valbytes);
380
- switch (ret.next) {
381
- case FD_NEXT_SAMEFIELD:
382
- dst = ret.dst;
383
- goto again;
384
- case FD_NEXT_OTHERFIELD:
385
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
386
- case FD_NEXT_ATLIMIT:
387
- return ptr;
388
- }
389
- }
390
-
391
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
392
- }
377
+ #define FASTDECODE_UNPACKEDVARINT(d, ptr, msg, table, hasbits, data, tagbytes, \
378
+ valbytes, card, zigzag, packed) \
379
+ uint64_t val; \
380
+ void *dst; \
381
+ fastdecode_arr farr; \
382
+ \
383
+ FASTDECODE_CHECKPACKED(tagbytes, card, packed); \
384
+ \
385
+ dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, valbytes, \
386
+ card); \
387
+ if (card == CARD_r) { \
388
+ if (UPB_UNLIKELY(!dst)) { \
389
+ RETURN_GENERIC("need array resize\n"); \
390
+ } \
391
+ } \
392
+ \
393
+ again: \
394
+ if (card == CARD_r) { \
395
+ dst = fastdecode_resizearr(d, dst, &farr, valbytes); \
396
+ } \
397
+ \
398
+ ptr += tagbytes; \
399
+ ptr = fastdecode_varint64(ptr, &val); \
400
+ if (ptr == NULL) \
401
+ return fastdecode_err(d); \
402
+ val = fastdecode_munge(val, valbytes, zigzag); \
403
+ memcpy(dst, &val, valbytes); \
404
+ \
405
+ if (card == CARD_r) { \
406
+ fastdecode_nextret ret = fastdecode_nextrepeated( \
407
+ d, dst, &ptr, &farr, data, tagbytes, valbytes); \
408
+ switch (ret.next) { \
409
+ case FD_NEXT_SAMEFIELD: \
410
+ dst = ret.dst; \
411
+ goto again; \
412
+ case FD_NEXT_OTHERFIELD: \
413
+ data = ret.tag; \
414
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS); \
415
+ case FD_NEXT_ATLIMIT: \
416
+ return ptr; \
417
+ } \
418
+ } \
419
+ \
420
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS);
393
421
 
394
422
  typedef struct {
395
423
  uint8_t valbytes;
@@ -418,49 +446,36 @@ static const char *fastdecode_topackedvarint(upb_decstate *d, const char *ptr,
418
446
  return ptr;
419
447
  }
420
448
 
421
- UPB_FORCEINLINE
422
- static const char *fastdecode_packedvarint(UPB_PARSE_PARAMS, int tagbytes,
423
- int valbytes, bool zigzag,
424
- _upb_field_parser *unpacked) {
425
- fastdecode_varintdata ctx = {valbytes, zigzag};
426
-
427
- if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) {
428
- if (fastdecode_flippacked(&data, tagbytes)) {
429
- return unpacked(UPB_PARSE_ARGS);
430
- } else {
431
- RETURN_GENERIC("varint field tag mismatch\n");
432
- }
433
- }
434
-
435
- ctx.dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &ctx.farr,
436
- valbytes, CARD_r);
437
- if (UPB_UNLIKELY(!ctx.dst)) {
438
- RETURN_GENERIC("need array resize\n");
439
- }
440
-
441
- ptr += tagbytes;
442
- ptr = fastdecode_delimited(d, ptr, &fastdecode_topackedvarint, &ctx);
443
-
444
- if (UPB_UNLIKELY(ptr == NULL)) {
445
- return fastdecode_err(d);
446
- }
447
-
448
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
449
- }
450
-
451
- UPB_FORCEINLINE
452
- static const char *fastdecode_varint(UPB_PARSE_PARAMS, int tagbytes,
453
- int valbytes, upb_card card, bool zigzag,
454
- _upb_field_parser *unpacked,
455
- _upb_field_parser *packed) {
456
- if (card == CARD_p) {
457
- return fastdecode_packedvarint(UPB_PARSE_ARGS, tagbytes, valbytes, zigzag,
458
- unpacked);
459
- } else {
460
- return fastdecode_unpackedvarint(UPB_PARSE_ARGS, tagbytes, valbytes, card,
461
- zigzag, packed);
449
+ #define FASTDECODE_PACKEDVARINT(d, ptr, msg, table, hasbits, data, tagbytes, \
450
+ valbytes, zigzag, unpacked) \
451
+ fastdecode_varintdata ctx = {valbytes, zigzag}; \
452
+ \
453
+ FASTDECODE_CHECKPACKED(tagbytes, CARD_r, unpacked); \
454
+ \
455
+ ctx.dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &ctx.farr, \
456
+ valbytes, CARD_r); \
457
+ if (UPB_UNLIKELY(!ctx.dst)) { \
458
+ RETURN_GENERIC("need array resize\n"); \
459
+ } \
460
+ \
461
+ ptr += tagbytes; \
462
+ ptr = fastdecode_delimited(d, ptr, &fastdecode_topackedvarint, &ctx); \
463
+ \
464
+ if (UPB_UNLIKELY(ptr == NULL)) { \
465
+ return fastdecode_err(d); \
466
+ } \
467
+ \
468
+ UPB_MUSTTAIL return fastdecode_dispatch(d, ptr, msg, table, hasbits, 0);
469
+
470
+ #define FASTDECODE_VARINT(d, ptr, msg, table, hasbits, data, tagbytes, \
471
+ valbytes, card, zigzag, unpacked, packed) \
472
+ if (card == CARD_p) { \
473
+ FASTDECODE_PACKEDVARINT(d, ptr, msg, table, hasbits, data, tagbytes, \
474
+ valbytes, zigzag, unpacked); \
475
+ } else { \
476
+ FASTDECODE_UNPACKEDVARINT(d, ptr, msg, table, hasbits, data, tagbytes, \
477
+ valbytes, card, zigzag, packed); \
462
478
  }
463
- }
464
479
 
465
480
  #define z_ZZ true
466
481
  #define b_ZZ false
@@ -472,10 +487,10 @@ static const char *fastdecode_varint(UPB_PARSE_PARAMS, int tagbytes,
472
487
  #define F(card, type, valbytes, tagbytes) \
473
488
  UPB_NOINLINE \
474
489
  const char *upb_p##card##type##valbytes##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
475
- return fastdecode_varint(UPB_PARSE_ARGS, tagbytes, valbytes, CARD_##card, \
476
- type##_ZZ, \
477
- &upb_pr##type##valbytes##_##tagbytes##bt, \
478
- &upb_pp##type##valbytes##_##tagbytes##bt); \
490
+ FASTDECODE_VARINT(d, ptr, msg, table, hasbits, data, tagbytes, valbytes, \
491
+ CARD_##card, type##_ZZ, \
492
+ upb_pr##type##valbytes##_##tagbytes##bt, \
493
+ upb_pp##type##valbytes##_##tagbytes##bt); \
479
494
  }
480
495
 
481
496
  #define TYPES(card, tagbytes) \
@@ -503,126 +518,110 @@ TAGBYTES(p)
503
518
  #undef F
504
519
  #undef TYPES
505
520
  #undef TAGBYTES
521
+ #undef FASTDECODE_UNPACKEDVARINT
522
+ #undef FASTDECODE_PACKEDVARINT
523
+ #undef FASTDECODE_VARINT
506
524
 
507
525
 
508
526
  /* fixed fields ***************************************************************/
509
527
 
510
- UPB_FORCEINLINE
511
- static const char *fastdecode_unpackedfixed(UPB_PARSE_PARAMS, int tagbytes,
512
- int valbytes, upb_card card,
513
- _upb_field_parser *packed) {
514
- void *dst;
515
- fastdecode_arr farr;
516
-
517
- if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) {
518
- if (card == CARD_r && fastdecode_flippacked(&data, tagbytes)) {
519
- return packed(UPB_PARSE_ARGS);
520
- }
521
- RETURN_GENERIC("fixed field tag mismatch\n");
528
+ #define FASTDECODE_UNPACKEDFIXED(d, ptr, msg, table, hasbits, data, tagbytes, \
529
+ valbytes, card, packed) \
530
+ void *dst; \
531
+ fastdecode_arr farr; \
532
+ \
533
+ FASTDECODE_CHECKPACKED(tagbytes, card, packed) \
534
+ \
535
+ dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, valbytes, \
536
+ card); \
537
+ if (card == CARD_r) { \
538
+ if (UPB_UNLIKELY(!dst)) { \
539
+ RETURN_GENERIC("couldn't allocate array in arena\n"); \
540
+ } \
541
+ } \
542
+ \
543
+ again: \
544
+ if (card == CARD_r) { \
545
+ dst = fastdecode_resizearr(d, dst, &farr, valbytes); \
546
+ } \
547
+ \
548
+ ptr += tagbytes; \
549
+ memcpy(dst, ptr, valbytes); \
550
+ ptr += valbytes; \
551
+ \
552
+ if (card == CARD_r) { \
553
+ fastdecode_nextret ret = fastdecode_nextrepeated( \
554
+ d, dst, &ptr, &farr, data, tagbytes, valbytes); \
555
+ switch (ret.next) { \
556
+ case FD_NEXT_SAMEFIELD: \
557
+ dst = ret.dst; \
558
+ goto again; \
559
+ case FD_NEXT_OTHERFIELD: \
560
+ data = ret.tag; \
561
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS); \
562
+ case FD_NEXT_ATLIMIT: \
563
+ return ptr; \
564
+ } \
565
+ } \
566
+ \
567
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS);
568
+
569
+ #define FASTDECODE_PACKEDFIXED(d, ptr, msg, table, hasbits, data, tagbytes, \
570
+ valbytes, unpacked) \
571
+ FASTDECODE_CHECKPACKED(tagbytes, CARD_r, unpacked) \
572
+ \
573
+ ptr += tagbytes; \
574
+ int size = (uint8_t)ptr[0]; \
575
+ ptr++; \
576
+ if (size & 0x80) { \
577
+ ptr = fastdecode_longsize(ptr, &size); \
578
+ } \
579
+ \
580
+ if (UPB_UNLIKELY(fastdecode_boundscheck(ptr, size, d->limit_ptr) || \
581
+ (size % valbytes) != 0)) { \
582
+ return fastdecode_err(d); \
583
+ } \
584
+ \
585
+ upb_array **arr_p = fastdecode_fieldmem(msg, data); \
586
+ upb_array *arr = *arr_p; \
587
+ uint8_t elem_size_lg2 = __builtin_ctz(valbytes); \
588
+ int elems = size / valbytes; \
589
+ \
590
+ if (UPB_LIKELY(!arr)) { \
591
+ *arr_p = arr = _upb_array_new(&d->arena, elems, elem_size_lg2); \
592
+ if (!arr) { \
593
+ return fastdecode_err(d); \
594
+ } \
595
+ } else { \
596
+ _upb_array_resize(arr, elems, &d->arena); \
597
+ } \
598
+ \
599
+ char *dst = _upb_array_ptr(arr); \
600
+ memcpy(dst, ptr, size); \
601
+ arr->len = elems; \
602
+ \
603
+ ptr += size; \
604
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS);
605
+
606
+ #define FASTDECODE_FIXED(d, ptr, msg, table, hasbits, data, tagbytes, \
607
+ valbytes, card, unpacked, packed) \
608
+ if (card == CARD_p) { \
609
+ FASTDECODE_PACKEDFIXED(d, ptr, msg, table, hasbits, data, tagbytes, \
610
+ valbytes, unpacked); \
611
+ } else { \
612
+ FASTDECODE_UNPACKEDFIXED(d, ptr, msg, table, hasbits, data, tagbytes, \
613
+ valbytes, card, packed); \
522
614
  }
523
615
 
524
- dst =
525
- fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, valbytes, card);
526
- if (card == CARD_r) {
527
- if (UPB_UNLIKELY(!dst)) {
528
- RETURN_GENERIC("couldn't allocate array in arena\n");
529
- }
530
- }
531
-
532
-
533
- again:
534
- if (card == CARD_r) {
535
- dst = fastdecode_resizearr(d, dst, &farr, valbytes);
536
- }
537
-
538
- ptr += tagbytes;
539
- memcpy(dst, ptr, valbytes);
540
- ptr += valbytes;
541
-
542
- if (card == CARD_r) {
543
- fastdecode_nextret ret =
544
- fastdecode_nextrepeated(d, dst, &ptr, &farr, data, tagbytes, valbytes);
545
- switch (ret.next) {
546
- case FD_NEXT_SAMEFIELD:
547
- dst = ret.dst;
548
- goto again;
549
- case FD_NEXT_OTHERFIELD:
550
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
551
- case FD_NEXT_ATLIMIT:
552
- return ptr;
553
- }
554
- }
555
-
556
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
557
- }
558
-
559
- UPB_FORCEINLINE
560
- static const char *fastdecode_packedfixed(UPB_PARSE_PARAMS, int tagbytes,
561
- int valbytes,
562
- _upb_field_parser *unpacked) {
563
- if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) {
564
- if (fastdecode_flippacked(&data, tagbytes)) {
565
- return unpacked(UPB_PARSE_ARGS);
566
- } else {
567
- RETURN_GENERIC("varint field tag mismatch\n");
568
- }
569
- }
570
-
571
- ptr += tagbytes;
572
- int size = (uint8_t)ptr[0];
573
- ptr++;
574
- if (size & 0x80) {
575
- ptr = fastdecode_longsize(ptr, &size);
576
- }
577
-
578
- if (UPB_UNLIKELY(fastdecode_boundscheck(ptr, size, d->limit_ptr)) ||
579
- (size % valbytes) != 0) {
580
- return fastdecode_err(d);
581
- }
582
-
583
- upb_array **arr_p = fastdecode_fieldmem(msg, data);
584
- upb_array *arr = *arr_p;
585
- uint8_t elem_size_lg2 = __builtin_ctz(valbytes);
586
- int elems = size / valbytes;
587
-
588
- if (UPB_LIKELY(!arr)) {
589
- *arr_p = arr = _upb_array_new(&d->arena, elems, elem_size_lg2);
590
- if (!arr) {
591
- return fastdecode_err(d);
592
- }
593
- } else {
594
- _upb_array_resize(arr, elems, &d->arena);
595
- }
596
-
597
- char *dst = _upb_array_ptr(arr);
598
- memcpy(dst, ptr, size);
599
- arr->len = elems;
600
-
601
- return fastdecode_dispatch(d, ptr + size, msg, table, hasbits);
602
- }
603
-
604
- UPB_FORCEINLINE
605
- static const char *fastdecode_fixed(UPB_PARSE_PARAMS, int tagbytes,
606
- int valbytes, upb_card card,
607
- _upb_field_parser *unpacked,
608
- _upb_field_parser *packed) {
609
- if (card == CARD_p) {
610
- return fastdecode_packedfixed(UPB_PARSE_ARGS, tagbytes, valbytes, unpacked);
611
- } else {
612
- return fastdecode_unpackedfixed(UPB_PARSE_ARGS, tagbytes, valbytes, card,
613
- packed);
614
- }
615
- }
616
-
617
616
  /* Generate all combinations:
618
617
  * {s,o,r,p} x {f4,f8} x {1bt,2bt} */
619
618
 
620
- #define F(card, valbytes, tagbytes) \
621
- UPB_NOINLINE \
622
- const char *upb_p##card##f##valbytes##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
623
- return fastdecode_fixed(UPB_PARSE_ARGS, tagbytes, valbytes, CARD_##card, \
624
- &upb_ppf##valbytes##_##tagbytes##bt, \
625
- &upb_prf##valbytes##_##tagbytes##bt); \
619
+ #define F(card, valbytes, tagbytes) \
620
+ UPB_NOINLINE \
621
+ const char *upb_p##card##f##valbytes##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
622
+ FASTDECODE_FIXED(d, ptr, msg, table, hasbits, data, tagbytes, valbytes, \
623
+ CARD_##card, upb_ppf##valbytes##_##tagbytes##bt, \
624
+ upb_prf##valbytes##_##tagbytes##bt); \
626
625
  }
627
626
 
628
627
  #define TYPES(card, tagbytes) \
@@ -641,6 +640,8 @@ TAGBYTES(p)
641
640
  #undef F
642
641
  #undef TYPES
643
642
  #undef TAGBYTES
643
+ #undef FASTDECODE_UNPACKEDFIXED
644
+ #undef FASTDECODE_PACKEDFIXED
644
645
 
645
646
  /* string fields **************************************************************/
646
647
 
@@ -652,56 +653,54 @@ typedef const char *fastdecode_copystr_func(struct upb_decstate *d,
652
653
  UPB_NOINLINE
653
654
  static const char *fastdecode_verifyutf8(upb_decstate *d, const char *ptr,
654
655
  upb_msg *msg, intptr_t table,
655
- uint64_t hasbits, upb_strview *dst) {
656
+ uint64_t hasbits, uint64_t data) {
657
+ upb_strview *dst = (upb_strview*)data;
656
658
  if (!decode_verifyutf8_inl(dst->data, dst->size)) {
657
659
  return fastdecode_err(d);
658
660
  }
659
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
661
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS);
660
662
  }
661
663
 
662
- UPB_FORCEINLINE
663
- static const char *fastdecode_longstring(struct upb_decstate *d,
664
- const char *ptr, upb_msg *msg,
665
- intptr_t table, uint64_t hasbits,
666
- upb_strview *dst,
667
- bool validate_utf8) {
668
- int size = (uint8_t)ptr[0]; // Could plumb through hasbits.
669
- ptr++;
670
- if (size & 0x80) {
671
- ptr = fastdecode_longsize(ptr, &size);
664
+ #define FASTDECODE_LONGSTRING(d, ptr, msg, table, hasbits, dst, validate_utf8) \
665
+ int size = (uint8_t)ptr[0]; /* Could plumb through hasbits. */ \
666
+ ptr++; \
667
+ if (size & 0x80) { \
668
+ ptr = fastdecode_longsize(ptr, &size); \
669
+ } \
670
+ \
671
+ if (UPB_UNLIKELY(fastdecode_boundscheck(ptr, size, d->limit_ptr))) { \
672
+ dst->size = 0; \
673
+ return fastdecode_err(d); \
674
+ } \
675
+ \
676
+ if (d->alias) { \
677
+ dst->data = ptr; \
678
+ dst->size = size; \
679
+ } else { \
680
+ char *data = upb_arena_malloc(&d->arena, size); \
681
+ if (!data) { \
682
+ return fastdecode_err(d); \
683
+ } \
684
+ memcpy(data, ptr, size); \
685
+ dst->data = data; \
686
+ dst->size = size; \
687
+ } \
688
+ \
689
+ ptr += size; \
690
+ if (validate_utf8) { \
691
+ data = (uint64_t)dst; \
692
+ UPB_MUSTTAIL return fastdecode_verifyutf8(UPB_PARSE_ARGS); \
693
+ } else { \
694
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS); \
672
695
  }
673
696
 
674
- if (UPB_UNLIKELY(fastdecode_boundscheck(ptr, size, d->limit_ptr))) {
675
- dst->size = 0;
676
- return fastdecode_err(d);
677
- }
678
-
679
- if (d->alias) {
680
- dst->data = ptr;
681
- dst->size = size;
682
- } else {
683
- char *data = upb_arena_malloc(&d->arena, size);
684
- if (!data) {
685
- return fastdecode_err(d);
686
- }
687
- memcpy(data, ptr, size);
688
- dst->data = data;
689
- dst->size = size;
690
- }
691
-
692
- if (validate_utf8) {
693
- return fastdecode_verifyutf8(d, ptr + size, msg, table, hasbits, dst);
694
- } else {
695
- return fastdecode_dispatch(d, ptr + size, msg, table, hasbits);
696
- }
697
- }
698
-
699
697
  UPB_NOINLINE
700
698
  static const char *fastdecode_longstring_utf8(struct upb_decstate *d,
701
- const char *ptr, upb_msg *msg,
702
- intptr_t table, uint64_t hasbits,
703
- upb_strview *dst) {
704
- return fastdecode_longstring(d, ptr, msg, table, hasbits, dst, true);
699
+ const char *ptr, upb_msg *msg,
700
+ intptr_t table, uint64_t hasbits,
701
+ uint64_t data) {
702
+ upb_strview *dst = (upb_strview*)data;
703
+ FASTDECODE_LONGSTRING(d, ptr, msg, table, hasbits, dst, true);
705
704
  }
706
705
 
707
706
  UPB_NOINLINE
@@ -709,8 +708,9 @@ static const char *fastdecode_longstring_noutf8(struct upb_decstate *d,
709
708
  const char *ptr, upb_msg *msg,
710
709
  intptr_t table,
711
710
  uint64_t hasbits,
712
- upb_strview *dst) {
713
- return fastdecode_longstring(d, ptr, msg, table, hasbits, dst, false);
711
+ uint64_t data) {
712
+ upb_strview *dst = (upb_strview*)data;
713
+ FASTDECODE_LONGSTRING(d, ptr, msg, table, hasbits, dst, false);
714
714
  }
715
715
 
716
716
  UPB_FORCEINLINE
@@ -723,156 +723,165 @@ static void fastdecode_docopy(upb_decstate *d, const char *ptr, uint32_t size,
723
723
  UPB_POISON_MEMORY_REGION(data + size, copy - size);
724
724
  }
725
725
 
726
- UPB_FORCEINLINE
727
- static const char *fastdecode_copystring(UPB_PARSE_PARAMS, int tagbytes,
728
- upb_card card, bool validate_utf8) {
729
- upb_strview *dst;
730
- fastdecode_arr farr;
731
- int64_t size;
732
- size_t arena_has;
733
- size_t common_has;
734
- char *buf;
735
-
736
- UPB_ASSERT(!d->alias);
737
- UPB_ASSERT(fastdecode_checktag(data, tagbytes));
738
-
739
- dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr,
740
- sizeof(upb_strview), card);
741
-
742
- again:
743
- if (card == CARD_r) {
744
- dst = fastdecode_resizearr(d, dst, &farr, sizeof(upb_strview));
745
- }
746
-
747
- size = (uint8_t)ptr[tagbytes];
748
- ptr += tagbytes + 1;
749
- dst->size = size;
750
-
751
- buf = d->arena.head.ptr;
752
- arena_has = _upb_arenahas(&d->arena);
753
- common_has = UPB_MIN(arena_has, (d->end - ptr) + 16);
754
-
755
- if (UPB_LIKELY(size <= 15 - tagbytes)) {
756
- if (arena_has < 16) goto longstr;
757
- d->arena.head.ptr += 16;
758
- memcpy(buf, ptr - tagbytes - 1, 16);
759
- dst->data = buf + tagbytes + 1;
760
- } else if (UPB_LIKELY(size <= 32)) {
761
- if (UPB_UNLIKELY(common_has < 32)) goto longstr;
762
- fastdecode_docopy(d, ptr, size, 32, buf, dst);
763
- } else if (UPB_LIKELY(size <= 64)) {
764
- if (UPB_UNLIKELY(common_has < 64)) goto longstr;
765
- fastdecode_docopy(d, ptr, size, 64, buf, dst);
766
- } else if (UPB_LIKELY(size < 128)) {
767
- if (UPB_UNLIKELY(common_has < 128)) goto longstr;
768
- fastdecode_docopy(d, ptr, size, 128, buf, dst);
769
- } else {
770
- goto longstr;
771
- }
772
-
773
- ptr += size;
774
-
775
- if (card == CARD_r) {
776
- if (validate_utf8 && !decode_verifyutf8_inl(dst->data, dst->size)) {
777
- return fastdecode_err(d);
778
- }
779
- fastdecode_nextret ret = fastdecode_nextrepeated(
780
- d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_strview));
781
- switch (ret.next) {
782
- case FD_NEXT_SAMEFIELD:
783
- dst = ret.dst;
784
- goto again;
785
- case FD_NEXT_OTHERFIELD:
786
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
787
- case FD_NEXT_ATLIMIT:
788
- return ptr;
789
- }
790
- }
791
-
792
- if (card != CARD_r && validate_utf8) {
793
- return fastdecode_verifyutf8(d, ptr, msg, table, hasbits, dst);
794
- }
795
-
796
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
797
-
798
- longstr:
799
- ptr--;
800
- if (validate_utf8) {
801
- return fastdecode_longstring_utf8(d, ptr, msg, table, hasbits, dst);
802
- } else {
803
- return fastdecode_longstring_noutf8(d, ptr, msg, table, hasbits, dst);
804
- }
805
- }
806
-
807
- UPB_FORCEINLINE
808
- static const char *fastdecode_string(UPB_PARSE_PARAMS, int tagbytes,
809
- upb_card card, _upb_field_parser *copyfunc,
810
- bool validate_utf8) {
811
- upb_strview *dst;
812
- fastdecode_arr farr;
813
- int64_t size;
814
-
815
- if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) {
816
- RETURN_GENERIC("string field tag mismatch\n");
817
- }
818
-
819
- if (UPB_UNLIKELY(!d->alias)) {
820
- return copyfunc(UPB_PARSE_ARGS);
821
- }
822
-
823
- dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr,
824
- sizeof(upb_strview), card);
825
-
826
- again:
827
- if (card == CARD_r) {
828
- dst = fastdecode_resizearr(d, dst, &farr, sizeof(upb_strview));
726
+ #define FASTDECODE_COPYSTRING(d, ptr, msg, table, hasbits, data, tagbytes, \
727
+ card, validate_utf8) \
728
+ upb_strview *dst; \
729
+ fastdecode_arr farr; \
730
+ int64_t size; \
731
+ size_t arena_has; \
732
+ size_t common_has; \
733
+ char *buf; \
734
+ \
735
+ UPB_ASSERT(!d->alias); \
736
+ UPB_ASSERT(fastdecode_checktag(data, tagbytes)); \
737
+ \
738
+ dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, \
739
+ sizeof(upb_strview), card); \
740
+ \
741
+ again: \
742
+ if (card == CARD_r) { \
743
+ dst = fastdecode_resizearr(d, dst, &farr, sizeof(upb_strview)); \
744
+ } \
745
+ \
746
+ size = (uint8_t)ptr[tagbytes]; \
747
+ ptr += tagbytes + 1; \
748
+ dst->size = size; \
749
+ \
750
+ buf = d->arena.head.ptr; \
751
+ arena_has = _upb_arenahas(&d->arena); \
752
+ common_has = UPB_MIN(arena_has, (d->end - ptr) + 16); \
753
+ \
754
+ if (UPB_LIKELY(size <= 15 - tagbytes)) { \
755
+ if (arena_has < 16) \
756
+ goto longstr; \
757
+ d->arena.head.ptr += 16; \
758
+ memcpy(buf, ptr - tagbytes - 1, 16); \
759
+ dst->data = buf + tagbytes + 1; \
760
+ } else if (UPB_LIKELY(size <= 32)) { \
761
+ if (UPB_UNLIKELY(common_has < 32)) \
762
+ goto longstr; \
763
+ fastdecode_docopy(d, ptr, size, 32, buf, dst); \
764
+ } else if (UPB_LIKELY(size <= 64)) { \
765
+ if (UPB_UNLIKELY(common_has < 64)) \
766
+ goto longstr; \
767
+ fastdecode_docopy(d, ptr, size, 64, buf, dst); \
768
+ } else if (UPB_LIKELY(size < 128)) { \
769
+ if (UPB_UNLIKELY(common_has < 128)) \
770
+ goto longstr; \
771
+ fastdecode_docopy(d, ptr, size, 128, buf, dst); \
772
+ } else { \
773
+ goto longstr; \
774
+ } \
775
+ \
776
+ ptr += size; \
777
+ \
778
+ if (card == CARD_r) { \
779
+ if (validate_utf8 && !decode_verifyutf8_inl(dst->data, dst->size)) { \
780
+ return fastdecode_err(d); \
781
+ } \
782
+ fastdecode_nextret ret = fastdecode_nextrepeated( \
783
+ d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_strview)); \
784
+ switch (ret.next) { \
785
+ case FD_NEXT_SAMEFIELD: \
786
+ dst = ret.dst; \
787
+ goto again; \
788
+ case FD_NEXT_OTHERFIELD: \
789
+ data = ret.tag; \
790
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS); \
791
+ case FD_NEXT_ATLIMIT: \
792
+ return ptr; \
793
+ } \
794
+ } \
795
+ \
796
+ if (card != CARD_r && validate_utf8) { \
797
+ data = (uint64_t)dst; \
798
+ UPB_MUSTTAIL return fastdecode_verifyutf8(UPB_PARSE_ARGS); \
799
+ } \
800
+ \
801
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS); \
802
+ \
803
+ longstr: \
804
+ ptr--; \
805
+ if (validate_utf8) { \
806
+ UPB_MUSTTAIL return fastdecode_longstring_utf8(d, ptr, msg, table, \
807
+ hasbits, (uint64_t)dst); \
808
+ } else { \
809
+ UPB_MUSTTAIL return fastdecode_longstring_noutf8(d, ptr, msg, table, \
810
+ hasbits, (uint64_t)dst); \
829
811
  }
830
812
 
831
- size = (int8_t)ptr[tagbytes];
832
- ptr += tagbytes + 1;
833
- dst->data = ptr;
834
- dst->size = size;
835
-
836
- if (UPB_UNLIKELY(fastdecode_boundscheck(ptr, size, d->end))) {
837
- ptr--;
838
- if (validate_utf8) {
839
- return fastdecode_longstring_utf8(d, ptr, msg, table, hasbits, dst);
840
- } else {
841
- return fastdecode_longstring_noutf8(d, ptr, msg, table, hasbits, dst);
842
- }
843
- }
844
-
845
- ptr += size;
846
-
847
- if (card == CARD_r) {
848
- if (validate_utf8 && !decode_verifyutf8_inl(dst->data, dst->size)) {
849
- return fastdecode_err(d);
850
- }
851
- fastdecode_nextret ret = fastdecode_nextrepeated(
852
- d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_strview));
853
- switch (ret.next) {
854
- case FD_NEXT_SAMEFIELD:
855
- dst = ret.dst;
856
- if (UPB_UNLIKELY(!d->alias)) {
857
- // Buffer flipped and we can't alias any more. Bounce to copyfunc(),
858
- // but via dispatch since we need to reload table data also.
859
- fastdecode_commitarr(dst, &farr, sizeof(upb_strview));
860
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
861
- }
862
- goto again;
863
- case FD_NEXT_OTHERFIELD:
864
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
865
- case FD_NEXT_ATLIMIT:
866
- return ptr;
867
- }
868
- }
869
-
870
- if (card != CARD_r && validate_utf8) {
871
- return fastdecode_verifyutf8(d, ptr, msg, table, hasbits, dst);
872
- }
873
-
874
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
875
- }
813
+ #define FASTDECODE_STRING(d, ptr, msg, table, hasbits, data, tagbytes, card, \
814
+ copyfunc, validate_utf8) \
815
+ upb_strview *dst; \
816
+ fastdecode_arr farr; \
817
+ int64_t size; \
818
+ \
819
+ if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) { \
820
+ RETURN_GENERIC("string field tag mismatch\n"); \
821
+ } \
822
+ \
823
+ if (UPB_UNLIKELY(!d->alias)) { \
824
+ UPB_MUSTTAIL return copyfunc(UPB_PARSE_ARGS); \
825
+ } \
826
+ \
827
+ dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, \
828
+ sizeof(upb_strview), card); \
829
+ \
830
+ again: \
831
+ if (card == CARD_r) { \
832
+ dst = fastdecode_resizearr(d, dst, &farr, sizeof(upb_strview)); \
833
+ } \
834
+ \
835
+ size = (int8_t)ptr[tagbytes]; \
836
+ ptr += tagbytes + 1; \
837
+ dst->data = ptr; \
838
+ dst->size = size; \
839
+ \
840
+ if (UPB_UNLIKELY(fastdecode_boundscheck(ptr, size, d->end))) { \
841
+ ptr--; \
842
+ if (validate_utf8) { \
843
+ return fastdecode_longstring_utf8(d, ptr, msg, table, hasbits, \
844
+ (uint64_t)dst); \
845
+ } else { \
846
+ return fastdecode_longstring_noutf8(d, ptr, msg, table, hasbits, \
847
+ (uint64_t)dst); \
848
+ } \
849
+ } \
850
+ \
851
+ ptr += size; \
852
+ \
853
+ if (card == CARD_r) { \
854
+ if (validate_utf8 && !decode_verifyutf8_inl(dst->data, dst->size)) { \
855
+ return fastdecode_err(d); \
856
+ } \
857
+ fastdecode_nextret ret = fastdecode_nextrepeated( \
858
+ d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_strview)); \
859
+ switch (ret.next) { \
860
+ case FD_NEXT_SAMEFIELD: \
861
+ dst = ret.dst; \
862
+ if (UPB_UNLIKELY(!d->alias)) { \
863
+ /* Buffer flipped and we can't alias any more. Bounce to */ \
864
+ /* copyfunc(), but via dispatch since we need to reload table */ \
865
+ /* data also. */ \
866
+ fastdecode_commitarr(dst, &farr, sizeof(upb_strview)); \
867
+ data = ret.tag; \
868
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS); \
869
+ } \
870
+ goto again; \
871
+ case FD_NEXT_OTHERFIELD: \
872
+ data = ret.tag; \
873
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS); \
874
+ case FD_NEXT_ATLIMIT: \
875
+ return ptr; \
876
+ } \
877
+ } \
878
+ \
879
+ if (card != CARD_r && validate_utf8) { \
880
+ data = (uint64_t)dst; \
881
+ UPB_MUSTTAIL return fastdecode_verifyutf8(UPB_PARSE_ARGS); \
882
+ } \
883
+ \
884
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS);
876
885
 
877
886
  /* Generate all combinations:
878
887
  * {p,c} x {s,o,r} x {s, b} x {1bt,2bt} */
@@ -880,16 +889,16 @@ again:
880
889
  #define s_VALIDATE true
881
890
  #define b_VALIDATE false
882
891
 
883
- #define F(card, tagbytes, type) \
884
- UPB_NOINLINE \
885
- const char *upb_c##card##type##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
886
- return fastdecode_copystring(UPB_PARSE_ARGS, tagbytes, CARD_##card, \
887
- type##_VALIDATE); \
888
- } \
889
- const char *upb_p##card##type##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
890
- return fastdecode_string(UPB_PARSE_ARGS, tagbytes, CARD_##card, \
891
- &upb_c##card##type##_##tagbytes##bt, \
892
- type##_VALIDATE); \
892
+ #define F(card, tagbytes, type) \
893
+ UPB_NOINLINE \
894
+ const char *upb_c##card##type##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
895
+ FASTDECODE_COPYSTRING(d, ptr, msg, table, hasbits, data, tagbytes, \
896
+ CARD_##card, type##_VALIDATE); \
897
+ } \
898
+ const char *upb_p##card##type##_##tagbytes##bt(UPB_PARSE_PARAMS) { \
899
+ FASTDECODE_STRING(d, ptr, msg, table, hasbits, data, tagbytes, \
900
+ CARD_##card, upb_c##card##type##_##tagbytes##bt, \
901
+ type##_VALIDATE); \
893
902
  }
894
903
 
895
904
  #define UTF8(card, tagbytes) \
@@ -908,6 +917,9 @@ TAGBYTES(r)
908
917
  #undef b_VALIDATE
909
918
  #undef F
910
919
  #undef TAGBYTES
920
+ #undef FASTDECODE_LONGSTRING
921
+ #undef FASTDECODE_COPYSTRING
922
+ #undef FASTDECODE_STRING
911
923
 
912
924
  /* message fields *************************************************************/
913
925
 
@@ -940,82 +952,82 @@ UPB_FORCEINLINE
940
952
  static const char *fastdecode_tosubmsg(upb_decstate *d, const char *ptr,
941
953
  void *ctx) {
942
954
  fastdecode_submsgdata *submsg = ctx;
943
- ptr = fastdecode_dispatch(d, ptr, submsg->msg, submsg->table, 0);
955
+ ptr = fastdecode_dispatch(d, ptr, submsg->msg, submsg->table, 0, 0);
944
956
  UPB_ASSUME(ptr != NULL);
945
957
  return ptr;
946
958
  }
947
959
 
948
- UPB_FORCEINLINE
949
- static const char *fastdecode_submsg(UPB_PARSE_PARAMS, int tagbytes,
950
- int msg_ceil_bytes, upb_card card) {
951
-
952
- if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) {
953
- RETURN_GENERIC("submessage field tag mismatch\n");
954
- }
955
-
956
- if (--d->depth == 0) return fastdecode_err(d);
957
-
958
- upb_msg **dst;
959
- uint32_t submsg_idx = (data >> 16) & 0xff;
960
- const upb_msglayout *tablep = decode_totablep(table);
961
- const upb_msglayout *subtablep = tablep->submsgs[submsg_idx];
962
- fastdecode_submsgdata submsg = {decode_totable(subtablep)};
963
- fastdecode_arr farr;
964
-
965
- if (subtablep->table_mask == (uint8_t)-1) {
966
- RETURN_GENERIC("submessage doesn't have fast tables.");
967
- }
968
-
969
- dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr,
970
- sizeof(upb_msg *), card);
971
-
972
- if (card == CARD_s) {
973
- *(uint32_t*)msg |= hasbits;
974
- hasbits = 0;
975
- }
976
-
977
- again:
978
- if (card == CARD_r) {
979
- dst = fastdecode_resizearr(d, dst, &farr, sizeof(upb_msg*));
980
- }
981
-
982
- submsg.msg = *dst;
983
-
984
- if (card == CARD_r || UPB_LIKELY(!submsg.msg)) {
985
- *dst = submsg.msg = decode_newmsg_ceil(d, subtablep, msg_ceil_bytes);
986
- }
987
-
988
- ptr += tagbytes;
989
- ptr = fastdecode_delimited(d, ptr, fastdecode_tosubmsg, &submsg);
990
-
991
- if (UPB_UNLIKELY(ptr == NULL || d->end_group != DECODE_NOGROUP)) {
992
- return fastdecode_err(d);
993
- }
994
-
995
- if (card == CARD_r) {
996
- fastdecode_nextret ret = fastdecode_nextrepeated(
997
- d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_msg *));
998
- switch (ret.next) {
999
- case FD_NEXT_SAMEFIELD:
1000
- dst = ret.dst;
1001
- goto again;
1002
- case FD_NEXT_OTHERFIELD:
1003
- d->depth++;
1004
- return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, ret.tag);
1005
- case FD_NEXT_ATLIMIT:
1006
- d->depth++;
1007
- return ptr;
1008
- }
1009
- }
1010
-
1011
- d->depth++;
1012
- return fastdecode_dispatch(d, ptr, msg, table, hasbits);
1013
- }
1014
-
1015
- #define F(card, tagbytes, size_ceil, ceil_arg) \
1016
- const char *upb_p##card##m_##tagbytes##bt_max##size_ceil##b( \
1017
- UPB_PARSE_PARAMS) { \
1018
- return fastdecode_submsg(UPB_PARSE_ARGS, tagbytes, ceil_arg, CARD_##card); \
960
+ #define FASTDECODE_SUBMSG(d, ptr, msg, table, hasbits, data, tagbytes, \
961
+ msg_ceil_bytes, card) \
962
+ \
963
+ if (UPB_UNLIKELY(!fastdecode_checktag(data, tagbytes))) { \
964
+ RETURN_GENERIC("submessage field tag mismatch\n"); \
965
+ } \
966
+ \
967
+ if (--d->depth == 0) return fastdecode_err(d); \
968
+ \
969
+ upb_msg **dst; \
970
+ uint32_t submsg_idx = (data >> 16) & 0xff; \
971
+ const upb_msglayout *tablep = decode_totablep(table); \
972
+ const upb_msglayout *subtablep = tablep->submsgs[submsg_idx]; \
973
+ fastdecode_submsgdata submsg = {decode_totable(subtablep)}; \
974
+ fastdecode_arr farr; \
975
+ \
976
+ if (subtablep->table_mask == (uint8_t)-1) { \
977
+ RETURN_GENERIC("submessage doesn't have fast tables."); \
978
+ } \
979
+ \
980
+ dst = fastdecode_getfield(d, ptr, msg, &data, &hasbits, &farr, \
981
+ sizeof(upb_msg *), card); \
982
+ \
983
+ if (card == CARD_s) { \
984
+ *(uint32_t *)msg |= hasbits; \
985
+ hasbits = 0; \
986
+ } \
987
+ \
988
+ again: \
989
+ if (card == CARD_r) { \
990
+ dst = fastdecode_resizearr(d, dst, &farr, sizeof(upb_msg *)); \
991
+ } \
992
+ \
993
+ submsg.msg = *dst; \
994
+ \
995
+ if (card == CARD_r || UPB_LIKELY(!submsg.msg)) { \
996
+ *dst = submsg.msg = decode_newmsg_ceil(d, subtablep, msg_ceil_bytes); \
997
+ } \
998
+ \
999
+ ptr += tagbytes; \
1000
+ ptr = fastdecode_delimited(d, ptr, fastdecode_tosubmsg, &submsg); \
1001
+ \
1002
+ if (UPB_UNLIKELY(ptr == NULL || d->end_group != DECODE_NOGROUP)) { \
1003
+ return fastdecode_err(d); \
1004
+ } \
1005
+ \
1006
+ if (card == CARD_r) { \
1007
+ fastdecode_nextret ret = fastdecode_nextrepeated( \
1008
+ d, dst, &ptr, &farr, data, tagbytes, sizeof(upb_msg *)); \
1009
+ switch (ret.next) { \
1010
+ case FD_NEXT_SAMEFIELD: \
1011
+ dst = ret.dst; \
1012
+ goto again; \
1013
+ case FD_NEXT_OTHERFIELD: \
1014
+ d->depth++; \
1015
+ data = ret.tag; \
1016
+ UPB_MUSTTAIL return fastdecode_tagdispatch(UPB_PARSE_ARGS); \
1017
+ case FD_NEXT_ATLIMIT: \
1018
+ d->depth++; \
1019
+ return ptr; \
1020
+ } \
1021
+ } \
1022
+ \
1023
+ d->depth++; \
1024
+ UPB_MUSTTAIL return fastdecode_dispatch(UPB_PARSE_ARGS);
1025
+
1026
+ #define F(card, tagbytes, size_ceil, ceil_arg) \
1027
+ const char *upb_p##card##m_##tagbytes##bt_max##size_ceil##b( \
1028
+ UPB_PARSE_PARAMS) { \
1029
+ FASTDECODE_SUBMSG(d, ptr, msg, table, hasbits, data, tagbytes, ceil_arg, \
1030
+ CARD_##card); \
1019
1031
  }
1020
1032
 
1021
1033
  #define SIZES(card, tagbytes) \
@@ -1036,5 +1048,6 @@ TAGBYTES(r)
1036
1048
  #undef TAGBYTES
1037
1049
  #undef SIZES
1038
1050
  #undef F
1051
+ #undef FASTDECODE_SUBMSG
1039
1052
 
1040
1053
  #endif /* UPB_FASTTABLE */