grpc 1.33.0.pre1 → 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.

Files changed (533) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +342 -134
  3. data/include/grpc/grpc.h +1 -2
  4. data/include/grpc/grpc_security.h +149 -172
  5. data/include/grpc/impl/codegen/grpc_types.h +9 -2
  6. data/include/grpc/impl/codegen/port_platform.h +22 -55
  7. data/src/core/ext/filters/client_channel/client_channel.cc +11 -34
  8. data/src/core/ext/filters/client_channel/config_selector.h +2 -3
  9. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -1
  10. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  11. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  12. data/src/core/ext/filters/client_channel/lb_policy.cc +5 -1
  13. data/src/core/ext/filters/client_channel/lb_policy.h +3 -3
  14. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +80 -71
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +2 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +47 -17
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +8 -5
  22. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +3 -3
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +16 -243
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +53 -17
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +809 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +20 -25
  28. data/src/core/ext/filters/client_channel/resolver.cc +3 -1
  29. data/src/core/ext/filters/client_channel/resolver.h +4 -1
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -1
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -1
  32. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
  33. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  34. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  35. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +20 -0
  36. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +66 -7
  37. data/src/core/ext/filters/client_channel/resolver_registry.cc +4 -4
  38. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +13 -25
  39. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +1 -1
  40. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +2 -2
  41. data/src/core/ext/filters/client_channel/retry_throttle.h +1 -1
  42. data/src/core/ext/filters/client_channel/server_address.h +0 -4
  43. data/src/core/ext/filters/client_channel/service_config.cc +3 -1
  44. data/src/core/ext/filters/client_channel/service_config.h +1 -1
  45. data/src/core/ext/filters/client_channel/subchannel.cc +18 -15
  46. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  47. data/src/core/ext/filters/client_channel/subchannel_interface.h +7 -15
  48. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  49. data/src/core/ext/filters/deadline/deadline_filter.cc +83 -77
  50. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  51. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  52. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  53. data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
  54. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  55. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +17 -3
  56. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +4 -24
  58. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  59. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  61. data/src/core/ext/transport/chttp2/transport/internal.h +0 -1
  62. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  63. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -2
  64. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  65. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  66. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  67. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  68. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +254 -0
  69. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  70. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  71. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  72. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +558 -0
  73. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  74. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  75. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  76. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +133 -0
  77. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  78. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  79. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  80. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  81. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  82. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +266 -0
  83. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +125 -0
  84. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  85. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  86. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  87. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  88. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  89. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  90. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  91. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  92. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  93. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  94. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  95. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  96. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +46 -0
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  100. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  101. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  102. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +55 -0
  103. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  104. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +110 -0
  105. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  106. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  107. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  108. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  109. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  110. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  111. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  112. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +190 -0
  113. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  114. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +185 -0
  115. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  116. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +62 -0
  117. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  118. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +97 -0
  119. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  120. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +915 -0
  121. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +280 -0
  122. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  123. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  124. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +64 -0
  125. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  126. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +511 -0
  127. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  128. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
  129. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  130. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +166 -0
  131. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  132. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +105 -0
  133. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  134. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +249 -0
  135. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  136. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  137. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  138. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  139. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  140. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +152 -0
  141. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +60 -0
  142. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +83 -0
  143. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  144. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +82 -0
  145. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  146. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +83 -0
  147. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  148. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +86 -0
  149. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  150. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  151. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  152. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  153. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  154. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  155. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  156. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  157. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  158. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  159. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  160. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +72 -0
  161. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  162. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  163. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  164. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  165. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  166. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  167. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  168. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  169. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +30 -0
  170. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  171. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  172. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  173. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  174. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  175. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  176. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  177. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  178. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  179. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  180. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +38 -0
  181. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  182. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  183. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  184. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +39 -0
  185. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  186. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  187. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  188. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  189. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  190. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +39 -0
  191. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  192. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  193. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  194. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  195. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  196. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  197. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  198. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  199. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  200. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  201. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  202. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  203. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  204. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  205. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  206. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +42 -0
  207. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +35 -0
  208. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +62 -0
  209. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +40 -0
  210. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +45 -0
  211. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +40 -0
  212. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +49 -0
  213. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +35 -0
  214. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +68 -0
  215. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +40 -0
  216. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +51 -0
  217. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +35 -0
  218. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +307 -0
  219. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  220. data/src/core/ext/xds/certificate_provider_factory.h +7 -5
  221. data/src/core/ext/xds/certificate_provider_store.cc +84 -0
  222. data/src/core/ext/xds/certificate_provider_store.h +65 -8
  223. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +119 -0
  224. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +72 -0
  225. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +28 -140
  226. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +6 -4
  227. data/src/core/ext/xds/xds_api.cc +241 -718
  228. data/src/core/ext/xds/xds_api.h +50 -9
  229. data/src/core/ext/xds/xds_bootstrap.cc +172 -25
  230. data/src/core/ext/xds/xds_bootstrap.h +23 -7
  231. data/src/core/ext/xds/xds_certificate_provider.cc +240 -0
  232. data/src/core/ext/xds/xds_certificate_provider.h +74 -0
  233. data/src/core/ext/xds/xds_client.cc +161 -128
  234. data/src/core/ext/xds/xds_client.h +12 -11
  235. data/src/core/ext/xds/xds_client_stats.cc +41 -4
  236. data/src/core/ext/xds/xds_client_stats.h +2 -2
  237. data/src/core/lib/channel/channel_args.cc +2 -1
  238. data/src/core/lib/channel/channel_trace.cc +4 -2
  239. data/src/core/lib/channel/channelz.h +2 -2
  240. data/src/core/lib/channel/handshaker.h +2 -2
  241. data/src/core/lib/compression/compression.cc +8 -4
  242. data/src/core/lib/compression/compression_internal.cc +10 -5
  243. data/src/core/lib/compression/compression_internal.h +2 -1
  244. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  245. data/src/core/lib/debug/stats_data.cc +1 -0
  246. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  247. data/src/core/lib/gpr/log_linux.cc +17 -3
  248. data/src/core/lib/gpr/log_posix.cc +13 -1
  249. data/src/core/lib/gpr/log_windows.cc +16 -4
  250. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  251. data/src/core/lib/gpr/string.cc +1 -1
  252. data/src/core/lib/gpr/time_precise.cc +3 -2
  253. data/src/core/lib/gpr/tls.h +4 -0
  254. data/src/core/lib/gpr/tls_msvc.h +2 -0
  255. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  256. data/src/core/lib/gpr/useful.h +5 -4
  257. data/src/core/lib/gprpp/dual_ref_counted.h +44 -49
  258. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  259. data/src/core/lib/gprpp/examine_stack.h +46 -0
  260. data/src/core/lib/gprpp/fork.cc +2 -2
  261. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  262. data/src/core/lib/gprpp/orphanable.h +4 -8
  263. data/src/core/lib/gprpp/ref_counted.h +40 -46
  264. data/src/core/lib/gprpp/ref_counted_ptr.h +9 -11
  265. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  266. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  267. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  268. data/src/core/lib/gprpp/thd.h +2 -2
  269. data/src/core/lib/gprpp/thd_posix.cc +36 -36
  270. data/src/core/lib/http/parser.cc +46 -25
  271. data/src/core/lib/iomgr/error.cc +2 -1
  272. data/src/core/lib/iomgr/ev_epollex_linux.cc +8 -4
  273. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  274. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  275. data/src/core/lib/iomgr/executor/threadpool.h +3 -3
  276. data/src/core/lib/iomgr/parse_address.cc +84 -6
  277. data/src/core/lib/iomgr/parse_address.h +20 -0
  278. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  279. data/src/core/lib/iomgr/python_util.h +3 -3
  280. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  281. data/src/core/lib/iomgr/tcp_posix.cc +3 -2
  282. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  283. data/src/core/lib/iomgr/unix_sockets_posix.cc +27 -15
  284. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  285. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  286. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  287. data/src/core/lib/json/json.h +2 -2
  288. data/src/core/lib/json/json_reader.cc +8 -4
  289. data/src/core/lib/json/json_util.h +167 -0
  290. data/src/core/lib/json/json_writer.cc +2 -1
  291. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  292. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  293. data/src/core/lib/security/authorization/mock_cel/cel_value.h +4 -0
  294. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  295. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  296. data/src/core/lib/security/context/security_context.h +3 -1
  297. data/src/core/lib/security/credentials/credentials.cc +1 -1
  298. data/src/core/lib/security/credentials/credentials.h +3 -3
  299. data/src/core/lib/security/credentials/external/aws_request_signer.cc +208 -0
  300. data/src/core/lib/security/credentials/external/aws_request_signer.h +73 -0
  301. data/src/core/lib/security/credentials/external/external_account_credentials.cc +311 -0
  302. data/src/core/lib/security/credentials/external/external_account_credentials.h +118 -0
  303. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +136 -0
  304. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +49 -0
  305. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +211 -0
  306. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +59 -0
  307. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +51 -0
  308. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  309. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  310. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -1
  311. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +2 -2
  312. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +35 -5
  313. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +12 -8
  314. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +78 -0
  315. data/src/core/lib/security/{certificate_provider.h → credentials/tls/grpc_tls_certificate_provider.h} +32 -18
  316. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +77 -149
  317. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +58 -187
  318. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -12
  319. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  320. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  321. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +88 -0
  322. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +70 -0
  323. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  324. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  325. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  326. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  327. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  328. data/src/core/lib/security/security_connector/ssl_utils.h +4 -2
  329. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +293 -275
  330. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +106 -61
  331. data/src/core/lib/security/transport/security_handshaker.cc +1 -1
  332. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  333. data/src/core/lib/security/util/json_util.h +1 -0
  334. data/src/core/lib/slice/slice.cc +7 -4
  335. data/src/core/lib/slice/slice_buffer.cc +2 -1
  336. data/src/core/lib/slice/slice_intern.cc +2 -2
  337. data/src/core/lib/surface/call.cc +9 -8
  338. data/src/core/lib/surface/completion_queue.cc +7 -6
  339. data/src/core/lib/surface/server.cc +4 -2
  340. data/src/core/lib/surface/server.h +2 -2
  341. data/src/core/lib/surface/validate_metadata.h +3 -0
  342. data/src/core/lib/surface/version.cc +2 -2
  343. data/src/core/lib/transport/authority_override.h +2 -0
  344. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  345. data/src/core/lib/transport/byte_stream.h +3 -3
  346. data/src/core/lib/transport/connectivity_state.h +3 -3
  347. data/src/core/lib/transport/metadata.h +2 -2
  348. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  349. data/src/core/lib/transport/transport.cc +5 -3
  350. data/src/core/lib/transport/transport.h +1 -1
  351. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -4
  352. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -3
  353. data/src/core/tsi/fake_transport_security.cc +1 -0
  354. data/src/core/tsi/local_transport_security.cc +5 -1
  355. data/src/core/tsi/local_transport_security.h +6 -7
  356. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -0
  357. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -1
  358. data/src/core/tsi/ssl_transport_security.cc +14 -7
  359. data/src/core/tsi/ssl_transport_security.h +3 -0
  360. data/src/core/tsi/transport_security.cc +4 -2
  361. data/src/ruby/ext/grpc/extconf.rb +1 -1
  362. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +22 -14
  363. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -24
  364. data/src/ruby/lib/grpc/version.rb +1 -1
  365. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  366. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  367. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  368. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  369. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  370. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  371. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  372. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  373. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  374. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  375. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  376. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  377. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  378. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  379. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  380. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  381. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  382. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  383. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  384. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  385. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  386. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  387. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  388. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  389. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  390. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  391. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  392. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  393. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  394. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  395. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  396. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  397. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  398. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  399. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  400. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  401. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  402. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  403. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  404. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  405. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  406. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  407. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  408. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  409. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  410. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  411. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  412. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  413. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  414. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  415. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  416. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  417. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  418. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  419. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  420. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  421. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  422. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  423. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  424. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  425. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  426. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  427. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  428. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  429. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  430. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  431. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  432. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  433. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  434. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  435. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  436. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  437. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  438. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  439. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  440. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  441. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  442. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  444. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  445. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  451. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  452. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  453. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  454. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  455. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  456. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  457. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  458. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  459. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  460. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  461. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  462. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +3 -3
  463. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  464. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  465. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  466. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  467. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  468. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  469. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  470. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  471. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  472. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  473. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  474. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  475. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  476. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  478. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  481. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  482. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  483. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  484. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  485. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  486. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  487. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  488. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  489. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  490. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  491. data/third_party/boringssl-with-bazel/err_data.c +340 -336
  492. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  494. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +46 -7
  495. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +8 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +90 -63
  497. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +60 -60
  498. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +179 -47
  499. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +10 -0
  501. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  502. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +14 -14
  503. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  504. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  505. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +7 -5
  506. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -2
  507. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  508. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  509. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  511. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +55 -1
  512. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  513. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +31 -23
  514. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +435 -394
  515. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  516. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  517. data/third_party/boringssl-with-bazel/src/ssl/internal.h +36 -1
  518. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +42 -1
  519. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +67 -0
  520. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +11 -14
  521. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +216 -11
  522. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +53 -11
  523. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +133 -39
  524. data/third_party/upb/upb/def.c +2169 -0
  525. data/third_party/upb/upb/def.h +330 -0
  526. data/third_party/upb/upb/def.hpp +525 -0
  527. data/third_party/upb/upb/reflection.c +391 -0
  528. data/third_party/upb/upb/reflection.h +168 -0
  529. data/third_party/upb/upb/text_encode.c +398 -0
  530. data/third_party/upb/upb/text_encode.h +35 -0
  531. metadata +227 -37
  532. data/src/core/ext/filters/client_channel/lb_policy/xds/eds_drop.cc +0 -571
  533. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
