grpc 1.31.0.pre2 → 1.34.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.
- checksums.yaml +4 -4
- data/Makefile +1030 -16151
- data/include/grpc/grpc.h +1 -7
- data/include/grpc/grpc_security.h +196 -186
- data/include/grpc/impl/codegen/README.md +22 -0
- data/include/grpc/impl/codegen/grpc_types.h +9 -7
- data/include/grpc/impl/codegen/port_platform.h +28 -56
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +243 -188
- data/src/core/ext/filters/client_channel/client_channel.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
- data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
- data/src/core/ext/filters/client_channel/config_selector.h +36 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -2
- data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy.cc +5 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +6 -4
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -7
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +178 -162
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -17
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +79 -30
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +10 -9
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +26 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +208 -130
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +299 -328
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +53 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +809 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
- data/src/core/ext/filters/client_channel/resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver.h +4 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +661 -58
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +18 -61
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +4 -3
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +50 -48
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +7 -11
- data/src/core/ext/filters/client_channel/retry_throttle.h +1 -1
- data/src/core/ext/filters/client_channel/server_address.cc +120 -7
- data/src/core/ext/filters/client_channel/server_address.h +44 -21
- data/src/core/ext/filters/client_channel/service_config.cc +18 -13
- data/src/core/ext/filters/client_channel/service_config.h +8 -5
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
- data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
- data/src/core/ext/filters/client_channel/subchannel.cc +82 -38
- data/src/core/ext/filters/client_channel/subchannel.h +18 -6
- data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
- data/src/core/ext/filters/deadline/deadline_filter.cc +83 -77
- data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
- data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
- data/src/core/ext/filters/max_age/max_age_filter.cc +3 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +2 -1
- data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +19 -2
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +36 -28
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +260 -311
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +11 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -2
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
- data/src/core/ext/transport/chttp2/transport/internal.h +10 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +19 -31
- data/src/core/ext/transport/chttp2/transport/writing.cc +7 -7
- data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +244 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +766 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +458 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1635 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +124 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +379 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +310 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +103 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +351 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +133 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +241 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +752 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +176 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +645 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +36 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +85 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
- data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +128 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +467 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +155 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +539 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +178 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +616 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +900 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +3290 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +60 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +139 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +364 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1336 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +110 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +387 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +76 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +214 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +147 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +570 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +139 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +449 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +54 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +133 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
- data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
- data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
- data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
- data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
- data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +753 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +57 -0
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
- data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +28 -0
- data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +53 -0
- data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +52 -0
- data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +129 -0
- data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +42 -0
- data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +77 -0
- data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +36 -0
- data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +85 -0
- data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +54 -0
- data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +160 -0
- data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +36 -0
- data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +84 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
- data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +254 -0
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +558 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +133 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +266 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +125 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +46 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +110 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +190 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +185 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +62 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +97 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +915 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +280 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +64 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +511 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +166 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +105 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +249 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +152 -0
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +60 -0
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +83 -0
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +82 -0
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +83 -0
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +86 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +72 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
- data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +38 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +39 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +39 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +42 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +62 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +49 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +68 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +51 -0
- data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +307 -0
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
- data/src/core/ext/xds/certificate_provider_factory.h +61 -0
- data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
- data/src/core/ext/xds/certificate_provider_registry.h +57 -0
- data/src/core/ext/xds/certificate_provider_store.cc +84 -0
- data/src/core/ext/xds/certificate_provider_store.h +107 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +119 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +72 -0
- data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +265 -0
- data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +104 -0
- data/src/core/ext/xds/xds_api.cc +2119 -0
- data/src/core/ext/xds/xds_api.h +438 -0
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +208 -19
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +31 -10
- data/src/core/ext/xds/xds_certificate_provider.cc +240 -0
- data/src/core/ext/xds/xds_certificate_provider.h +74 -0
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +9 -6
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +636 -847
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +120 -98
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +61 -18
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +38 -10
- data/src/core/lib/channel/channel_args.cc +2 -1
- data/src/core/lib/channel/channel_args.h +0 -1
- data/src/core/lib/channel/channel_trace.cc +4 -2
- data/src/core/lib/channel/channelz.cc +24 -60
- data/src/core/lib/channel/channelz.h +14 -22
- data/src/core/lib/channel/channelz_registry.cc +15 -12
- data/src/core/lib/channel/channelz_registry.h +3 -0
- data/src/core/lib/channel/handshaker.h +2 -2
- data/src/core/lib/compression/compression.cc +8 -4
- data/src/core/lib/compression/compression_internal.cc +10 -5
- data/src/core/lib/compression/compression_internal.h +2 -1
- data/src/core/lib/compression/stream_compression_identity.cc +1 -3
- data/src/core/lib/debug/stats_data.cc +1 -0
- data/src/core/lib/gpr/cpu_iphone.cc +10 -2
- data/src/core/lib/gpr/log_linux.cc +17 -3
- data/src/core/lib/gpr/log_posix.cc +13 -1
- data/src/core/lib/gpr/log_windows.cc +16 -4
- data/src/core/lib/gpr/murmur_hash.cc +1 -1
- data/src/core/lib/gpr/string.cc +1 -1
- data/src/core/lib/gpr/sync_posix.cc +2 -8
- data/src/core/lib/gpr/time_precise.cc +5 -2
- data/src/core/lib/gpr/time_precise.h +6 -2
- data/src/core/lib/gpr/tls.h +4 -0
- data/src/core/lib/gpr/tls_msvc.h +2 -0
- data/src/core/lib/gpr/tls_stdcpp.h +48 -0
- data/src/core/lib/gpr/useful.h +5 -4
- data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
- data/src/core/lib/gprpp/examine_stack.cc +43 -0
- data/src/core/lib/gprpp/examine_stack.h +46 -0
- data/src/core/lib/gprpp/fork.cc +2 -2
- data/src/core/lib/gprpp/manual_constructor.h +1 -1
- data/src/core/lib/gprpp/orphanable.h +4 -8
- data/src/core/lib/gprpp/ref_counted.h +91 -68
- data/src/core/lib/gprpp/ref_counted_ptr.h +158 -7
- data/src/core/lib/gprpp/stat.h +38 -0
- data/src/core/lib/gprpp/stat_posix.cc +49 -0
- data/src/core/lib/gprpp/stat_windows.cc +48 -0
- data/src/core/lib/gprpp/thd.h +2 -2
- data/src/core/lib/gprpp/thd_posix.cc +36 -36
- data/src/core/lib/http/parser.cc +46 -25
- data/src/core/lib/iomgr/endpoint.cc +5 -1
- data/src/core/lib/iomgr/endpoint.h +7 -3
- data/src/core/lib/iomgr/endpoint_cfstream.cc +36 -11
- data/src/core/lib/iomgr/error.cc +2 -1
- data/src/core/lib/iomgr/ev_epollex_linux.cc +8 -4
- data/src/core/lib/iomgr/ev_posix.cc +0 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -1
- data/src/core/lib/iomgr/exec_ctx.h +10 -8
- data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
- data/src/core/lib/iomgr/executor/threadpool.h +3 -3
- data/src/core/lib/iomgr/iomgr.cc +0 -10
- data/src/core/lib/iomgr/iomgr.h +0 -10
- data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +85 -7
- data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +23 -3
- data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
- data/src/core/lib/iomgr/python_util.h +3 -3
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
- data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
- data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
- data/src/core/lib/iomgr/tcp_custom.cc +32 -16
- data/src/core/lib/iomgr/tcp_posix.cc +34 -15
- data/src/core/lib/iomgr/tcp_windows.cc +26 -10
- data/src/core/lib/iomgr/timer_custom.cc +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +27 -15
- data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/json/json.h +2 -2
- data/src/core/lib/json/json_reader.cc +8 -4
- data/src/core/lib/json/json_util.cc +58 -0
- data/src/core/lib/json/json_util.h +204 -0
- data/src/core/lib/json/json_writer.cc +2 -1
- data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
- data/src/core/lib/security/authorization/authorization_engine.h +84 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
- data/src/core/lib/security/authorization/evaluate_args.h +59 -0
- data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +44 -0
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +69 -0
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +97 -0
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +57 -0
- data/src/core/lib/security/context/security_context.h +3 -1
- data/src/core/lib/security/credentials/credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.h +3 -3
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +208 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.h +73 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +311 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.h +118 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +136 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +49 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +211 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +59 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +51 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +351 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +218 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +78 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +74 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +77 -149
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +58 -187
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -12
- data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +45 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.h +51 -0
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -14
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +88 -0
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +70 -0
- data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
- data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +1 -1
- data/src/core/lib/security/security_connector/security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +9 -2
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +293 -275
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +106 -61
- data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
- data/src/core/lib/security/transport/security_handshaker.cc +1 -1
- data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
- data/src/core/lib/security/util/json_util.h +1 -0
- data/src/core/lib/slice/slice.cc +7 -4
- data/src/core/lib/slice/slice_buffer.cc +2 -1
- data/src/core/lib/slice/slice_intern.cc +2 -2
- data/src/core/lib/surface/call.cc +21 -20
- data/src/core/lib/surface/call.h +2 -1
- data/src/core/lib/surface/channel.cc +37 -51
- data/src/core/lib/surface/channel.h +18 -3
- data/src/core/lib/surface/completion_queue.cc +17 -278
- data/src/core/lib/surface/completion_queue.h +0 -8
- data/src/core/lib/surface/init.cc +27 -12
- data/src/core/lib/surface/server.cc +1069 -1245
- data/src/core/lib/surface/server.h +363 -87
- data/src/core/lib/surface/validate_metadata.h +3 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/authority_override.cc +38 -0
- data/src/core/lib/transport/authority_override.h +34 -0
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.h +2 -1
- data/src/core/lib/transport/byte_stream.h +3 -3
- data/src/core/lib/transport/connectivity_state.cc +18 -13
- data/src/core/lib/transport/connectivity_state.h +22 -10
- data/src/core/lib/transport/error_utils.cc +13 -0
- data/src/core/lib/transport/error_utils.h +6 -0
- data/src/core/lib/transport/metadata.cc +11 -1
- data/src/core/lib/transport/metadata.h +2 -2
- data/src/core/lib/transport/static_metadata.cc +295 -276
- data/src/core/lib/transport/static_metadata.h +80 -73
- data/src/core/lib/transport/timeout_encoding.cc +4 -4
- data/src/core/lib/transport/transport.cc +5 -3
- data/src/core/lib/transport/transport.h +8 -1
- data/src/core/lib/uri/uri_parser.cc +23 -21
- data/src/core/lib/uri/uri_parser.h +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.cc +35 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +26 -3
- data/src/core/tsi/fake_transport_security.cc +1 -0
- data/src/core/tsi/local_transport_security.cc +5 -1
- data/src/core/tsi/local_transport_security.h +6 -7
- data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -1
- data/src/core/tsi/ssl_transport_security.cc +16 -9
- data/src/core/tsi/ssl_transport_security.h +3 -0
- data/src/core/tsi/transport_security.cc +4 -2
- data/src/ruby/bin/math_services_pb.rb +4 -4
- data/src/ruby/ext/grpc/extconf.rb +1 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +26 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +43 -31
- data/src/ruby/lib/grpc/generic/client_stub.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/channel_credentials_spec.rb +10 -0
- data/src/ruby/spec/generic/active_call_spec.rb +19 -8
- 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 +20 -0
- data/src/ruby/spec/user_agent_spec.rb +74 -0
- data/third_party/abseil-cpp/absl/algorithm/container.h +1764 -0
- data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
- data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
- data/third_party/abseil-cpp/absl/base/casts.h +9 -6
- data/third_party/abseil-cpp/absl/base/config.h +60 -17
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
- data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +166 -0
- data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
- data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
- data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
- data/third_party/abseil-cpp/absl/base/macros.h +36 -109
- data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
- data/third_party/abseil-cpp/absl/base/options.h +31 -4
- data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
- data/third_party/abseil-cpp/absl/container/fixed_array.h +532 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
- data/third_party/abseil-cpp/absl/container/internal/common.h +206 -0
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +460 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +161 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +208 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +270 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +321 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +50 -0
- data/third_party/abseil-cpp/absl/container/internal/layout.h +743 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1903 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +139 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1945 -0
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +196 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +134 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +89 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +108 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +93 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +149 -0
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +173 -0
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +36 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1560 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
- data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
- data/third_party/abseil-cpp/absl/hash/hash.h +325 -0
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
- data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +996 -0
- data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
- data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
- data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
- data/third_party/abseil-cpp/absl/status/status.cc +445 -0
- data/third_party/abseil-cpp/absl/status/status.h +817 -0
- data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +38 -0
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
- data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +1998 -0
- data/third_party/abseil-cpp/absl/strings/cord.h +1276 -0
- data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +173 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
- data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
- data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
- data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
- data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
- data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
- data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +249 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +492 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2739 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +1065 -0
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
- data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
- data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
- data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
- data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
- data/third_party/abseil-cpp/absl/time/format.cc +43 -36
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
- data/third_party/abseil-cpp/absl/time/time.h +15 -16
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
- data/third_party/abseil-cpp/absl/types/optional.h +9 -9
- data/third_party/abseil-cpp/absl/types/span.h +49 -36
- data/third_party/abseil-cpp/absl/types/variant.h +861 -0
- data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
- data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
- data/third_party/boringssl-with-bazel/err_data.c +479 -467
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +0 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
- data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +56 -22
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +8 -2
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +543 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +237 -0
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
- data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +7 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +21 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +24 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +13 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +14 -14
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +7 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +54 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +0 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +12 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +4 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +103 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +5 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +199 -78
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +482 -432
- data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +18 -18
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -3
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +49 -10
- data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +42 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +77 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +11 -14
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +250 -20
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +57 -19
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +140 -41
- data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
- data/third_party/upb/upb/decode.c +64 -15
- data/third_party/upb/upb/def.c +2169 -0
- data/third_party/upb/upb/def.h +330 -0
- data/third_party/upb/upb/def.hpp +525 -0
- data/third_party/upb/upb/encode.c +2 -2
- data/third_party/upb/upb/msg.h +2 -2
- data/third_party/upb/upb/port_def.inc +1 -1
- data/third_party/upb/upb/reflection.c +391 -0
- data/third_party/upb/upb/reflection.h +168 -0
- data/third_party/upb/upb/table.c +0 -11
- data/third_party/upb/upb/table.int.h +0 -9
- data/third_party/upb/upb/text_encode.c +398 -0
- data/third_party/upb/upb/text_encode.h +35 -0
- data/third_party/upb/upb/upb.c +16 -14
- data/third_party/upb/upb/upb.h +26 -0
- data/third_party/upb/upb/upb.hpp +2 -0
- metadata +489 -161
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -528
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1143
- data/src/core/ext/filters/client_channel/xds/xds_api.cc +0 -2110
- data/src/core/ext/filters/client_channel/xds/xds_api.h +0 -345
- data/src/core/ext/filters/client_channel/xds/xds_channel.h +0 -46
- data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +0 -106
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
- data/src/core/lib/security/transport/target_authority_table.cc +0 -75
- data/src/core/lib/security/transport/target_authority_table.h +0 -40
- data/src/core/lib/slice/slice_hash_table.h +0 -199
- data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
@@ -1,12 +1,23 @@
|
|
1
1
|
#include "absl/strings/internal/str_format/float_conversion.h"
|
2
2
|
|
3
3
|
#include <string.h>
|
4
|
+
|
4
5
|
#include <algorithm>
|
5
6
|
#include <cassert>
|
6
7
|
#include <cmath>
|
8
|
+
#include <limits>
|
7
9
|
#include <string>
|
8
10
|
|
11
|
+
#include "absl/base/attributes.h"
|
9
12
|
#include "absl/base/config.h"
|
13
|
+
#include "absl/base/internal/bits.h"
|
14
|
+
#include "absl/base/optimization.h"
|
15
|
+
#include "absl/functional/function_ref.h"
|
16
|
+
#include "absl/meta/type_traits.h"
|
17
|
+
#include "absl/numeric/int128.h"
|
18
|
+
#include "absl/strings/numbers.h"
|
19
|
+
#include "absl/types/optional.h"
|
20
|
+
#include "absl/types/span.h"
|
10
21
|
|
11
22
|
namespace absl {
|
12
23
|
ABSL_NAMESPACE_BEGIN
|
@@ -14,13 +25,901 @@ namespace str_format_internal {
|
|
14
25
|
|
15
26
|
namespace {
|
16
27
|
|
17
|
-
|
28
|
+
// The code below wants to avoid heap allocations.
|
29
|
+
// To do so it needs to allocate memory on the stack.
|
30
|
+
// `StackArray` will allocate memory on the stack in the form of a uint32_t
|
31
|
+
// array and call the provided callback with said memory.
|
32
|
+
// It will allocate memory in increments of 512 bytes. We could allocate the
|
33
|
+
// largest needed unconditionally, but that is more than we need in most of
|
34
|
+
// cases. This way we use less stack in the common cases.
|
35
|
+
class StackArray {
|
36
|
+
using Func = absl::FunctionRef<void(absl::Span<uint32_t>)>;
|
37
|
+
static constexpr size_t kStep = 512 / sizeof(uint32_t);
|
38
|
+
// 5 steps is 2560 bytes, which is enough to hold a long double with the
|
39
|
+
// largest/smallest exponents.
|
40
|
+
// The operations below will static_assert their particular maximum.
|
41
|
+
static constexpr size_t kNumSteps = 5;
|
42
|
+
|
43
|
+
// We do not want this function to be inlined.
|
44
|
+
// Otherwise the caller will allocate the stack space unnecessarily for all
|
45
|
+
// the variants even though it only calls one.
|
46
|
+
template <size_t steps>
|
47
|
+
ABSL_ATTRIBUTE_NOINLINE static void RunWithCapacityImpl(Func f) {
|
48
|
+
uint32_t values[steps * kStep]{};
|
49
|
+
f(absl::MakeSpan(values));
|
50
|
+
}
|
51
|
+
|
52
|
+
public:
|
53
|
+
static constexpr size_t kMaxCapacity = kStep * kNumSteps;
|
54
|
+
|
55
|
+
static void RunWithCapacity(size_t capacity, Func f) {
|
56
|
+
assert(capacity <= kMaxCapacity);
|
57
|
+
const size_t step = (capacity + kStep - 1) / kStep;
|
58
|
+
assert(step <= kNumSteps);
|
59
|
+
switch (step) {
|
60
|
+
case 1:
|
61
|
+
return RunWithCapacityImpl<1>(f);
|
62
|
+
case 2:
|
63
|
+
return RunWithCapacityImpl<2>(f);
|
64
|
+
case 3:
|
65
|
+
return RunWithCapacityImpl<3>(f);
|
66
|
+
case 4:
|
67
|
+
return RunWithCapacityImpl<4>(f);
|
68
|
+
case 5:
|
69
|
+
return RunWithCapacityImpl<5>(f);
|
70
|
+
}
|
71
|
+
|
72
|
+
assert(false && "Invalid capacity");
|
73
|
+
}
|
74
|
+
};
|
75
|
+
|
76
|
+
// Calculates `10 * (*v) + carry` and stores the result in `*v` and returns
|
77
|
+
// the carry.
|
78
|
+
template <typename Int>
|
79
|
+
inline Int MultiplyBy10WithCarry(Int *v, Int carry) {
|
80
|
+
using BiggerInt = absl::conditional_t<sizeof(Int) == 4, uint64_t, uint128>;
|
81
|
+
BiggerInt tmp = 10 * static_cast<BiggerInt>(*v) + carry;
|
82
|
+
*v = static_cast<Int>(tmp);
|
83
|
+
return static_cast<Int>(tmp >> (sizeof(Int) * 8));
|
84
|
+
}
|
85
|
+
|
86
|
+
// Calculates `(2^64 * carry + *v) / 10`.
|
87
|
+
// Stores the quotient in `*v` and returns the remainder.
|
88
|
+
// Requires: `0 <= carry <= 9`
|
89
|
+
inline uint64_t DivideBy10WithCarry(uint64_t *v, uint64_t carry) {
|
90
|
+
constexpr uint64_t divisor = 10;
|
91
|
+
// 2^64 / divisor = chunk_quotient + chunk_remainder / divisor
|
92
|
+
constexpr uint64_t chunk_quotient = (uint64_t{1} << 63) / (divisor / 2);
|
93
|
+
constexpr uint64_t chunk_remainder = uint64_t{} - chunk_quotient * divisor;
|
94
|
+
|
95
|
+
const uint64_t mod = *v % divisor;
|
96
|
+
const uint64_t next_carry = chunk_remainder * carry + mod;
|
97
|
+
*v = *v / divisor + carry * chunk_quotient + next_carry / divisor;
|
98
|
+
return next_carry % divisor;
|
99
|
+
}
|
100
|
+
|
101
|
+
// Generates the decimal representation for an integer of the form `v * 2^exp`,
|
102
|
+
// where `v` and `exp` are both positive integers.
|
103
|
+
// It generates the digits from the left (ie the most significant digit first)
|
104
|
+
// to allow for direct printing into the sink.
|
105
|
+
//
|
106
|
+
// Requires `0 <= exp` and `exp <= numeric_limits<long double>::max_exponent`.
|
107
|
+
class BinaryToDecimal {
|
108
|
+
static constexpr int ChunksNeeded(int exp) {
|
109
|
+
// We will left shift a uint128 by `exp` bits, so we need `128+exp` total
|
110
|
+
// bits. Round up to 32.
|
111
|
+
// See constructor for details about adding `10%` to the value.
|
112
|
+
return (128 + exp + 31) / 32 * 11 / 10;
|
113
|
+
}
|
114
|
+
|
115
|
+
public:
|
116
|
+
// Run the conversion for `v * 2^exp` and call `f(binary_to_decimal)`.
|
117
|
+
// This function will allocate enough stack space to perform the conversion.
|
118
|
+
static void RunConversion(uint128 v, int exp,
|
119
|
+
absl::FunctionRef<void(BinaryToDecimal)> f) {
|
120
|
+
assert(exp > 0);
|
121
|
+
assert(exp <= std::numeric_limits<long double>::max_exponent);
|
122
|
+
static_assert(
|
123
|
+
StackArray::kMaxCapacity >=
|
124
|
+
ChunksNeeded(std::numeric_limits<long double>::max_exponent),
|
125
|
+
"");
|
126
|
+
|
127
|
+
StackArray::RunWithCapacity(
|
128
|
+
ChunksNeeded(exp),
|
129
|
+
[=](absl::Span<uint32_t> input) { f(BinaryToDecimal(input, v, exp)); });
|
130
|
+
}
|
131
|
+
|
132
|
+
int TotalDigits() const {
|
133
|
+
return static_cast<int>((decimal_end_ - decimal_start_) * kDigitsPerChunk +
|
134
|
+
CurrentDigits().size());
|
135
|
+
}
|
136
|
+
|
137
|
+
// See the current block of digits.
|
138
|
+
absl::string_view CurrentDigits() const {
|
139
|
+
return absl::string_view(digits_ + kDigitsPerChunk - size_, size_);
|
140
|
+
}
|
141
|
+
|
142
|
+
// Advance the current view of digits.
|
143
|
+
// Returns `false` when no more digits are available.
|
144
|
+
bool AdvanceDigits() {
|
145
|
+
if (decimal_start_ >= decimal_end_) return false;
|
146
|
+
|
147
|
+
uint32_t w = data_[decimal_start_++];
|
148
|
+
for (size_ = 0; size_ < kDigitsPerChunk; w /= 10) {
|
149
|
+
digits_[kDigitsPerChunk - ++size_] = w % 10 + '0';
|
150
|
+
}
|
151
|
+
return true;
|
152
|
+
}
|
153
|
+
|
154
|
+
private:
|
155
|
+
BinaryToDecimal(absl::Span<uint32_t> data, uint128 v, int exp) : data_(data) {
|
156
|
+
// We need to print the digits directly into the sink object without
|
157
|
+
// buffering them all first. To do this we need two things:
|
158
|
+
// - to know the total number of digits to do padding when necessary
|
159
|
+
// - to generate the decimal digits from the left.
|
160
|
+
//
|
161
|
+
// In order to do this, we do a two pass conversion.
|
162
|
+
// On the first pass we convert the binary representation of the value into
|
163
|
+
// a decimal representation in which each uint32_t chunk holds up to 9
|
164
|
+
// decimal digits. In the second pass we take each decimal-holding-uint32_t
|
165
|
+
// value and generate the ascii decimal digits into `digits_`.
|
166
|
+
//
|
167
|
+
// The binary and decimal representations actually share the same memory
|
168
|
+
// region. As we go converting the chunks from binary to decimal we free
|
169
|
+
// them up and reuse them for the decimal representation. One caveat is that
|
170
|
+
// the decimal representation is around 7% less efficient in space than the
|
171
|
+
// binary one. We allocate an extra 10% memory to account for this. See
|
172
|
+
// ChunksNeeded for this calculation.
|
173
|
+
int chunk_index = exp / 32;
|
174
|
+
decimal_start_ = decimal_end_ = ChunksNeeded(exp);
|
175
|
+
const int offset = exp % 32;
|
176
|
+
// Left shift v by exp bits.
|
177
|
+
data_[chunk_index] = static_cast<uint32_t>(v << offset);
|
178
|
+
for (v >>= (32 - offset); v; v >>= 32)
|
179
|
+
data_[++chunk_index] = static_cast<uint32_t>(v);
|
180
|
+
|
181
|
+
while (chunk_index >= 0) {
|
182
|
+
// While we have more than one chunk available, go in steps of 1e9.
|
183
|
+
// `data_[chunk_index]` holds the highest non-zero binary chunk, so keep
|
184
|
+
// the variable updated.
|
185
|
+
uint32_t carry = 0;
|
186
|
+
for (int i = chunk_index; i >= 0; --i) {
|
187
|
+
uint64_t tmp = uint64_t{data_[i]} + (uint64_t{carry} << 32);
|
188
|
+
data_[i] = static_cast<uint32_t>(tmp / uint64_t{1000000000});
|
189
|
+
carry = static_cast<uint32_t>(tmp % uint64_t{1000000000});
|
190
|
+
}
|
191
|
+
|
192
|
+
// If the highest chunk is now empty, remove it from view.
|
193
|
+
if (data_[chunk_index] == 0) --chunk_index;
|
194
|
+
|
195
|
+
--decimal_start_;
|
196
|
+
assert(decimal_start_ != chunk_index);
|
197
|
+
data_[decimal_start_] = carry;
|
198
|
+
}
|
199
|
+
|
200
|
+
// Fill the first set of digits. The first chunk might not be complete, so
|
201
|
+
// handle differently.
|
202
|
+
for (uint32_t first = data_[decimal_start_++]; first != 0; first /= 10) {
|
203
|
+
digits_[kDigitsPerChunk - ++size_] = first % 10 + '0';
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
private:
|
208
|
+
static constexpr int kDigitsPerChunk = 9;
|
209
|
+
|
210
|
+
int decimal_start_;
|
211
|
+
int decimal_end_;
|
212
|
+
|
213
|
+
char digits_[kDigitsPerChunk];
|
214
|
+
int size_ = 0;
|
215
|
+
|
216
|
+
absl::Span<uint32_t> data_;
|
217
|
+
};
|
218
|
+
|
219
|
+
// Converts a value of the form `x * 2^-exp` into a sequence of decimal digits.
|
220
|
+
// Requires `-exp < 0` and
|
221
|
+
// `-exp >= limits<long double>::min_exponent - limits<long double>::digits`.
|
222
|
+
class FractionalDigitGenerator {
|
223
|
+
public:
|
224
|
+
// Run the conversion for `v * 2^exp` and call `f(generator)`.
|
225
|
+
// This function will allocate enough stack space to perform the conversion.
|
226
|
+
static void RunConversion(
|
227
|
+
uint128 v, int exp, absl::FunctionRef<void(FractionalDigitGenerator)> f) {
|
228
|
+
using Limits = std::numeric_limits<long double>;
|
229
|
+
assert(-exp < 0);
|
230
|
+
assert(-exp >= Limits::min_exponent - 128);
|
231
|
+
static_assert(StackArray::kMaxCapacity >=
|
232
|
+
(Limits::digits + 128 - Limits::min_exponent + 31) / 32,
|
233
|
+
"");
|
234
|
+
StackArray::RunWithCapacity((Limits::digits + exp + 31) / 32,
|
235
|
+
[=](absl::Span<uint32_t> input) {
|
236
|
+
f(FractionalDigitGenerator(input, v, exp));
|
237
|
+
});
|
238
|
+
}
|
239
|
+
|
240
|
+
// Returns true if there are any more non-zero digits left.
|
241
|
+
bool HasMoreDigits() const { return next_digit_ != 0 || chunk_index_ >= 0; }
|
242
|
+
|
243
|
+
// Returns true if the remainder digits are greater than 5000...
|
244
|
+
bool IsGreaterThanHalf() const {
|
245
|
+
return next_digit_ > 5 || (next_digit_ == 5 && chunk_index_ >= 0);
|
246
|
+
}
|
247
|
+
// Returns true if the remainder digits are exactly 5000...
|
248
|
+
bool IsExactlyHalf() const { return next_digit_ == 5 && chunk_index_ < 0; }
|
249
|
+
|
250
|
+
struct Digits {
|
251
|
+
int digit_before_nine;
|
252
|
+
int num_nines;
|
253
|
+
};
|
254
|
+
|
255
|
+
// Get the next set of digits.
|
256
|
+
// They are composed by a non-9 digit followed by a runs of zero or more 9s.
|
257
|
+
Digits GetDigits() {
|
258
|
+
Digits digits{next_digit_, 0};
|
259
|
+
|
260
|
+
next_digit_ = GetOneDigit();
|
261
|
+
while (next_digit_ == 9) {
|
262
|
+
++digits.num_nines;
|
263
|
+
next_digit_ = GetOneDigit();
|
264
|
+
}
|
265
|
+
|
266
|
+
return digits;
|
267
|
+
}
|
268
|
+
|
269
|
+
private:
|
270
|
+
// Return the next digit.
|
271
|
+
int GetOneDigit() {
|
272
|
+
if (chunk_index_ < 0) return 0;
|
273
|
+
|
274
|
+
uint32_t carry = 0;
|
275
|
+
for (int i = chunk_index_; i >= 0; --i) {
|
276
|
+
carry = MultiplyBy10WithCarry(&data_[i], carry);
|
277
|
+
}
|
278
|
+
// If the lowest chunk is now empty, remove it from view.
|
279
|
+
if (data_[chunk_index_] == 0) --chunk_index_;
|
280
|
+
return carry;
|
281
|
+
}
|
282
|
+
|
283
|
+
FractionalDigitGenerator(absl::Span<uint32_t> data, uint128 v, int exp)
|
284
|
+
: chunk_index_(exp / 32), data_(data) {
|
285
|
+
const int offset = exp % 32;
|
286
|
+
// Right shift `v` by `exp` bits.
|
287
|
+
data_[chunk_index_] = static_cast<uint32_t>(v << (32 - offset));
|
288
|
+
v >>= offset;
|
289
|
+
// Make sure we don't overflow the data. We already calculated that
|
290
|
+
// non-zero bits fit, so we might not have space for leading zero bits.
|
291
|
+
for (int pos = chunk_index_; v; v >>= 32)
|
292
|
+
data_[--pos] = static_cast<uint32_t>(v);
|
293
|
+
|
294
|
+
// Fill next_digit_, as GetDigits expects it to be populated always.
|
295
|
+
next_digit_ = GetOneDigit();
|
296
|
+
}
|
297
|
+
|
298
|
+
int next_digit_;
|
299
|
+
int chunk_index_;
|
300
|
+
absl::Span<uint32_t> data_;
|
301
|
+
};
|
302
|
+
|
303
|
+
// Count the number of leading zero bits.
|
304
|
+
int LeadingZeros(uint64_t v) { return base_internal::CountLeadingZeros64(v); }
|
305
|
+
int LeadingZeros(uint128 v) {
|
306
|
+
auto high = static_cast<uint64_t>(v >> 64);
|
307
|
+
auto low = static_cast<uint64_t>(v);
|
308
|
+
return high != 0 ? base_internal::CountLeadingZeros64(high)
|
309
|
+
: 64 + base_internal::CountLeadingZeros64(low);
|
310
|
+
}
|
311
|
+
|
312
|
+
// Round up the text digits starting at `p`.
|
313
|
+
// The buffer must have an extra digit that is known to not need rounding.
|
314
|
+
// This is done below by having an extra '0' digit on the left.
|
315
|
+
void RoundUp(char *p) {
|
316
|
+
while (*p == '9' || *p == '.') {
|
317
|
+
if (*p == '9') *p = '0';
|
318
|
+
--p;
|
319
|
+
}
|
320
|
+
++*p;
|
321
|
+
}
|
322
|
+
|
323
|
+
// Check the previous digit and round up or down to follow the round-to-even
|
324
|
+
// policy.
|
325
|
+
void RoundToEven(char *p) {
|
326
|
+
if (*p == '.') --p;
|
327
|
+
if (*p % 2 == 1) RoundUp(p);
|
328
|
+
}
|
329
|
+
|
330
|
+
// Simple integral decimal digit printing for values that fit in 64-bits.
|
331
|
+
// Returns the pointer to the last written digit.
|
332
|
+
char *PrintIntegralDigitsFromRightFast(uint64_t v, char *p) {
|
333
|
+
do {
|
334
|
+
*--p = DivideBy10WithCarry(&v, 0) + '0';
|
335
|
+
} while (v != 0);
|
336
|
+
return p;
|
337
|
+
}
|
338
|
+
|
339
|
+
// Simple integral decimal digit printing for values that fit in 128-bits.
|
340
|
+
// Returns the pointer to the last written digit.
|
341
|
+
char *PrintIntegralDigitsFromRightFast(uint128 v, char *p) {
|
342
|
+
auto high = static_cast<uint64_t>(v >> 64);
|
343
|
+
auto low = static_cast<uint64_t>(v);
|
344
|
+
|
345
|
+
while (high != 0) {
|
346
|
+
uint64_t carry = DivideBy10WithCarry(&high, 0);
|
347
|
+
carry = DivideBy10WithCarry(&low, carry);
|
348
|
+
*--p = carry + '0';
|
349
|
+
}
|
350
|
+
return PrintIntegralDigitsFromRightFast(low, p);
|
351
|
+
}
|
352
|
+
|
353
|
+
// Simple fractional decimal digit printing for values that fir in 64-bits after
|
354
|
+
// shifting.
|
355
|
+
// Performs rounding if necessary to fit within `precision`.
|
356
|
+
// Returns the pointer to one after the last character written.
|
357
|
+
char *PrintFractionalDigitsFast(uint64_t v, char *start, int exp,
|
358
|
+
int precision) {
|
359
|
+
char *p = start;
|
360
|
+
v <<= (64 - exp);
|
361
|
+
while (precision > 0) {
|
362
|
+
if (!v) return p;
|
363
|
+
*p++ = MultiplyBy10WithCarry(&v, uint64_t{0}) + '0';
|
364
|
+
--precision;
|
365
|
+
}
|
366
|
+
|
367
|
+
// We need to round.
|
368
|
+
if (v < 0x8000000000000000) {
|
369
|
+
// We round down, so nothing to do.
|
370
|
+
} else if (v > 0x8000000000000000) {
|
371
|
+
// We round up.
|
372
|
+
RoundUp(p - 1);
|
373
|
+
} else {
|
374
|
+
RoundToEven(p - 1);
|
375
|
+
}
|
376
|
+
|
377
|
+
assert(precision == 0);
|
378
|
+
// Precision can only be zero here.
|
379
|
+
return p;
|
380
|
+
}
|
381
|
+
|
382
|
+
// Simple fractional decimal digit printing for values that fir in 128-bits
|
383
|
+
// after shifting.
|
384
|
+
// Performs rounding if necessary to fit within `precision`.
|
385
|
+
// Returns the pointer to one after the last character written.
|
386
|
+
char *PrintFractionalDigitsFast(uint128 v, char *start, int exp,
|
387
|
+
int precision) {
|
388
|
+
char *p = start;
|
389
|
+
v <<= (128 - exp);
|
390
|
+
auto high = static_cast<uint64_t>(v >> 64);
|
391
|
+
auto low = static_cast<uint64_t>(v);
|
392
|
+
|
393
|
+
// While we have digits to print and `low` is not empty, do the long
|
394
|
+
// multiplication.
|
395
|
+
while (precision > 0 && low != 0) {
|
396
|
+
uint64_t carry = MultiplyBy10WithCarry(&low, uint64_t{0});
|
397
|
+
carry = MultiplyBy10WithCarry(&high, carry);
|
398
|
+
|
399
|
+
*p++ = carry + '0';
|
400
|
+
--precision;
|
401
|
+
}
|
402
|
+
|
403
|
+
// Now `low` is empty, so use a faster approach for the rest of the digits.
|
404
|
+
// This block is pretty much the same as the main loop for the 64-bit case
|
405
|
+
// above.
|
406
|
+
while (precision > 0) {
|
407
|
+
if (!high) return p;
|
408
|
+
*p++ = MultiplyBy10WithCarry(&high, uint64_t{0}) + '0';
|
409
|
+
--precision;
|
410
|
+
}
|
411
|
+
|
412
|
+
// We need to round.
|
413
|
+
if (high < 0x8000000000000000) {
|
414
|
+
// We round down, so nothing to do.
|
415
|
+
} else if (high > 0x8000000000000000 || low != 0) {
|
416
|
+
// We round up.
|
417
|
+
RoundUp(p - 1);
|
418
|
+
} else {
|
419
|
+
RoundToEven(p - 1);
|
420
|
+
}
|
421
|
+
|
422
|
+
assert(precision == 0);
|
423
|
+
// Precision can only be zero here.
|
424
|
+
return p;
|
425
|
+
}
|
426
|
+
|
427
|
+
struct FormatState {
|
428
|
+
char sign_char;
|
429
|
+
int precision;
|
430
|
+
const FormatConversionSpecImpl &conv;
|
431
|
+
FormatSinkImpl *sink;
|
432
|
+
|
433
|
+
// In `alt` mode (flag #) we keep the `.` even if there are no fractional
|
434
|
+
// digits. In non-alt mode, we strip it.
|
435
|
+
bool ShouldPrintDot() const { return precision != 0 || conv.has_alt_flag(); }
|
436
|
+
};
|
437
|
+
|
438
|
+
struct Padding {
|
439
|
+
int left_spaces;
|
440
|
+
int zeros;
|
441
|
+
int right_spaces;
|
442
|
+
};
|
443
|
+
|
444
|
+
Padding ExtraWidthToPadding(size_t total_size, const FormatState &state) {
|
445
|
+
if (state.conv.width() < 0 ||
|
446
|
+
static_cast<size_t>(state.conv.width()) <= total_size) {
|
447
|
+
return {0, 0, 0};
|
448
|
+
}
|
449
|
+
int missing_chars = state.conv.width() - total_size;
|
450
|
+
if (state.conv.has_left_flag()) {
|
451
|
+
return {0, 0, missing_chars};
|
452
|
+
} else if (state.conv.has_zero_flag()) {
|
453
|
+
return {0, missing_chars, 0};
|
454
|
+
} else {
|
455
|
+
return {missing_chars, 0, 0};
|
456
|
+
}
|
457
|
+
}
|
458
|
+
|
459
|
+
void FinalPrint(const FormatState &state, absl::string_view data,
|
460
|
+
int padding_offset, int trailing_zeros,
|
461
|
+
absl::string_view data_postfix) {
|
462
|
+
if (state.conv.width() < 0) {
|
463
|
+
// No width specified. Fast-path.
|
464
|
+
if (state.sign_char != '\0') state.sink->Append(1, state.sign_char);
|
465
|
+
state.sink->Append(data);
|
466
|
+
state.sink->Append(trailing_zeros, '0');
|
467
|
+
state.sink->Append(data_postfix);
|
468
|
+
return;
|
469
|
+
}
|
470
|
+
|
471
|
+
auto padding = ExtraWidthToPadding((state.sign_char != '\0' ? 1 : 0) +
|
472
|
+
data.size() + data_postfix.size() +
|
473
|
+
static_cast<size_t>(trailing_zeros),
|
474
|
+
state);
|
475
|
+
|
476
|
+
state.sink->Append(padding.left_spaces, ' ');
|
477
|
+
if (state.sign_char != '\0') state.sink->Append(1, state.sign_char);
|
478
|
+
// Padding in general needs to be inserted somewhere in the middle of `data`.
|
479
|
+
state.sink->Append(data.substr(0, padding_offset));
|
480
|
+
state.sink->Append(padding.zeros, '0');
|
481
|
+
state.sink->Append(data.substr(padding_offset));
|
482
|
+
state.sink->Append(trailing_zeros, '0');
|
483
|
+
state.sink->Append(data_postfix);
|
484
|
+
state.sink->Append(padding.right_spaces, ' ');
|
485
|
+
}
|
486
|
+
|
487
|
+
// Fastpath %f formatter for when the shifted value fits in a simple integral
|
488
|
+
// type.
|
489
|
+
// Prints `v*2^exp` with the options from `state`.
|
490
|
+
template <typename Int>
|
491
|
+
void FormatFFast(Int v, int exp, const FormatState &state) {
|
492
|
+
constexpr int input_bits = sizeof(Int) * 8;
|
493
|
+
|
494
|
+
static constexpr size_t integral_size =
|
495
|
+
/* in case we need to round up an extra digit */ 1 +
|
496
|
+
/* decimal digits for uint128 */ 40 + 1;
|
497
|
+
char buffer[integral_size + /* . */ 1 + /* max digits uint128 */ 128];
|
498
|
+
buffer[integral_size] = '.';
|
499
|
+
char *const integral_digits_end = buffer + integral_size;
|
500
|
+
char *integral_digits_start;
|
501
|
+
char *const fractional_digits_start = buffer + integral_size + 1;
|
502
|
+
char *fractional_digits_end = fractional_digits_start;
|
503
|
+
|
504
|
+
if (exp >= 0) {
|
505
|
+
const int total_bits = input_bits - LeadingZeros(v) + exp;
|
506
|
+
integral_digits_start =
|
507
|
+
total_bits <= 64
|
508
|
+
? PrintIntegralDigitsFromRightFast(static_cast<uint64_t>(v) << exp,
|
509
|
+
integral_digits_end)
|
510
|
+
: PrintIntegralDigitsFromRightFast(static_cast<uint128>(v) << exp,
|
511
|
+
integral_digits_end);
|
512
|
+
} else {
|
513
|
+
exp = -exp;
|
514
|
+
|
515
|
+
integral_digits_start = PrintIntegralDigitsFromRightFast(
|
516
|
+
exp < input_bits ? v >> exp : 0, integral_digits_end);
|
517
|
+
// PrintFractionalDigits may pull a carried 1 all the way up through the
|
518
|
+
// integral portion.
|
519
|
+
integral_digits_start[-1] = '0';
|
520
|
+
|
521
|
+
fractional_digits_end =
|
522
|
+
exp <= 64 ? PrintFractionalDigitsFast(v, fractional_digits_start, exp,
|
523
|
+
state.precision)
|
524
|
+
: PrintFractionalDigitsFast(static_cast<uint128>(v),
|
525
|
+
fractional_digits_start, exp,
|
526
|
+
state.precision);
|
527
|
+
// There was a carry, so include the first digit too.
|
528
|
+
if (integral_digits_start[-1] != '0') --integral_digits_start;
|
529
|
+
}
|
530
|
+
|
531
|
+
size_t size = fractional_digits_end - integral_digits_start;
|
532
|
+
|
533
|
+
// In `alt` mode (flag #) we keep the `.` even if there are no fractional
|
534
|
+
// digits. In non-alt mode, we strip it.
|
535
|
+
if (!state.ShouldPrintDot()) --size;
|
536
|
+
FinalPrint(state, absl::string_view(integral_digits_start, size),
|
537
|
+
/*padding_offset=*/0,
|
538
|
+
static_cast<int>(state.precision - (fractional_digits_end -
|
539
|
+
fractional_digits_start)),
|
540
|
+
/*data_postfix=*/"");
|
541
|
+
}
|
542
|
+
|
543
|
+
// Slow %f formatter for when the shifted value does not fit in a uint128, and
|
544
|
+
// `exp > 0`.
|
545
|
+
// Prints `v*2^exp` with the options from `state`.
|
546
|
+
// This one is guaranteed to not have fractional digits, so we don't have to
|
547
|
+
// worry about anything after the `.`.
|
548
|
+
void FormatFPositiveExpSlow(uint128 v, int exp, const FormatState &state) {
|
549
|
+
BinaryToDecimal::RunConversion(v, exp, [&](BinaryToDecimal btd) {
|
550
|
+
const size_t total_digits =
|
551
|
+
btd.TotalDigits() +
|
552
|
+
(state.ShouldPrintDot() ? static_cast<size_t>(state.precision) + 1 : 0);
|
553
|
+
|
554
|
+
const auto padding = ExtraWidthToPadding(
|
555
|
+
total_digits + (state.sign_char != '\0' ? 1 : 0), state);
|
556
|
+
|
557
|
+
state.sink->Append(padding.left_spaces, ' ');
|
558
|
+
if (state.sign_char != '\0') state.sink->Append(1, state.sign_char);
|
559
|
+
state.sink->Append(padding.zeros, '0');
|
560
|
+
|
561
|
+
do {
|
562
|
+
state.sink->Append(btd.CurrentDigits());
|
563
|
+
} while (btd.AdvanceDigits());
|
564
|
+
|
565
|
+
if (state.ShouldPrintDot()) state.sink->Append(1, '.');
|
566
|
+
state.sink->Append(state.precision, '0');
|
567
|
+
state.sink->Append(padding.right_spaces, ' ');
|
568
|
+
});
|
569
|
+
}
|
570
|
+
|
571
|
+
// Slow %f formatter for when the shifted value does not fit in a uint128, and
|
572
|
+
// `exp < 0`.
|
573
|
+
// Prints `v*2^exp` with the options from `state`.
|
574
|
+
// This one is guaranteed to be < 1.0, so we don't have to worry about integral
|
575
|
+
// digits.
|
576
|
+
void FormatFNegativeExpSlow(uint128 v, int exp, const FormatState &state) {
|
577
|
+
const size_t total_digits =
|
578
|
+
/* 0 */ 1 +
|
579
|
+
(state.ShouldPrintDot() ? static_cast<size_t>(state.precision) + 1 : 0);
|
580
|
+
auto padding =
|
581
|
+
ExtraWidthToPadding(total_digits + (state.sign_char ? 1 : 0), state);
|
582
|
+
padding.zeros += 1;
|
583
|
+
state.sink->Append(padding.left_spaces, ' ');
|
584
|
+
if (state.sign_char != '\0') state.sink->Append(1, state.sign_char);
|
585
|
+
state.sink->Append(padding.zeros, '0');
|
586
|
+
|
587
|
+
if (state.ShouldPrintDot()) state.sink->Append(1, '.');
|
588
|
+
|
589
|
+
// Print digits
|
590
|
+
int digits_to_go = state.precision;
|
591
|
+
|
592
|
+
FractionalDigitGenerator::RunConversion(
|
593
|
+
v, exp, [&](FractionalDigitGenerator digit_gen) {
|
594
|
+
// There are no digits to print here.
|
595
|
+
if (state.precision == 0) return;
|
596
|
+
|
597
|
+
// We go one digit at a time, while keeping track of runs of nines.
|
598
|
+
// The runs of nines are used to perform rounding when necessary.
|
599
|
+
|
600
|
+
while (digits_to_go > 0 && digit_gen.HasMoreDigits()) {
|
601
|
+
auto digits = digit_gen.GetDigits();
|
602
|
+
|
603
|
+
// Now we have a digit and a run of nines.
|
604
|
+
// See if we can print them all.
|
605
|
+
if (digits.num_nines + 1 < digits_to_go) {
|
606
|
+
// We don't have to round yet, so print them.
|
607
|
+
state.sink->Append(1, digits.digit_before_nine + '0');
|
608
|
+
state.sink->Append(digits.num_nines, '9');
|
609
|
+
digits_to_go -= digits.num_nines + 1;
|
610
|
+
|
611
|
+
} else {
|
612
|
+
// We can't print all the nines, see where we have to truncate.
|
613
|
+
|
614
|
+
bool round_up = false;
|
615
|
+
if (digits.num_nines + 1 > digits_to_go) {
|
616
|
+
// We round up at a nine. No need to print them.
|
617
|
+
round_up = true;
|
618
|
+
} else {
|
619
|
+
// We can fit all the nines, but truncate just after it.
|
620
|
+
if (digit_gen.IsGreaterThanHalf()) {
|
621
|
+
round_up = true;
|
622
|
+
} else if (digit_gen.IsExactlyHalf()) {
|
623
|
+
// Round to even
|
624
|
+
round_up =
|
625
|
+
digits.num_nines != 0 || digits.digit_before_nine % 2 == 1;
|
626
|
+
}
|
627
|
+
}
|
628
|
+
|
629
|
+
if (round_up) {
|
630
|
+
state.sink->Append(1, digits.digit_before_nine + '1');
|
631
|
+
--digits_to_go;
|
632
|
+
// The rest will be zeros.
|
633
|
+
} else {
|
634
|
+
state.sink->Append(1, digits.digit_before_nine + '0');
|
635
|
+
state.sink->Append(digits_to_go - 1, '9');
|
636
|
+
digits_to_go = 0;
|
637
|
+
}
|
638
|
+
return;
|
639
|
+
}
|
640
|
+
}
|
641
|
+
});
|
642
|
+
|
643
|
+
state.sink->Append(digits_to_go, '0');
|
644
|
+
state.sink->Append(padding.right_spaces, ' ');
|
645
|
+
}
|
646
|
+
|
647
|
+
template <typename Int>
|
648
|
+
void FormatF(Int mantissa, int exp, const FormatState &state) {
|
649
|
+
if (exp >= 0) {
|
650
|
+
const int total_bits = sizeof(Int) * 8 - LeadingZeros(mantissa) + exp;
|
651
|
+
|
652
|
+
// Fallback to the slow stack-based approach if we can't do it in a 64 or
|
653
|
+
// 128 bit state.
|
654
|
+
if (ABSL_PREDICT_FALSE(total_bits > 128)) {
|
655
|
+
return FormatFPositiveExpSlow(mantissa, exp, state);
|
656
|
+
}
|
657
|
+
} else {
|
658
|
+
// Fallback to the slow stack-based approach if we can't do it in a 64 or
|
659
|
+
// 128 bit state.
|
660
|
+
if (ABSL_PREDICT_FALSE(exp < -128)) {
|
661
|
+
return FormatFNegativeExpSlow(mantissa, -exp, state);
|
662
|
+
}
|
663
|
+
}
|
664
|
+
return FormatFFast(mantissa, exp, state);
|
665
|
+
}
|
666
|
+
|
667
|
+
// Grab the group of four bits (nibble) from `n`. E.g., nibble 1 corresponds to
|
668
|
+
// bits 4-7.
|
669
|
+
template <typename Int>
|
670
|
+
uint8_t GetNibble(Int n, int nibble_index) {
|
671
|
+
constexpr Int mask_low_nibble = Int{0xf};
|
672
|
+
int shift = nibble_index * 4;
|
673
|
+
n &= mask_low_nibble << shift;
|
674
|
+
return static_cast<uint8_t>((n >> shift) & 0xf);
|
675
|
+
}
|
676
|
+
|
677
|
+
// Add one to the given nibble, applying carry to higher nibbles. Returns true
|
678
|
+
// if overflow, false otherwise.
|
679
|
+
template <typename Int>
|
680
|
+
bool IncrementNibble(int nibble_index, Int *n) {
|
681
|
+
constexpr int kShift = sizeof(Int) * 8 - 1;
|
682
|
+
constexpr int kNumNibbles = sizeof(Int) * 8 / 4;
|
683
|
+
Int before = *n >> kShift;
|
684
|
+
// Here we essentially want to take the number 1 and move it into the requsted
|
685
|
+
// nibble, then add it to *n to effectively increment the nibble. However,
|
686
|
+
// ASan will complain if we try to shift the 1 beyond the limits of the Int,
|
687
|
+
// i.e., if the nibble_index is out of range. So therefore we check for this
|
688
|
+
// and if we are out of range we just add 0 which leaves *n unchanged, which
|
689
|
+
// seems like the reasonable thing to do in that case.
|
690
|
+
*n += ((nibble_index >= kNumNibbles) ? 0 : (Int{1} << (nibble_index * 4)));
|
691
|
+
Int after = *n >> kShift;
|
692
|
+
return (before && !after) || (nibble_index >= kNumNibbles);
|
693
|
+
}
|
694
|
+
|
695
|
+
// Return a mask with 1's in the given nibble and all lower nibbles.
|
696
|
+
template <typename Int>
|
697
|
+
Int MaskUpToNibbleInclusive(int nibble_index) {
|
698
|
+
constexpr int kNumNibbles = sizeof(Int) * 8 / 4;
|
699
|
+
static const Int ones = ~Int{0};
|
700
|
+
return ones >> std::max(0, 4 * (kNumNibbles - nibble_index - 1));
|
701
|
+
}
|
702
|
+
|
703
|
+
// Return a mask with 1's below the given nibble.
|
704
|
+
template <typename Int>
|
705
|
+
Int MaskUpToNibbleExclusive(int nibble_index) {
|
706
|
+
return nibble_index <= 0 ? 0 : MaskUpToNibbleInclusive<Int>(nibble_index - 1);
|
707
|
+
}
|
708
|
+
|
709
|
+
template <typename Int>
|
710
|
+
Int MoveToNibble(uint8_t nibble, int nibble_index) {
|
711
|
+
return Int{nibble} << (4 * nibble_index);
|
712
|
+
}
|
713
|
+
|
714
|
+
// Given mantissa size, find optimal # of mantissa bits to put in initial digit.
|
715
|
+
//
|
716
|
+
// In the hex representation we keep a single hex digit to the left of the dot.
|
717
|
+
// However, the question as to how many bits of the mantissa should be put into
|
718
|
+
// that hex digit in theory is arbitrary, but in practice it is optimal to
|
719
|
+
// choose based on the size of the mantissa. E.g., for a `double`, there are 53
|
720
|
+
// mantissa bits, so that means that we should put 1 bit to the left of the dot,
|
721
|
+
// thereby leaving 52 bits to the right, which is evenly divisible by four and
|
722
|
+
// thus all fractional digits represent actual precision. For a `long double`,
|
723
|
+
// on the other hand, there are 64 bits of mantissa, thus we can use all four
|
724
|
+
// bits for the initial hex digit and still have a number left over (60) that is
|
725
|
+
// a multiple of four. Once again, the goal is to have all fractional digits
|
726
|
+
// represent real precision.
|
727
|
+
template <typename Float>
|
728
|
+
constexpr int HexFloatLeadingDigitSizeInBits() {
|
729
|
+
return std::numeric_limits<Float>::digits % 4 > 0
|
730
|
+
? std::numeric_limits<Float>::digits % 4
|
731
|
+
: 4;
|
732
|
+
}
|
733
|
+
|
734
|
+
// This function captures the rounding behavior of glibc for hex float
|
735
|
+
// representations. E.g. when rounding 0x1.ab800000 to a precision of .2
|
736
|
+
// ("%.2a") glibc will round up because it rounds toward the even number (since
|
737
|
+
// 0xb is an odd number, it will round up to 0xc). However, when rounding at a
|
738
|
+
// point that is not followed by 800000..., it disregards the parity and rounds
|
739
|
+
// up if > 8 and rounds down if < 8.
|
740
|
+
template <typename Int>
|
741
|
+
bool HexFloatNeedsRoundUp(Int mantissa, int final_nibble_displayed,
|
742
|
+
uint8_t leading) {
|
743
|
+
// If the last nibble (hex digit) to be displayed is the lowest on in the
|
744
|
+
// mantissa then that means that we don't have any further nibbles to inform
|
745
|
+
// rounding, so don't round.
|
746
|
+
if (final_nibble_displayed <= 0) {
|
747
|
+
return false;
|
748
|
+
}
|
749
|
+
int rounding_nibble_idx = final_nibble_displayed - 1;
|
750
|
+
constexpr int kTotalNibbles = sizeof(Int) * 8 / 4;
|
751
|
+
assert(final_nibble_displayed <= kTotalNibbles);
|
752
|
+
Int mantissa_up_to_rounding_nibble_inclusive =
|
753
|
+
mantissa & MaskUpToNibbleInclusive<Int>(rounding_nibble_idx);
|
754
|
+
Int eight = MoveToNibble<Int>(8, rounding_nibble_idx);
|
755
|
+
if (mantissa_up_to_rounding_nibble_inclusive != eight) {
|
756
|
+
return mantissa_up_to_rounding_nibble_inclusive > eight;
|
757
|
+
}
|
758
|
+
// Nibble in question == 8.
|
759
|
+
uint8_t round_if_odd = (final_nibble_displayed == kTotalNibbles)
|
760
|
+
? leading
|
761
|
+
: GetNibble(mantissa, final_nibble_displayed);
|
762
|
+
return round_if_odd % 2 == 1;
|
763
|
+
}
|
764
|
+
|
765
|
+
// Stores values associated with a Float type needed by the FormatA
|
766
|
+
// implementation in order to avoid templatizing that function by the Float
|
767
|
+
// type.
|
768
|
+
struct HexFloatTypeParams {
|
769
|
+
template <typename Float>
|
770
|
+
explicit HexFloatTypeParams(Float)
|
771
|
+
: min_exponent(std::numeric_limits<Float>::min_exponent - 1),
|
772
|
+
leading_digit_size_bits(HexFloatLeadingDigitSizeInBits<Float>()) {
|
773
|
+
assert(leading_digit_size_bits >= 1 && leading_digit_size_bits <= 4);
|
774
|
+
}
|
775
|
+
|
776
|
+
int min_exponent;
|
777
|
+
int leading_digit_size_bits;
|
778
|
+
};
|
779
|
+
|
780
|
+
// Hex Float Rounding. First check if we need to round; if so, then we do that
|
781
|
+
// by manipulating (incrementing) the mantissa, that way we can later print the
|
782
|
+
// mantissa digits by iterating through them in the same way regardless of
|
783
|
+
// whether a rounding happened.
|
784
|
+
template <typename Int>
|
785
|
+
void FormatARound(bool precision_specified, const FormatState &state,
|
786
|
+
uint8_t *leading, Int *mantissa, int *exp) {
|
787
|
+
constexpr int kTotalNibbles = sizeof(Int) * 8 / 4;
|
788
|
+
// Index of the last nibble that we could display given precision.
|
789
|
+
int final_nibble_displayed =
|
790
|
+
precision_specified ? std::max(0, (kTotalNibbles - state.precision)) : 0;
|
791
|
+
if (HexFloatNeedsRoundUp(*mantissa, final_nibble_displayed, *leading)) {
|
792
|
+
// Need to round up.
|
793
|
+
bool overflow = IncrementNibble(final_nibble_displayed, mantissa);
|
794
|
+
*leading += (overflow ? 1 : 0);
|
795
|
+
if (ABSL_PREDICT_FALSE(*leading > 15)) {
|
796
|
+
// We have overflowed the leading digit. This would mean that we would
|
797
|
+
// need two hex digits to the left of the dot, which is not allowed. So
|
798
|
+
// adjust the mantissa and exponent so that the result is always 1.0eXXX.
|
799
|
+
*leading = 1;
|
800
|
+
*mantissa = 0;
|
801
|
+
*exp += 4;
|
802
|
+
}
|
803
|
+
}
|
804
|
+
// Now that we have handled a possible round-up we can go ahead and zero out
|
805
|
+
// all the nibbles of the mantissa that we won't need.
|
806
|
+
if (precision_specified) {
|
807
|
+
*mantissa &= ~MaskUpToNibbleExclusive<Int>(final_nibble_displayed);
|
808
|
+
}
|
809
|
+
}
|
810
|
+
|
811
|
+
template <typename Int>
|
812
|
+
void FormatANormalize(const HexFloatTypeParams float_traits, uint8_t *leading,
|
813
|
+
Int *mantissa, int *exp) {
|
814
|
+
constexpr int kIntBits = sizeof(Int) * 8;
|
815
|
+
static const Int kHighIntBit = Int{1} << (kIntBits - 1);
|
816
|
+
const int kLeadDigitBitsCount = float_traits.leading_digit_size_bits;
|
817
|
+
// Normalize mantissa so that highest bit set is in MSB position, unless we
|
818
|
+
// get interrupted by the exponent threshold.
|
819
|
+
while (*mantissa && !(*mantissa & kHighIntBit)) {
|
820
|
+
if (ABSL_PREDICT_FALSE(*exp - 1 < float_traits.min_exponent)) {
|
821
|
+
*mantissa >>= (float_traits.min_exponent - *exp);
|
822
|
+
*exp = float_traits.min_exponent;
|
823
|
+
return;
|
824
|
+
}
|
825
|
+
*mantissa <<= 1;
|
826
|
+
--*exp;
|
827
|
+
}
|
828
|
+
// Extract bits for leading digit then shift them away leaving the
|
829
|
+
// fractional part.
|
830
|
+
*leading =
|
831
|
+
static_cast<uint8_t>(*mantissa >> (kIntBits - kLeadDigitBitsCount));
|
832
|
+
*exp -= (*mantissa != 0) ? kLeadDigitBitsCount : *exp;
|
833
|
+
*mantissa <<= kLeadDigitBitsCount;
|
834
|
+
}
|
835
|
+
|
836
|
+
template <typename Int>
|
837
|
+
void FormatA(const HexFloatTypeParams float_traits, Int mantissa, int exp,
|
838
|
+
bool uppercase, const FormatState &state) {
|
839
|
+
// Int properties.
|
840
|
+
constexpr int kIntBits = sizeof(Int) * 8;
|
841
|
+
constexpr int kTotalNibbles = sizeof(Int) * 8 / 4;
|
842
|
+
// Did the user specify a precision explicitly?
|
843
|
+
const bool precision_specified = state.conv.precision() >= 0;
|
844
|
+
|
845
|
+
// ========== Normalize/Denormalize ==========
|
846
|
+
exp += kIntBits; // make all digits fractional digits.
|
847
|
+
// This holds the (up to four) bits of leading digit, i.e., the '1' in the
|
848
|
+
// number 0x1.e6fp+2. It's always > 0 unless number is zero or denormal.
|
849
|
+
uint8_t leading = 0;
|
850
|
+
FormatANormalize(float_traits, &leading, &mantissa, &exp);
|
851
|
+
|
852
|
+
// =============== Rounding ==================
|
853
|
+
// Check if we need to round; if so, then we do that by manipulating
|
854
|
+
// (incrementing) the mantissa before beginning to print characters.
|
855
|
+
FormatARound(precision_specified, state, &leading, &mantissa, &exp);
|
856
|
+
|
857
|
+
// ============= Format Result ===============
|
858
|
+
// This buffer holds the "0x1.ab1de3" portion of "0x1.ab1de3pe+2". Compute the
|
859
|
+
// size with long double which is the largest of the floats.
|
860
|
+
constexpr size_t kBufSizeForHexFloatRepr =
|
861
|
+
2 // 0x
|
862
|
+
+ std::numeric_limits<long double>::digits / 4 // number of hex digits
|
863
|
+
+ 1 // round up
|
864
|
+
+ 1; // "." (dot)
|
865
|
+
char digits_buffer[kBufSizeForHexFloatRepr];
|
866
|
+
char *digits_iter = digits_buffer;
|
867
|
+
const char *const digits =
|
868
|
+
static_cast<const char *>("0123456789ABCDEF0123456789abcdef") +
|
869
|
+
(uppercase ? 0 : 16);
|
870
|
+
|
871
|
+
// =============== Hex Prefix ================
|
872
|
+
*digits_iter++ = '0';
|
873
|
+
*digits_iter++ = uppercase ? 'X' : 'x';
|
874
|
+
|
875
|
+
// ========== Non-Fractional Digit ===========
|
876
|
+
*digits_iter++ = digits[leading];
|
877
|
+
|
878
|
+
// ================== Dot ====================
|
879
|
+
// There are three reasons we might need a dot. Keep in mind that, at this
|
880
|
+
// point, the mantissa holds only the fractional part.
|
881
|
+
if ((precision_specified && state.precision > 0) ||
|
882
|
+
(!precision_specified && mantissa > 0) || state.conv.has_alt_flag()) {
|
883
|
+
*digits_iter++ = '.';
|
884
|
+
}
|
885
|
+
|
886
|
+
// ============ Fractional Digits ============
|
887
|
+
int digits_emitted = 0;
|
888
|
+
while (mantissa > 0) {
|
889
|
+
*digits_iter++ = digits[GetNibble(mantissa, kTotalNibbles - 1)];
|
890
|
+
mantissa <<= 4;
|
891
|
+
++digits_emitted;
|
892
|
+
}
|
893
|
+
int trailing_zeros =
|
894
|
+
precision_specified ? state.precision - digits_emitted : 0;
|
895
|
+
assert(trailing_zeros >= 0);
|
896
|
+
auto digits_result = string_view(digits_buffer, digits_iter - digits_buffer);
|
897
|
+
|
898
|
+
// =============== Exponent ==================
|
899
|
+
constexpr size_t kBufSizeForExpDecRepr =
|
900
|
+
numbers_internal::kFastToBufferSize // requred for FastIntToBuffer
|
901
|
+
+ 1 // 'p' or 'P'
|
902
|
+
+ 1; // '+' or '-'
|
903
|
+
char exp_buffer[kBufSizeForExpDecRepr];
|
904
|
+
exp_buffer[0] = uppercase ? 'P' : 'p';
|
905
|
+
exp_buffer[1] = exp >= 0 ? '+' : '-';
|
906
|
+
numbers_internal::FastIntToBuffer(exp < 0 ? -exp : exp, exp_buffer + 2);
|
907
|
+
|
908
|
+
// ============ Assemble Result ==============
|
909
|
+
FinalPrint(state, //
|
910
|
+
digits_result, // 0xN.NNN...
|
911
|
+
2, // offset in `data` to start padding if needed.
|
912
|
+
trailing_zeros, // num remaining mantissa padding zeros
|
913
|
+
exp_buffer); // exponent
|
914
|
+
}
|
915
|
+
|
916
|
+
char *CopyStringTo(absl::string_view v, char *out) {
|
18
917
|
std::memcpy(out, v.data(), v.size());
|
19
918
|
return out + v.size();
|
20
919
|
}
|
21
920
|
|
22
921
|
template <typename Float>
|
23
|
-
bool FallbackToSnprintf(const Float v, const
|
922
|
+
bool FallbackToSnprintf(const Float v, const FormatConversionSpecImpl &conv,
|
24
923
|
FormatSinkImpl *sink) {
|
25
924
|
int w = conv.width() >= 0 ? conv.width() : 0;
|
26
925
|
int p = conv.precision() >= 0 ? conv.precision() : -1;
|
@@ -33,17 +932,17 @@ bool FallbackToSnprintf(const Float v, const ConversionSpec &conv,
|
|
33
932
|
if (std::is_same<long double, Float>()) {
|
34
933
|
*fp++ = 'L';
|
35
934
|
}
|
36
|
-
*fp++ = FormatConversionCharToChar(conv.
|
935
|
+
*fp++ = FormatConversionCharToChar(conv.conversion_char());
|
37
936
|
*fp = 0;
|
38
937
|
assert(fp < fmt + sizeof(fmt));
|
39
938
|
}
|
40
939
|
std::string space(512, '\0');
|
41
|
-
string_view result;
|
940
|
+
absl::string_view result;
|
42
941
|
while (true) {
|
43
942
|
int n = snprintf(&space[0], space.size(), fmt, w, p, v);
|
44
943
|
if (n < 0) return false;
|
45
944
|
if (static_cast<size_t>(n) < space.size()) {
|
46
|
-
result = string_view(space.data(), n);
|
945
|
+
result = absl::string_view(space.data(), n);
|
47
946
|
break;
|
48
947
|
}
|
49
948
|
space.resize(n + 1);
|
@@ -96,21 +995,24 @@ enum class FormatStyle { Fixed, Precision };
|
|
96
995
|
// Otherwise, return false.
|
97
996
|
template <typename Float>
|
98
997
|
bool ConvertNonNumericFloats(char sign_char, Float v,
|
99
|
-
const
|
998
|
+
const FormatConversionSpecImpl &conv,
|
999
|
+
FormatSinkImpl *sink) {
|
100
1000
|
char text[4], *ptr = text;
|
101
|
-
if (sign_char) *ptr++ = sign_char;
|
1001
|
+
if (sign_char != '\0') *ptr++ = sign_char;
|
102
1002
|
if (std::isnan(v)) {
|
103
|
-
ptr = std::copy_n(
|
104
|
-
|
1003
|
+
ptr = std::copy_n(
|
1004
|
+
FormatConversionCharIsUpper(conv.conversion_char()) ? "NAN" : "nan", 3,
|
1005
|
+
ptr);
|
105
1006
|
} else if (std::isinf(v)) {
|
106
|
-
ptr = std::copy_n(
|
107
|
-
|
1007
|
+
ptr = std::copy_n(
|
1008
|
+
FormatConversionCharIsUpper(conv.conversion_char()) ? "INF" : "inf", 3,
|
1009
|
+
ptr);
|
108
1010
|
} else {
|
109
1011
|
return false;
|
110
1012
|
}
|
111
1013
|
|
112
1014
|
return sink->PutPaddedString(string_view(text, ptr - text), conv.width(), -1,
|
113
|
-
conv.
|
1015
|
+
conv.has_left_flag());
|
114
1016
|
}
|
115
1017
|
|
116
1018
|
// Round up the last digit of the value.
|
@@ -170,7 +1072,12 @@ constexpr bool CanFitMantissa() {
|
|
170
1072
|
|
171
1073
|
template <typename Float>
|
172
1074
|
struct Decomposed {
|
173
|
-
|
1075
|
+
using MantissaType =
|
1076
|
+
absl::conditional_t<std::is_same<long double, Float>::value, uint128,
|
1077
|
+
uint64_t>;
|
1078
|
+
static_assert(std::numeric_limits<Float>::digits <= sizeof(MantissaType) * 8,
|
1079
|
+
"");
|
1080
|
+
MantissaType mantissa;
|
174
1081
|
int exponent;
|
175
1082
|
};
|
176
1083
|
|
@@ -181,7 +1088,8 @@ Decomposed<Float> Decompose(Float v) {
|
|
181
1088
|
Float m = std::frexp(v, &exp);
|
182
1089
|
m = std::ldexp(m, std::numeric_limits<Float>::digits);
|
183
1090
|
exp -= std::numeric_limits<Float>::digits;
|
184
|
-
|
1091
|
+
|
1092
|
+
return {static_cast<typename Decomposed<Float>::MantissaType>(m), exp};
|
185
1093
|
}
|
186
1094
|
|
187
1095
|
// Print 'digits' as decimal.
|
@@ -350,31 +1258,32 @@ bool FloatToBuffer(Decomposed<Float> decomposed, int precision, Buffer *out,
|
|
350
1258
|
return false;
|
351
1259
|
}
|
352
1260
|
|
353
|
-
void WriteBufferToSink(char sign_char, string_view str,
|
354
|
-
const
|
1261
|
+
void WriteBufferToSink(char sign_char, absl::string_view str,
|
1262
|
+
const FormatConversionSpecImpl &conv,
|
1263
|
+
FormatSinkImpl *sink) {
|
355
1264
|
int left_spaces = 0, zeros = 0, right_spaces = 0;
|
356
1265
|
int missing_chars =
|
357
1266
|
conv.width() >= 0 ? std::max(conv.width() - static_cast<int>(str.size()) -
|
358
1267
|
static_cast<int>(sign_char != 0),
|
359
1268
|
0)
|
360
1269
|
: 0;
|
361
|
-
if (conv.
|
1270
|
+
if (conv.has_left_flag()) {
|
362
1271
|
right_spaces = missing_chars;
|
363
|
-
} else if (conv.
|
1272
|
+
} else if (conv.has_zero_flag()) {
|
364
1273
|
zeros = missing_chars;
|
365
1274
|
} else {
|
366
1275
|
left_spaces = missing_chars;
|
367
1276
|
}
|
368
1277
|
|
369
1278
|
sink->Append(left_spaces, ' ');
|
370
|
-
if (sign_char) sink->Append(1, sign_char);
|
1279
|
+
if (sign_char != '\0') sink->Append(1, sign_char);
|
371
1280
|
sink->Append(zeros, '0');
|
372
1281
|
sink->Append(str);
|
373
1282
|
sink->Append(right_spaces, ' ');
|
374
1283
|
}
|
375
1284
|
|
376
1285
|
template <typename Float>
|
377
|
-
bool FloatToSink(const Float v, const
|
1286
|
+
bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
|
378
1287
|
FormatSinkImpl *sink) {
|
379
1288
|
// Print the sign or the sign column.
|
380
1289
|
Float abs_v = v;
|
@@ -382,9 +1291,9 @@ bool FloatToSink(const Float v, const ConversionSpec &conv,
|
|
382
1291
|
if (std::signbit(abs_v)) {
|
383
1292
|
sign_char = '-';
|
384
1293
|
abs_v = -abs_v;
|
385
|
-
} else if (conv.
|
1294
|
+
} else if (conv.has_show_pos_flag()) {
|
386
1295
|
sign_char = '+';
|
387
|
-
} else if (conv.
|
1296
|
+
} else if (conv.has_sign_col_flag()) {
|
388
1297
|
sign_char = ' ';
|
389
1298
|
}
|
390
1299
|
|
@@ -401,89 +1310,92 @@ bool FloatToSink(const Float v, const ConversionSpec &conv,
|
|
401
1310
|
|
402
1311
|
Buffer buffer;
|
403
1312
|
|
404
|
-
|
405
|
-
case ConversionChar::f:
|
406
|
-
case ConversionChar::F:
|
407
|
-
if (!FloatToBuffer<FormatStyle::Fixed>(decomposed, precision, &buffer,
|
408
|
-
nullptr)) {
|
409
|
-
return FallbackToSnprintf(v, conv, sink);
|
410
|
-
}
|
411
|
-
if (!conv.flags().alt && buffer.back() == '.') buffer.pop_back();
|
412
|
-
break;
|
413
|
-
|
414
|
-
case ConversionChar::e:
|
415
|
-
case ConversionChar::E:
|
416
|
-
if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
|
417
|
-
&exp)) {
|
418
|
-
return FallbackToSnprintf(v, conv, sink);
|
419
|
-
}
|
420
|
-
if (!conv.flags().alt && buffer.back() == '.') buffer.pop_back();
|
421
|
-
PrintExponent(exp, FormatConversionCharIsUpper(conv.conv()) ? 'E' : 'e',
|
422
|
-
&buffer);
|
423
|
-
break;
|
424
|
-
|
425
|
-
case ConversionChar::g:
|
426
|
-
case ConversionChar::G:
|
427
|
-
precision = std::max(0, precision - 1);
|
428
|
-
if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
|
429
|
-
&exp)) {
|
430
|
-
return FallbackToSnprintf(v, conv, sink);
|
431
|
-
}
|
432
|
-
if (precision + 1 > exp && exp >= -4) {
|
433
|
-
if (exp < 0) {
|
434
|
-
// Have 1.23456, needs 0.00123456
|
435
|
-
// Move the first digit
|
436
|
-
buffer.begin[1] = *buffer.begin;
|
437
|
-
// Add some zeros
|
438
|
-
for (; exp < -1; ++exp) *buffer.begin-- = '0';
|
439
|
-
*buffer.begin-- = '.';
|
440
|
-
*buffer.begin = '0';
|
441
|
-
} else if (exp > 0) {
|
442
|
-
// Have 1.23456, needs 1234.56
|
443
|
-
// Move the '.' exp positions to the right.
|
444
|
-
std::rotate(buffer.begin + 1, buffer.begin + 2,
|
445
|
-
buffer.begin + exp + 2);
|
446
|
-
}
|
447
|
-
exp = 0;
|
448
|
-
}
|
449
|
-
if (!conv.flags().alt) {
|
450
|
-
while (buffer.back() == '0') buffer.pop_back();
|
451
|
-
if (buffer.back() == '.') buffer.pop_back();
|
452
|
-
}
|
453
|
-
if (exp) {
|
454
|
-
PrintExponent(exp, FormatConversionCharIsUpper(conv.conv()) ? 'E' : 'e',
|
455
|
-
&buffer);
|
456
|
-
}
|
457
|
-
break;
|
1313
|
+
FormatConversionChar c = conv.conversion_char();
|
458
1314
|
|
459
|
-
|
460
|
-
|
1315
|
+
if (c == FormatConversionCharInternal::f ||
|
1316
|
+
c == FormatConversionCharInternal::F) {
|
1317
|
+
FormatF(decomposed.mantissa, decomposed.exponent,
|
1318
|
+
{sign_char, precision, conv, sink});
|
1319
|
+
return true;
|
1320
|
+
} else if (c == FormatConversionCharInternal::e ||
|
1321
|
+
c == FormatConversionCharInternal::E) {
|
1322
|
+
if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
|
1323
|
+
&exp)) {
|
461
1324
|
return FallbackToSnprintf(v, conv, sink);
|
462
|
-
|
463
|
-
|
464
|
-
|
1325
|
+
}
|
1326
|
+
if (!conv.has_alt_flag() && buffer.back() == '.') buffer.pop_back();
|
1327
|
+
PrintExponent(
|
1328
|
+
exp, FormatConversionCharIsUpper(conv.conversion_char()) ? 'E' : 'e',
|
1329
|
+
&buffer);
|
1330
|
+
} else if (c == FormatConversionCharInternal::g ||
|
1331
|
+
c == FormatConversionCharInternal::G) {
|
1332
|
+
precision = std::max(0, precision - 1);
|
1333
|
+
if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
|
1334
|
+
&exp)) {
|
1335
|
+
return FallbackToSnprintf(v, conv, sink);
|
1336
|
+
}
|
1337
|
+
if (precision + 1 > exp && exp >= -4) {
|
1338
|
+
if (exp < 0) {
|
1339
|
+
// Have 1.23456, needs 0.00123456
|
1340
|
+
// Move the first digit
|
1341
|
+
buffer.begin[1] = *buffer.begin;
|
1342
|
+
// Add some zeros
|
1343
|
+
for (; exp < -1; ++exp) *buffer.begin-- = '0';
|
1344
|
+
*buffer.begin-- = '.';
|
1345
|
+
*buffer.begin = '0';
|
1346
|
+
} else if (exp > 0) {
|
1347
|
+
// Have 1.23456, needs 1234.56
|
1348
|
+
// Move the '.' exp positions to the right.
|
1349
|
+
std::rotate(buffer.begin + 1, buffer.begin + 2, buffer.begin + exp + 2);
|
1350
|
+
}
|
1351
|
+
exp = 0;
|
1352
|
+
}
|
1353
|
+
if (!conv.has_alt_flag()) {
|
1354
|
+
while (buffer.back() == '0') buffer.pop_back();
|
1355
|
+
if (buffer.back() == '.') buffer.pop_back();
|
1356
|
+
}
|
1357
|
+
if (exp) {
|
1358
|
+
PrintExponent(
|
1359
|
+
exp, FormatConversionCharIsUpper(conv.conversion_char()) ? 'E' : 'e',
|
1360
|
+
&buffer);
|
1361
|
+
}
|
1362
|
+
} else if (c == FormatConversionCharInternal::a ||
|
1363
|
+
c == FormatConversionCharInternal::A) {
|
1364
|
+
bool uppercase = (c == FormatConversionCharInternal::A);
|
1365
|
+
FormatA(HexFloatTypeParams(Float{}), decomposed.mantissa,
|
1366
|
+
decomposed.exponent, uppercase, {sign_char, precision, conv, sink});
|
1367
|
+
return true;
|
1368
|
+
} else {
|
1369
|
+
return false;
|
465
1370
|
}
|
466
1371
|
|
467
1372
|
WriteBufferToSink(sign_char,
|
468
|
-
string_view(buffer.begin, buffer.end - buffer.begin),
|
469
|
-
sink);
|
1373
|
+
absl::string_view(buffer.begin, buffer.end - buffer.begin),
|
1374
|
+
conv, sink);
|
470
1375
|
|
471
1376
|
return true;
|
472
1377
|
}
|
473
1378
|
|
474
1379
|
} // namespace
|
475
1380
|
|
476
|
-
bool ConvertFloatImpl(long double v, const
|
1381
|
+
bool ConvertFloatImpl(long double v, const FormatConversionSpecImpl &conv,
|
477
1382
|
FormatSinkImpl *sink) {
|
1383
|
+
if (std::numeric_limits<long double>::digits ==
|
1384
|
+
2 * std::numeric_limits<double>::digits) {
|
1385
|
+
// This is the `double-double` representation of `long double`.
|
1386
|
+
// We do not handle it natively. Fallback to snprintf.
|
1387
|
+
return FallbackToSnprintf(v, conv, sink);
|
1388
|
+
}
|
1389
|
+
|
478
1390
|
return FloatToSink(v, conv, sink);
|
479
1391
|
}
|
480
1392
|
|
481
|
-
bool ConvertFloatImpl(float v, const
|
1393
|
+
bool ConvertFloatImpl(float v, const FormatConversionSpecImpl &conv,
|
482
1394
|
FormatSinkImpl *sink) {
|
483
|
-
return FloatToSink(v, conv, sink);
|
1395
|
+
return FloatToSink(static_cast<double>(v), conv, sink);
|
484
1396
|
}
|
485
1397
|
|
486
|
-
bool ConvertFloatImpl(double v, const
|
1398
|
+
bool ConvertFloatImpl(double v, const FormatConversionSpecImpl &conv,
|
487
1399
|
FormatSinkImpl *sink) {
|
488
1400
|
return FloatToSink(v, conv, sink);
|
489
1401
|
}
|