grpc 1.41.0.pre2 → 1.42.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (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 +81 -68
  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
@@ -40,6 +40,9 @@
40
40
  // R"((?i)hello)" -- (?i) turns on case-insensitive matching
41
41
  // R"(/\*(.*?)\*/)" -- .*? matches . minimum no. of times possible
42
42
  //
43
+ // When using UTF-8 encoding, case-insensitive matching will perform
44
+ // simple case folding, not full case folding.
45
+ //
43
46
  // -----------------------------------------------------------------------
44
47
  // MATCHING INTERFACE:
45
48
  //
@@ -205,6 +208,7 @@
205
208
  #include <map>
206
209
  #include <mutex>
207
210
  #include <string>
211
+ #include <type_traits>
208
212
  #include <vector>
209
213
 
210
214
  #if defined(__APPLE__)
@@ -244,6 +248,7 @@ class RE2 {
244
248
  ErrorBadCharRange, // bad character class range
245
249
  ErrorMissingBracket, // missing closing ]
246
250
  ErrorMissingParen, // missing closing )
251
+ ErrorUnexpectedParen, // unexpected closing )
247
252
  ErrorTrailingBackslash, // trailing \ at end of regexp
248
253
  ErrorRepeatArgument, // repeat argument missing, e.g. "*"
249
254
  ErrorRepeatSize, // bad repetition argument
@@ -364,12 +369,12 @@ class RE2 {
364
369
  // (void*)NULL (the corresponding matched sub-pattern is not copied)
365
370
  //
366
371
  // Returns true iff all of the following conditions are satisfied:
367
- // a. "text" matches "re" exactly
368
- // b. The number of matched sub-patterns is >= number of supplied pointers
372
+ // a. "text" matches "re" fully - from the beginning to the end of "text".
373
+ // b. The number of matched sub-patterns is >= number of supplied pointers.
369
374
  // c. The "i"th argument has a suitable type for holding the
370
375
  // string captured as the "i"th sub-pattern. If you pass in
371
376
  // NULL for the "i"th argument, or pass fewer arguments than
372
- // number of sub-patterns, "i"th captured sub-pattern is
377
+ // number of sub-patterns, the "i"th captured sub-pattern is
373
378
  // ignored.
374
379
  //
375
380
  // CAVEAT: An optional sub-pattern that does not exist in the
@@ -383,8 +388,17 @@ class RE2 {
383
388
  return Apply(FullMatchN, text, re, Arg(std::forward<A>(a))...);
384
389
  }
385
390
 
386
- // Exactly like FullMatch(), except that "re" is allowed to match
387
- // a substring of "text".
391
+ // Like FullMatch(), except that "re" is allowed to match a substring
392
+ // of "text".
393
+ //
394
+ // Returns true iff all of the following conditions are satisfied:
395
+ // a. "text" matches "re" partially - for some substring of "text".
396
+ // b. The number of matched sub-patterns is >= number of supplied pointers.
397
+ // c. The "i"th argument has a suitable type for holding the
398
+ // string captured as the "i"th sub-pattern. If you pass in
399
+ // NULL for the "i"th argument, or pass fewer arguments than
400
+ // number of sub-patterns, the "i"th captured sub-pattern is
401
+ // ignored.
388
402
  template <typename... A>
389
403
  static bool PartialMatch(const StringPiece& text, const RE2& re, A&&... a) {
390
404
  return Apply(PartialMatchN, text, re, Arg(std::forward<A>(a))...);
@@ -393,7 +407,16 @@ class RE2 {
393
407
  // Like FullMatch() and PartialMatch(), except that "re" has to match
394
408
  // a prefix of the text, and "input" is advanced past the matched
395
409
  // text. Note: "input" is modified iff this routine returns true
396
- // and "re" matched a non-empty substring of "text".
410
+ // and "re" matched a non-empty substring of "input".
411
+ //
412
+ // Returns true iff all of the following conditions are satisfied:
413
+ // a. "input" matches "re" partially - for some prefix of "input".
414
+ // b. The number of matched sub-patterns is >= number of supplied pointers.
415
+ // c. The "i"th argument has a suitable type for holding the
416
+ // string captured as the "i"th sub-pattern. If you pass in
417
+ // NULL for the "i"th argument, or pass fewer arguments than
418
+ // number of sub-patterns, the "i"th captured sub-pattern is
419
+ // ignored.
397
420
  template <typename... A>
398
421
  static bool Consume(StringPiece* input, const RE2& re, A&&... a) {
399
422
  return Apply(ConsumeN, input, re, Arg(std::forward<A>(a))...);
@@ -403,6 +426,15 @@ class RE2 {
403
426
  // the text. That is, "re" need not start its match at the beginning
404
427
  // of "input". For example, "FindAndConsume(s, "(\\w+)", &word)" finds
405
428
  // the next word in "s" and stores it in "word".
429
+ //
430
+ // Returns true iff all of the following conditions are satisfied:
431
+ // a. "input" matches "re" partially - for some substring of "input".
432
+ // b. The number of matched sub-patterns is >= number of supplied pointers.
433
+ // c. The "i"th argument has a suitable type for holding the
434
+ // string captured as the "i"th sub-pattern. If you pass in
435
+ // NULL for the "i"th argument, or pass fewer arguments than
436
+ // number of sub-patterns, the "i"th captured sub-pattern is
437
+ // ignored.
406
438
  template <typename... A>
407
439
  static bool FindAndConsume(StringPiece* input, const RE2& re, A&&... a) {
408
440
  return Apply(FindAndConsumeN, input, re, Arg(std::forward<A>(a))...);
@@ -703,32 +735,12 @@ class RE2 {
703
735
  const Options& options() const { return options_; }
704
736
 
705
737
  // Argument converters; see below.
706
- static inline Arg CRadix(short* x);
707
- static inline Arg CRadix(unsigned short* x);
708
- static inline Arg CRadix(int* x);
709
- static inline Arg CRadix(unsigned int* x);
710
- static inline Arg CRadix(long* x);
711
- static inline Arg CRadix(unsigned long* x);
712
- static inline Arg CRadix(long long* x);
713
- static inline Arg CRadix(unsigned long long* x);
714
-
715
- static inline Arg Hex(short* x);
716
- static inline Arg Hex(unsigned short* x);
717
- static inline Arg Hex(int* x);
718
- static inline Arg Hex(unsigned int* x);
719
- static inline Arg Hex(long* x);
720
- static inline Arg Hex(unsigned long* x);
721
- static inline Arg Hex(long long* x);
722
- static inline Arg Hex(unsigned long long* x);
723
-
724
- static inline Arg Octal(short* x);
725
- static inline Arg Octal(unsigned short* x);
726
- static inline Arg Octal(int* x);
727
- static inline Arg Octal(unsigned int* x);
728
- static inline Arg Octal(long* x);
729
- static inline Arg Octal(unsigned long* x);
730
- static inline Arg Octal(long long* x);
731
- static inline Arg Octal(unsigned long long* x);
738
+ template <typename T>
739
+ static Arg CRadix(T* ptr);
740
+ template <typename T>
741
+ static Arg Hex(T* ptr);
742
+ template <typename T>
743
+ static Arg Octal(T* ptr);
732
744
 
733
745
  private:
734
746
  void Init(const StringPiece& pattern, const Options& options);
@@ -771,130 +783,130 @@ class RE2 {
771
783
 
772
784
  /***** Implementation details *****/
773
785
 
774
- // Hex/Octal/Binary?
775
-
776
- // Special class for parsing into objects that define a ParseFrom() method
777
- template <class T>
778
- class _RE2_MatchObject {
779
- public:
780
- static inline bool Parse(const char* str, size_t n, void* dest) {
781
- if (dest == NULL) return true;
782
- T* object = reinterpret_cast<T*>(dest);
783
- return object->ParseFrom(str, n);
784
- }
785
- };
786
+ namespace re2_internal {
787
+
788
+ // Types for which the 3-ary Parse() function template has specializations.
789
+ template <typename T> struct Parse3ary : public std::false_type {};
790
+ template <> struct Parse3ary<void> : public std::true_type {};
791
+ template <> struct Parse3ary<std::string> : public std::true_type {};
792
+ template <> struct Parse3ary<StringPiece> : public std::true_type {};
793
+ template <> struct Parse3ary<char> : public std::true_type {};
794
+ template <> struct Parse3ary<signed char> : public std::true_type {};
795
+ template <> struct Parse3ary<unsigned char> : public std::true_type {};
796
+ template <> struct Parse3ary<float> : public std::true_type {};
797
+ template <> struct Parse3ary<double> : public std::true_type {};
798
+
799
+ template <typename T>
800
+ bool Parse(const char* str, size_t n, T* dest);
801
+
802
+ // Types for which the 4-ary Parse() function template has specializations.
803
+ template <typename T> struct Parse4ary : public std::false_type {};
804
+ template <> struct Parse4ary<long> : public std::true_type {};
805
+ template <> struct Parse4ary<unsigned long> : public std::true_type {};
806
+ template <> struct Parse4ary<short> : public std::true_type {};
807
+ template <> struct Parse4ary<unsigned short> : public std::true_type {};
808
+ template <> struct Parse4ary<int> : public std::true_type {};
809
+ template <> struct Parse4ary<unsigned int> : public std::true_type {};
810
+ template <> struct Parse4ary<long long> : public std::true_type {};
811
+ template <> struct Parse4ary<unsigned long long> : public std::true_type {};
812
+
813
+ template <typename T>
814
+ bool Parse(const char* str, size_t n, T* dest, int radix);
815
+
816
+ } // namespace re2_internal
786
817
 
787
818
  class RE2::Arg {
819
+ private:
820
+ template <typename T>
821
+ using CanParse3ary = typename std::enable_if<
822
+ re2_internal::Parse3ary<T>::value,
823
+ int>::type;
824
+
825
+ template <typename T>
826
+ using CanParse4ary = typename std::enable_if<
827
+ re2_internal::Parse4ary<T>::value,
828
+ int>::type;
829
+
830
+ #if !defined(_MSC_VER)
831
+ template <typename T>
832
+ using CanParseFrom = typename std::enable_if<
833
+ std::is_member_function_pointer<
834
+ decltype(static_cast<bool (T::*)(const char*, size_t)>(
835
+ &T::ParseFrom))>::value,
836
+ int>::type;
837
+ #endif
838
+
788
839
  public:
789
- // Empty constructor so we can declare arrays of RE2::Arg
790
- Arg();
840
+ Arg() : Arg(nullptr) {}
841
+ Arg(std::nullptr_t ptr) : arg_(ptr), parser_(DoNothing) {}
791
842
 
792
- // Constructor specially designed for NULL arguments
793
- Arg(void*);
794
- Arg(std::nullptr_t);
843
+ template <typename T, CanParse3ary<T> = 0>
844
+ Arg(T* ptr) : arg_(ptr), parser_(DoParse3ary<T>) {}
845
+
846
+ template <typename T, CanParse4ary<T> = 0>
847
+ Arg(T* ptr) : arg_(ptr), parser_(DoParse4ary<T>) {}
848
+
849
+ #if !defined(_MSC_VER)
850
+ template <typename T, CanParseFrom<T> = 0>
851
+ Arg(T* ptr) : arg_(ptr), parser_(DoParseFrom<T>) {}
852
+ #endif
795
853
 
796
854
  typedef bool (*Parser)(const char* str, size_t n, void* dest);
797
855
 
798
- // Type-specific parsers
799
- #define MAKE_PARSER(type, name) \
800
- Arg(type* p) : arg_(p), parser_(name) {} \
801
- Arg(type* p, Parser parser) : arg_(p), parser_(parser) {}
802
-
803
- MAKE_PARSER(char, parse_char)
804
- MAKE_PARSER(signed char, parse_schar)
805
- MAKE_PARSER(unsigned char, parse_uchar)
806
- MAKE_PARSER(float, parse_float)
807
- MAKE_PARSER(double, parse_double)
808
- MAKE_PARSER(std::string, parse_string)
809
- MAKE_PARSER(StringPiece, parse_stringpiece)
810
-
811
- MAKE_PARSER(short, parse_short)
812
- MAKE_PARSER(unsigned short, parse_ushort)
813
- MAKE_PARSER(int, parse_int)
814
- MAKE_PARSER(unsigned int, parse_uint)
815
- MAKE_PARSER(long, parse_long)
816
- MAKE_PARSER(unsigned long, parse_ulong)
817
- MAKE_PARSER(long long, parse_longlong)
818
- MAKE_PARSER(unsigned long long, parse_ulonglong)
819
-
820
- #undef MAKE_PARSER
821
-
822
- // Generic constructor templates
823
- template <class T> Arg(T* p)
824
- : arg_(p), parser_(_RE2_MatchObject<T>::Parse) { }
825
- template <class T> Arg(T* p, Parser parser)
826
- : arg_(p), parser_(parser) { }
827
-
828
- // Parse the data
829
- bool Parse(const char* str, size_t n) const;
856
+ template <typename T>
857
+ Arg(T* ptr, Parser parser) : arg_(ptr), parser_(parser) {}
858
+
859
+ bool Parse(const char* str, size_t n) const {
860
+ return (*parser_)(str, n, arg_);
861
+ }
830
862
 
831
863
  private:
832
- void* arg_;
833
- Parser parser_;
864
+ static bool DoNothing(const char* /*str*/, size_t /*n*/, void* /*dest*/) {
865
+ return true;
866
+ }
834
867
 
835
- static bool parse_null (const char* str, size_t n, void* dest);
836
- static bool parse_char (const char* str, size_t n, void* dest);
837
- static bool parse_schar (const char* str, size_t n, void* dest);
838
- static bool parse_uchar (const char* str, size_t n, void* dest);
839
- static bool parse_float (const char* str, size_t n, void* dest);
840
- static bool parse_double (const char* str, size_t n, void* dest);
841
- static bool parse_string (const char* str, size_t n, void* dest);
842
- static bool parse_stringpiece (const char* str, size_t n, void* dest);
843
-
844
- #define DECLARE_INTEGER_PARSER(name) \
845
- private: \
846
- static bool parse_##name(const char* str, size_t n, void* dest); \
847
- static bool parse_##name##_radix(const char* str, size_t n, void* dest, \
848
- int radix); \
849
- \
850
- public: \
851
- static bool parse_##name##_hex(const char* str, size_t n, void* dest); \
852
- static bool parse_##name##_octal(const char* str, size_t n, void* dest); \
853
- static bool parse_##name##_cradix(const char* str, size_t n, void* dest);
854
-
855
- DECLARE_INTEGER_PARSER(short)
856
- DECLARE_INTEGER_PARSER(ushort)
857
- DECLARE_INTEGER_PARSER(int)
858
- DECLARE_INTEGER_PARSER(uint)
859
- DECLARE_INTEGER_PARSER(long)
860
- DECLARE_INTEGER_PARSER(ulong)
861
- DECLARE_INTEGER_PARSER(longlong)
862
- DECLARE_INTEGER_PARSER(ulonglong)
863
-
864
- #undef DECLARE_INTEGER_PARSER
868
+ template <typename T>
869
+ static bool DoParse3ary(const char* str, size_t n, void* dest) {
870
+ return re2_internal::Parse(str, n, reinterpret_cast<T*>(dest));
871
+ }
865
872
 
866
- };
873
+ template <typename T>
874
+ static bool DoParse4ary(const char* str, size_t n, void* dest) {
875
+ return re2_internal::Parse(str, n, reinterpret_cast<T*>(dest), 10);
876
+ }
867
877
 
868
- inline RE2::Arg::Arg() : arg_(NULL), parser_(parse_null) { }
869
- inline RE2::Arg::Arg(void* p) : arg_(p), parser_(parse_null) { }
870
- inline RE2::Arg::Arg(std::nullptr_t p) : arg_(p), parser_(parse_null) { }
878
+ #if !defined(_MSC_VER)
879
+ template <typename T>
880
+ static bool DoParseFrom(const char* str, size_t n, void* dest) {
881
+ if (dest == NULL) return true;
882
+ return reinterpret_cast<T*>(dest)->ParseFrom(str, n);
883
+ }
884
+ #endif
871
885
 
872
- inline bool RE2::Arg::Parse(const char* str, size_t n) const {
873
- return (*parser_)(str, n, arg_);
874
- }
886
+ void* arg_;
887
+ Parser parser_;
888
+ };
875
889
 
876
- // This part of the parser, appropriate only for ints, deals with bases
877
- #define MAKE_INTEGER_PARSER(type, name) \
878
- inline RE2::Arg RE2::Hex(type* ptr) { \
879
- return RE2::Arg(ptr, RE2::Arg::parse_##name##_hex); \
880
- } \
881
- inline RE2::Arg RE2::Octal(type* ptr) { \
882
- return RE2::Arg(ptr, RE2::Arg::parse_##name##_octal); \
883
- } \
884
- inline RE2::Arg RE2::CRadix(type* ptr) { \
885
- return RE2::Arg(ptr, RE2::Arg::parse_##name##_cradix); \
886
- }
890
+ template <typename T>
891
+ inline RE2::Arg RE2::CRadix(T* ptr) {
892
+ return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool {
893
+ return re2_internal::Parse(str, n, reinterpret_cast<T*>(dest), 0);
894
+ });
895
+ }
887
896
 
888
- MAKE_INTEGER_PARSER(short, short)
889
- MAKE_INTEGER_PARSER(unsigned short, ushort)
890
- MAKE_INTEGER_PARSER(int, int)
891
- MAKE_INTEGER_PARSER(unsigned int, uint)
892
- MAKE_INTEGER_PARSER(long, long)
893
- MAKE_INTEGER_PARSER(unsigned long, ulong)
894
- MAKE_INTEGER_PARSER(long long, longlong)
895
- MAKE_INTEGER_PARSER(unsigned long long, ulonglong)
897
+ template <typename T>
898
+ inline RE2::Arg RE2::Hex(T* ptr) {
899
+ return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool {
900
+ return re2_internal::Parse(str, n, reinterpret_cast<T*>(dest), 16);
901
+ });
902
+ }
896
903
 
897
- #undef MAKE_INTEGER_PARSER
904
+ template <typename T>
905
+ inline RE2::Arg RE2::Octal(T* ptr) {
906
+ return RE2::Arg(ptr, [](const char* str, size_t n, void* dest) -> bool {
907
+ return re2_internal::Parse(str, n, reinterpret_cast<T*>(dest), 8);
908
+ });
909
+ }
898
910
 
899
911
  #ifndef SWIG
900
912
  // Silence warnings about missing initializers for members of LazyRE2.
@@ -955,8 +967,11 @@ namespace hooks {
955
967
  // thread_local, but for the sake of brevity, we lump together all versions
956
968
  // of Apple platforms that aren't macOS. If an iOS application really needs
957
969
  // the context pointee someday, we can get more specific then...
970
+ //
971
+ // As per https://github.com/google/re2/issues/325, thread_local support in
972
+ // MinGW seems to be buggy. (FWIW, Abseil folks also avoid it.)
958
973
  #define RE2_HAVE_THREAD_LOCAL
959
- #if defined(__APPLE__) && !TARGET_OS_OSX
974
+ #if (defined(__APPLE__) && !TARGET_OS_OSX) || defined(__MINGW32__)
960
975
  #undef RE2_HAVE_THREAD_LOCAL
961
976
  #endif
962
977
 
@@ -498,6 +498,7 @@ static const char *kErrorStrings[] = {
498
498
  "invalid character class range",
499
499
  "missing ]",
500
500
  "missing )",
501
+ "unexpected )",
501
502
  "trailing \\",
502
503
  "no argument for repetition operator",
503
504
  "invalid repetition size",
@@ -721,8 +722,14 @@ bool Regexp::RequiredPrefixForAccel(std::string* prefix, bool* foldcase) {
721
722
  *foldcase = false;
722
723
 
723
724
  // No need for a walker: the regexp must either begin with or be
724
- // a literal char or string.
725
+ // a literal char or string. We "see through" capturing groups,
726
+ // but make no effort to glue multiple prefix fragments together.
725
727
  Regexp* re = op_ == kRegexpConcat && nsub_ > 0 ? sub()[0] : this;
728
+ while (re->op_ == kRegexpCapture) {
729
+ re = re->sub()[0];
730
+ if (re->op_ == kRegexpConcat && re->nsub_ > 0)
731
+ re = re->sub()[0];
732
+ }
726
733
  if (re->op_ != kRegexpLiteral &&
727
734
  re->op_ != kRegexpLiteralString)
728
735
  return false;
@@ -912,7 +919,7 @@ void CharClassBuilder::Negate() {
912
919
  // The ranges are allocated in the same block as the header,
913
920
  // necessitating a special allocator and Delete method.
914
921
 
915
- CharClass* CharClass::New(int maxranges) {
922
+ CharClass* CharClass::New(size_t maxranges) {
916
923
  CharClass* cc;
917
924
  uint8_t* data = new uint8_t[sizeof *cc + maxranges*sizeof cc->ranges_[0]];
918
925
  cc = reinterpret_cast<CharClass*>(data);
@@ -929,7 +936,7 @@ void CharClass::Delete() {
929
936
  }
930
937
 
931
938
  CharClass* CharClass::Negate() {
932
- CharClass* cc = CharClass::New(nranges_+1);
939
+ CharClass* cc = CharClass::New(static_cast<size_t>(nranges_+1));
933
940
  cc->folds_ascii_ = folds_ascii_;
934
941
  cc->nrunes_ = Runemax + 1 - nrunes_;
935
942
  int n = 0;
@@ -948,7 +955,7 @@ CharClass* CharClass::Negate() {
948
955
  return cc;
949
956
  }
950
957
 
951
- bool CharClass::Contains(Rune r) {
958
+ bool CharClass::Contains(Rune r) const {
952
959
  RuneRange* rr = ranges_;
953
960
  int n = nranges_;
954
961
  while (n > 0) {
@@ -966,7 +973,7 @@ bool CharClass::Contains(Rune r) {
966
973
  }
967
974
 
968
975
  CharClass* CharClassBuilder::GetCharClass() {
969
- CharClass* cc = CharClass::New(static_cast<int>(ranges_.size()));
976
+ CharClass* cc = CharClass::New(ranges_.size());
970
977
  int n = 0;
971
978
  for (iterator it = begin(); it != end(); ++it)
972
979
  cc->ranges_[n++] = *it;
@@ -86,6 +86,7 @@
86
86
  // form accessible to clients, so that client code can analyze the
87
87
  // parsed regular expressions.
88
88
 
89
+ #include <stddef.h>
89
90
  #include <stdint.h>
90
91
  #include <map>
91
92
  #include <set>
@@ -177,6 +178,7 @@ enum RegexpStatusCode {
177
178
  kRegexpBadCharRange, // bad character class range
178
179
  kRegexpMissingBracket, // missing closing ]
179
180
  kRegexpMissingParen, // missing closing )
181
+ kRegexpUnexpectedParen, // unexpected closing )
180
182
  kRegexpTrailingBackslash, // at end of regexp
181
183
  kRegexpRepeatArgument, // repeat argument missing, e.g. "*"
182
184
  kRegexpRepeatSize, // bad repetition argument
@@ -252,13 +254,13 @@ class CharClass {
252
254
  bool full() { return nrunes_ == Runemax+1; }
253
255
  bool FoldsASCII() { return folds_ascii_; }
254
256
 
255
- bool Contains(Rune r);
257
+ bool Contains(Rune r) const;
256
258
  CharClass* Negate();
257
259
 
258
260
  private:
259
261
  CharClass(); // not implemented
260
262
  ~CharClass(); // not implemented
261
- static CharClass* New(int maxranges);
263
+ static CharClass* New(size_t maxranges);
262
264
 
263
265
  friend class CharClassBuilder;
264
266
 
@@ -447,6 +449,10 @@ class Regexp {
447
449
  // regardless of the return value.
448
450
  bool RequiredPrefixForAccel(std::string* prefix, bool* foldcase);
449
451
 
452
+ // Controls the maximum repeat count permitted by the parser.
453
+ // FOR FUZZING ONLY.
454
+ static void FUZZING_ONLY_set_maximum_repeat_count(int i);
455
+
450
456
  private:
451
457
  // Constructor allocates vectors as appropriate for operator.
452
458
  explicit Regexp(RegexpOp op, ParseFlags parse_flags);
@@ -7,6 +7,7 @@
7
7
  #include <stddef.h>
8
8
  #include <algorithm>
9
9
  #include <memory>
10
+ #include <utility>
10
11
 
11
12
  #include "util/util.h"
12
13
  #include "util/logging.h"
@@ -18,19 +19,37 @@
18
19
 
19
20
  namespace re2 {
20
21
 
21
- RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor) {
22
- options_.Copy(options);
22
+ RE2::Set::Set(const RE2::Options& options, RE2::Anchor anchor)
23
+ : options_(options),
24
+ anchor_(anchor),
25
+ compiled_(false),
26
+ size_(0) {
23
27
  options_.set_never_capture(true); // might unblock some optimisations
24
- anchor_ = anchor;
25
- prog_ = NULL;
26
- compiled_ = false;
27
- size_ = 0;
28
28
  }
29
29
 
30
30
  RE2::Set::~Set() {
31
31
  for (size_t i = 0; i < elem_.size(); i++)
32
32
  elem_[i].second->Decref();
33
- delete prog_;
33
+ }
34
+
35
+ RE2::Set::Set(Set&& other)
36
+ : options_(other.options_),
37
+ anchor_(other.anchor_),
38
+ elem_(std::move(other.elem_)),
39
+ compiled_(other.compiled_),
40
+ size_(other.size_),
41
+ prog_(std::move(other.prog_)) {
42
+ other.elem_.clear();
43
+ other.elem_.shrink_to_fit();
44
+ other.compiled_ = false;
45
+ other.size_ = 0;
46
+ other.prog_.reset();
47
+ }
48
+
49
+ RE2::Set& RE2::Set::operator=(Set&& other) {
50
+ this->~Set();
51
+ (void) new (this) Set(std::move(other));
52
+ return *this;
34
53
  }
35
54
 
36
55
  int RE2::Set::Add(const StringPiece& pattern, std::string* error) {
@@ -97,9 +116,9 @@ bool RE2::Set::Compile() {
97
116
  options_.ParseFlags());
98
117
  re2::Regexp* re = re2::Regexp::Alternate(sub.data(), size_, pf);
99
118
 
100
- prog_ = Prog::CompileSet(re, anchor_, options_.max_mem());
119
+ prog_.reset(Prog::CompileSet(re, anchor_, options_.max_mem()));
101
120
  re->Decref();
102
- return prog_ != NULL;
121
+ return prog_ != nullptr;
103
122
  }
104
123
 
105
124
  bool RE2::Set::Match(const StringPiece& text, std::vector<int>* v) const {
@@ -114,6 +133,9 @@ bool RE2::Set::Match(const StringPiece& text, std::vector<int>* v,
114
133
  error_info->kind = kNotCompiled;
115
134
  return false;
116
135
  }
136
+ #ifdef RE2_HAVE_THREAD_LOCAL
137
+ hooks::context = NULL;
138
+ #endif
117
139
  bool dfa_failed = false;
118
140
  std::unique_ptr<SparseSet> matches;
119
141
  if (v != NULL) {
@@ -5,6 +5,7 @@
5
5
  #ifndef RE2_SET_H_
6
6
  #define RE2_SET_H_
7
7
 
8
+ #include <memory>
8
9
  #include <string>
9
10
  #include <utility>
10
11
  #include <vector>
@@ -36,6 +37,13 @@ class RE2::Set {
36
37
  Set(const RE2::Options& options, RE2::Anchor anchor);
37
38
  ~Set();
38
39
 
40
+ // Not copyable.
41
+ Set(const Set&) = delete;
42
+ Set& operator=(const Set&) = delete;
43
+ // Movable.
44
+ Set(Set&& other);
45
+ Set& operator=(Set&& other);
46
+
39
47
  // Adds pattern to the set using the options passed to the constructor.
40
48
  // Returns the index that will identify the regexp in the output of Match(),
41
49
  // or -1 if the regexp cannot be parsed.
@@ -67,12 +75,9 @@ class RE2::Set {
67
75
  RE2::Options options_;
68
76
  RE2::Anchor anchor_;
69
77
  std::vector<Elem> elem_;
70
- re2::Prog* prog_;
71
78
  bool compiled_;
72
79
  int size_;
73
-
74
- Set(const Set&) = delete;
75
- Set& operator=(const Set&) = delete;
80
+ std::unique_ptr<re2::Prog> prog_;
76
81
  };
77
82
 
78
83
  } // namespace re2
@@ -28,8 +28,6 @@ bool Regexp::SimplifyRegexp(const StringPiece& src, ParseFlags flags,
28
28
  Regexp* sre = re->Simplify();
29
29
  re->Decref();
30
30
  if (sre == NULL) {
31
- // Should not happen, since Simplify never fails.
32
- LOG(ERROR) << "Simplify failed on " << src;
33
31
  if (status) {
34
32
  status->set_code(kRegexpInternalError);
35
33
  status->set_error_arg(src);
@@ -180,10 +178,20 @@ Regexp* Regexp::Simplify() {
180
178
  CoalesceWalker cw;
181
179
  Regexp* cre = cw.Walk(this, NULL);
182
180
  if (cre == NULL)
183
- return cre;
181
+ return NULL;
182
+ if (cw.stopped_early()) {
183
+ cre->Decref();
184
+ return NULL;
185
+ }
184
186
  SimplifyWalker sw;
185
187
  Regexp* sre = sw.Walk(cre, NULL);
186
188
  cre->Decref();
189
+ if (sre == NULL)
190
+ return NULL;
191
+ if (sw.stopped_early()) {
192
+ sre->Decref();
193
+ return NULL;
194
+ }
187
195
  return sre;
188
196
  }
189
197
 
@@ -291,7 +291,7 @@ int ToStringWalker::PostVisit(Regexp* re, int parent_arg, int pre_arg,
291
291
  // There's no syntax accepted by the parser to generate
292
292
  // this node (it is generated by RE2::Set) so make something
293
293
  // up that is readable but won't compile.
294
- t_->append("(?HaveMatch:%d)", re->match_id());
294
+ t_->append(StringPrintf("(?HaveMatch:%d)", re->match_id()));
295
295
  break;
296
296
  }
297
297
 
@@ -119,7 +119,7 @@ template<typename T> T Regexp::Walker<T>::Copy(T arg) {
119
119
 
120
120
  // State about a single level in the traversal.
121
121
  template<typename T> struct WalkState {
122
- WalkState<T>(Regexp* re, T parent)
122
+ WalkState(Regexp* re, T parent)
123
123
  : re(re),
124
124
  n(-1),
125
125
  parent_arg(parent),
@@ -12,6 +12,7 @@
12
12
 
13
13
  #ifdef _WIN32
14
14
  // Requires Windows Vista or Windows Server 2008 at minimum.
15
+ #include <windows.h>
15
16
  #if defined(WINVER) && WINVER >= 0x0600
16
17
  #define MUTEX_IS_WIN32_SRWLOCK
17
18
  #endif
@@ -26,7 +27,6 @@
26
27
  #endif
27
28
 
28
29
  #if defined(MUTEX_IS_WIN32_SRWLOCK)
29
- #include <windows.h>
30
30
  typedef SRWLOCK MutexType;
31
31
  #elif defined(MUTEX_IS_PTHREAD_RWLOCK)
32
32
  #include <pthread.h>
@@ -66,7 +66,7 @@ class Mutex {
66
66
 
67
67
  #if defined(MUTEX_IS_WIN32_SRWLOCK)
68
68
 
69
- Mutex::Mutex() { InitializeSRWLock(&mutex_); }
69
+ Mutex::Mutex() : mutex_(SRWLOCK_INIT) { }
70
70
  Mutex::~Mutex() { }
71
71
  void Mutex::Lock() { AcquireSRWLockExclusive(&mutex_); }
72
72
  void Mutex::Unlock() { ReleaseSRWLockExclusive(&mutex_); }