@@ -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
- char *CopyStringTo(string_view v, char *out) {
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 ConversionSpec &conv,
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.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 ConversionSpec &conv, FormatSinkImpl *sink) {
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(FormatConversionCharIsUpper(conv.conv()) ? "NAN" : "nan",
104
- 3, ptr);
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(FormatConversionCharIsUpper(conv.conv()) ? "INF" : "inf",
107
- 3, ptr);
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.flags().left);
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
- Float mantissa;
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
- return {m, exp};
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 ConversionSpec &conv, FormatSinkImpl *sink) {
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.flags().left) {
1270
+ if (conv.has_left_flag()) {
362
1271
  right_spaces = missing_chars;
363
- } else if (conv.flags().zero) {
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 ConversionSpec &conv,
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.flags().show_pos) {
1294
+ } else if (conv.has_show_pos_flag()) {
386
1295
  sign_char = '+';
387
- } else if (conv.flags().sign_col) {
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
- switch (conv.conv()) {
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
- case ConversionChar::a:
460
- case ConversionChar::A:
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
- default:
464
- return false;
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), conv,
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 ConversionSpec &conv,
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 ConversionSpec &conv,
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 ConversionSpec &conv,
1398
+ bool ConvertFloatImpl(double v, const FormatConversionSpecImpl &conv,
487
1399
  FormatSinkImpl *sink) {
488
1400
  return FloatToSink(v, conv, sink);
489
1401
  }