grpc 1.34.0 → 1.35.0.pre1

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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +808 -2787
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +14 -0
  6. data/include/grpc/grpc_security.h +61 -3
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +1 -1
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  12. data/include/grpc/slice_buffer.h +3 -3
  13. data/include/grpc/support/sync.h +3 -3
  14. data/include/grpc/support/time.h +7 -7
  15. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  16. data/src/core/ext/filters/client_channel/client_channel.cc +2734 -1498
  17. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -0
  20. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  21. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  22. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -6
  23. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +4 -5
  25. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +2 -3
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +32 -30
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +162 -20
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -8
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -2
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +7 -14
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  42. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -9
  43. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  44. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +18 -31
  45. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +3 -5
  46. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  47. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  48. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  49. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +11 -13
  50. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +8 -8
  51. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  52. data/src/core/ext/filters/client_channel/retry_throttle.h +3 -1
  53. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  54. data/src/core/ext/filters/client_channel/subchannel.cc +34 -50
  55. data/src/core/ext/filters/client_channel/subchannel.h +12 -18
  56. data/src/core/ext/filters/deadline/deadline_filter.cc +4 -2
  57. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  58. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  59. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  60. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  61. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  62. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  63. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  64. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  65. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +178 -86
  66. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  67. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  69. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  70. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  71. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  72. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  73. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  74. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  75. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  76. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -27
  77. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +139 -40
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +111 -111
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +424 -241
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  85. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +21 -21
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +88 -39
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +44 -44
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +17 -17
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +72 -35
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +7 -7
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +27 -11
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +30 -30
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +136 -49
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +47 -47
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +163 -78
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +7 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +28 -28
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +23 -23
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +106 -54
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  126. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +16 -16
  127. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +81 -35
  128. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  129. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  130. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +203 -203
  131. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +845 -495
  132. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +5 -5
  133. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +26 -6
  134. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  135. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  136. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +87 -87
  137. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +343 -204
  138. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  139. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +20 -20
  140. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +85 -46
  141. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +33 -11
  143. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +32 -32
  144. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +118 -67
  145. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  147. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  148. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  149. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +29 -29
  150. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +120 -82
  151. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  152. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  155. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  156. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  157. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  159. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  160. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  164. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  165. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  166. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  168. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  169. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +16 -3
  171. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  172. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  173. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  174. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  175. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  176. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  177. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  178. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  179. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  180. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  181. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  182. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  184. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  185. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +34 -34
  186. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +149 -72
  187. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  188. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  189. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  190. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  191. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  192. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  193. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  194. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  195. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  196. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  197. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  198. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  199. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  200. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  201. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  202. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  203. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  204. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  205. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  206. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  207. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  208. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  209. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  210. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  211. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  212. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  213. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  214. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  215. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  216. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  217. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  218. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  219. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  220. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  221. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  222. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  223. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  224. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  225. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  226. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +1 -1
  227. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +7 -0
  228. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +5 -5
  229. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +21 -7
  230. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +2 -2
  231. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +7 -0
  232. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +4 -4
  233. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +17 -8
  234. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +7 -7
  235. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +31 -18
  236. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +5 -5
  237. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +19 -11
  238. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  239. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  240. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  241. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  242. data/src/core/ext/xds/certificate_provider_store.cc +10 -7
  243. data/src/core/ext/xds/certificate_provider_store.h +12 -7
  244. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +25 -0
  245. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -4
  246. data/src/core/ext/xds/xds_api.cc +220 -31
  247. data/src/core/ext/xds/xds_api.h +41 -10
  248. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  249. data/src/core/ext/xds/xds_certificate_provider.cc +61 -2
  250. data/src/core/ext/xds/xds_certificate_provider.h +40 -2
  251. data/src/core/ext/xds/xds_client.cc +31 -29
  252. data/src/core/ext/xds/xds_client.h +6 -1
  253. data/src/core/ext/xds/xds_client_stats.cc +2 -2
  254. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  255. data/src/core/lib/channel/channel_args.cc +8 -8
  256. data/src/core/lib/channel/channel_trace.h +1 -1
  257. data/src/core/lib/channel/channelz.cc +13 -14
  258. data/src/core/lib/channel/channelz.h +0 -1
  259. data/src/core/lib/channel/channelz_registry.h +0 -1
  260. data/src/core/lib/channel/handshaker.cc +2 -2
  261. data/src/core/lib/compression/compression_args.cc +3 -2
  262. data/src/core/lib/debug/stats.h +2 -2
  263. data/src/core/lib/debug/stats_data.h +13 -13
  264. data/src/core/lib/gpr/alloc.cc +3 -2
  265. data/src/core/lib/gpr/log.cc +53 -16
  266. data/src/core/lib/gpr/log_linux.cc +3 -1
  267. data/src/core/lib/gpr/log_posix.cc +3 -1
  268. data/src/core/lib/gpr/log_windows.cc +3 -1
  269. data/src/core/lib/gpr/spinlock.h +10 -2
  270. data/src/core/lib/gpr/string.cc +22 -21
  271. data/src/core/lib/gpr/string.h +5 -6
  272. data/src/core/lib/gpr/sync.cc +4 -4
  273. data/src/core/lib/gpr/time.cc +12 -12
  274. data/src/core/lib/gprpp/arena.h +3 -2
  275. data/src/core/lib/gprpp/ref_counted.h +2 -2
  276. data/src/core/lib/gprpp/ref_counted_ptr.h +9 -1
  277. data/src/core/lib/gprpp/thd_posix.cc +6 -1
  278. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  279. data/src/core/lib/http/httpcli.cc +1 -1
  280. data/src/core/lib/http/httpcli.h +2 -3
  281. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  282. data/src/core/lib/http/parser.cc +1 -2
  283. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  284. data/src/core/lib/iomgr/combiner.cc +2 -1
  285. data/src/core/lib/iomgr/endpoint.h +1 -1
  286. data/src/core/lib/iomgr/error.cc +15 -11
  287. data/src/core/lib/iomgr/error_internal.h +1 -1
  288. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  289. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -13
  290. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  291. data/src/core/lib/iomgr/exec_ctx.h +6 -4
  292. data/src/core/lib/iomgr/executor.cc +2 -1
  293. data/src/core/lib/iomgr/executor.h +1 -1
  294. data/src/core/lib/iomgr/executor/threadpool.h +1 -1
  295. data/src/core/lib/iomgr/iomgr.cc +1 -1
  296. data/src/core/lib/iomgr/load_file.h +1 -1
  297. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  298. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  299. data/src/core/lib/iomgr/parse_address.cc +52 -46
  300. data/src/core/lib/iomgr/parse_address.h +13 -9
  301. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  302. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  303. data/src/core/lib/iomgr/python_util.h +1 -1
  304. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  305. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  306. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  307. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  308. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  309. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  310. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  311. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  312. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  313. data/src/core/lib/iomgr/tcp_posix.cc +9 -6
  314. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  315. data/src/core/lib/iomgr/timer_custom.cc +3 -3
  316. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  317. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  318. data/src/core/lib/iomgr/udp_server.cc +1 -2
  319. data/src/core/lib/iomgr/udp_server.h +1 -2
  320. data/src/core/lib/iomgr/unix_sockets_posix.cc +17 -18
  321. data/src/core/lib/json/json.h +10 -0
  322. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  323. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  324. data/src/core/lib/security/context/security_context.cc +4 -3
  325. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  326. data/src/core/lib/security/credentials/credentials.cc +6 -6
  327. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  328. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  329. data/src/core/lib/security/credentials/external/aws_request_signer.cc +15 -10
  330. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -2
  331. data/src/core/lib/security/credentials/external/external_account_credentials.cc +217 -31
  332. data/src/core/lib/security/credentials/external/external_account_credentials.h +7 -5
  333. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  334. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -4
  335. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -18
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +5 -6
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  339. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +18 -5
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  341. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -3
  342. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +37 -44
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  345. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  346. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +1 -6
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +1 -6
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +326 -5
  350. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +64 -0
  351. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +1 -1
  352. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +0 -1
  353. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  354. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  355. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  356. data/src/core/lib/security/credentials/xds/xds_credentials.cc +140 -10
  357. data/src/core/lib/security/credentials/xds/xds_credentials.h +27 -9
  358. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  359. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  360. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +46 -13
  361. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +23 -6
  362. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +3 -2
  364. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  365. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  366. data/src/core/lib/security/security_connector/ssl_utils.h +12 -19
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +57 -12
  368. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +2 -3
  369. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  370. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  371. data/src/core/lib/slice/slice_intern.cc +4 -5
  372. data/src/core/lib/slice/slice_internal.h +2 -2
  373. data/src/core/lib/surface/call.cc +32 -24
  374. data/src/core/lib/surface/call_details.cc +8 -8
  375. data/src/core/lib/surface/channel.cc +16 -10
  376. data/src/core/lib/surface/channel.h +3 -2
  377. data/src/core/lib/surface/channel_init.cc +1 -1
  378. data/src/core/lib/surface/completion_queue.cc +23 -18
  379. data/src/core/lib/surface/completion_queue.h +16 -16
  380. data/src/core/lib/surface/init.cc +6 -5
  381. data/src/core/lib/surface/lame_client.cc +20 -46
  382. data/src/core/lib/surface/lame_client.h +4 -0
  383. data/src/core/lib/surface/server.cc +59 -15
  384. data/src/core/lib/surface/server.h +37 -5
  385. data/src/core/lib/surface/version.cc +1 -1
  386. data/src/core/lib/transport/authority_override.cc +6 -4
  387. data/src/core/lib/transport/authority_override.h +5 -2
  388. data/src/core/lib/transport/connectivity_state.h +6 -4
  389. data/src/core/lib/transport/error_utils.h +1 -1
  390. data/src/core/lib/transport/metadata_batch.h +4 -4
  391. data/src/core/lib/transport/static_metadata.cc +1 -1
  392. data/src/core/lib/transport/status_metadata.cc +4 -3
  393. data/src/core/lib/transport/transport.h +7 -7
  394. data/src/core/lib/uri/uri_parser.cc +131 -249
  395. data/src/core/lib/uri/uri_parser.h +57 -21
  396. data/src/core/plugin_registry/grpc_plugin_registry.cc +10 -4
  397. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  398. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  399. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  400. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +23 -23
  401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  403. data/src/core/tsi/fake_transport_security.cc +5 -3
  404. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  405. data/src/core/tsi/ssl_transport_security.cc +62 -49
  406. data/src/core/tsi/ssl_transport_security.h +6 -6
  407. data/src/core/tsi/transport_security.cc +6 -6
  408. data/src/core/tsi/transport_security_interface.h +1 -1
  409. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  410. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -0
  411. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +31 -13
  412. data/src/ruby/lib/grpc/version.rb +1 -1
  413. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  414. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  415. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  416. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  417. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  418. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  419. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  420. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  421. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  422. data/third_party/upb/upb/decode.c +248 -167
  423. data/third_party/upb/upb/decode.h +20 -1
  424. data/third_party/upb/upb/decode.int.h +163 -0
  425. data/third_party/upb/upb/decode_fast.c +1040 -0
  426. data/third_party/upb/upb/decode_fast.h +126 -0
  427. data/third_party/upb/upb/def.c +525 -516
  428. data/third_party/upb/upb/def.h +16 -31
  429. data/third_party/upb/upb/def.hpp +37 -123
  430. data/third_party/upb/upb/encode.c +227 -169
  431. data/third_party/upb/upb/encode.h +27 -2
  432. data/third_party/upb/upb/json_decode.c +1443 -0
  433. data/third_party/upb/upb/json_decode.h +23 -0
  434. data/third_party/upb/upb/json_encode.c +713 -0
  435. data/third_party/upb/upb/json_encode.h +36 -0
  436. data/third_party/upb/upb/msg.c +167 -88
  437. data/third_party/upb/upb/msg.h +174 -34
  438. data/third_party/upb/upb/port_def.inc +74 -61
  439. data/third_party/upb/upb/port_undef.inc +3 -7
  440. data/third_party/upb/upb/reflection.c +36 -19
  441. data/third_party/upb/upb/table.c +34 -197
  442. data/third_party/upb/upb/table.int.h +14 -5
  443. data/third_party/upb/upb/text_encode.c +45 -22
  444. data/third_party/upb/upb/text_encode.h +4 -1
  445. data/third_party/upb/upb/upb.c +18 -41
  446. data/third_party/upb/upb/upb.h +36 -7
  447. data/third_party/upb/upb/upb.hpp +4 -4
  448. data/third_party/upb/upb/upb.int.h +29 -0
  449. metadata +60 -46
  450. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -909
  451. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  452. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  453. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -355
  454. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -138
  455. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +0 -265
  456. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +0 -104
  457. data/src/core/lib/gprpp/map.h +0 -53
  458. data/third_party/upb/upb/port.c +0 -26
