grpc 1.41.0 → 1.42.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 (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +83 -70
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -115,9 +115,8 @@ Prog::Prog()
115
115
  start_unanchored_(0),
116
116
  size_(0),
117
117
  bytemap_range_(0),
118
+ prefix_foldcase_(false),
118
119
  prefix_size_(0),
119
- prefix_front_(-1),
120
- prefix_back_(-1),
121
120
  list_count_(0),
122
121
  dfa_mem_(0),
123
122
  dfa_first_(NULL),
@@ -127,6 +126,8 @@ Prog::Prog()
127
126
  Prog::~Prog() {
128
127
  DeleteDFA(dfa_longest_);
129
128
  DeleteDFA(dfa_first_);
129
+ if (prefix_foldcase_)
130
+ delete[] prefix_dfa_;
130
131
  }
131
132
 
132
133
  typedef SparseSet Workq;
@@ -916,6 +917,183 @@ void Prog::ComputeHints(std::vector<Inst>* flat, int begin, int end) {
916
917
  }
917
918
  }
918
919
 
920
+ // The final state will always be this, which frees up a register for the hot
921
+ // loop and thus avoids the spilling that can occur when building with Clang.
922
+ static const size_t kShiftDFAFinal = 9;
923
+
924
+ // This function takes the prefix as std::string (i.e. not const std::string&
925
+ // as normal) because it's going to clobber it, so a temporary is convenient.
926
+ static uint64_t* BuildShiftDFA(std::string prefix) {
927
+ // This constant is for convenience now and also for correctness later when
928
+ // we clobber the prefix, but still need to know how long it was initially.
929
+ const size_t size = prefix.size();
930
+
931
+ // Construct the NFA.
932
+ // The table is indexed by input byte; each element is a bitfield of states
933
+ // reachable by the input byte. Given a bitfield of the current states, the
934
+ // bitfield of states reachable from those is - for this specific purpose -
935
+ // always ((ncurr << 1) | 1). Intersecting the reachability bitfields gives
936
+ // the bitfield of the next states reached by stepping over the input byte.
937
+ // Credits for this technique: the Hyperscan paper by Geoff Langdale et al.
938
+ uint16_t nfa[256]{};
939
+ for (size_t i = 0; i < size; ++i) {
940
+ uint8_t b = prefix[i];
941
+ nfa[b] |= 1 << (i+1);
942
+ }
943
+ // This is the `\C*?` for unanchored search.
944
+ for (int b = 0; b < 256; ++b)
945
+ nfa[b] |= 1;
946
+
947
+ // This maps from DFA state to NFA states; the reverse mapping is used when
948
+ // recording transitions and gets implemented with plain old linear search.
949
+ // The "Shift DFA" technique limits this to ten states when using uint64_t;
950
+ // to allow for the initial state, we use at most nine bytes of the prefix.
951
+ // That same limit is also why uint16_t is sufficient for the NFA bitfield.
952
+ uint16_t states[kShiftDFAFinal+1]{};
953
+ states[0] = 1;
954
+ for (size_t dcurr = 0; dcurr < size; ++dcurr) {
955
+ uint8_t b = prefix[dcurr];
956
+ uint16_t ncurr = states[dcurr];
957
+ uint16_t nnext = nfa[b] & ((ncurr << 1) | 1);
958
+ size_t dnext = dcurr+1;
959
+ if (dnext == size)
960
+ dnext = kShiftDFAFinal;
961
+ states[dnext] = nnext;
962
+ }
963
+
964
+ // Sort and unique the bytes of the prefix to avoid repeating work while we
965
+ // record transitions. This clobbers the prefix, but it's no longer needed.
966
+ std::sort(prefix.begin(), prefix.end());
967
+ prefix.erase(std::unique(prefix.begin(), prefix.end()), prefix.end());
968
+
969
+ // Construct the DFA.
970
+ // The table is indexed by input byte; each element is effectively a packed
971
+ // array of uint6_t; each array value will be multiplied by six in order to
972
+ // avoid having to do so later in the hot loop as well as masking/shifting.
973
+ // Credits for this technique: "Shift-based DFAs" on GitHub by Per Vognsen.
974
+ uint64_t* dfa = new uint64_t[256]{};
975
+ // Record a transition from each state for each of the bytes of the prefix.
976
+ // Note that all other input bytes go back to the initial state by default.
977
+ for (size_t dcurr = 0; dcurr < size; ++dcurr) {
978
+ for (uint8_t b : prefix) {
979
+ uint16_t ncurr = states[dcurr];
980
+ uint16_t nnext = nfa[b] & ((ncurr << 1) | 1);
981
+ size_t dnext = 0;
982
+ while (states[dnext] != nnext)
983
+ ++dnext;
984
+ dfa[b] |= static_cast<uint64_t>(dnext * 6) << (dcurr * 6);
985
+ // Convert ASCII letters to uppercase and record the extra transitions.
986
+ // Note that ASCII letters are guaranteed to be lowercase at this point
987
+ // because that's how the parser normalises them. #FunFact: 'k' and 's'
988
+ // match U+212A and U+017F, respectively, so they won't occur here when
989
+ // using UTF-8 encoding because the parser will emit character classes.
990
+ if ('a' <= b && b <= 'z') {
991
+ b -= 'a' - 'A';
992
+ dfa[b] |= static_cast<uint64_t>(dnext * 6) << (dcurr * 6);
993
+ }
994
+ }
995
+ }
996
+ // This lets the final state "saturate", which will matter for performance:
997
+ // in the hot loop, we check for a match only at the end of each iteration,
998
+ // so we must keep signalling the match until we get around to checking it.
999
+ for (int b = 0; b < 256; ++b)
1000
+ dfa[b] |= static_cast<uint64_t>(kShiftDFAFinal * 6) << (kShiftDFAFinal * 6);
1001
+
1002
+ return dfa;
1003
+ }
1004
+
1005
+ void Prog::ConfigurePrefixAccel(const std::string& prefix,
1006
+ bool prefix_foldcase) {
1007
+ prefix_foldcase_ = prefix_foldcase;
1008
+ prefix_size_ = prefix.size();
1009
+ if (prefix_foldcase_) {
1010
+ // Use PrefixAccel_ShiftDFA().
1011
+ // ... and no more than nine bytes of the prefix. (See above for details.)
1012
+ prefix_size_ = std::min(prefix_size_, kShiftDFAFinal);
1013
+ prefix_dfa_ = BuildShiftDFA(prefix.substr(0, prefix_size_));
1014
+ } else if (prefix_size_ != 1) {
1015
+ // Use PrefixAccel_FrontAndBack().
1016
+ prefix_front_ = prefix.front();
1017
+ prefix_back_ = prefix.back();
1018
+ } else {
1019
+ // Use memchr(3).
1020
+ prefix_front_ = prefix.front();
1021
+ }
1022
+ }
1023
+
1024
+ const void* Prog::PrefixAccel_ShiftDFA(const void* data, size_t size) {
1025
+ if (size < prefix_size_)
1026
+ return NULL;
1027
+
1028
+ uint64_t curr = 0;
1029
+
1030
+ // At the time of writing, rough benchmarks on a Broadwell machine showed
1031
+ // that this unroll factor (i.e. eight) achieves a speedup factor of two.
1032
+ if (size >= 8) {
1033
+ const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
1034
+ const uint8_t* endp = p + (size&~7);
1035
+ do {
1036
+ uint8_t b0 = p[0];
1037
+ uint8_t b1 = p[1];
1038
+ uint8_t b2 = p[2];
1039
+ uint8_t b3 = p[3];
1040
+ uint8_t b4 = p[4];
1041
+ uint8_t b5 = p[5];
1042
+ uint8_t b6 = p[6];
1043
+ uint8_t b7 = p[7];
1044
+
1045
+ uint64_t next0 = prefix_dfa_[b0];
1046
+ uint64_t next1 = prefix_dfa_[b1];
1047
+ uint64_t next2 = prefix_dfa_[b2];
1048
+ uint64_t next3 = prefix_dfa_[b3];
1049
+ uint64_t next4 = prefix_dfa_[b4];
1050
+ uint64_t next5 = prefix_dfa_[b5];
1051
+ uint64_t next6 = prefix_dfa_[b6];
1052
+ uint64_t next7 = prefix_dfa_[b7];
1053
+
1054
+ uint64_t curr0 = next0 >> (curr & 63);
1055
+ uint64_t curr1 = next1 >> (curr0 & 63);
1056
+ uint64_t curr2 = next2 >> (curr1 & 63);
1057
+ uint64_t curr3 = next3 >> (curr2 & 63);
1058
+ uint64_t curr4 = next4 >> (curr3 & 63);
1059
+ uint64_t curr5 = next5 >> (curr4 & 63);
1060
+ uint64_t curr6 = next6 >> (curr5 & 63);
1061
+ uint64_t curr7 = next7 >> (curr6 & 63);
1062
+
1063
+ if ((curr7 & 63) == kShiftDFAFinal * 6) {
1064
+ // At the time of writing, using the same masking subexpressions from
1065
+ // the preceding lines caused Clang to clutter the hot loop computing
1066
+ // them - even though they aren't actually needed for shifting! Hence
1067
+ // these rewritten conditions, which achieve a speedup factor of two.
1068
+ if (((curr7-curr0) & 63) == 0) return p+1-prefix_size_;
1069
+ if (((curr7-curr1) & 63) == 0) return p+2-prefix_size_;
1070
+ if (((curr7-curr2) & 63) == 0) return p+3-prefix_size_;
1071
+ if (((curr7-curr3) & 63) == 0) return p+4-prefix_size_;
1072
+ if (((curr7-curr4) & 63) == 0) return p+5-prefix_size_;
1073
+ if (((curr7-curr5) & 63) == 0) return p+6-prefix_size_;
1074
+ if (((curr7-curr6) & 63) == 0) return p+7-prefix_size_;
1075
+ if (((curr7-curr7) & 63) == 0) return p+8-prefix_size_;
1076
+ }
1077
+
1078
+ curr = curr7;
1079
+ p += 8;
1080
+ } while (p != endp);
1081
+ data = p;
1082
+ size = size&7;
1083
+ }
1084
+
1085
+ const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
1086
+ const uint8_t* endp = p + size;
1087
+ while (p != endp) {
1088
+ uint8_t b = *p++;
1089
+ uint64_t next = prefix_dfa_[b];
1090
+ curr = next >> (curr & 63);
1091
+ if ((curr & 63) == kShiftDFAFinal * 6)
1092
+ return p-prefix_size_;
1093
+ }
1094
+ return NULL;
1095
+ }
1096
+
919
1097
  #if defined(__AVX2__)
