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
@@ -0,0 +1,145 @@
1
+ /* Copyright 2020 王一 Wang Yi <godspeed_china@yeah.net>
2
+ This is free and unencumbered software released into the public domain. http://unlicense.org/
3
+ See github.com/wangyi-fudan/wyhash/ LICENSE
4
+ */
5
+ #ifndef wyhash_final_version
6
+ #define wyhash_final_version
7
+ //defines that change behavior
8
+ #ifndef WYHASH_CONDOM
9
+ #define WYHASH_CONDOM 1 //0: read 8 bytes before and after boundaries, dangerous but fastest. 1: normal valid behavior 2: extra protection against entropy loss (probability=2^-63), aka. "blind multiplication"
10
+ #endif
11
+ #define WYHASH_32BIT_MUM 0 //faster on 32 bit system
12
+ //includes
13
+ #include <stdint.h>
14
+ #include <string.h>
15
+ #if defined(_MSC_VER) && defined(_M_X64)
16
+ #include <intrin.h>
17
+ #pragma intrinsic(_umul128)
18
+ #endif
19
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
20
+ #define _likely_(x) __builtin_expect(x,1)
21
+ #define _unlikely_(x) __builtin_expect(x,0)
22
+ #else
23
+ #define _likely_(x) (x)
24
+ #define _unlikely_(x) (x)
25
+ #endif
26
+ //mum function
27
+ static inline uint64_t _wyrot(uint64_t x) { return (x>>32)|(x<<32); }
28
+ static inline void _wymum(uint64_t *A, uint64_t *B){
29
+ #if(WYHASH_32BIT_MUM)
30
+ uint64_t hh=(*A>>32)*(*B>>32), hl=(*A>>32)*(unsigned)*B, lh=(unsigned)*A*(*B>>32), ll=(uint64_t)(unsigned)*A*(unsigned)*B;
31
+ #if(WYHASH_CONDOM>1)
32
+ *A^=_wyrot(hl)^hh; *B^=_wyrot(lh)^ll;
33
+ #else
34
+ *A=_wyrot(hl)^hh; *B=_wyrot(lh)^ll;
35
+ #endif
36
+ #elif defined(__SIZEOF_INT128__)
37
+ __uint128_t r=*A; r*=*B;
38
+ #if(WYHASH_CONDOM>1)
39
+ *A^=(uint64_t)r; *B^=(uint64_t)(r>>64);
40
+ #else
41
+ *A=(uint64_t)r; *B=(uint64_t)(r>>64);
42
+ #endif
43
+ #elif defined(_MSC_VER) && defined(_M_X64)
44
+ #if(WYHASH_CONDOM>1)
45
+ uint64_t a, b;
46
+ a=_umul128(*A,*B,&b);
47
+ *A^=a; *B^=b;
48
+ #else
49
+ *A=_umul128(*A,*B,B);
50
+ #endif
51
+ #else
52
+ uint64_t ha=*A>>32, hb=*B>>32, la=(uint32_t)*A, lb=(uint32_t)*B, hi, lo;
53
+ uint64_t rh=ha*hb, rm0=ha*lb, rm1=hb*la, rl=la*lb, t=rl+(rm0<<32), c=t<rl;
54
+ lo=t+(rm1<<32); c+=lo<t; hi=rh+(rm0>>32)+(rm1>>32)+c;
55
+ #if(WYHASH_CONDOM>1)
56
+ *A^=lo; *B^=hi;
57
+ #else
58
+ *A=lo; *B=hi;
59
+ #endif
60
+ #endif
61
+ }
62
+ static inline uint64_t _wymix(uint64_t A, uint64_t B){ _wymum(&A,&B); return A^B; }
63
+ //read functions
64
+ #ifndef WYHASH_LITTLE_ENDIAN
65
+ #if defined(_WIN32) || defined(__LITTLE_ENDIAN__) || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
66
+ #define WYHASH_LITTLE_ENDIAN 1
67
+ #elif defined(__BIG_ENDIAN__) || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
68
+ #define WYHASH_LITTLE_ENDIAN 0
69
+ #endif
70
+ #endif
71
+ #if (WYHASH_LITTLE_ENDIAN)
72
+ static inline uint64_t _wyr8(const uint8_t *p) { uint64_t v; memcpy(&v, p, 8); return v;}
73
+ static inline uint64_t _wyr4(const uint8_t *p) { unsigned v; memcpy(&v, p, 4); return v;}
74
+ #elif defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
75
+ static inline uint64_t _wyr8(const uint8_t *p) { uint64_t v; memcpy(&v, p, 8); return __builtin_bswap64(v);}
76
+ static inline uint64_t _wyr4(const uint8_t *p) { unsigned v; memcpy(&v, p, 4); return __builtin_bswap32(v);}
77
+ #elif defined(_MSC_VER)
78
+ static inline uint64_t _wyr8(const uint8_t *p) { uint64_t v; memcpy(&v, p, 8); return _byteswap_uint64(v);}
79
+ static inline uint64_t _wyr4(const uint8_t *p) { unsigned v; memcpy(&v, p, 4); return _byteswap_ulong(v);}
80
+ #endif
81
+ static inline uint64_t _wyr3(const uint8_t *p, unsigned k) { return (((uint64_t)p[0])<<16)|(((uint64_t)p[k>>1])<<8)|p[k-1];}
82
+ //wyhash function
83
+ static inline uint64_t _wyfinish16(const uint8_t *p, uint64_t len, uint64_t seed, const uint64_t *secret, uint64_t i){
84
+ #if(WYHASH_CONDOM>0)
85
+ uint64_t a, b;
86
+ if(_likely_(i<=8)){
87
+ if(_likely_(i>=4)){ a=_wyr4(p); b=_wyr4(p+i-4); }
88
+ else if (_likely_(i)){ a=_wyr3(p,i); b=0; }
89
+ else a=b=0;
90
+ }
91
+ else{ a=_wyr8(p); b=_wyr8(p+i-8); }
92
+ return _wymix(secret[1]^len,_wymix(a^secret[1], b^seed));
93
+ #else
94
+ #define oneshot_shift ((i<8)*((8-i)<<3))
95
+ return _wymix(secret[1]^len,_wymix((_wyr8(p)<<oneshot_shift)^secret[1],(_wyr8(p+i-8)>>oneshot_shift)^seed));
96
+ #endif
97
+ }
98
+
99
+ static inline uint64_t _wyfinish(const uint8_t *p, uint64_t len, uint64_t seed, const uint64_t *secret, uint64_t i){
100
+ if(_likely_(i<=16)) return _wyfinish16(p,len,seed,secret,i);
101
+ return _wyfinish(p+16,len,_wymix(_wyr8(p)^secret[1],_wyr8(p+8)^seed),secret,i-16);
102
+ }
103
+
104
+ static inline uint64_t wyhash(const void *key, uint64_t len, uint64_t seed, const uint64_t *secret){
105
+ const uint8_t *p=(const uint8_t *)key;
106
+ uint64_t i=len; seed^=*secret;
107
+ if(_unlikely_(i>64)){
108
+ uint64_t see1=seed;
109
+ do{
110
+ seed=_wymix(_wyr8(p)^secret[1],_wyr8(p+8)^seed)^_wymix(_wyr8(p+16)^secret[2],_wyr8(p+24)^seed);
111
+ see1=_wymix(_wyr8(p+32)^secret[3],_wyr8(p+40)^see1)^_wymix(_wyr8(p+48)^secret[4],_wyr8(p+56)^see1);
112
+ p+=64; i-=64;
113
+ }while(i>64);
114
+ seed^=see1;
115
+ }
116
+ return _wyfinish(p,len,seed,secret,i);
117
+ }
118
+ //utility functions
119
+ const uint64_t _wyp[5] = {0xa0761d6478bd642full, 0xe7037ed1a0b428dbull, 0x8ebc6af09c88c6e3ull, 0x589965cc75374cc3ull, 0x1d8e4e27c47d124full};
120
+ static inline uint64_t wyhash64(uint64_t A, uint64_t B){ A^=_wyp[0]; B^=_wyp[1]; _wymum(&A,&B); return _wymix(A^_wyp[0],B^_wyp[1]);}
121
+ static inline uint64_t wyrand(uint64_t *seed){ *seed+=_wyp[0]; return _wymix(*seed,*seed^_wyp[1]);}
122
+ static inline double wy2u01(uint64_t r){ const double _wynorm=1.0/(1ull<<52); return (r>>12)*_wynorm;}
123
+ static inline double wy2gau(uint64_t r){ const double _wynorm=1.0/(1ull<<20); return ((r&0x1fffff)+((r>>21)&0x1fffff)+((r>>42)&0x1fffff))*_wynorm-3.0;}
124
+ static inline uint64_t wy2u0k(uint64_t r, uint64_t k){ _wymum(&r,&k); return k; }
125
+
126
+ static inline void make_secret(uint64_t seed, uint64_t *secret){
127
+ uint8_t c[] = {15, 23, 27, 29, 30, 39, 43, 45, 46, 51, 53, 54, 57, 58, 60, 71, 75, 77, 78, 83, 85, 86, 89, 90, 92, 99, 101, 102, 105, 106, 108, 113, 114, 116, 120, 135, 139, 141, 142, 147, 149, 150, 153, 154, 156, 163, 165, 166, 169, 170, 172, 177, 178, 180, 184, 195, 197, 198, 201, 202, 204, 209, 210, 212, 216, 225, 226, 228, 232, 240 };
128
+ for(size_t i=0;i<5;i++){
129
+ uint8_t ok;
130
+ do{
131
+ ok=1; secret[i]=0;
132
+ for(size_t j=0;j<64;j+=8) secret[i]|=((uint64_t)c[wyrand(&seed)%sizeof(c)])<<j;
133
+ if(secret[i]%2==0){ ok=0; continue; }
134
+ for(size_t j=0;j<i;j++)
135
+ #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__)
136
+ if(__builtin_popcountll(secret[j]^secret[i])!=32){ ok=0; break; }
137
+ #elif defined(_MSC_VER) && defined(_M_X64)
138
+ if(_mm_popcnt_u64(secret[j]^secret[i])!=32){ ok=0; break; }
139
+ #endif
140
+ if(!ok)continue;
141
+ for(uint64_t j=3;j<0x100000000ull;j+=2) if(secret[i]%j==0){ ok=0; break; }
142
+ }while(!ok);
143
+ }
144
+ }
145
+ #endif
@@ -1,33 +1,37 @@
1
1
 