@@ -7,15 +7,34 @@
7
7
 
8
8
  #include "upb/msg.h"
9
9
 
10
+ /* Must be last. */
11
+ #include "upb/port_def.inc"
12
+
10
13
  #ifdef __cplusplus
11
14
  extern "C" {
12
15
  #endif
13
16
 
17
+ enum {
18
+ /* If set, strings will alias the input buffer instead of copying into the
19
+ * arena. */
20
+ UPB_DECODE_ALIAS = 1,
21
+ };
22
+
23
+ #define UPB_DECODE_MAXDEPTH(depth) ((depth) << 16)
24
+
25
+ bool _upb_decode(const char *buf, size_t size, upb_msg *msg,
26
+ const upb_msglayout *l, upb_arena *arena, int options);
27
+
28
+ UPB_INLINE
14
29
  bool upb_decode(const char *buf, size_t size, upb_msg *msg,
15
- const upb_msglayout *l, upb_arena *arena);
30
+ const upb_msglayout *l, upb_arena *arena) {
31
+ return _upb_decode(buf, size, msg, l, arena, 0);
32
+ }
16
33
 
17
34
  #ifdef __cplusplus
18
35
  } /* extern "C" */
19
36
  #endif
20
37
 
38
+ #include "upb/port_undef.inc"
39
+
21
40
  #endif /* UPB_DECODE_H_ */