920
1098
  // Finds the least significant non-zero bit in n.
921
1099
  static int FindLSBSet(uint32_t n) {
@@ -958,7 +1136,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) {
958
1136
  const __m256i* endfp = fp + size/sizeof(__m256i);
959
1137
  const __m256i f_set1 = _mm256_set1_epi8(prefix_front_);
960
1138
  const __m256i b_set1 = _mm256_set1_epi8(prefix_back_);
961
- while (fp != endfp) {
1139
+ do {
962
1140
  const __m256i f_loadu = _mm256_loadu_si256(fp++);
963
1141
  const __m256i b_loadu = _mm256_loadu_si256(bp++);
964
1142
  const __m256i f_cmpeq = _mm256_cmpeq_epi8(f_set1, f_loadu);
@@ -970,7 +1148,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) {
970
1148
  const int fb_ctz = FindLSBSet(fb_movemask);
971
1149
  return reinterpret_cast<const char*>(fp-1) + fb_ctz;
972
1150
  }
973
- }
1151
+ } while (fp != endfp);
974
1152
  data = fp;
975
1153
  size = size%sizeof(__m256i);
976
1154
  }
@@ -220,11 +220,23 @@ class Prog {
220
220
  // Accelerates to the first likely occurrence of the prefix.
221
221
  // Returns a pointer to the first byte or NULL if not found.
222
222
  const void* PrefixAccel(const void* data, size_t size) {
223
- DCHECK_GE(prefix_size_, 1);
224
- return prefix_size_ == 1 ? memchr(data, prefix_front_, size)
225
- : PrefixAccel_FrontAndBack(data, size);
223
+ DCHECK(can_prefix_accel());
224
+ if (prefix_foldcase_) {
225
+ return PrefixAccel_ShiftDFA(data, size);
226
+ } else if (prefix_size_ != 1) {
227
+ return PrefixAccel_FrontAndBack(data, size);
228
+ } else {
229
+ return memchr(data, prefix_front_, size);
230
+ }
226
231
  }
227
232
 
233
+ // Configures prefix accel using the analysis performed during compilation.
234
+ void ConfigurePrefixAccel(const std::string& prefix, bool prefix_foldcase);
235
+
236
+ // An implementation of prefix accel that uses prefix_dfa_ to perform
237
+ // case-insensitive search.
238
+ const void* PrefixAccel_ShiftDFA(const void* data, size_t size);
239
+
228
240
  // An implementation of prefix accel that looks for prefix_front_ and
229
241
  // prefix_back_ to return fewer false positives than memchr(3) alone.
230
242
  const void* PrefixAccel_FrontAndBack(const void* data, size_t size);
@@ -298,10 +310,6 @@ class Prog {
298
310
  // FOR TESTING OR EXPERIMENTAL PURPOSES ONLY.
299
311
  int BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb);
300
312
 
301
- // Controls whether the DFA should bail out early if the NFA would be faster.
302
- // FOR TESTING ONLY.
303
- static void TEST_dfa_should_bail_when_slow(bool b);
304
-
305
313
  // Compute bytemap.
306
314
  void ComputeByteMap();
307
315
 
@@ -390,6 +398,10 @@ class Prog {
390
398
  // Computes hints for ByteRange instructions in [begin, end).
391
399
  void ComputeHints(std::vector<Inst>* flat, int begin, int end);
392
400
 
401
+ // Controls whether the DFA should bail out early if the NFA would be faster.
402
+ // FOR TESTING ONLY.
403
+ static void TESTING_ONLY_set_dfa_should_bail_when_slow(bool b);
404
+
393
405
  private:
394
406
  friend class Compiler;
395
407
 
@@ -406,9 +418,16 @@ class Prog {
406
418
  int start_unanchored_; // unanchored entry point for program
407
419
  int size_; // number of instructions
408
420
  int bytemap_range_; // bytemap_[x] < bytemap_range_
421
+
422
+ bool prefix_foldcase_; // whether prefix is case-insensitive
409
423
  size_t prefix_size_; // size of prefix (0 if no prefix)
410
- int prefix_front_; // first byte of prefix (-1 if no prefix)
411
- int prefix_back_; // last byte of prefix (-1 if no prefix)
424
+ union {
425
+ uint64_t* prefix_dfa_; // "Shift DFA" for prefix
426
+ struct {
427
+ int prefix_front_; // first byte of prefix
428
+ int prefix_back_; // last byte of prefix
429
+ };
430
+ };
412
431
 
413
432
  int list_count_; // count of lists (see above)
414
433
  int inst_count_[kNumInst]; // count of instructions by opcode
@@ -83,6 +83,8 @@ static RE2::ErrorCode RegexpErrorToRE2(re2::RegexpStatusCode code) {
83
83
  return RE2::ErrorMissingBracket;
84
84
  case re2::kRegexpMissingParen:
85
85
  return RE2::ErrorMissingParen;
86
+ case re2::kRegexpUnexpectedParen:
87
+ return RE2::ErrorUnexpectedParen;
86
88
  case re2::kRegexpTrailingBackslash:
87
89
  return RE2::ErrorTrailingBackslash;
88
90
  case re2::kRegexpRepeatArgument:
@@ -799,7 +801,7 @@ bool RE2::Match(const StringPiece& text,
799
801
  // it doesn't have the shared state and occasional mutex that
800
802
  // the DFA does.
801
803
  if (can_one_pass && text.size() <= 4096 &&
802
- (ncap > 1 || text.size() <= 8)) {
804
+ (ncap > 1 || text.size() <= 16)) {
803
805
  skipped_test = true;
804
806
  break;
805
807
  }
@@ -1038,41 +1040,49 @@ bool RE2::Rewrite(std::string* out,
1038
1040
 
1039
1041
  /***** Parsers for various types *****/
1040
1042
 
1041
- bool RE2::Arg::parse_null(const char* str, size_t n, void* dest) {
1043
+ namespace re2_internal {
1044
+
1045
+ template <>
1046
+ bool Parse(const char* str, size_t n, void* dest) {
1042
1047
  // We fail if somebody asked us to store into a non-NULL void* pointer
1043
1048
  return (dest == NULL);
1044
1049
  }
1045
1050
 
1046
- bool RE2::Arg::parse_string(const char* str, size_t n, void* dest) {
1051
+ template <>
1052
+ bool Parse(const char* str, size_t n, std::string* dest) {
1047
1053
  if (dest == NULL) return true;
1048
- reinterpret_cast<std::string*>(dest)->assign(str, n);
1054
+ dest->assign(str, n);
1049
1055
  return true;
1050
1056
  }
1051
1057
 
1052
- bool RE2::Arg::parse_stringpiece(const char* str, size_t n, void* dest) {
1058
+ template <>
1059
+ bool Parse(const char* str, size_t n, StringPiece* dest) {
1053
1060
  if (dest == NULL) return true;
1054
- *(reinterpret_cast<StringPiece*>(dest)) = StringPiece(str, n);
1061
+ *dest = StringPiece(str, n);
1055
1062
  return true;
1056
1063
  }
1057
1064
 
1058
- bool RE2::Arg::parse_char(const char* str, size_t n, void* dest) {
1065
+ template <>
1066
+ bool Parse(const char* str, size_t n, char* dest) {
1059
1067
  if (n != 1) return false;
1060
1068
  if (dest == NULL) return true;
1061
- *(reinterpret_cast<char*>(dest)) = str[0];
1069
+ *dest = str[0];
1062
1070
  return true;
1063
1071
  }
1064
1072
 
1065
- bool RE2::Arg::parse_schar(const char* str, size_t n, void* dest) {
1073
+ template <>
1074
+ bool Parse(const char* str, size_t n, signed char* dest) {
1066
1075
  if (n != 1) return false;
1067
1076
  if (dest == NULL) return true;
1068
- *(reinterpret_cast<signed char*>(dest)) = str[0];
1077
+ *dest = str[0];
1069
1078
  return true;
1070
1079
  }
1071
1080
 
1072
- bool RE2::Arg::parse_uchar(const char* str, size_t n, void* dest) {
1081
+ template <>
1082
+ bool Parse(const char* str, size_t n, unsigned char* dest) {
1073
1083
  if (n != 1) return false;
1074
1084
  if (dest == NULL) return true;
1075
- *(reinterpret_cast<unsigned char*>(dest)) = str[0];
1085
+ *dest = str[0];
1076
1086
  return true;
1077
1087
  }
1078
1088
 
@@ -1136,10 +1146,40 @@ static const char* TerminateNumber(char* buf, size_t nbuf, const char* str,
1136
1146
  return buf;
1137
1147
  }
1138
1148
 
1139
- bool RE2::Arg::parse_long_radix(const char* str,
1140
- size_t n,
1141
- void* dest,
1142
- int radix) {
1149
+ template <>
1150
+ bool Parse(const char* str, size_t n, float* dest) {
1151
+ if (n == 0) return false;
1152
+ static const int kMaxLength = 200;
1153
+ char buf[kMaxLength+1];
1154
+ str = TerminateNumber(buf, sizeof buf, str, &n, true);
1155
+ char* end;
1156
+ errno = 0;
1157
+ float r = strtof(str, &end);
1158
+ if (end != str + n) return false; // Leftover junk
1159
+ if (errno) return false;
1160
+ if (dest == NULL) return true;
1161
+ *dest = r;
1162
+ return true;
1163
+ }
1164
+
1165
+ template <>
1166
+ bool Parse(const char* str, size_t n, double* dest) {
1167
+ if (n == 0) return false;
1168
+ static const int kMaxLength = 200;
1169
+ char buf[kMaxLength+1];
1170
+ str = TerminateNumber(buf, sizeof buf, str, &n, true);
1171
+ char* end;
1172
+ errno = 0;
1173
+ double r = strtod(str, &end);
1174
+ if (end != str + n) return false; // Leftover junk
1175
+ if (errno) return false;
1176
+ if (dest == NULL) return true;
1177
+ *dest = r;
1178
+ return true;
1179
+ }
1180
+
1181
+ template <>
1182
+ bool Parse(const char* str, size_t n, long* dest, int radix) {
1143
1183
  if (n == 0) return false;
1144
1184
  char buf[kMaxNumberLength+1];
1145
1185
  str = TerminateNumber(buf, sizeof buf, str, &n, false);
@@ -1149,14 +1189,12 @@ bool RE2::Arg::parse_long_radix(const char* str,
1149
1189
  if (end != str + n) return false; // Leftover junk
1150
1190
  if (errno) return false;
1151
1191
  if (dest == NULL) return true;
1152
- *(reinterpret_cast<long*>(dest)) = r;
1192
+ *dest = r;
1153
1193
  return true;
1154
1194
  }
1155
1195
 
1156
- bool RE2::Arg::parse_ulong_radix(const char* str,
1157
- size_t n,
1158
- void* dest,
1159
- int radix) {
1196
+ template <>
1197
+ bool Parse(const char* str, size_t n, unsigned long* dest, int radix) {
1160
1198
  if (n == 0) return false;
1161
1199
  char buf[kMaxNumberLength+1];
1162
1200
  str = TerminateNumber(buf, sizeof buf, str, &n, false);
@@ -1172,62 +1210,52 @@ bool RE2::Arg::parse_ulong_radix(const char* str,
1172
1210
  if (end != str + n) return false; // Leftover junk
1173
1211
  if (errno) return false;
1174
1212
  if (dest == NULL) return true;
1175
- *(reinterpret_cast<unsigned long*>(dest)) = r;
1213
+ *dest = r;
1176
1214
  return true;
1177
1215
  }
1178
1216
 
1179
- bool RE2::Arg::parse_short_radix(const char* str,
1180
- size_t n,
1181
- void* dest,
1182
- int radix) {
1217
+ template <>
1218
+ bool Parse(const char* str, size_t n, short* dest, int radix) {
1183
1219
  long r;
1184
- if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
1185
- if ((short)r != r) return false; // Out of range
1220
+ if (!Parse(str, n, &r, radix)) return false; // Could not parse
1221
+ if ((short)r != r) return false; // Out of range
1186
1222
  if (dest == NULL) return true;
1187
- *(reinterpret_cast<short*>(dest)) = (short)r;
1223
+ *dest = (short)r;
1188
1224
  return true;
1189
1225
  }
1190
1226
 
1191
- bool RE2::Arg::parse_ushort_radix(const char* str,
1192
- size_t n,
1193
- void* dest,
1194
- int radix) {
1227
+ template <>
1228
+ bool Parse(const char* str, size_t n, unsigned short* dest, int radix) {
1195
1229
  unsigned long r;
1196
- if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
1197
- if ((unsigned short)r != r) return false; // Out of range
1230
+ if (!Parse(str, n, &r, radix)) return false; // Could not parse
1231
+ if ((unsigned short)r != r) return false; // Out of range
1198
1232
  if (dest == NULL) return true;
1199
- *(reinterpret_cast<unsigned short*>(dest)) = (unsigned short)r;
1233
+ *dest = (unsigned short)r;
1200
1234
  return true;
1201
1235
  }
1202
1236
 
1203
- bool RE2::Arg::parse_int_radix(const char* str,
1204
- size_t n,
1205
- void* dest,
1206
- int radix) {
1237
+ template <>
1238
+ bool Parse(const char* str, size_t n, int* dest, int radix) {
1207
1239
  long r;
1208
- if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
1209
- if ((int)r != r) return false; // Out of range
1240
+ if (!Parse(str, n, &r, radix)) return false; // Could not parse
1241
+ if ((int)r != r) return false; // Out of range
1210
1242
  if (dest == NULL) return true;
1211
- *(reinterpret_cast<int*>(dest)) = (int)r;
1243
+ *dest = (int)r;
1212
1244
  return true;
1213
1245
  }
1214
1246
 
1215
- bool RE2::Arg::parse_uint_radix(const char* str,
1216
- size_t n,
1217
- void* dest,
1218
- int radix) {
1247
+ template <>
1248
+ bool Parse(const char* str, size_t n, unsigned int* dest, int radix) {
1219
1249
  unsigned long r;
1220
- if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
1221
- if ((unsigned int)r != r) return false; // Out of range
1250
+ if (!Parse(str, n, &r, radix)) return false; // Could not parse
1251
+ if ((unsigned int)r != r) return false; // Out of range
1222
1252
  if (dest == NULL) return true;
1223
- *(reinterpret_cast<unsigned int*>(dest)) = (unsigned int)r;
1253
+ *dest = (unsigned int)r;
1224
1254
  return true;
1225
1255
  }
1226
1256
 
1227
- bool RE2::Arg::parse_longlong_radix(const char* str,
1228
- size_t n,
1229
- void* dest,
1230
- int radix) {
1257
+ template <>
1258
+ bool Parse(const char* str, size_t n, long long* dest, int radix) {
1231
1259
  if (n == 0) return false;
1232
1260
  char buf[kMaxNumberLength+1];
1233
1261
  str = TerminateNumber(buf, sizeof buf, str, &n, false);
@@ -1237,14 +1265,12 @@ bool RE2::Arg::parse_longlong_radix(const char* str,
1237
1265
  if (end != str + n) return false; // Leftover junk
1238
1266
  if (errno) return false;
1239
1267
  if (dest == NULL) return true;
1240
- *(reinterpret_cast<long long*>(dest)) = r;
1268
+ *dest = r;
1241
1269
  return true;
1242
1270
  }
1243
1271
 
1244
- bool RE2::Arg::parse_ulonglong_radix(const char* str,
1245
- size_t n,
1246
- void* dest,
1247
- int radix) {
1272
+ template <>
1273
+ bool Parse(const char* str, size_t n, unsigned long long* dest, int radix) {
1248
1274
  if (n == 0) return false;
1249
1275
  char buf[kMaxNumberLength+1];
1250
1276
  str = TerminateNumber(buf, sizeof buf, str, &n, false);
@@ -1259,68 +1285,11 @@ bool RE2::Arg::parse_ulonglong_radix(const char* str,
1259
1285
  if (end != str + n) return false; // Leftover junk
1260
1286
  if (errno) return false;
1261
1287
  if (dest == NULL) return true;
1262
- *(reinterpret_cast<unsigned long long*>(dest)) = r;
1263
- return true;
1264
- }
1265
-
1266
- static bool parse_double_float(const char* str, size_t n, bool isfloat,
1267
- void* dest) {
1268
- if (n == 0) return false;
1269
- static const int kMaxLength = 200;
1270
- char buf[kMaxLength+1];
1271
- str = TerminateNumber(buf, sizeof buf, str, &n, true);
1272
- char* end;
1273
- errno = 0;
1274
- double r;
1275
- if (isfloat) {
1276
- r = strtof(str, &end);
1277
- } else {
1278
- r = strtod(str, &end);
1279
- }
1280
- if (end != str + n) return false; // Leftover junk
1281
- if (errno) return false;
1282
- if (dest == NULL) return true;
1283
- if (isfloat) {
1284
- *(reinterpret_cast<float*>(dest)) = (float)r;
1285
- } else {
1286
- *(reinterpret_cast<double*>(dest)) = r;
1287
- }
1288
+ *dest = r;
1288
1289
  return true;
1289
1290
  }
1290
1291
 
1291
- bool RE2::Arg::parse_double(const char* str, size_t n, void* dest) {
1292
- return parse_double_float(str, n, false, dest);
1293
- }
1294
-
1295
- bool RE2::Arg::parse_float(const char* str, size_t n, void* dest) {
1296
- return parse_double_float(str, n, true, dest);
1297
- }
1298
-
1299
- #define DEFINE_INTEGER_PARSER(name) \
1300
- bool RE2::Arg::parse_##name(const char* str, size_t n, void* dest) { \
1301
- return parse_##name##_radix(str, n, dest, 10); \
1302
- } \
1303
- bool RE2::Arg::parse_##name##_hex(const char* str, size_t n, void* dest) { \
1304
- return parse_##name##_radix(str, n, dest, 16); \
1305
- } \
1306
- bool RE2::Arg::parse_##name##_octal(const char* str, size_t n, void* dest) { \
1307
- return parse_##name##_radix(str, n, dest, 8); \
1308
- } \
1309
- bool RE2::Arg::parse_##name##_cradix(const char* str, size_t n, \
1310
- void* dest) { \
1311
- return parse_##name##_radix(str, n, dest, 0); \
1312
- }
1313
-
1314
- DEFINE_INTEGER_PARSER(short)
1315
- DEFINE_INTEGER_PARSER(ushort)
1316
- DEFINE_INTEGER_PARSER(int)
1317
- DEFINE_INTEGER_PARSER(uint)
1318
- DEFINE_INTEGER_PARSER(long)
1319
- DEFINE_INTEGER_PARSER(ulong)
1320
- DEFINE_INTEGER_PARSER(longlong)
1321
- DEFINE_INTEGER_PARSER(ulonglong)
1322
-
1323
- #undef DEFINE_INTEGER_PARSER
1292
+ } // namespace re2_internal
1324
1293
 
1325
1294
  namespace hooks {
1326
1295