2
+ #include "upb/decode.h"
3
+
2
4
  #include <setjmp.h>
3
5
  #include <string.h>
4
6
 
5
- #include "upb/decode.h"
7
+ #include "upb/decode.int.h"
6
8
  #include "upb/upb.h"
9
+ #include "upb/upb.int.h"
7
10
 
11
+ /* Must be last. */
8
12
  #include "upb/port_def.inc"
9
13
 
10
- /* Maps descriptor type -> upb field type. */
11
- static const uint8_t desctype_to_fieldtype[] = {
14
+ /* Maps descriptor type -> elem_size_lg2. */
15
+ static const uint8_t desctype_to_elem_size_lg2[] = {
12
16
  -1, /* invalid descriptor type */
13
- UPB_TYPE_DOUBLE, /* DOUBLE */
14
- UPB_TYPE_FLOAT, /* FLOAT */
15
- UPB_TYPE_INT64, /* INT64 */
16
- UPB_TYPE_UINT64, /* UINT64 */
17
- UPB_TYPE_INT32, /* INT32 */
18
- UPB_TYPE_UINT64, /* FIXED64 */
19
- UPB_TYPE_UINT32, /* FIXED32 */
20
- UPB_TYPE_BOOL, /* BOOL */
21
- UPB_TYPE_STRING, /* STRING */
22
- UPB_TYPE_MESSAGE, /* GROUP */
23
- UPB_TYPE_MESSAGE, /* MESSAGE */
24
- UPB_TYPE_BYTES, /* BYTES */
25
- UPB_TYPE_UINT32, /* UINT32 */
26
- UPB_TYPE_ENUM, /* ENUM */
27
- UPB_TYPE_INT32, /* SFIXED32 */
28
- UPB_TYPE_INT64, /* SFIXED64 */
29
- UPB_TYPE_INT32, /* SINT32 */
30
- UPB_TYPE_INT64, /* SINT64 */
17
+ 3, /* DOUBLE */
18
+ 2, /* FLOAT */
19
+ 3, /* INT64 */
20
+ 3, /* UINT64 */
21
+ 2, /* INT32 */
22
+ 3, /* FIXED64 */
23
+ 2, /* FIXED32 */
24
+ 0, /* BOOL */
25
+ UPB_SIZE(3, 4), /* STRING */
26
+ UPB_SIZE(2, 3), /* GROUP */
27
+ UPB_SIZE(2, 3), /* MESSAGE */
28
+ UPB_SIZE(3, 4), /* BYTES */
29
+ 2, /* UINT32 */
30
+ 2, /* ENUM */
31
+ 2, /* SFIXED32 */
32
+ 3, /* SFIXED64 */
33
+ 2, /* SINT32 */
34
+ 3, /* SINT64 */
31
35
  };
32
36
 
33
37
  /* Maps descriptor type -> upb map size. */
@@ -134,106 +138,101 @@ static const int8_t delim_ops[37] = {
134
138
  OP_VARPCK_LG2(3), /* REPEATED SINT64 */
135
139
  };
136
140
 
137
- /* Data pertaining to the parse. */
138
- typedef struct {
139
- const char *limit; /* End of delimited region or end of buffer. */
140
- upb_arena *arena;
141
- int depth;
142
- uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */
143
- jmp_buf err;
144
- } upb_decstate;
145
-
146
141
  typedef union {
147
142
  bool bool_val;
148
143
  uint32_t uint32_val;
149
144
  uint64_t uint64_val;
150
- upb_strview str_val;
145
+ uint32_t size;
151
146
  } wireval;
152
147
 
153
148
  static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
154
149
  const upb_msglayout *layout);