@@ -0,0 +1,163 @@
1
+ /*
2
+ ** Internal implementation details of the decoder that are shared between
3
+ ** decode.c and decode_fast.c.
4
+ */
5
+
6
+ #ifndef UPB_DECODE_INT_H_
7
+ #define UPB_DECODE_INT_H_
8
+
9
+ #include <setjmp.h>
10
+
11
+ #include "upb/msg.h"
12
+ #include "upb/upb.int.h"
13
+
14
+ /* Must be last. */
15
+ #include "upb/port_def.inc"
16
+
17
+ #define DECODE_NOGROUP -1
18
+
19
+ typedef struct upb_decstate {
20
+ const char *end; /* Can read up to 16 bytes slop beyond this. */
21
+ const char *limit_ptr; /* = end + UPB_MIN(limit, 0) */
22
+ upb_msg *unknown_msg; /* If non-NULL, add unknown data at buffer flip. */
23
+ const char *unknown; /* Start of unknown data. */
24
+ int limit; /* Submessage limit relative to end. */
25
+ int depth;
26
+ uint32_t end_group; /* field number of END_GROUP tag, else DECODE_NOGROUP */
27
+ bool alias;
28
+ char patch[32];
29
+ upb_arena arena;
30
+ jmp_buf err;
31
+ } upb_decstate;
32
+
33
+ /* Error function that will abort decoding with longjmp(). We can't declare this
34
+ * UPB_NORETURN, even though it is appropriate, because if we do then compilers
35
+ * will "helpfully" refuse to tailcall to it
36
+ * (see: https://stackoverflow.com/a/55657013), which will defeat a major goal
37
+ * of our optimizations. That is also why we must declare it in a separate file,
38
+ * otherwise the compiler will see that it calls longjmp() and deduce that it is
39
+ * noreturn. */
40
+ const char *fastdecode_err(upb_decstate *d);
41
+
42
+ extern const uint8_t upb_utf8_offsets[];
43
+
44
+ UPB_INLINE
45
+ bool decode_verifyutf8_inl(const char *buf, int len) {
46
+ int i, j;
47
+ uint8_t offset;
48
+
49
+ i = 0;
50
+ while (i < len) {
51
+ offset = upb_utf8_offsets[(uint8_t)buf[i]];
52
+ if (offset == 0 || i + offset > len) {
53
+ return false;
54
+ }
55
+ for (j = i + 1; j < i + offset; j++) {
56
+ if ((buf[j] & 0xc0) != 0x80) {
57
+ return false;
58
+ }
59
+ }
60
+ i += offset;
61
+ }
62
+ return i == len;
63
+ }
64
+
65
+ /* x86-64 pointers always have the high 16 bits matching. So we can shift
66
+ * left 8 and right 8 without loss of information. */
67
+ UPB_INLINE intptr_t decode_totable(const upb_msglayout *tablep) {
68
+ return ((intptr_t)tablep << 8) | tablep->table_mask;
69
+ }
70
+
71
+ UPB_INLINE const upb_msglayout *decode_totablep(intptr_t table) {
72
+ return (const upb_msglayout*)(table >> 8);
73
+ }
74
+
75
+ UPB_INLINE
76
+ const char *decode_isdonefallback_inl(upb_decstate *d, const char *ptr,
77
+ int overrun) {
78
+ if (overrun < d->limit) {
79
+ /* Need to copy remaining data into patch buffer. */
80
+ UPB_ASSERT(overrun < 16);
81
+ if (d->unknown_msg) {
82
+ if (!_upb_msg_addunknown(d->unknown_msg, d->unknown, ptr - d->unknown,
83
+ &d->arena)) {
84
+ return NULL;
85
+ }
86
+ d->unknown = &d->patch[0] + overrun;
87
+ }
88
+ memset(d->patch + 16, 0, 16);
89
+ memcpy(d->patch, d->end, 16);
90
+ ptr = &d->patch[0] + overrun;
91
+ d->end = &d->patch[16];
92
+ d->limit -= 16;
93
+ d->limit_ptr = d->end + d->limit;
94
+ d->alias = false;
95
+ UPB_ASSERT(ptr < d->limit_ptr);
96
+ return ptr;
97
+ } else {
98
+ return NULL;
99
+ }
100
+ }
101
+
102
+ const char *decode_isdonefallback(upb_decstate *d, const char *ptr,
103
+ int overrun);
104
+
105
+ UPB_INLINE
106
+ bool decode_isdone(upb_decstate *d, const char **ptr) {
107
+ int overrun = *ptr - d->end;
108
+ if (UPB_LIKELY(*ptr < d->limit_ptr)) {
109
+ return false;
110
+ } else if (UPB_LIKELY(overrun == d->limit)) {
111
+ return true;
112
+ } else {
113
+ *ptr = decode_isdonefallback(d, *ptr, overrun);
114
+ return false;
115
+ }
116
+ }
117
+
118
+ UPB_INLINE
119
+ const char *fastdecode_tagdispatch(upb_decstate *d, const char *ptr,
120
+ upb_msg *msg, intptr_t table,
121
+ uint64_t hasbits, uint32_t tag) {
122
+ const upb_msglayout *table_p = decode_totablep(table);
123
+ uint8_t mask = table;
124
+ uint64_t data;
125
+ size_t idx = tag & mask;
126
+ UPB_ASSUME((idx & 7) == 0);
127
+ idx >>= 3;
128
+ data = table_p->fasttable[idx].field_data ^ tag;
129
+ return table_p->fasttable[idx].field_parser(d, ptr, msg, table, hasbits, data);
130
+ }
131
+
132
+ UPB_INLINE uint32_t fastdecode_loadtag(const char* ptr) {
133
+ uint16_t tag;
134
+ memcpy(&tag, ptr, 2);
135
+ return tag;
136
+ }
137
+
138
+ UPB_INLINE void decode_checklimit(upb_decstate *d) {
139
+ UPB_ASSERT(d->limit_ptr == d->end + UPB_MIN(0, d->limit));
140
+ }
141
+
142
+ UPB_INLINE int decode_pushlimit(upb_decstate *d, const char *ptr, int size) {
143
+ int limit = size + (int)(ptr - d->end);
144
+ int delta = d->limit - limit;
145
+ decode_checklimit(d);
146
+ d->limit = limit;
147
+ d->limit_ptr = d->end + UPB_MIN(0, limit);
148
+ decode_checklimit(d);
149
+ return delta;
150
+ }
151
+
152
+ UPB_INLINE void decode_poplimit(upb_decstate *d, const char *ptr,
153
+ int saved_delta) {
154
+ UPB_ASSERT(ptr - d->end == d->limit);
155
+ decode_checklimit(d);
156
+ d->limit += saved_delta;
157
+ d->limit_ptr = d->end + UPB_MIN(0, d->limit);
158
+ decode_checklimit(d);
159
+ }
160
+
161
+ #include "upb/port_undef.inc"
162
+
163
+ #endif /* UPB_DECODE_INT_H_ */
@@ -0,0 +1,1040 @@
1
+ // Fast decoder: ~3x the speed of decode.c, but x86-64 specific.
2
+ // Also the table size grows by 2x.
3
+ //
4
+ // Could potentially be ported to ARM64 or other 64-bit archs that pass at
5
+ // least six arguments in registers.
6
+ //
7
+ // The overall design is to create specialized functions for every possible
8
+ // field type (eg. oneof boolean field with a 1 byte tag) and then dispatch
9
+ // to the specialized function as quickly as possible.
10
+
11
+ #include "upb/decode_fast.h"
12
+
13
+ #include "upb/decode.int.h"
14
+
15
+ /* Must be last. */
16
+ #include "upb/port_def.inc"
17
+
18
+ #if UPB_FASTTABLE
19
+
20
+ // The standard set of arguments passed to each parsing function.
21
+ // Thanks to x86-64 calling conventions, these will stay in registers.
22
+ #define UPB_PARSE_PARAMS \
23
+ upb_decstate *d, const char *ptr, upb_msg *msg, intptr_t table, \
24
+ uint64_t hasbits, uint64_t data
25
+
26
+ #define UPB_PARSE_ARGS d, ptr, msg, table, hasbits, data
27
+
28
+ #define RETURN_GENERIC(m) \
29
+ /* fprintf(stderr, m); */ \
30
+ return fastdecode_generic(d, ptr, msg, table, hasbits, 0);
31
+
32
+ typedef enum {
33
+ CARD_s = 0, /* Singular (optional, non-repeated) */
34
+ CARD_o = 1, /* Oneof */
35
+ CARD_r = 2, /* Repeated */
36
+ CARD_p = 3 /* Packed Repeated */
37
+ } upb_card;
38
+
39
+ 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) {
43
+ ptr = decode_isdonefallback_inl(d, ptr, overrun);
44
+ if (ptr == NULL) {
45
+ return fastdecode_err(d);
46
+ }
47
+ uint16_t tag = fastdecode_loadtag(ptr);
48
+ return fastdecode_tagdispatch(d, ptr, msg, table, hasbits, tag);
49
+ }
50
+
51
+ 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) {
55
+ if (UPB_UNLIKELY(ptr >= d->limit_ptr)) {
56
+ int overrun = ptr - d->end;
57
+ if (UPB_LIKELY(overrun == d->limit)) {
58
+ // Parse is finished.
59
+ *(uint32_t*)msg |= hasbits; // Sync hasbits.
60
+ return ptr;
61
+ } else {
62
+ return fastdecode_isdonefallback(d, ptr, msg, table, hasbits, overrun);
63
+ }
64
+ }
65
+
66
+ // 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);
69
+ }
70
+
71
+ UPB_FORCEINLINE
72
+ static bool fastdecode_checktag(uint64_t data, int tagbytes) {
73
+ if (tagbytes == 1) {
74
+ return (data & 0xff) == 0;
75
+ } else {
76
+ return (data & 0xffff) == 0;
77
+ }
78
+ }
79
+
80
+ UPB_FORCEINLINE
81
+ static const char *fastdecode_longsize(const char *ptr, int *size) {
82
+ int i;
83
+ UPB_ASSERT(*size & 0x80);
84
+ *size &= 0xff;
85
+ for (i = 0; i < 3; i++) {
86
+ ptr++;
87
+ size_t byte = (uint8_t)ptr[-1];
88
+ *size += (byte - 1) << (7 + 7 * i);
89
+ if (UPB_LIKELY((byte & 0x80) == 0)) return ptr;
90
+ }
91
+ ptr++;
92
+ size_t byte = (uint8_t)ptr[-1];
93
+ // len is limited by 2gb not 4gb, hence 8 and not 16 as normally expected
94
+ // for a 32 bit varint.
95
+ if (UPB_UNLIKELY(byte >= 8)) return NULL;
96
+ *size += (byte - 1) << 28;
97
+ return ptr;
98
+ }
99
+
100
+ UPB_FORCEINLINE
101
+ static bool fastdecode_boundscheck(const char *ptr, size_t len,
102
+ const char *end) {
103
+ uintptr_t uptr = (uintptr_t)ptr;
104
+ uintptr_t uend = (uintptr_t)end + 16;
105
+ uintptr_t res = uptr + len;
106
+ return res < uptr || res > uend;
107
+ }
108
+
109
+ UPB_FORCEINLINE
110
+ static bool fastdecode_boundscheck2(const char *ptr, size_t len,
111
+ const char *end) {
112
+ // This is one extra branch compared to the more normal:
113
+ // return (size_t)(end - ptr) < size;
114
+ // However it is one less computation if we are just about to use "ptr + len":
115
+ // https://godbolt.org/z/35YGPz
116
+ // In microbenchmarks this shows an overall 4% improvement.
117
+ uintptr_t uptr = (uintptr_t)ptr;
118
+ uintptr_t uend = (uintptr_t)end;
119
+ uintptr_t res = uptr + len;
120
+ return res < uptr || res > uend;
121
+ }
122
+
123
+ typedef const char *fastdecode_delimfunc(upb_decstate *d, const char *ptr,
124
+ void *ctx);
125
+
126
+ UPB_FORCEINLINE
127
+ static const char *fastdecode_delimited(upb_decstate *d, const char *ptr,
128
+ fastdecode_delimfunc *func, void *ctx) {
129
+ ptr++;
130
+ int len = (int8_t)ptr[-1];
131
+ if (fastdecode_boundscheck2(ptr, len, d->limit_ptr)) {
132
+ // Slow case: Sub-message is >=128 bytes and/or exceeds the current buffer.
133
+ // If it exceeds the buffer limit, limit/limit_ptr will change during
134
+ // sub-message parsing, so we need to preserve delta, not limit.
135
+ if (UPB_UNLIKELY(len & 0x80)) {
136
+ // Size varint >1 byte (length >= 128).
137
+ ptr = fastdecode_longsize(ptr, &len);
138
+ if (!ptr) {
139
+ // Corrupt wire format: size exceeded INT_MAX.
140
+ return NULL;
141
+ }
142
+ }
143
+ if (ptr - d->end + (int)len > d->limit) {
144
+ // Corrupt wire format: invalid limit.
145
+ return NULL;
146
+ }
147
+ int delta = decode_pushlimit(d, ptr, len);
148
+ ptr = func(d, ptr, ctx);
149
+ decode_poplimit(d, ptr, delta);
150
+ } else {
151
+ // Fast case: Sub-message is <128 bytes and fits in the current buffer.
152
+ // This means we can preserve limit/limit_ptr verbatim.
153
+ const char *saved_limit_ptr = d->limit_ptr;
154
+ int saved_limit = d->limit;
155
+ d->limit_ptr = ptr + len;
156
+ d->limit = d->limit_ptr - d->end;
157
+ UPB_ASSERT(d->limit_ptr == d->end + UPB_MIN(0, d->limit));
158
+ ptr = func(d, ptr, ctx);
159
+ d->limit_ptr = saved_limit_ptr;
160
+ d->limit = saved_limit;
161
+ UPB_ASSERT(d->limit_ptr == d->end + UPB_MIN(0, d->limit));
162
+ }
163
+ return ptr;
164
+ }
165
+
166
+ /* singular, oneof, repeated field handling ***********************************/
167
+
168
+ typedef struct {
169
+ upb_array *arr;
170
+ void *end;
171
+ } fastdecode_arr;
172
+
173
+ typedef enum {
174
+ FD_NEXT_ATLIMIT,
175
+ FD_NEXT_SAMEFIELD,
176
+ FD_NEXT_OTHERFIELD
177
+ } fastdecode_next;
178
+
179
+ typedef struct {
180
+ void *dst;
181
+ fastdecode_next next;
182
+ uint32_t tag;
183
+ } fastdecode_nextret;
184
+
185
+ UPB_FORCEINLINE
186
+ static void *fastdecode_resizearr(upb_decstate *d, void *dst,
187
+ fastdecode_arr *farr, int valbytes) {
188
+ if (UPB_UNLIKELY(dst == farr->end)) {
189
+ size_t old_size = farr->arr->size;
190
+ size_t old_bytes = old_size * valbytes;
191
+ size_t new_size = old_size * 2;
192
+ size_t new_bytes = new_size * valbytes;
193
+ char *old_ptr = _upb_array_ptr(farr->arr);
194
+ char *new_ptr = upb_arena_realloc(&d->arena, old_ptr, old_bytes, new_bytes);
195
+ uint8_t elem_size_lg2 = __builtin_ctz(valbytes);
196
+ farr->arr->size = new_size;
197
+ farr->arr->data = _upb_array_tagptr(new_ptr, elem_size_lg2);
198
+ dst = (void*)(new_ptr + (old_size * valbytes));
199
+ farr->end = (void*)(new_ptr + (new_size * valbytes));
200
+ }
201
+ return dst;
202
+ }
203
+
204
+ UPB_FORCEINLINE
205
+ static bool fastdecode_tagmatch(uint32_t tag, uint64_t data, int tagbytes) {
206
+ if (tagbytes == 1) {
207
+ return (uint8_t)tag == (uint8_t)data;
208
+ } else {
209
+ return (uint16_t)tag == (uint16_t)data;
210
+ }
211
+ }
212
+
213
+ UPB_FORCEINLINE
214
+ static void fastdecode_commitarr(void *dst, fastdecode_arr *farr,
215
+ int valbytes) {
216
+ farr->arr->len =
217
+ (size_t)((char *)dst - (char *)_upb_array_ptr(farr->arr)) / valbytes;
218
+ }
219
+
220
+ UPB_FORCEINLINE
221
+ static fastdecode_nextret fastdecode_nextrepeated(upb_decstate *d, void *dst,
222
+ const char **ptr,
223
+ fastdecode_arr *farr,
224
+ uint64_t data, int tagbytes,
225
+ int valbytes) {
226
+ fastdecode_nextret ret;
227
+ dst = (char *)dst + valbytes;
228
+
229
+ if (UPB_LIKELY(!decode_isdone(d, ptr))) {
230
+ ret.tag = fastdecode_loadtag(*ptr);
231
+ if (fastdecode_tagmatch(ret.tag, data, tagbytes)) {
232
+ ret.next = FD_NEXT_SAMEFIELD;
233
+ } else {
234
+ fastdecode_commitarr(dst, farr, valbytes);
235
+ ret.next = FD_NEXT_OTHERFIELD;
236
+ }
237
+ } else {
238
+ fastdecode_commitarr(dst, farr, valbytes);
239
+ ret.next = FD_NEXT_ATLIMIT;
240
+ }
241
+
242
+ ret.dst = dst;
243
+ return ret;
244
+ }
245
+
246
+ UPB_FORCEINLINE
247
+ static void *fastdecode_fieldmem(upb_msg *msg, uint64_t data) {
248
+ size_t ofs = data >> 48;
249
+ return (char *)msg + ofs;
250
+ }
251
+
252
+ UPB_FORCEINLINE
253
+ static void *fastdecode_getfield(upb_decstate *d, const char *ptr, upb_msg *msg,
254
+ uint64_t *data, uint64_t *hasbits,
255
+ fastdecode_arr *farr, int valbytes,
256
+ upb_card card) {
257
+ switch (card) {
258
+ case CARD_s: {
259
+ uint8_t hasbit_index = *data >> 24;
260
+ // Set hasbit and return pointer to scalar field.
261
+ *hasbits |= 1ull << hasbit_index;
262
+ return fastdecode_fieldmem(msg, *data);
263
+ }
264
+ case CARD_o: {
265
+ uint16_t case_ofs = *data >> 32;
266
+ uint32_t *oneof_case = UPB_PTR_AT(msg, case_ofs, uint32_t);
267
+ uint8_t field_number = *data >> 24;
268
+ *oneof_case = field_number;
269
+ return fastdecode_fieldmem(msg, *data);
270
+ }
271
+ case CARD_r: {
272
+ // Get pointer to upb_array and allocate/expand if necessary.
273
+ uint8_t elem_size_lg2 = __builtin_ctz(valbytes);
274
+ upb_array **arr_p = fastdecode_fieldmem(msg, *data);
275
+ char *begin;
276
+ *(uint32_t*)msg |= *hasbits;
277
+ *hasbits = 0;
278
+ if (UPB_LIKELY(!*arr_p)) {
279
+ farr->arr = _upb_array_new(&d->arena, 8, elem_size_lg2);
280
+ *arr_p = farr->arr;
281
+ } else {
282
+ farr->arr = *arr_p;
283
+ }
284
+ begin = _upb_array_ptr(farr->arr);
285
+ farr->end = begin + (farr->arr->size * valbytes);
286
+ *data = fastdecode_loadtag(ptr);
287
+ return begin + (farr->arr->len * valbytes);
288
+ }
289
+ default:
290
+ UPB_UNREACHABLE();
291
+ }
292
+ }
293
+
294
+ UPB_FORCEINLINE
295
+ static bool fastdecode_flippacked(uint64_t *data, int tagbytes) {
296
+ *data ^= (0x2 ^ 0x0); // Patch data to match packed wiretype.
297
+ return fastdecode_checktag(*data, tagbytes);
298
+ }
299
+
300
+ /* varint fields **************************************************************/
301
+
302
+ UPB_FORCEINLINE
303
+ static uint64_t fastdecode_munge(uint64_t val, int valbytes, bool zigzag) {
304
+ if (valbytes == 1) {
305
+ return val != 0;
306
+ } else if (zigzag) {
307
+ if (valbytes == 4) {
308
+ uint32_t n = val;
309
+ return (n >> 1) ^ -(int32_t)(n & 1);
310
+ } else if (valbytes == 8) {
311
+ return (val >> 1) ^ -(int64_t)(val & 1);
312
+ }
313
+ UPB_UNREACHABLE();
314
+ }
315
+ return val;
316
+ }
317
+
318
+ UPB_FORCEINLINE
319
+ static const char *fastdecode_varint64(const char *ptr, uint64_t *val) {
320
+ ptr++;
321
+ *val = (uint8_t)ptr[-1];
322
+ if (UPB_UNLIKELY(*val & 0x80)) {
323
+ int i;
324
+ for (i = 0; i < 8; i++) {
325
+ ptr++;
326
+ uint64_t byte = (uint8_t)ptr[-1];
327
+ *val += (byte - 1) << (7 + 7 * i);
328
+ if (UPB_LIKELY((byte & 0x80) == 0)) goto done;
329
+ }
330
+ ptr++;
331
+ uint64_t byte = (uint8_t)ptr[-1];
332
+ if (byte > 1) {
333
+ return NULL;
334
+ }
335
+ *val += (byte - 1) << 63;
336
+ }
337
+ done:
338
+ UPB_ASSUME(ptr != NULL);
339
+ return ptr;
340
+ }
341
+
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
+ }
393
+
394
+ typedef struct {
395
+ uint8_t valbytes;
396
+ bool zigzag;
397
+ void *dst;
398
+ fastdecode_arr farr;
399
+ } fastdecode_varintdata;
400
+
401
+ UPB_FORCEINLINE
402
+ static const char *fastdecode_topackedvarint(upb_decstate *d, const char *ptr,
403
+ void *ctx) {
404
+ fastdecode_varintdata *data = ctx;
405
+ void *dst = data->dst;
406
+ uint64_t val;
407
+
408
+ while (!decode_isdone(d, &ptr)) {
409
+ dst = fastdecode_resizearr(d, dst, &data->farr, data->valbytes);
410
+ ptr = fastdecode_varint64(ptr, &val);
411
+ if (ptr == NULL) return NULL;
412
+ val = fastdecode_munge(val, data->valbytes, data->zigzag);
413
+ memcpy(dst, &val, data->valbytes);
414
+ dst = (char *)dst + data->valbytes;
415
+ }
416
+
417
+ fastdecode_commitarr(dst, &data->farr, data->valbytes);
418
+ return ptr;
419
+ }
420
+
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);
462
+ }
463
+ }
464
+
465
+ #define z_ZZ true
466
+ #define b_ZZ false
467
+ #define v_ZZ false
468
+
469
+ /* Generate all combinations:
470
+ * {s,o,r,p} x {b1,v4,z4,v8,z8} x {1bt,2bt} */
471
+
472
+ #define F(card, type, valbytes, tagbytes) \
473
+ UPB_NOINLINE \
474
+ 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); \
479
+ }
480
+
481
+ #define TYPES(card, tagbytes) \
482
+ F(card, b, 1, tagbytes) \
483
+ F(card, v, 4, tagbytes) \
484
+ F(card, v, 8, tagbytes) \
485
+ F(card, z, 4, tagbytes) \
486
+ F(card, z, 8, tagbytes)
487
+
488
+ #define TAGBYTES(card) \
489
+ TYPES(card, 1) \
490
+ TYPES(card, 2)
491
+
492
+ TAGBYTES(s)
493
+ TAGBYTES(o)
494
+ TAGBYTES(r)
495
+ TAGBYTES(p)
496
+
497
+ #undef z_ZZ
498
+ #undef b_ZZ
499
+ #undef v_ZZ
500
+ #undef o_ONEOF
501
+ #undef s_ONEOF
502
+ #undef r_ONEOF
503
+ #undef F
504
+ #undef TYPES
505
+ #undef TAGBYTES
506
+
507
+
508
+ /* fixed fields ***************************************************************/
509
+
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");
522
+ }
523
+
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
+ /* Generate all combinations:
618
+ * {s,o,r,p} x {f4,f8} x {1bt,2bt} */
619
+
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); \
626
+ }
627
+
628
+ #define TYPES(card, tagbytes) \
629
+ F(card, 4, tagbytes) \
630
+ F(card, 8, tagbytes)
631
+
632
+ #define TAGBYTES(card) \
633
+ TYPES(card, 1) \
634
+ TYPES(card, 2)
635
+
636
+ TAGBYTES(s)
637
+ TAGBYTES(o)
638
+ TAGBYTES(r)
639
+ TAGBYTES(p)
640
+
641
+ #undef F
642
+ #undef TYPES
643
+ #undef TAGBYTES
644
+
645
+ /* string fields **************************************************************/
646
+
647
+ typedef const char *fastdecode_copystr_func(struct upb_decstate *d,
648
+ const char *ptr, upb_msg *msg,
649
+ const upb_msglayout *table,
650
+ uint64_t hasbits, upb_strview *dst);
651
+
652
+ UPB_NOINLINE
653
+ static const char *fastdecode_verifyutf8(upb_decstate *d, const char *ptr,
654
+ upb_msg *msg, intptr_t table,
655
+ uint64_t hasbits, upb_strview *dst) {
656
+ if (!decode_verifyutf8_inl(dst->data, dst->size)) {
657
+ return fastdecode_err(d);
658
+ }
659
+ return fastdecode_dispatch(d, ptr, msg, table, hasbits);
660
+ }
661
+
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);
672
+ }
673
+
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
+ UPB_NOINLINE
700
+ 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);
705
+ }
706
+
707
+ UPB_NOINLINE
708
+ static const char *fastdecode_longstring_noutf8(struct upb_decstate *d,
709
+ const char *ptr, upb_msg *msg,
710
+ intptr_t table,
711
+ uint64_t hasbits,
712
+ upb_strview *dst) {
713
+ return fastdecode_longstring(d, ptr, msg, table, hasbits, dst, false);
714
+ }
715
+
716
+ UPB_FORCEINLINE
717
+ static void fastdecode_docopy(upb_decstate *d, const char *ptr, uint32_t size,
718
+ int copy, char *data, upb_strview *dst) {
719
+ d->arena.head.ptr += copy;
720
+ dst->data = data;
721
+ UPB_UNPOISON_MEMORY_REGION(data, copy);
722
+ memcpy(data, ptr, copy);
723
+ UPB_POISON_MEMORY_REGION(data + size, copy - size);
724
+ }
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));
829
+ }
830
+
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
+ }
876
+
877
+ /* Generate all combinations:
878
+ * {p,c} x {s,o,r} x {s, b} x {1bt,2bt} */
879
+
880
+ #define s_VALIDATE true
881
+ #define b_VALIDATE false
882
+
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); \
893
+ }
894
+
895
+ #define UTF8(card, tagbytes) \
896
+ F(card, tagbytes, s) \
897
+ F(card, tagbytes, b)
898
+
899
+ #define TAGBYTES(card) \
900
+ UTF8(card, 1) \
901
+ UTF8(card, 2)
902
+
903
+ TAGBYTES(s)
904
+ TAGBYTES(o)
905
+ TAGBYTES(r)
906
+
907
+ #undef s_VALIDATE
908
+ #undef b_VALIDATE
909
+ #undef F
910
+ #undef TAGBYTES
911
+
912
+ /* message fields *************************************************************/
913
+
914
+ UPB_INLINE
915
+ upb_msg *decode_newmsg_ceil(upb_decstate *d, const upb_msglayout *l,
916
+ int msg_ceil_bytes) {
917
+ size_t size = l->size + sizeof(upb_msg_internal);
918
+ char *msg_data;
919
+ if (UPB_LIKELY(msg_ceil_bytes > 0 &&
920
+ _upb_arenahas(&d->arena) >= msg_ceil_bytes)) {
921
+ UPB_ASSERT(size <= (size_t)msg_ceil_bytes);
922
+ msg_data = d->arena.head.ptr;
923
+ d->arena.head.ptr += size;
924
+ UPB_UNPOISON_MEMORY_REGION(msg_data, msg_ceil_bytes);
925
+ memset(msg_data, 0, msg_ceil_bytes);
926
+ UPB_POISON_MEMORY_REGION(msg_data + size, msg_ceil_bytes - size);
927
+ } else {
928
+ msg_data = (char*)upb_arena_malloc(&d->arena, size);
929
+ memset(msg_data, 0, size);
930
+ }
931
+ return msg_data + sizeof(upb_msg_internal);
932
+ }
933
+
934
+ typedef struct {
935
+ intptr_t table;
936
+ upb_msg *msg;
937
+ } fastdecode_submsgdata;
938
+
939
+ UPB_FORCEINLINE
940
+ static const char *fastdecode_tosubmsg(upb_decstate *d, const char *ptr,
941
+ void *ctx) {
942
+ fastdecode_submsgdata *submsg = ctx;
943
+ ptr = fastdecode_dispatch(d, ptr, submsg->msg, submsg->table, 0);
944
+ UPB_ASSUME(ptr != NULL);
945
+ return ptr;
946
+ }
947
+
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); \
1019
+ }
1020
+
1021
+ #define SIZES(card, tagbytes) \
1022
+ F(card, tagbytes, 64, 64) \
1023
+ F(card, tagbytes, 128, 128) \
1024
+ F(card, tagbytes, 192, 192) \
1025
+ F(card, tagbytes, 256, 256) \
1026
+ F(card, tagbytes, max, -1)
1027
+
1028
+ #define TAGBYTES(card) \
1029
+ SIZES(card, 1) \
1030
+ SIZES(card, 2)
1031
+
1032
+ TAGBYTES(s)
1033
+ TAGBYTES(o)
1034
+ TAGBYTES(r)
1035
+
1036
+ #undef TAGBYTES
1037
+ #undef SIZES
1038
+ #undef F
1039
+
1040
+ #endif /* UPB_FASTTABLE */