grpc 1.30.0 → 1.31.1
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.
- checksums.yaml +4 -4
- data/Makefile +560 -619
- data/include/grpc/grpc_security.h +8 -0
- data/include/grpc/grpc_security_constants.h +3 -0
- data/include/grpc/impl/codegen/grpc_types.h +7 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -32
- data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
- data/src/core/ext/filters/client_channel/client_channel.cc +406 -261
- data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
- data/src/core/ext/filters/client_channel/config_selector.h +93 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +2 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +39 -23
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +381 -72
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -48
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +21 -18
- data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +33 -28
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +1 -1
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +327 -123
- data/src/core/ext/filters/client_channel/xds/xds_api.h +72 -7
- data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +12 -23
- data/src/core/ext/filters/client_channel/xds/xds_client.cc +112 -33
- data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +10 -10
- data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
- data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
- data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +383 -347
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -4
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +22 -27
- data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
- data/src/core/ext/transport/chttp2/transport/internal.h +13 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
- data/src/core/ext/transport/chttp2/transport/writing.cc +9 -14
- data/src/core/ext/transport/inproc/inproc_transport.cc +35 -15
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +80 -69
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +24 -23
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +66 -56
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +317 -311
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +9 -8
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +163 -169
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +4 -5
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +137 -117
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +105 -87
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +12 -13
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +49 -42
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +81 -65
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +648 -696
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +234 -199
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +13 -13
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +20 -18
- data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +18 -17
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
- data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +3 -3
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
- data/src/core/ext/upb-generated/validate/validate.upb.h +536 -535
- data/src/core/lib/channel/channel_trace.cc +2 -6
- data/src/core/lib/channel/channelz.cc +5 -15
- data/src/core/lib/gpr/log_linux.cc +6 -8
- data/src/core/lib/gpr/log_posix.cc +6 -8
- data/src/core/lib/gpr/string.cc +10 -9
- data/src/core/lib/gpr/string.h +4 -2
- data/src/core/lib/gprpp/global_config_env.cc +8 -6
- data/src/core/lib/http/httpcli.cc +13 -10
- data/src/core/lib/http/httpcli_security_connector.cc +5 -5
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
- data/src/core/lib/iomgr/error_cfstream.cc +9 -8
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
- data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
- data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
- data/src/core/lib/iomgr/ev_posix.cc +2 -0
- data/src/core/lib/iomgr/iomgr.cc +10 -0
- data/src/core/lib/iomgr/iomgr.h +10 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
- data/src/core/lib/iomgr/port.h +1 -21
- data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
- data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
- data/src/core/lib/iomgr/resource_quota.cc +34 -31
- data/src/core/lib/iomgr/sockaddr_utils.cc +7 -5
- data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
- data/src/core/lib/iomgr/socket_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
- data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
- data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
- data/src/core/lib/iomgr/tcp_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_custom.h +1 -1
- data/src/core/lib/iomgr/tcp_server.cc +3 -4
- data/src/core/lib/iomgr/tcp_server.h +7 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
- data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
- data/src/core/lib/iomgr/timer_generic.cc +13 -12
- data/src/core/lib/iomgr/udp_server.cc +24 -23
- data/src/core/lib/iomgr/udp_server.h +5 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
- data/src/core/lib/json/json_reader.cc +20 -21
- data/src/core/lib/security/credentials/credentials.h +5 -3
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -9
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +10 -10
- data/src/core/lib/security/security_connector/security_connector.cc +2 -0
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
- data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
- data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
- data/src/core/lib/security/transport/auth_filters.h +0 -5
- data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
- data/src/core/lib/security/util/json_util.cc +12 -13
- data/src/core/lib/slice/slice.cc +38 -1
- data/src/core/lib/slice/slice_internal.h +1 -0
- data/src/core/lib/surface/call.cc +40 -41
- data/src/core/lib/surface/completion_queue.cc +271 -14
- data/src/core/lib/surface/completion_queue.h +8 -0
- data/src/core/lib/surface/init.cc +2 -0
- data/src/core/lib/surface/server.cc +565 -632
- data/src/core/lib/surface/server.h +34 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/transport.h +6 -0
- data/src/core/lib/uri/uri_parser.cc +8 -15
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
- data/src/core/tsi/ssl_transport_security.cc +108 -11
- data/src/core/tsi/ssl_transport_security.h +14 -2
- data/src/core/tsi/transport_security_interface.h +5 -0
- data/src/ruby/bin/math_services_pb.rb +4 -4
- data/src/ruby/ext/grpc/extconf.rb +5 -2
- data/src/ruby/ext/grpc/rb_call.c +3 -2
- data/src/ruby/ext/grpc/rb_call.h +4 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
- data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +25 -1
- data/src/ruby/spec/support/services.rb +10 -4
- data/src/ruby/spec/user_agent_spec.rb +74 -0
- data/third_party/boringssl-with-bazel/err_data.c +89 -83
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
- data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
- data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +33 -16
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +789 -715
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +17 -14
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +28 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
- data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +12 -9
- data/third_party/re2/re2/bitmap256.h +117 -0
- data/third_party/re2/re2/bitstate.cc +385 -0
- data/third_party/re2/re2/compile.cc +1279 -0
- data/third_party/re2/re2/dfa.cc +2130 -0
- data/third_party/re2/re2/filtered_re2.cc +121 -0
- data/third_party/re2/re2/filtered_re2.h +109 -0
- data/third_party/re2/re2/mimics_pcre.cc +197 -0
- data/third_party/re2/re2/nfa.cc +713 -0
- data/third_party/re2/re2/onepass.cc +623 -0
- data/third_party/re2/re2/parse.cc +2464 -0
- data/third_party/re2/re2/perl_groups.cc +119 -0
- data/third_party/re2/re2/pod_array.h +55 -0
- data/third_party/re2/re2/prefilter.cc +710 -0
- data/third_party/re2/re2/prefilter.h +108 -0
- data/third_party/re2/re2/prefilter_tree.cc +407 -0
- data/third_party/re2/re2/prefilter_tree.h +139 -0
- data/third_party/re2/re2/prog.cc +988 -0
- data/third_party/re2/re2/prog.h +436 -0
- data/third_party/re2/re2/re2.cc +1362 -0
- data/third_party/re2/re2/re2.h +1002 -0
- data/third_party/re2/re2/regexp.cc +980 -0
- data/third_party/re2/re2/regexp.h +659 -0
- data/third_party/re2/re2/set.cc +154 -0
- data/third_party/re2/re2/set.h +80 -0
- data/third_party/re2/re2/simplify.cc +657 -0
- data/third_party/re2/re2/sparse_array.h +392 -0
- data/third_party/re2/re2/sparse_set.h +264 -0
- data/third_party/re2/re2/stringpiece.cc +65 -0
- data/third_party/re2/re2/stringpiece.h +210 -0
- data/third_party/re2/re2/tostring.cc +351 -0
- data/third_party/re2/re2/unicode_casefold.cc +582 -0
- data/third_party/re2/re2/unicode_casefold.h +78 -0
- data/third_party/re2/re2/unicode_groups.cc +6269 -0
- data/third_party/re2/re2/unicode_groups.h +67 -0
- data/third_party/re2/re2/walker-inl.h +246 -0
- data/third_party/re2/util/benchmark.h +156 -0
- data/third_party/re2/util/flags.h +26 -0
- data/third_party/re2/util/logging.h +109 -0
- data/third_party/re2/util/malloc_counter.h +19 -0
- data/third_party/re2/util/mix.h +41 -0
- data/third_party/re2/util/mutex.h +148 -0
- data/third_party/re2/util/pcre.cc +1025 -0
- data/third_party/re2/util/pcre.h +681 -0
- data/third_party/re2/util/rune.cc +260 -0
- data/third_party/re2/util/strutil.cc +149 -0
- data/third_party/re2/util/strutil.h +21 -0
- data/third_party/re2/util/test.h +50 -0
- data/third_party/re2/util/utf.h +44 -0
- data/third_party/re2/util/util.h +42 -0
- data/third_party/upb/upb/decode.c +467 -504
- data/third_party/upb/upb/encode.c +163 -121
- data/third_party/upb/upb/msg.c +130 -64
- data/third_party/upb/upb/msg.h +418 -14
- data/third_party/upb/upb/port_def.inc +35 -6
- data/third_party/upb/upb/port_undef.inc +8 -1
- data/third_party/upb/upb/table.c +53 -75
- data/third_party/upb/upb/table.int.h +11 -43
- data/third_party/upb/upb/upb.c +148 -124
- data/third_party/upb/upb/upb.h +65 -147
- data/third_party/upb/upb/upb.hpp +86 -0
- metadata +90 -30
- data/third_party/upb/upb/generated_util.h +0 -105
@@ -0,0 +1,659 @@
|
|
1
|
+
// Copyright 2006 The RE2 Authors. All Rights Reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style
|
3
|
+
// license that can be found in the LICENSE file.
|
4
|
+
|
5
|
+
#ifndef RE2_REGEXP_H_
|
6
|
+
#define RE2_REGEXP_H_
|
7
|
+
|
8
|
+
// --- SPONSORED LINK --------------------------------------------------
|
9
|
+
// If you want to use this library for regular expression matching,
|
10
|
+
// you should use re2/re2.h, which provides a class RE2 that
|
11
|
+
// mimics the PCRE interface provided by PCRE's C++ wrappers.
|
12
|
+
// This header describes the low-level interface used to implement RE2
|
13
|
+
// and may change in backwards-incompatible ways from time to time.
|
14
|
+
// In contrast, RE2's interface will not.
|
15
|
+
// ---------------------------------------------------------------------
|
16
|
+
|
17
|
+
// Regular expression library: parsing, execution, and manipulation
|
18
|
+
// of regular expressions.
|
19
|
+
//
|
20
|
+
// Any operation that traverses the Regexp structures should be written
|
21
|
+
// using Regexp::Walker (see walker-inl.h), not recursively, because deeply nested
|
22
|
+
// regular expressions such as x++++++++++++++++++++... might cause recursive
|
23
|
+
// traversals to overflow the stack.
|
24
|
+
//
|
25
|
+
// It is the caller's responsibility to provide appropriate mutual exclusion
|
26
|
+
// around manipulation of the regexps. RE2 does this.
|
27
|
+
//
|
28
|
+
// PARSING
|
29
|
+
//
|
30
|
+
// Regexp::Parse parses regular expressions encoded in UTF-8.
|
31
|
+
// The default syntax is POSIX extended regular expressions,
|
32
|
+
// with the following changes:
|
33
|
+
//
|
34
|
+
// 1. Backreferences (optional in POSIX EREs) are not supported.
|
35
|
+
// (Supporting them precludes the use of DFA-based
|
36
|
+
// matching engines.)
|
37
|
+
//
|
38
|
+
// 2. Collating elements and collation classes are not supported.
|
39
|
+
// (No one has needed or wanted them.)
|
40
|
+
//
|
41
|
+
// The exact syntax accepted can be modified by passing flags to
|
42
|
+
// Regexp::Parse. In particular, many of the basic Perl additions
|
43
|
+
// are available. The flags are documented below (search for LikePerl).
|
44
|
+
//
|
45
|
+
// If parsed with the flag Regexp::Latin1, both the regular expression
|
46
|
+
// and the input to the matching routines are assumed to be encoded in
|
47
|
+
// Latin-1, not UTF-8.
|
48
|
+
//
|
49
|
+
// EXECUTION
|
50
|
+
//
|
51
|
+
// Once Regexp has parsed a regular expression, it provides methods
|
52
|
+
// to search text using that regular expression. These methods are
|
53
|
+
// implemented via calling out to other regular expression libraries.
|
54
|
+
// (Let's call them the sublibraries.)
|
55
|
+
//
|
56
|
+
// To call a sublibrary, Regexp does not simply prepare a
|
57
|
+
// string version of the regular expression and hand it to the
|
58
|
+
// sublibrary. Instead, Regexp prepares, from its own parsed form, the
|
59
|
+
// corresponding internal representation used by the sublibrary.
|
60
|
+
// This has the drawback of needing to know the internal representation
|
61
|
+
// used by the sublibrary, but it has two important benefits:
|
62
|
+
//
|
63
|
+
// 1. The syntax and meaning of regular expressions is guaranteed
|
64
|
+
// to be that used by Regexp's parser, not the syntax expected
|
65
|
+
// by the sublibrary. Regexp might accept a restricted or
|
66
|
+
// expanded syntax for regular expressions as compared with
|
67
|
+
// the sublibrary. As long as Regexp can translate from its
|
68
|
+
// internal form into the sublibrary's, clients need not know
|
69
|
+
// exactly which sublibrary they are using.
|
70
|
+
//
|
71
|
+
// 2. The sublibrary parsers are bypassed. For whatever reason,
|
72
|
+
// sublibrary regular expression parsers often have security
|
73
|
+
// problems. For example, plan9grep's regular expression parser
|
74
|
+
// has a buffer overflow in its handling of large character
|
75
|
+
// classes, and PCRE's parser has had buffer overflow problems
|
76
|
+
// in the past. Security-team requires sandboxing of sublibrary
|
77
|
+
// regular expression parsers. Avoiding the sublibrary parsers
|
78
|
+
// avoids the sandbox.
|
79
|
+
//
|
80
|
+
// The execution methods we use now are provided by the compiled form,
|
81
|
+
// Prog, described in prog.h
|
82
|
+
//
|
83
|
+
// MANIPULATION
|
84
|
+
//
|
85
|
+
// Unlike other regular expression libraries, Regexp makes its parsed
|
86
|
+
// form accessible to clients, so that client code can analyze the
|
87
|
+
// parsed regular expressions.
|
88
|
+
|
89
|
+
#include <stdint.h>
|
90
|
+
#include <map>
|
91
|
+
#include <set>
|
92
|
+
#include <string>
|
93
|
+
|
94
|
+
#include "util/util.h"
|
95
|
+
#include "util/logging.h"
|
96
|
+
#include "util/utf.h"
|
97
|
+
#include "re2/stringpiece.h"
|
98
|
+
|
99
|
+
namespace re2 {
|
100
|
+
|
101
|
+
// Keep in sync with string list kOpcodeNames[] in testing/dump.cc
|
102
|
+
enum RegexpOp {
|
103
|
+
// Matches no strings.
|
104
|
+
kRegexpNoMatch = 1,
|
105
|
+
|
106
|
+
// Matches empty string.
|
107
|
+
kRegexpEmptyMatch,
|
108
|
+
|
109
|
+
// Matches rune_.
|
110
|
+
kRegexpLiteral,
|
111
|
+
|
112
|
+
// Matches runes_.
|
113
|
+
kRegexpLiteralString,
|
114
|
+
|
115
|
+
// Matches concatenation of sub_[0..nsub-1].
|
116
|
+
kRegexpConcat,
|
117
|
+
// Matches union of sub_[0..nsub-1].
|
118
|
+
kRegexpAlternate,
|
119
|
+
|
120
|
+
// Matches sub_[0] zero or more times.
|
121
|
+
kRegexpStar,
|
122
|
+
// Matches sub_[0] one or more times.
|
123
|
+
kRegexpPlus,
|
124
|
+
// Matches sub_[0] zero or one times.
|
125
|
+
kRegexpQuest,
|
126
|
+
|
127
|
+
// Matches sub_[0] at least min_ times, at most max_ times.
|
128
|
+
// max_ == -1 means no upper limit.
|
129
|
+
kRegexpRepeat,
|
130
|
+
|
131
|
+
// Parenthesized (capturing) subexpression. Index is cap_.
|
132
|
+
// Optionally, capturing name is name_.
|
133
|
+
kRegexpCapture,
|
134
|
+
|
135
|
+
// Matches any character.
|
136
|
+
kRegexpAnyChar,
|
137
|
+
|
138
|
+
// Matches any byte [sic].
|
139
|
+
kRegexpAnyByte,
|
140
|
+
|
141
|
+
// Matches empty string at beginning of line.
|
142
|
+
kRegexpBeginLine,
|
143
|
+
// Matches empty string at end of line.
|
144
|
+
kRegexpEndLine,
|
145
|
+
|
146
|
+
// Matches word boundary "\b".
|
147
|
+
kRegexpWordBoundary,
|
148
|
+
// Matches not-a-word boundary "\B".
|
149
|
+
kRegexpNoWordBoundary,
|
150
|
+
|
151
|
+
// Matches empty string at beginning of text.
|
152
|
+
kRegexpBeginText,
|
153
|
+
// Matches empty string at end of text.
|
154
|
+
kRegexpEndText,
|
155
|
+
|
156
|
+
// Matches character class given by cc_.
|
157
|
+
kRegexpCharClass,
|
158
|
+
|
159
|
+
// Forces match of entire expression right now,
|
160
|
+
// with match ID match_id_ (used by RE2::Set).
|
161
|
+
kRegexpHaveMatch,
|
162
|
+
|
163
|
+
kMaxRegexpOp = kRegexpHaveMatch,
|
164
|
+
};
|
165
|
+
|
166
|
+
// Keep in sync with string list in regexp.cc
|
167
|
+
enum RegexpStatusCode {
|
168
|
+
// No error
|
169
|
+
kRegexpSuccess = 0,
|
170
|
+
|
171
|
+
// Unexpected error
|
172
|
+
kRegexpInternalError,
|
173
|
+
|
174
|
+
// Parse errors
|
175
|
+
kRegexpBadEscape, // bad escape sequence
|
176
|
+
kRegexpBadCharClass, // bad character class
|
177
|
+
kRegexpBadCharRange, // bad character class range
|
178
|
+
kRegexpMissingBracket, // missing closing ]
|
179
|
+
kRegexpMissingParen, // missing closing )
|
180
|
+
kRegexpTrailingBackslash, // at end of regexp
|
181
|
+
kRegexpRepeatArgument, // repeat argument missing, e.g. "*"
|
182
|
+
kRegexpRepeatSize, // bad repetition argument
|
183
|
+
kRegexpRepeatOp, // bad repetition operator
|
184
|
+
kRegexpBadPerlOp, // bad perl operator
|
185
|
+
kRegexpBadUTF8, // invalid UTF-8 in regexp
|
186
|
+
kRegexpBadNamedCapture, // bad named capture
|
187
|
+
};
|
188
|
+
|
189
|
+
// Error status for certain operations.
|
190
|
+
class RegexpStatus {
|
191
|
+
public:
|
192
|
+
RegexpStatus() : code_(kRegexpSuccess), tmp_(NULL) {}
|
193
|
+
~RegexpStatus() { delete tmp_; }
|
194
|
+
|
195
|
+
void set_code(RegexpStatusCode code) { code_ = code; }
|
196
|
+
void set_error_arg(const StringPiece& error_arg) { error_arg_ = error_arg; }
|
197
|
+
void set_tmp(std::string* tmp) { delete tmp_; tmp_ = tmp; }
|
198
|
+
RegexpStatusCode code() const { return code_; }
|
199
|
+
const StringPiece& error_arg() const { return error_arg_; }
|
200
|
+
bool ok() const { return code() == kRegexpSuccess; }
|
201
|
+
|
202
|
+
// Copies state from status.
|
203
|
+
void Copy(const RegexpStatus& status);
|
204
|
+
|
205
|
+
// Returns text equivalent of code, e.g.:
|
206
|
+
// "Bad character class"
|
207
|
+
static std::string CodeText(RegexpStatusCode code);
|
208
|
+
|
209
|
+
// Returns text describing error, e.g.:
|
210
|
+
// "Bad character class: [z-a]"
|
211
|
+
std::string Text() const;
|
212
|
+
|
213
|
+
private:
|
214
|
+
RegexpStatusCode code_; // Kind of error
|
215
|
+
StringPiece error_arg_; // Piece of regexp containing syntax error.
|
216
|
+
std::string* tmp_; // Temporary storage, possibly where error_arg_ is.
|
217
|
+
|
218
|
+
RegexpStatus(const RegexpStatus&) = delete;
|
219
|
+
RegexpStatus& operator=(const RegexpStatus&) = delete;
|
220
|
+
};
|
221
|
+
|
222
|
+
// Compiled form; see prog.h
|
223
|
+
class Prog;
|
224
|
+
|
225
|
+
struct RuneRange {
|
226
|
+
RuneRange() : lo(0), hi(0) { }
|
227
|
+
RuneRange(int l, int h) : lo(l), hi(h) { }
|
228
|
+
Rune lo;
|
229
|
+
Rune hi;
|
230
|
+
};
|
231
|
+
|
232
|
+
// Less-than on RuneRanges treats a == b if they overlap at all.
|
233
|
+
// This lets us look in a set to find the range covering a particular Rune.
|
234
|
+
struct RuneRangeLess {
|
235
|
+
bool operator()(const RuneRange& a, const RuneRange& b) const {
|
236
|
+
return a.hi < b.lo;
|
237
|
+
}
|
238
|
+
};
|
239
|
+
|
240
|
+
class CharClassBuilder;
|
241
|
+
|
242
|
+
class CharClass {
|
243
|
+
public:
|
244
|
+
void Delete();
|
245
|
+
|
246
|
+
typedef RuneRange* iterator;
|
247
|
+
iterator begin() { return ranges_; }
|
248
|
+
iterator end() { return ranges_ + nranges_; }
|
249
|
+
|
250
|
+
int size() { return nrunes_; }
|
251
|
+
bool empty() { return nrunes_ == 0; }
|
252
|
+
bool full() { return nrunes_ == Runemax+1; }
|
253
|
+
bool FoldsASCII() { return folds_ascii_; }
|
254
|
+
|
255
|
+
bool Contains(Rune r);
|
256
|
+
CharClass* Negate();
|
257
|
+
|
258
|
+
private:
|
259
|
+
CharClass(); // not implemented
|
260
|
+
~CharClass(); // not implemented
|
261
|
+
static CharClass* New(int maxranges);
|
262
|
+
|
263
|
+
friend class CharClassBuilder;
|
264
|
+
|
265
|
+
bool folds_ascii_;
|
266
|
+
int nrunes_;
|
267
|
+
RuneRange *ranges_;
|
268
|
+
int nranges_;
|
269
|
+
|
270
|
+
CharClass(const CharClass&) = delete;
|
271
|
+
CharClass& operator=(const CharClass&) = delete;
|
272
|
+
};
|
273
|
+
|
274
|
+
class Regexp {
|
275
|
+
public:
|
276
|
+
|
277
|
+
// Flags for parsing. Can be ORed together.
|
278
|
+
enum ParseFlags {
|
279
|
+
NoParseFlags = 0,
|
280
|
+
FoldCase = 1<<0, // Fold case during matching (case-insensitive).
|
281
|
+
Literal = 1<<1, // Treat s as literal string instead of a regexp.
|
282
|
+
ClassNL = 1<<2, // Allow char classes like [^a-z] and \D and \s
|
283
|
+
// and [[:space:]] to match newline.
|
284
|
+
DotNL = 1<<3, // Allow . to match newline.
|
285
|
+
MatchNL = ClassNL | DotNL,
|
286
|
+
OneLine = 1<<4, // Treat ^ and $ as only matching at beginning and
|
287
|
+
// end of text, not around embedded newlines.
|
288
|
+
// (Perl's default)
|
289
|
+
Latin1 = 1<<5, // Regexp and text are in Latin1, not UTF-8.
|
290
|
+
NonGreedy = 1<<6, // Repetition operators are non-greedy by default.
|
291
|
+
PerlClasses = 1<<7, // Allow Perl character classes like \d.
|
292
|
+
PerlB = 1<<8, // Allow Perl's \b and \B.
|
293
|
+
PerlX = 1<<9, // Perl extensions:
|
294
|
+
// non-capturing parens - (?: )
|
295
|
+
// non-greedy operators - *? +? ?? {}?
|
296
|
+
// flag edits - (?i) (?-i) (?i: )
|
297
|
+
// i - FoldCase
|
298
|
+
// m - !OneLine
|
299
|
+
// s - DotNL
|
300
|
+
// U - NonGreedy
|
301
|
+
// line ends: \A \z
|
302
|
+
// \Q and \E to disable/enable metacharacters
|
303
|
+
// (?P<name>expr) for named captures
|
304
|
+
// \C to match any single byte
|
305
|
+
UnicodeGroups = 1<<10, // Allow \p{Han} for Unicode Han group
|
306
|
+
// and \P{Han} for its negation.
|
307
|
+
NeverNL = 1<<11, // Never match NL, even if the regexp mentions
|
308
|
+
// it explicitly.
|
309
|
+
NeverCapture = 1<<12, // Parse all parens as non-capturing.
|
310
|
+
|
311
|
+
// As close to Perl as we can get.
|
312
|
+
LikePerl = ClassNL | OneLine | PerlClasses | PerlB | PerlX |
|
313
|
+
UnicodeGroups,
|
314
|
+
|
315
|
+
// Internal use only.
|
316
|
+
WasDollar = 1<<13, // on kRegexpEndText: was $ in regexp text
|
317
|
+
AllParseFlags = (1<<14)-1,
|
318
|
+
};
|
319
|
+
|
320
|
+
// Get. No set, Regexps are logically immutable once created.
|
321
|
+
RegexpOp op() { return static_cast<RegexpOp>(op_); }
|
322
|
+
int nsub() { return nsub_; }
|
323
|
+
bool simple() { return simple_ != 0; }
|
324
|
+
ParseFlags parse_flags() { return static_cast<ParseFlags>(parse_flags_); }
|
325
|
+
int Ref(); // For testing.
|
326
|
+
|
327
|
+
Regexp** sub() {
|
328
|
+
if(nsub_ <= 1)
|
329
|
+
return &subone_;
|
330
|
+
else
|
331
|
+
return submany_;
|
332
|
+
}
|
333
|
+
|
334
|
+
int min() { DCHECK_EQ(op_, kRegexpRepeat); return min_; }
|
335
|
+
int max() { DCHECK_EQ(op_, kRegexpRepeat); return max_; }
|
336
|
+
Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return rune_; }
|
337
|
+
CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return cc_; }
|
338
|
+
int cap() { DCHECK_EQ(op_, kRegexpCapture); return cap_; }
|
339
|
+
const std::string* name() { DCHECK_EQ(op_, kRegexpCapture); return name_; }
|
340
|
+
Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return runes_; }
|
341
|
+
int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return nrunes_; }
|
342
|
+
int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return match_id_; }
|
343
|
+
|
344
|
+
// Increments reference count, returns object as convenience.
|
345
|
+
Regexp* Incref();
|
346
|
+
|
347
|
+
// Decrements reference count and deletes this object if count reaches 0.
|
348
|
+
void Decref();
|
349
|
+
|
350
|
+
// Parses string s to produce regular expression, returned.
|
351
|
+
// Caller must release return value with re->Decref().
|
352
|
+
// On failure, sets *status (if status != NULL) and returns NULL.
|
353
|
+
static Regexp* Parse(const StringPiece& s, ParseFlags flags,
|
354
|
+
RegexpStatus* status);
|
355
|
+
|
356
|
+
// Returns a _new_ simplified version of the current regexp.
|
357
|
+
// Does not edit the current regexp.
|
358
|
+
// Caller must release return value with re->Decref().
|
359
|
+
// Simplified means that counted repetition has been rewritten
|
360
|
+
// into simpler terms and all Perl/POSIX features have been
|
361
|
+
// removed. The result will capture exactly the same
|
362
|
+
// subexpressions the original did, unless formatted with ToString.
|
363
|
+
Regexp* Simplify();
|
364
|
+
friend class CoalesceWalker;
|
365
|
+
friend class SimplifyWalker;
|
366
|
+
|
367
|
+
// Parses the regexp src and then simplifies it and sets *dst to the
|
368
|
+
// string representation of the simplified form. Returns true on success.
|
369
|
+
// Returns false and sets *status (if status != NULL) on parse error.
|
370
|
+
static bool SimplifyRegexp(const StringPiece& src, ParseFlags flags,
|
371
|
+
std::string* dst, RegexpStatus* status);
|
372
|
+
|
373
|
+
// Returns the number of capturing groups in the regexp.
|
374
|
+
int NumCaptures();
|
375
|
+
friend class NumCapturesWalker;
|
376
|
+
|
377
|
+
// Returns a map from names to capturing group indices,
|
378
|
+
// or NULL if the regexp contains no named capture groups.
|
379
|
+
// The caller is responsible for deleting the map.
|
380
|
+
std::map<std::string, int>* NamedCaptures();
|
381
|
+
|
382
|
+
// Returns a map from capturing group indices to capturing group
|
383
|
+
// names or NULL if the regexp contains no named capture groups. The
|
384
|
+
// caller is responsible for deleting the map.
|
385
|
+
std::map<int, std::string>* CaptureNames();
|
386
|
+
|
387
|
+
// Returns a string representation of the current regexp,
|
388
|
+
// using as few parentheses as possible.
|
389
|
+
std::string ToString();
|
390
|
+
|
391
|
+
// Convenience functions. They consume the passed reference,
|
392
|
+
// so in many cases you should use, e.g., Plus(re->Incref(), flags).
|
393
|
+
// They do not consume allocated arrays like subs or runes.
|
394
|
+
static Regexp* Plus(Regexp* sub, ParseFlags flags);
|
395
|
+
static Regexp* Star(Regexp* sub, ParseFlags flags);
|
396
|
+
static Regexp* Quest(Regexp* sub, ParseFlags flags);
|
397
|
+
static Regexp* Concat(Regexp** subs, int nsubs, ParseFlags flags);
|
398
|
+
static Regexp* Alternate(Regexp** subs, int nsubs, ParseFlags flags);
|
399
|
+
static Regexp* Capture(Regexp* sub, ParseFlags flags, int cap);
|
400
|
+
static Regexp* Repeat(Regexp* sub, ParseFlags flags, int min, int max);
|
401
|
+
static Regexp* NewLiteral(Rune rune, ParseFlags flags);
|
402
|
+
static Regexp* NewCharClass(CharClass* cc, ParseFlags flags);
|
403
|
+
static Regexp* LiteralString(Rune* runes, int nrunes, ParseFlags flags);
|
404
|
+
static Regexp* HaveMatch(int match_id, ParseFlags flags);
|
405
|
+
|
406
|
+
// Like Alternate but does not factor out common prefixes.
|
407
|
+
static Regexp* AlternateNoFactor(Regexp** subs, int nsubs, ParseFlags flags);
|
408
|
+
|
409
|
+
// Debugging function. Returns string format for regexp
|
410
|
+
// that makes structure clear. Does NOT use regexp syntax.
|
411
|
+
std::string Dump();
|
412
|
+
|
413
|
+
// Helper traversal class, defined fully in walker-inl.h.
|
414
|
+
template<typename T> class Walker;
|
415
|
+
|
416
|
+
// Compile to Prog. See prog.h
|
417
|
+
// Reverse prog expects to be run over text backward.
|
418
|
+
// Construction and execution of prog will
|
419
|
+
// stay within approximately max_mem bytes of memory.
|
420
|
+
// If max_mem <= 0, a reasonable default is used.
|
421
|
+
Prog* CompileToProg(int64_t max_mem);
|
422
|
+
Prog* CompileToReverseProg(int64_t max_mem);
|
423
|
+
|
424
|
+
// Whether to expect this library to find exactly the same answer as PCRE
|
425
|
+
// when running this regexp. Most regexps do mimic PCRE exactly, but a few
|
426
|
+
// obscure cases behave differently. Technically this is more a property
|
427
|
+
// of the Prog than the Regexp, but the computation is much easier to do
|
428
|
+
// on the Regexp. See mimics_pcre.cc for the exact conditions.
|
429
|
+
bool MimicsPCRE();
|
430
|
+
|
431
|
+
// Benchmarking function.
|
432
|
+
void NullWalk();
|
433
|
+
|
434
|
+
// Whether every match of this regexp must be anchored and
|
435
|
+
// begin with a non-empty fixed string (perhaps after ASCII
|
436
|
+
// case-folding). If so, returns the prefix and the sub-regexp that
|
437
|
+
// follows it.
|
438
|
+
// Callers should expect *prefix, *foldcase and *suffix to be "zeroed"
|
439
|
+
// regardless of the return value.
|
440
|
+
bool RequiredPrefix(std::string* prefix, bool* foldcase,
|
441
|
+
Regexp** suffix);
|
442
|
+
|
443
|
+
// Whether every match of this regexp must be unanchored and
|
444
|
+
// begin with a non-empty fixed string (perhaps after ASCII
|
445
|
+
// case-folding). If so, returns the prefix.
|
446
|
+
// Callers should expect *prefix and *foldcase to be "zeroed"
|
447
|
+
// regardless of the return value.
|
448
|
+
bool RequiredPrefixForAccel(std::string* prefix, bool* foldcase);
|
449
|
+
|
450
|
+
private:
|
451
|
+
// Constructor allocates vectors as appropriate for operator.
|
452
|
+
explicit Regexp(RegexpOp op, ParseFlags parse_flags);
|
453
|
+
|
454
|
+
// Use Decref() instead of delete to release Regexps.
|
455
|
+
// This is private to catch deletes at compile time.
|
456
|
+
~Regexp();
|
457
|
+
void Destroy();
|
458
|
+
bool QuickDestroy();
|
459
|
+
|
460
|
+
// Helpers for Parse. Listed here so they can edit Regexps.
|
461
|
+
class ParseState;
|
462
|
+
|
463
|
+
friend class ParseState;
|
464
|
+
friend bool ParseCharClass(StringPiece* s, Regexp** out_re,
|
465
|
+
RegexpStatus* status);
|
466
|
+
|
467
|
+
// Helper for testing [sic].
|
468
|
+
friend bool RegexpEqualTestingOnly(Regexp*, Regexp*);
|
469
|
+
|
470
|
+
// Computes whether Regexp is already simple.
|
471
|
+
bool ComputeSimple();
|
472
|
+
|
473
|
+
// Constructor that generates a Star, Plus or Quest,
|
474
|
+
// squashing the pair if sub is also a Star, Plus or Quest.
|
475
|
+
static Regexp* StarPlusOrQuest(RegexpOp op, Regexp* sub, ParseFlags flags);
|
476
|
+
|
477
|
+
// Constructor that generates a concatenation or alternation,
|
478
|
+
// enforcing the limit on the number of subexpressions for
|
479
|
+
// a particular Regexp.
|
480
|
+
static Regexp* ConcatOrAlternate(RegexpOp op, Regexp** subs, int nsubs,
|
481
|
+
ParseFlags flags, bool can_factor);
|
482
|
+
|
483
|
+
// Returns the leading string that re starts with.
|
484
|
+
// The returned Rune* points into a piece of re,
|
485
|
+
// so it must not be used after the caller calls re->Decref().
|
486
|
+
static Rune* LeadingString(Regexp* re, int* nrune, ParseFlags* flags);
|
487
|
+
|
488
|
+
// Removes the first n leading runes from the beginning of re.
|
489
|
+
// Edits re in place.
|
490
|
+
static void RemoveLeadingString(Regexp* re, int n);
|
491
|
+
|
492
|
+
// Returns the leading regexp in re's top-level concatenation.
|
493
|
+
// The returned Regexp* points at re or a sub-expression of re,
|
494
|
+
// so it must not be used after the caller calls re->Decref().
|
495
|
+
static Regexp* LeadingRegexp(Regexp* re);
|
496
|
+
|
497
|
+
// Removes LeadingRegexp(re) from re and returns the remainder.
|
498
|
+
// Might edit re in place.
|
499
|
+
static Regexp* RemoveLeadingRegexp(Regexp* re);
|
500
|
+
|
501
|
+
// Simplifies an alternation of literal strings by factoring out
|
502
|
+
// common prefixes.
|
503
|
+
static int FactorAlternation(Regexp** sub, int nsub, ParseFlags flags);
|
504
|
+
friend class FactorAlternationImpl;
|
505
|
+
|
506
|
+
// Is a == b? Only efficient on regexps that have not been through
|
507
|
+
// Simplify yet - the expansion of a kRegexpRepeat will make this
|
508
|
+
// take a long time. Do not call on such regexps, hence private.
|
509
|
+
static bool Equal(Regexp* a, Regexp* b);
|
510
|
+
|
511
|
+
// Allocate space for n sub-regexps.
|
512
|
+
void AllocSub(int n) {
|
513
|
+
DCHECK(n >= 0 && static_cast<uint16_t>(n) == n);
|
514
|
+
if (n > 1)
|
515
|
+
submany_ = new Regexp*[n];
|
516
|
+
nsub_ = static_cast<uint16_t>(n);
|
517
|
+
}
|
518
|
+
|
519
|
+
// Add Rune to LiteralString
|
520
|
+
void AddRuneToString(Rune r);
|
521
|
+
|
522
|
+
// Swaps this with that, in place.
|
523
|
+
void Swap(Regexp *that);
|
524
|
+
|
525
|
+
// Operator. See description of operators above.
|
526
|
+
// uint8_t instead of RegexpOp to control space usage.
|
527
|
+
uint8_t op_;
|
528
|
+
|
529
|
+
// Is this regexp structure already simple
|
530
|
+
// (has it been returned by Simplify)?
|
531
|
+
// uint8_t instead of bool to control space usage.
|
532
|
+
uint8_t simple_;
|
533
|
+
|
534
|
+
// Flags saved from parsing and used during execution.
|
535
|
+
// (Only FoldCase is used.)
|
536
|
+
// uint16_t instead of ParseFlags to control space usage.
|
537
|
+
uint16_t parse_flags_;
|
538
|
+
|
539
|
+
// Reference count. Exists so that SimplifyRegexp can build
|
540
|
+
// regexp structures that are dags rather than trees to avoid
|
541
|
+
// exponential blowup in space requirements.
|
542
|
+
// uint16_t to control space usage.
|
543
|
+
// The standard regexp routines will never generate a
|
544
|
+
// ref greater than the maximum repeat count (kMaxRepeat),
|
545
|
+
// but even so, Incref and Decref consult an overflow map
|
546
|
+
// when ref_ reaches kMaxRef.
|
547
|
+
uint16_t ref_;
|
548
|
+
static const uint16_t kMaxRef = 0xffff;
|
549
|
+
|
550
|
+
// Subexpressions.
|
551
|
+
// uint16_t to control space usage.
|
552
|
+
// Concat and Alternate handle larger numbers of subexpressions
|
553
|
+
// by building concatenation or alternation trees.
|
554
|
+
// Other routines should call Concat or Alternate instead of
|
555
|
+
// filling in sub() by hand.
|
556
|
+
uint16_t nsub_;
|
557
|
+
static const uint16_t kMaxNsub = 0xffff;
|
558
|
+
union {
|
559
|
+
Regexp** submany_; // if nsub_ > 1
|
560
|
+
Regexp* subone_; // if nsub_ == 1
|
561
|
+
};
|
562
|
+
|
563
|
+
// Extra space for parse and teardown stacks.
|
564
|
+
Regexp* down_;
|
565
|
+
|
566
|
+
// Arguments to operator. See description of operators above.
|
567
|
+
union {
|
568
|
+
struct { // Repeat
|
569
|
+
int max_;
|
570
|
+
int min_;
|
571
|
+
};
|
572
|
+
struct { // Capture
|
573
|
+
int cap_;
|
574
|
+
std::string* name_;
|
575
|
+
};
|
576
|
+
struct { // LiteralString
|
577
|
+
int nrunes_;
|
578
|
+
Rune* runes_;
|
579
|
+
};
|
580
|
+
struct { // CharClass
|
581
|
+
// These two could be in separate union members,
|
582
|
+
// but it wouldn't save any space (there are other two-word structs)
|
583
|
+
// and keeping them separate avoids confusion during parsing.
|
584
|
+
CharClass* cc_;
|
585
|
+
CharClassBuilder* ccb_;
|
586
|
+
};
|
587
|
+
Rune rune_; // Literal
|
588
|
+
int match_id_; // HaveMatch
|
589
|
+
void *the_union_[2]; // as big as any other element, for memset
|
590
|
+
};
|
591
|
+
|
592
|
+
Regexp(const Regexp&) = delete;
|
593
|
+
Regexp& operator=(const Regexp&) = delete;
|
594
|
+
};
|
595
|
+
|
596
|
+
// Character class set: contains non-overlapping, non-abutting RuneRanges.
|
597
|
+
typedef std::set<RuneRange, RuneRangeLess> RuneRangeSet;
|
598
|
+
|
599
|
+
class CharClassBuilder {
|
600
|
+
public:
|
601
|
+
CharClassBuilder();
|
602
|
+
|
603
|
+
typedef RuneRangeSet::iterator iterator;
|
604
|
+
iterator begin() { return ranges_.begin(); }
|
605
|
+
iterator end() { return ranges_.end(); }
|
606
|
+
|
607
|
+
int size() { return nrunes_; }
|
608
|
+
bool empty() { return nrunes_ == 0; }
|
609
|
+
bool full() { return nrunes_ == Runemax+1; }
|
610
|
+
|
611
|
+
bool Contains(Rune r);
|
612
|
+
bool FoldsASCII();
|
613
|
+
bool AddRange(Rune lo, Rune hi); // returns whether class changed
|
614
|
+
CharClassBuilder* Copy();
|
615
|
+
void AddCharClass(CharClassBuilder* cc);
|
616
|
+
void Negate();
|
617
|
+
void RemoveAbove(Rune r);
|
618
|
+
CharClass* GetCharClass();
|
619
|
+
void AddRangeFlags(Rune lo, Rune hi, Regexp::ParseFlags parse_flags);
|
620
|
+
|
621
|
+
private:
|
622
|
+
static const uint32_t AlphaMask = (1<<26) - 1;
|
623
|
+
uint32_t upper_; // bitmap of A-Z
|
624
|
+
uint32_t lower_; // bitmap of a-z
|
625
|
+
int nrunes_;
|
626
|
+
RuneRangeSet ranges_;
|
627
|
+
|
628
|
+
CharClassBuilder(const CharClassBuilder&) = delete;
|
629
|
+
CharClassBuilder& operator=(const CharClassBuilder&) = delete;
|
630
|
+
};
|
631
|
+
|
632
|
+
// Bitwise ops on ParseFlags produce ParseFlags.
|
633
|
+
inline Regexp::ParseFlags operator|(Regexp::ParseFlags a,
|
634
|
+
Regexp::ParseFlags b) {
|
635
|
+
return static_cast<Regexp::ParseFlags>(
|
636
|
+
static_cast<int>(a) | static_cast<int>(b));
|
637
|
+
}
|
638
|
+
|
639
|
+
inline Regexp::ParseFlags operator^(Regexp::ParseFlags a,
|
640
|
+
Regexp::ParseFlags b) {
|
641
|
+
return static_cast<Regexp::ParseFlags>(
|
642
|
+
static_cast<int>(a) ^ static_cast<int>(b));
|
643
|
+
}
|
644
|
+
|
645
|
+
inline Regexp::ParseFlags operator&(Regexp::ParseFlags a,
|
646
|
+
Regexp::ParseFlags b) {
|
647
|
+
return static_cast<Regexp::ParseFlags>(
|
648
|
+
static_cast<int>(a) & static_cast<int>(b));
|
649
|
+
}
|
650
|
+
|
651
|
+
inline Regexp::ParseFlags operator~(Regexp::ParseFlags a) {
|
652
|
+
// Attempting to produce a value out of enum's range has undefined behaviour.
|
653
|
+
return static_cast<Regexp::ParseFlags>(
|
654
|
+
~static_cast<int>(a) & static_cast<int>(Regexp::AllParseFlags));
|
655
|
+
}
|
656
|
+
|
657
|
+
} // namespace re2
|
658
|
+
|
659
|
+
#endif // RE2_REGEXP_H_
|