155
150
 
156
- UPB_NORETURN static void decode_err(upb_decstate *d) { longjmp(d->err, 1); }
157
-
158
- void decode_verifyutf8(upb_decstate *d, const char *buf, int len) {
159
- static const uint8_t utf8_offset[] = {
160
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
161
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
162
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
163
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
164
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
165
- 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
166
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
167
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
169
- 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
170
- 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0,
171
- };
172
-
173
- int i, j;
174
- uint8_t offset;
175
-
176
- i = 0;
177
- while (i < len) {
178
- offset = utf8_offset[(uint8_t)buf[i]];
179
- if (offset == 0 || i + offset > len) {
180
- decode_err(d);
181
- }
182
- for (j = i + 1; j < i + offset; j++) {
183
- if ((buf[j] & 0xc0) != 0x80) {
184
- decode_err(d);
185
- }
186
- }
187
- i += offset;
188
- }
189
- if (i != len) decode_err(d);
151
+ UPB_NORETURN static void decode_err(upb_decstate *d) { UPB_LONGJMP(d->err, 1); }
152
+
153
+ const char *fastdecode_err(upb_decstate *d) {
154
+ longjmp(d->err, 1);
155
+ return NULL;
156
+ }
157
+
158
+ const uint8_t upb_utf8_offsets[] = {
159
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
160
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
161
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
162
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
163
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
164
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
165
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
166
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
167
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
168
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
169
+ 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0,
170
+ };
171
+
172
+ static void decode_verifyutf8(upb_decstate *d, const char *buf, int len) {
173
+ if (!decode_verifyutf8_inl(buf, len)) decode_err(d);
190
174
  }
191
175
 
192
176
  static bool decode_reserve(upb_decstate *d, upb_array *arr, size_t elem) {
193
177
  bool need_realloc = arr->size - arr->len < elem;
194
- if (need_realloc && !_upb_array_realloc(arr, arr->len + elem, d->arena)) {
178
+ if (need_realloc && !_upb_array_realloc(arr, arr->len + elem, &d->arena)) {
195
179
  decode_err(d);
196
180
  }
197
181
  return need_realloc;
198
182
  }
199
183
 
184
+ typedef struct {
185
+ const char *ptr;
186
+ uint64_t val;
187
+ } decode_vret;
188
+
200
189
  UPB_NOINLINE
201
- static const char *decode_longvarint64(upb_decstate *d, const char *ptr,
202
- const char *limit, uint64_t *val) {
203
- uint8_t byte;
204
- int bitpos = 0;
205
- uint64_t out = 0;
206
-
207
- do {
208
- if (bitpos >= 70 || ptr == limit) decode_err(d);
209
- byte = *ptr;
210
- out |= (uint64_t)(byte & 0x7F) << bitpos;
211
- ptr++;
212
- bitpos += 7;
213
- } while (byte & 0x80);
214
-
215
- *val = out;
216
- return ptr;
190
+ static decode_vret decode_longvarint64(const char *ptr, uint64_t val) {
191
+ decode_vret ret = {NULL, 0};
192
+ uint64_t byte;
193
+ int i;
194
+ for (i = 1; i < 10; i++) {
195
+ byte = (uint8_t)ptr[i];
196
+ val += (byte - 1) << (i * 7);
197
+ if (!(byte & 0x80)) {
198
+ ret.ptr = ptr + i + 1;
199
+ ret.val = val;
200
+ return ret;
201
+ }
202
+ }
203
+ return ret;
217
204
  }
218
205
 
219
206
  UPB_FORCEINLINE
220
207
  static const char *decode_varint64(upb_decstate *d, const char *ptr,
221
- const char *limit, uint64_t *val) {
222
- if (UPB_LIKELY(ptr < limit && (*ptr & 0x80) == 0)) {
223
- *val = (uint8_t)*ptr;
208
+ uint64_t *val) {
209
+ uint64_t byte = (uint8_t)*ptr;
210
+ if (UPB_LIKELY((byte & 0x80) == 0)) {
211
+ *val = byte;
224
212
  return ptr + 1;
225
213
  } else {
226
- return decode_longvarint64(d, ptr, limit, val);
214
+ decode_vret res = decode_longvarint64(ptr, byte);
215
+ if (!res.ptr) decode_err(d);
216
+ *val = res.val;
217
+ return res.ptr;
227
218
  }
228
219
  }
229
220
 
230
- static const char *decode_varint32(upb_decstate *d, const char *ptr,
231
- const char *limit, uint32_t *val) {
232
- uint64_t u64;
233
- ptr = decode_varint64(d, ptr, limit, &u64);
234
- if (u64 > UINT32_MAX) decode_err(d);
235
- *val = (uint32_t)u64;
236
- return ptr;
221
+ UPB_FORCEINLINE
222
+ static const char *decode_tag(upb_decstate *d, const char *ptr,
223
+ uint32_t *val) {
224
+ uint64_t byte = (uint8_t)*ptr;
225
+ if (UPB_LIKELY((byte & 0x80) == 0)) {
226
+ *val = byte;
227
+ return ptr + 1;
228
+ } else {
229
+ const char *start = ptr;
230
+ decode_vret res = decode_longvarint64(ptr, byte);
231
+ ptr = res.ptr;
232
+ *val = res.val;
233
+ if (!ptr || *val > UINT32_MAX || ptr - start > 5) decode_err(d);
234
+ return ptr;
235
+ }
237
236
  }
238
237
 
239
238
  static void decode_munge(int type, wireval *val) {
@@ -280,33 +279,65 @@ static const upb_msglayout_field *upb_find_field(const upb_msglayout *l,
280
279
  static upb_msg *decode_newsubmsg(upb_decstate *d, const upb_msglayout *layout,
281
280
  const upb_msglayout_field *field) {
282
281
  const upb_msglayout *subl = layout->submsgs[field->submsg_index];
283
- return _upb_msg_new(subl, d->arena);
282
+ return _upb_msg_new_inl(subl, &d->arena);
283
+ }
284
+
285
+ UPB_NOINLINE
286
+ const char *decode_isdonefallback(upb_decstate *d, const char *ptr,
287
+ int overrun) {
288
+ ptr = decode_isdonefallback_inl(d, ptr, overrun);
289
+ if (ptr == NULL) {
290
+ decode_err(d);
291
+ }
292
+ return ptr;
293
+ }
294
+
295
+ static const char *decode_readstr(upb_decstate *d, const char *ptr, int size,
296
+ upb_strview *str) {
297
+ if (d->alias) {
298
+ str->data = ptr;
299
+ } else {
300
+ char *data = upb_arena_malloc(&d->arena, size);
301
+ if (!data) decode_err(d);
302
+ memcpy(data, ptr, size);
303
+ str->data = data;
304
+ }
305
+ str->size = size;
306
+ return ptr + size;
284
307
  }
285
308
 
286
- static void decode_tosubmsg(upb_decstate *d, upb_msg *submsg,
287
- const upb_msglayout *layout,
288
- const upb_msglayout_field *field, upb_strview val) {
309
+ UPB_FORCEINLINE
310
+ static const char *decode_tosubmsg(upb_decstate *d, const char *ptr,
311
+ upb_msg *submsg, const upb_msglayout *layout,
312
+ const upb_msglayout_field *field, int size) {
289
313
  const upb_msglayout *subl = layout->submsgs[field->submsg_index];
290
- const char *saved_limit = d->limit;
314
+ int saved_delta = decode_pushlimit(d, ptr, size);
291
315
  if (--d->depth < 0) decode_err(d);
292
- d->limit = val.data + val.size;
293
- decode_msg(d, val.data, submsg, subl);
294
- d->limit = saved_limit;
295
- if (d->end_group != 0) decode_err(d);
316
+ if (!decode_isdone(d, &ptr)) {
317
+ ptr = decode_msg(d, ptr, submsg, subl);
318
+ }
319
+ if (d->end_group != DECODE_NOGROUP) decode_err(d);
320
+ decode_poplimit(d, ptr, saved_delta);
296
321
  d->depth++;
322
+ return ptr;
297
323
  }
298
324
 
325
+ UPB_FORCEINLINE
299
326
  static const char *decode_group(upb_decstate *d, const char *ptr,
300
327
  upb_msg *submsg, const upb_msglayout *subl,
301
328
  uint32_t number) {
302
329
  if (--d->depth < 0) decode_err(d);
330
+ if (decode_isdone(d, &ptr)) {
331
+ decode_err(d);
332
+ }
303
333
  ptr = decode_msg(d, ptr, submsg, subl);
304
334
  if (d->end_group != number) decode_err(d);
305
- d->end_group = 0;
335
+ d->end_group = DECODE_NOGROUP;
306
336
  d->depth++;
307
337
  return ptr;
308
338
  }
309
339
 
340
+ UPB_FORCEINLINE
310
341
  static const char *decode_togroup(upb_decstate *d, const char *ptr,
311
342
  upb_msg *submsg, const upb_msglayout *layout,
312
343
  const upb_msglayout_field *field) {
@@ -322,15 +353,15 @@ static const char *decode_toarray(upb_decstate *d, const char *ptr,
322
353
  upb_array *arr = *arrp;
323
354
  void *mem;
324
355
 
325
- if (!arr) {
326
- upb_fieldtype_t type = desctype_to_fieldtype[field->descriptortype];
327
- arr = _upb_array_new(d->arena, type);
356
+ if (arr) {
357
+ decode_reserve(d, arr, 1);
358
+ } else {
359
+ size_t lg2 = desctype_to_elem_size_lg2[field->descriptortype];
360
+ arr = _upb_array_new(&d->arena, 4, lg2);
328
361
  if (!arr) decode_err(d);
329
362
  *arrp = arr;
330
363
  }
331
364
 
332
- decode_reserve(d, arr, 1);
333
-
334
365
  switch (op) {
335
366
  case OP_SCALAR_LG2(0):
336
367
  case OP_SCALAR_LG2(2):
@@ -341,15 +372,14 @@ static const char *decode_toarray(upb_decstate *d, const char *ptr,
341
372
  memcpy(mem, &val, 1 << op);
342
373
  return ptr;
343
374
  case OP_STRING:
344
- decode_verifyutf8(d, val.str_val.data, val.str_val.size);
375
+ decode_verifyutf8(d, ptr, val.size);
345
376
  /* Fallthrough. */
346
- case OP_BYTES:
377
+ case OP_BYTES: {
347
378
  /* Append bytes. */
348
- mem =
349
- UPB_PTR_AT(_upb_array_ptr(arr), arr->len * sizeof(upb_strview), void);
379
+ upb_strview *str = (upb_strview*)_upb_array_ptr(arr) + arr->len;
350
380
  arr->len++;
351
- memcpy(mem, &val, sizeof(upb_strview));
352
- return ptr;
381
+ return decode_readstr(d, ptr, val.size, str);
382
+ }
353
383
  case OP_SUBMSG: {
354
384
  /* Append submessage / group. */
355
385
  upb_msg *submsg = decode_newsubmsg(d, layout, field);
@@ -357,26 +387,25 @@ static const char *decode_toarray(upb_decstate *d, const char *ptr,
357
387
  submsg;
358
388
  arr->len++;
359
389
  if (UPB_UNLIKELY(field->descriptortype == UPB_DTYPE_GROUP)) {
360
- ptr = decode_togroup(d, ptr, submsg, layout, field);
390
+ return decode_togroup(d, ptr, submsg, layout, field);
361
391
  } else {
362
- decode_tosubmsg(d, submsg, layout, field, val.str_val);
392
+ return decode_tosubmsg(d, ptr, submsg, layout, field, val.size);
363
393
  }
364
- return ptr;
365
394
  }
366
395
  case OP_FIXPCK_LG2(2):
367
396
  case OP_FIXPCK_LG2(3): {
368
397
  /* Fixed packed. */
369
398
  int lg2 = op - OP_FIXPCK_LG2(0);
370
399
  int mask = (1 << lg2) - 1;
371
- size_t count = val.str_val.size >> lg2;
372
- if ((val.str_val.size & mask) != 0) {
400
+ size_t count = val.size >> lg2;
401
+ if ((val.size & mask) != 0) {
373
402
  decode_err(d); /* Length isn't a round multiple of elem size. */
374
403
  }
375
404
  decode_reserve(d, arr, count);
376
405
  mem = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << lg2, void);
377
406
  arr->len += count;
378
- memcpy(mem, val.str_val.data, val.str_val.size);
379
- return ptr;
407
+ memcpy(mem, ptr, val.size); /* XXX: ptr boundary. */
408
+ return ptr + val.size;
380
409
  }
381
410
  case OP_VARPCK_LG2(0):
382
411
  case OP_VARPCK_LG2(2):
@@ -384,12 +413,11 @@ static const char *decode_toarray(upb_decstate *d, const char *ptr,
384
413
  /* Varint packed. */
385
414
  int lg2 = op - OP_VARPCK_LG2(0);
386
415
  int scale = 1 << lg2;
387
- const char *ptr = val.str_val.data;
388
- const char *end = ptr + val.str_val.size;
416
+ int saved_limit = decode_pushlimit(d, ptr, val.size);
389
417
  char *out = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << lg2, void);
390
- while (ptr < end) {
418
+ while (!decode_isdone(d, &ptr)) {
391
419
  wireval elem;
392
- ptr = decode_varint64(d, ptr, end, &elem.uint64_val);
420
+ ptr = decode_varint64(d, ptr, &elem.uint64_val);
393
421
  decode_munge(field->descriptortype, &elem);
394
422
  if (decode_reserve(d, arr, 1)) {
395
423
  out = UPB_PTR_AT(_upb_array_ptr(arr), arr->len << lg2, void);
@@ -398,7 +426,7 @@ static const char *decode_toarray(upb_decstate *d, const char *ptr,
398
426
  memcpy(out, &elem, scale);
399
427
  out += scale;
400
428
  }
401
- if (ptr != end) decode_err(d);
429
+ decode_poplimit(d, ptr, saved_limit);
402
430
  return ptr;
403
431
  }
404
432
  default:
@@ -406,9 +434,9 @@ static const char *decode_toarray(upb_decstate *d, const char *ptr,
406
434
  }
407
435
  }
408
436
 
409
- static void decode_tomap(upb_decstate *d, upb_msg *msg,
410
- const upb_msglayout *layout,
411
- const upb_msglayout_field *field, wireval val) {
437
+ static const char *decode_tomap(upb_decstate *d, const char *ptr, upb_msg *msg,
438
+ const upb_msglayout *layout,
439
+ const upb_msglayout_field *field, wireval val) {
412
440
  upb_map **map_p = UPB_PTR_AT(msg, field->offset, upb_map *);
413
441
  upb_map *map = *map_p;
414
442
  upb_map_entry ent;
@@ -423,7 +451,7 @@ static void decode_tomap(upb_decstate *d, upb_msg *msg,
423
451
  char val_size = desctype_to_mapsize[val_field->descriptortype];
424
452
  UPB_ASSERT(key_field->offset == 0);
425
453
  UPB_ASSERT(val_field->offset == sizeof(upb_strview));
426
- map = _upb_map_new(d->arena, key_size, val_size);
454
+ map = _upb_map_new(&d->arena, key_size, val_size);
427
455
  *map_p = map;
428
456
  }
429
457
 
@@ -433,13 +461,12 @@ static void decode_tomap(upb_decstate *d, upb_msg *msg,
433
461
  if (entry->fields[1].descriptortype == UPB_DESCRIPTOR_TYPE_MESSAGE ||
434
462
  entry->fields[1].descriptortype == UPB_DESCRIPTOR_TYPE_GROUP) {
435
463
  /* Create proactively to handle the case where it doesn't appear. */
436
- ent.v.val = upb_value_ptr(_upb_msg_new(entry->submsgs[0], d->arena));
464
+ ent.v.val = upb_value_ptr(_upb_msg_new(entry->submsgs[0], &d->arena));
437
465
  }
438
466
 
439
- decode_tosubmsg(d, &ent.k, layout, field, val.str_val);
440
-
441
- /* Insert into map. */
442
- _upb_map_set(map, &ent.k, map->key_size, &ent.v, map->val_size, d->arena);
467
+ ptr = decode_tosubmsg(d, ptr, &ent.k, layout, field, val.size);
468
+ _upb_map_set(map, &ent.k, map->key_size, &ent.v, map->val_size, &d->arena);
469
+ return ptr;
443
470
  }
444
471
 
445
472
  static const char *decode_tomsg(upb_decstate *d, const char *ptr, upb_msg *msg,
@@ -473,16 +500,15 @@ static const char *decode_tomsg(upb_decstate *d, const char *ptr, upb_msg *msg,
473
500
  if (UPB_UNLIKELY(type == UPB_DTYPE_GROUP)) {
474
501
  ptr = decode_togroup(d, ptr, submsg, layout, field);
475
502
  } else {
476
- decode_tosubmsg(d, submsg, layout, field, val.str_val);
503
+ ptr = decode_tosubmsg(d, ptr, submsg, layout, field, val.size);
477
504
  }
478
505
  break;
479
506
  }
480
507
  case OP_STRING:
481
- decode_verifyutf8(d, val.str_val.data, val.str_val.size);
508
+ decode_verifyutf8(d, ptr, val.size);
482
509
  /* Fallthrough. */
483
510
  case OP_BYTES:
484
- memcpy(mem, &val, sizeof(upb_strview));
485
- break;
511
+ return decode_readstr(d, ptr, val.size, mem);
486
512
  case OP_SCALAR_LG2(3):
487
513
  memcpy(mem, &val, 8);
488
514
  break;
@@ -499,9 +525,24 @@ static const char *decode_tomsg(upb_decstate *d, const char *ptr, upb_msg *msg,
499
525
  return ptr;
500
526
  }
501
527
 
528
+ UPB_FORCEINLINE
529
+ static bool decode_tryfastdispatch(upb_decstate *d, const char **ptr,
530
+ upb_msg *msg, const upb_msglayout *layout) {
531
+ #if UPB_FASTTABLE
532
+ if (layout && layout->table_mask != (unsigned char)-1) {
533
+ uint16_t tag = fastdecode_loadtag(*ptr);
534
+ intptr_t table = decode_totable(layout);
535
+ *ptr = fastdecode_tagdispatch(d, *ptr, msg, table, 0, tag);
536
+ return true;
537
+ }
538
+ #endif
539
+ return false;
540
+ }
541
+
542
+ UPB_NOINLINE
502
543
  static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
503
544
  const upb_msglayout *layout) {
504
- while (ptr < d->limit) {
545
+ while (true) {
505
546
  uint32_t tag;
506
547
  const upb_msglayout_field *field;
507
548
  int field_number;
@@ -510,7 +551,8 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
510
551
  wireval val;
511
552
  int op;
512
553
 
513
- ptr = decode_varint32(d, ptr, d->limit, &tag);
554
+ UPB_ASSERT(ptr < d->limit_ptr);
555
+ ptr = decode_tag(d, ptr, &tag);
514
556
  field_number = tag >> 3;
515
557
  wire_type = tag & 7;
516
558
 
@@ -518,12 +560,11 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
518
560
 
519
561
  switch (wire_type) {
520
562
  case UPB_WIRE_TYPE_VARINT:
521
- ptr = decode_varint64(d, ptr, d->limit, &val.uint64_val);
563
+ ptr = decode_varint64(d, ptr, &val.uint64_val);
522
564
  op = varint_ops[field->descriptortype];
523
565
  decode_munge(field->descriptortype, &val);
524
566
  break;
525
567
  case UPB_WIRE_TYPE_32BIT:
526
- if (d->limit - ptr < 4) decode_err(d);
527
568
  memcpy(&val.uint32_val, ptr, 4);
528
569
  val.uint32_val = _upb_be_swap32(val.uint32_val);
529
570
  ptr += 4;
@@ -531,7 +572,6 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
531
572
  if (((1 << field->descriptortype) & fixed32_ok) == 0) goto unknown;
532
573
  break;
533
574
  case UPB_WIRE_TYPE_64BIT:
534
- if (d->limit - ptr < 8) decode_err(d);
535
575
  memcpy(&val.uint64_val, ptr, 8);
536
576
  val.uint64_val = _upb_be_swap64(val.uint64_val);
537
577
  ptr += 8;
@@ -539,17 +579,16 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
539
579
  if (((1 << field->descriptortype) & fixed64_ok) == 0) goto unknown;
540
580
  break;
541
581
  case UPB_WIRE_TYPE_DELIMITED: {
542
- uint32_t size;
543
582
  int ndx = field->descriptortype;
583
+ uint64_t size;
544
584
  if (_upb_isrepeated(field)) ndx += 18;
545
- ptr = decode_varint32(d, ptr, d->limit, &size);
546
- if (size >= INT32_MAX || (size_t)(d->limit - ptr) < size) {
585
+ ptr = decode_varint64(d, ptr, &size);
586
+ if (size >= INT32_MAX ||
587
+ ptr - d->end + (int32_t)size > d->limit) {
547
588
  decode_err(d); /* Length overflow. */
548
589
  }
549
- val.str_val.data = ptr;
550
- val.str_val.size = size;
551
- ptr += size;
552
590
  op = delim_ops[ndx];
591
+ val.size = size;
553
592
  break;
554
593
  }
555
594
  case UPB_WIRE_TYPE_START_GROUP:
@@ -572,7 +611,7 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
572
611
  ptr = decode_toarray(d, ptr, msg, layout, field, val, op);
573
612
  break;
574
613
  case _UPB_LABEL_MAP:
575
- decode_tomap(d, msg, layout, field, val);
614
+ ptr = decode_tomap(d, ptr, msg, layout, field, val);
576
615
  break;
577
616
  default:
578
617
  ptr = decode_tomsg(d, ptr, msg, layout, field, val, op);
@@ -582,36 +621,78 @@ static const char *decode_msg(upb_decstate *d, const char *ptr, upb_msg *msg,
582
621
  unknown:
583
622
  /* Skip unknown field. */
584
623
  if (field_number == 0) decode_err(d);
585
- if (wire_type == UPB_WIRE_TYPE_START_GROUP) {
586
- ptr = decode_group(d, ptr, NULL, NULL, field_number);
587
- }
624
+ if (wire_type == UPB_WIRE_TYPE_DELIMITED) ptr += val.size;
588
625
  if (msg) {
626
+ if (wire_type == UPB_WIRE_TYPE_START_GROUP) {
627
+ d->unknown = field_start;
628
+ d->unknown_msg = msg;
629
+ ptr = decode_group(d, ptr, NULL, NULL, field_number);
630
+ d->unknown_msg = NULL;
631
+ field_start = d->unknown;
632
+ }
589
633
  if (!_upb_msg_addunknown(msg, field_start, ptr - field_start,
590
- d->arena)) {
634
+ &d->arena)) {
591
635
  decode_err(d);
592
636
  }
637
+ } else if (wire_type == UPB_WIRE_TYPE_START_GROUP) {
638
+ ptr = decode_group(d, ptr, NULL, NULL, field_number);
593
639
  }
594
640
  }
641
+
642
+ if (decode_isdone(d, &ptr)) return ptr;
643
+ if (decode_tryfastdispatch(d, &ptr, msg, layout)) return ptr;
595
644
  }
645
+ }
596
646
 
597
- if (ptr != d->limit) decode_err(d);
598
- return ptr;
647
+ const char *fastdecode_generic(struct upb_decstate *d, const char *ptr,
648
+ upb_msg *msg, intptr_t table, uint64_t hasbits,
649
+ uint64_t data) {
650
+ (void)data;
651
+ *(uint32_t*)msg |= hasbits;
652
+ return decode_msg(d, ptr, msg, decode_totablep(table));
599
653
  }
600
654
 
601
- bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l,
602
- upb_arena *arena) {
655
+ bool _upb_decode(const char *buf, size_t size, void *msg,
656
+ const upb_msglayout *l, upb_arena *arena, int options) {
657
+ bool ok;
603
658
  upb_decstate state;
604
- state.limit = buf + size;
605
- state.arena = arena;
606
- state.depth = 64;
607
- state.end_group = 0;
659
+ unsigned depth = (unsigned)options >> 16;
660
+
661
+ if (size == 0) {
662
+ return true;
663
+ } else if (size <= 16) {
664
+ memset(&state.patch, 0, 32);
665
+ memcpy(&state.patch, buf, size);
666
+ buf = state.patch;
667
+ state.end = buf + size;
668
+ state.limit = 0;
669
+ state.alias = false;
670
+ } else {
671
+ state.end = buf + size - 16;
672
+ state.limit = 16;
673
+ state.alias = options & UPB_DECODE_ALIAS;
674
+ }
608
675
 
609
- if (setjmp(state.err)) return false;
676
+ state.limit_ptr = state.end;
677
+ state.unknown_msg = NULL;
678
+ state.depth = depth ? depth : 64;
679
+ state.end_group = DECODE_NOGROUP;
680
+ state.arena.head = arena->head;
681
+ state.arena.last_size = arena->last_size;
682
+ state.arena.parent = arena;
610
683
 
611
- if (size == 0) return true;
612
- decode_msg(&state, buf, msg, l);
684
+ if (UPB_UNLIKELY(UPB_SETJMP(state.err))) {
685
+ ok = false;
686
+ } else {
687
+ if (!decode_tryfastdispatch(&state, &buf, msg, l)) {
688
+ decode_msg(&state, buf, msg, l);
689
+ }
690
+ ok = state.end_group == DECODE_NOGROUP;
691
+ }
613
692
 
614
- return state.end_group == 0;
693
+ arena->head.ptr = state.arena.head.ptr;
694
+ arena->head.end = state.arena.head.end;
695
+ return ok;
615
696
  }
616
697
 
617
698
  #undef OP_SCALAR_LG2