grpc 1.84.0 → 1.85.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1004) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +40 -27
  3. data/include/grpc/event_engine/memory_allocator.h +1 -0
  4. data/include/grpc/grpc.h +3 -0
  5. data/include/grpc/grpc_security_constants.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +4 -0
  7. data/src/core/call/call_filters.h +10 -10
  8. data/src/core/{lib/security/authorization → call}/evaluate_args.cc +22 -1
  9. data/src/core/{lib/security/authorization → call}/evaluate_args.h +19 -5
  10. data/src/core/call/filter_fusion.h +15 -15
  11. data/src/core/call/interception_chain.h +3 -3
  12. data/src/core/call/metadata_batch.cc +1 -0
  13. data/src/core/call/metadata_batch.h +45 -33
  14. data/src/core/call/parsed_metadata.h +3 -3
  15. data/src/core/call/request_buffer.cc +6 -6
  16. data/src/core/call/request_buffer.h +1 -1
  17. data/src/core/channelz/channel_trace.cc +5 -5
  18. data/src/core/channelz/channel_trace.h +1 -1
  19. data/src/core/channelz/channelz.cc +9 -9
  20. data/src/core/channelz/channelz.h +12 -12
  21. data/src/core/channelz/channelz_registry.cc +10 -10
  22. data/src/core/channelz/ztrace_collector.h +5 -5
  23. data/src/core/client_channel/client_channel.cc +4 -4
  24. data/src/core/client_channel/client_channel_filter.cc +14 -14
  25. data/src/core/client_channel/global_subchannel_pool.cc +4 -4
  26. data/src/core/client_channel/subchannel.cc +24 -23
  27. data/src/core/client_channel/subchannel_stream_client.cc +5 -5
  28. data/src/core/credentials/call/external/aws_external_account_credentials.cc +7 -7
  29. data/src/core/credentials/call/external/aws_request_signer.cc +16 -0
  30. data/src/core/credentials/call/external/external_account_credentials.cc +4 -4
  31. data/src/core/credentials/call/regional_access_boundary_fetcher.cc +9 -9
  32. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +4 -4
  33. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -3
  34. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +1 -1
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +9 -9
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +1 -1
  37. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +6 -6
  38. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
  39. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +4 -4
  40. data/src/core/credentials/transport/tls/ssl_utils.cc +10 -0
  41. data/src/core/credentials/transport/tls/tls_security_connector.cc +10 -10
  42. data/src/core/credentials/transport/tls/tls_security_connector.h +6 -6
  43. data/src/core/credentials/transport/tls/tls_utils.h +9 -0
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +1 -1
  45. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  46. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
  47. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +1 -1
  48. data/src/core/ext/filters/http/message_compress/compression_filter.cc +15 -0
  49. data/src/core/ext/filters/rbac/rbac_filter.h +1 -1
  50. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +5 -5
  51. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +30 -21
  52. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -11
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +14 -11
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  55. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -4
  56. data/src/core/ext/transport/chttp2/transport/frame.h +9 -0
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -9
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -2
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +16 -18
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +2 -1
  61. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +277 -189
  62. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +40 -17
  63. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +12 -24
  64. data/src/core/ext/transport/chttp2/transport/http2_transport.h +3 -29
  65. data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  67. data/src/core/ext/transport/chttp2/transport/read_context.h +96 -3
  68. data/src/core/ext/transport/chttp2/transport/reclaimer.cc +32 -0
  69. data/src/core/ext/transport/chttp2/transport/reclaimer.h +64 -0
  70. data/src/core/ext/transport/chttp2/transport/security_frame.h +8 -8
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +17 -9
  72. data/src/core/ext/transport/chttp2/transport/write_cycle.h +23 -3
  73. data/src/core/ext/transport/inproc/inproc_transport.cc +5 -5
  74. data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb.h +137 -73
  75. data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb_minitable.c +45 -25
  76. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb.h +6 -6
  77. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.c +4 -4
  78. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.h +5 -5
  79. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb.h +46 -26
  80. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.c +17 -14
  81. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.h +5 -5
  82. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb.h +5 -5
  83. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.c +3 -3
  84. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.h +5 -5
  85. data/src/core/ext/upb-gen/grpc/health/v1/health.upb.h +329 -0
  86. data/src/core/ext/upb-gen/grpc/health/v1/health.upb_minitable.c +128 -0
  87. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/health/v1/health.upb_minitable.h +8 -5
  88. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb.h +5 -5
  89. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.c +3 -3
  90. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.h +5 -5
  91. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb.h +185 -23
  92. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.c +20 -12
  93. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.h +5 -5
  94. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb.h +58 -42
  95. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.c +17 -12
  96. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.h +5 -5
  97. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +567 -549
  98. data/src/core/ext/upbdefs-gen/grpc/lookup/v1/rls_config.upbdefs.c +182 -0
  99. data/src/core/ext/upbdefs-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upbdefs.h +14 -14
  100. data/src/core/filter/ext_proc/ext_proc_filter.cc +1603 -46
  101. data/src/core/filter/ext_proc/ext_proc_filter.h +55 -22
  102. data/src/core/filter/ext_proc/ext_proc_messages.cc +106 -51
  103. data/src/core/filter/ext_proc/ext_proc_messages.h +36 -9
  104. data/src/core/handshaker/handshaker.cc +4 -4
  105. data/src/core/handshaker/http_connect/http_connect_client_handshaker.cc +3 -3
  106. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +10 -10
  107. data/src/core/handshaker/security/secure_endpoint.cc +13 -13
  108. data/src/core/handshaker/security/security_handshaker.cc +6 -6
  109. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  110. data/src/core/lib/channel/channel_args.cc +20 -0
  111. data/src/core/lib/channel/channel_args.h +17 -17
  112. data/src/core/lib/channel/promise_based_filter.cc +2 -2
  113. data/src/core/lib/channel/promise_based_filter.h +66 -27
  114. data/src/core/lib/debug/trace_flags.cc +2 -0
  115. data/src/core/lib/debug/trace_flags.h +1 -0
  116. data/src/core/lib/event_engine/ares_resolver.cc +14 -14
  117. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +7 -7
  118. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +4 -4
  119. data/src/core/lib/event_engine/default_event_engine.cc +5 -5
  120. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +9 -9
  121. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +16 -14
  122. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +6 -6
  123. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +3 -3
  124. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1 -1
  125. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +7 -7
  126. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +17 -17
  127. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +3 -3
  128. data/src/core/lib/event_engine/posix_engine/timer.cc +5 -5
  129. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +5 -5
  130. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +3 -3
  131. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +1 -1
  132. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  133. data/src/core/lib/event_engine/thread_pool/thread_count.h +3 -3
  134. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +50 -21
  135. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +3 -3
  136. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +3 -3
  137. data/src/core/lib/event_engine/windows/windows_engine.cc +15 -15
  138. data/src/core/lib/event_engine/windows/windows_listener.cc +6 -6
  139. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +6 -6
  140. data/src/core/lib/experiments/experiments.cc +48 -0
  141. data/src/core/lib/experiments/experiments.h +24 -0
  142. data/src/core/lib/iomgr/buffer_list.cc +3 -3
  143. data/src/core/lib/iomgr/buffer_list.h +1 -1
  144. data/src/core/lib/iomgr/combiner.cc +0 -1
  145. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  146. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  147. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  148. data/src/core/lib/iomgr/tcp_posix.cc +7 -7
  149. data/src/core/lib/promise/activity.cc +1 -1
  150. data/src/core/lib/promise/activity.h +1 -1
  151. data/src/core/lib/promise/arena_promise.h +7 -7
  152. data/src/core/lib/promise/detail/promise_factory.h +8 -8
  153. data/src/core/lib/promise/detail/promise_like.h +4 -4
  154. data/src/core/lib/promise/inter_activity_latch.h +6 -6
  155. data/src/core/lib/promise/inter_activity_pipe.h +1 -1
  156. data/src/core/lib/promise/observable.h +3 -3
  157. data/src/core/lib/promise/party.cc +1 -1
  158. data/src/core/lib/promise/try_seq.h +2 -2
  159. data/src/core/lib/resource_quota/arena.h +3 -3
  160. data/src/core/lib/resource_quota/memory_quota.cc +16 -16
  161. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  162. data/src/core/lib/resource_quota/thread_quota.cc +3 -3
  163. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  164. data/src/core/lib/security/authorization/authorization_engine.h +1 -1
  165. data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
  166. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -1
  167. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
  168. data/src/core/lib/security/authorization/matchers.h +1 -1
  169. data/src/core/lib/surface/call.cc +8 -7
  170. data/src/core/lib/surface/call.h +3 -3
  171. data/src/core/lib/surface/call_utils.h +4 -0
  172. data/src/core/lib/surface/channel.cc +1 -1
  173. data/src/core/lib/surface/channel.h +1 -1
  174. data/src/core/lib/surface/channel_init.cc +1 -1
  175. data/src/core/lib/surface/init.cc +7 -7
  176. data/src/core/lib/surface/lame_client.cc +1 -1
  177. data/src/core/lib/surface/legacy_channel.cc +2 -2
  178. data/src/core/lib/surface/version.cc +1 -1
  179. data/src/core/lib/transport/transport_framing_endpoint_extension.h +3 -3
  180. data/src/core/load_balancing/autosharding/autosharding.cc +931 -0
  181. data/src/core/load_balancing/autosharding/autosharding.h +78 -0
  182. data/src/core/load_balancing/grpclb/grpclb_client_stats.cc +2 -2
  183. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  184. data/src/core/load_balancing/grpclb/load_balancer_api.h +3 -1
  185. data/src/core/load_balancing/health_check_client.cc +7 -7
  186. data/src/core/load_balancing/lb_policy.cc +1 -1
  187. data/src/core/load_balancing/oob_backend_metric.cc +5 -5
  188. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  189. data/src/core/load_balancing/ring_hash/ring_hash.cc +109 -37
  190. data/src/core/load_balancing/rls/rls.cc +23 -17
  191. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +10 -10
  192. data/src/core/load_balancing/xds/cds.cc +6 -5
  193. data/src/core/load_balancing/xds/xds_cluster_impl.cc +2 -2
  194. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  195. data/src/core/mitigation_engine/mitigation_engine.h +28 -4
  196. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -0
  197. data/src/core/resolver/dns/dns_resolver.cc +7 -7
  198. data/src/core/resolver/fake/fake_resolver.cc +5 -5
  199. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +38 -30
  200. data/src/core/server/server.cc +30 -30
  201. data/src/core/server/server.h +4 -3
  202. data/src/core/server/server_config_selector_filter.cc +3 -3
  203. data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -15
  204. data/src/core/telemetry/default_tcp_tracer.cc +1 -1
  205. data/src/core/telemetry/instrument.cc +30 -16
  206. data/src/core/telemetry/instrument.h +3 -3
  207. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  208. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -4
  209. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
  210. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  211. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  212. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
  213. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +3 -3
  214. data/src/core/tsi/ssl_transport_security.cc +46 -13
  215. data/src/core/tsi/ssl_transport_security.h +7 -0
  216. data/src/core/tsi/ssl_transport_security_utils.cc +16 -6
  217. data/src/core/util/event_log.cc +3 -3
  218. data/src/core/util/http_client/httpcli.cc +5 -5
  219. data/src/core/util/http_client/httpcli.h +1 -1
  220. data/src/core/util/json/json_object_loader.cc +7 -0
  221. data/src/core/util/json/json_object_loader.h +17 -2
  222. data/src/core/util/latent_see.cc +123 -36
  223. data/src/core/util/latent_see.h +14 -1
  224. data/src/core/util/mpscq.cc +1 -1
  225. data/src/core/util/notification.h +4 -4
  226. data/src/core/util/sync.h +20 -6
  227. data/src/core/util/table.h +20 -22
  228. data/src/core/util/work_serializer.cc +2 -2
  229. data/src/core/xds/grpc/blackboard.cc +4 -3
  230. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  231. data/src/core/xds/grpc/streaming_call_promise_wrapper.cc +181 -0
  232. data/src/core/xds/grpc/streaming_call_promise_wrapper.h +213 -0
  233. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +2 -2
  234. data/src/core/xds/grpc/xds_client_grpc.cc +8 -8
  235. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  236. data/src/core/xds/grpc/xds_endpoint.cc +1 -1
  237. data/src/core/xds/grpc/xds_endpoint_parser.cc +11 -0
  238. data/src/core/xds/grpc/xds_grpc_service_parser.cc +12 -10
  239. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +17 -14
  240. data/src/core/xds/grpc/xds_matcher.h +2 -2
  241. data/src/core/xds/grpc/xds_transport_grpc.cc +125 -85
  242. data/src/core/xds/grpc/xds_transport_grpc.h +19 -4
  243. data/src/core/xds/xds_client/lrs_client.cc +22 -19
  244. data/src/core/xds/xds_client/xds_client.cc +19 -16
  245. data/src/core/xds/xds_client/xds_transport.h +49 -3
  246. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  247. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  248. data/src/ruby/lib/grpc/version.rb +1 -1
  249. data/src/ruby/pb/README.md +1 -1
  250. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  251. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  252. data/third_party/abseil-cpp/absl/algorithm/container.h +345 -147
  253. data/third_party/abseil-cpp/absl/base/attributes.h +67 -44
  254. data/third_party/abseil-cpp/absl/base/call_once.h +1 -0
  255. data/third_party/abseil-cpp/absl/base/casts.cc +61 -0
  256. data/third_party/abseil-cpp/absl/base/casts.h +135 -2
  257. data/third_party/abseil-cpp/absl/base/config.h +63 -41
  258. data/third_party/abseil-cpp/absl/base/fast_type_id.h +30 -2
  259. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  260. data/third_party/abseil-cpp/absl/base/internal/hardening.h +136 -0
  261. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +6 -2
  262. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -4
  263. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  264. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  265. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  266. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +26 -24
  267. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +74 -29
  268. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -11
  269. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  270. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +5 -1
  271. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  272. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  273. data/third_party/abseil-cpp/absl/base/macros.h +76 -37
  274. data/third_party/abseil-cpp/absl/base/nullability.h +5 -5
  275. data/third_party/abseil-cpp/absl/base/optimization.h +4 -5
  276. data/third_party/abseil-cpp/absl/base/options.h +46 -18
  277. data/third_party/abseil-cpp/absl/base/policy_checks.h +5 -5
  278. data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  279. data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  280. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +7 -2
  281. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  282. data/third_party/abseil-cpp/absl/container/btree_map.h +60 -10
  283. data/third_party/abseil-cpp/absl/container/btree_set.h +61 -15
  284. data/third_party/abseil-cpp/absl/container/fixed_array.h +19 -21
  285. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +49 -27
  286. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +50 -26
  287. data/third_party/abseil-cpp/absl/container/inlined_vector.h +42 -36
  288. data/third_party/abseil-cpp/absl/container/internal/btree.h +32 -24
  289. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +30 -22
  290. data/third_party/abseil-cpp/absl/container/internal/common.h +57 -5
  291. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  292. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +40 -36
  293. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +119 -39
  294. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +14 -2
  295. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +14 -22
  296. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +52 -52
  297. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +7 -7
  298. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +7 -7
  299. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +32 -40
  300. data/third_party/abseil-cpp/absl/container/internal/layout.h +13 -13
  301. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +95 -72
  302. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +633 -365
  303. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1016 -749
  304. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +0 -1
  305. data/third_party/abseil-cpp/absl/container/node_hash_map.h +58 -35
  306. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +23 -6
  307. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  308. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  309. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  310. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  311. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  312. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +304 -188
  313. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  314. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  315. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  316. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  317. data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +15 -1
  318. data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -1
  319. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +12 -1
  320. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  321. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -11
  322. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  323. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  324. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +6 -1
  325. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +14 -8
  326. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +48 -38
  327. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  328. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +63 -118
  329. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +7 -47
  330. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  331. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +83 -149
  332. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  333. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  334. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  335. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  336. data/third_party/abseil-cpp/absl/flags/declare.h +9 -0
  337. data/third_party/abseil-cpp/absl/flags/flag.h +2 -1
  338. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  339. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +19 -18
  340. data/third_party/abseil-cpp/absl/flags/internal/flag.h +33 -34
  341. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  342. data/third_party/abseil-cpp/absl/flags/marshalling.cc +1 -16
  343. data/third_party/abseil-cpp/absl/flags/marshalling.h +2 -28
  344. data/third_party/abseil-cpp/absl/flags/reflection.cc +11 -7
  345. data/third_party/abseil-cpp/absl/flags/usage_config.cc +2 -2
  346. data/third_party/abseil-cpp/absl/functional/any_invocable.h +22 -19
  347. data/third_party/abseil-cpp/absl/functional/bind_front.h +7 -1
  348. data/third_party/abseil-cpp/absl/functional/function_ref.h +125 -20
  349. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +43 -31
  350. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  351. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +44 -6
  352. data/third_party/abseil-cpp/absl/hash/hash.h +1 -1
  353. data/third_party/abseil-cpp/absl/hash/internal/city.cc +39 -51
  354. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +379 -14
  355. data/third_party/abseil-cpp/absl/hash/internal/hash.h +457 -353
  356. data/third_party/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  357. data/third_party/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  358. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +4 -0
  359. data/third_party/abseil-cpp/absl/log/internal/check_op.h +128 -50
  360. data/third_party/abseil-cpp/absl/log/internal/conditions.h +38 -35
  361. data/third_party/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  362. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +10 -6
  363. data/third_party/abseil-cpp/absl/log/internal/log_message.h +19 -1
  364. data/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  365. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  366. data/third_party/abseil-cpp/absl/log/internal/proto.cc +13 -0
  367. data/third_party/abseil-cpp/absl/log/internal/strip.h +30 -31
  368. data/third_party/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  369. data/third_party/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  370. data/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +30 -30
  371. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  372. data/third_party/abseil-cpp/absl/log/log.h +2 -2
  373. data/third_party/abseil-cpp/absl/log/log_entry.cc +263 -0
  374. data/third_party/abseil-cpp/absl/log/log_entry.h +2 -0
  375. data/third_party/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  376. data/third_party/abseil-cpp/absl/memory/memory.h +55 -5
  377. data/third_party/abseil-cpp/absl/meta/type_traits.h +161 -56
  378. data/third_party/abseil-cpp/absl/numeric/int128.h +41 -21
  379. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  380. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  381. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +32 -4
  382. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  383. data/third_party/abseil-cpp/absl/random/beta_distribution.h +2 -2
  384. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  385. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  386. data/third_party/abseil-cpp/absl/random/distributions.h +17 -17
  387. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  388. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  389. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc +2 -2
  390. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  391. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  392. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  393. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  394. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  395. data/third_party/abseil-cpp/absl/random/internal/platform.h +0 -13
  396. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  397. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  398. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  399. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +5 -31
  400. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  401. data/third_party/abseil-cpp/absl/random/internal/traits.h +21 -0
  402. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  403. data/third_party/abseil-cpp/absl/random/mocking_access.h +74 -0
  404. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  405. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  406. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +30 -4
  407. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +225 -63
  408. data/third_party/abseil-cpp/absl/status/status.cc +66 -70
  409. data/third_party/abseil-cpp/absl/status/status.h +254 -23
  410. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  411. data/third_party/abseil-cpp/absl/status/statusor.h +117 -137
  412. data/third_party/abseil-cpp/absl/strings/ascii.h +10 -6
  413. data/third_party/abseil-cpp/absl/strings/cord.cc +41 -17
  414. data/third_party/abseil-cpp/absl/strings/cord.h +26 -17
  415. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  416. data/third_party/abseil-cpp/absl/strings/escaping.cc +305 -125
  417. data/third_party/abseil-cpp/absl/strings/escaping.h +12 -2
  418. data/third_party/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +2 -2
  420. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  421. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +27 -21
  422. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +11 -19
  423. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  424. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  425. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  426. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +2 -24
  427. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -36
  428. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  429. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  430. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  431. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  432. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +921 -231
  433. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -16
  434. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +16 -12
  435. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  436. data/third_party/abseil-cpp/absl/strings/numbers.cc +477 -8
  437. data/third_party/abseil-cpp/absl/strings/numbers.h +29 -12
  438. data/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h +198 -0
  439. data/third_party/abseil-cpp/absl/strings/str_cat.cc +96 -91
  440. data/third_party/abseil-cpp/absl/strings/str_cat.h +53 -13
  441. data/third_party/abseil-cpp/absl/strings/str_split.h +14 -9
  442. data/third_party/abseil-cpp/absl/strings/string_view.h +10 -716
  443. data/third_party/abseil-cpp/absl/strings/substitute.cc +24 -24
  444. data/third_party/abseil-cpp/absl/strings/substitute.h +2 -2
  445. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  446. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  447. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +24 -3
  448. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  449. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  450. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  451. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +41 -29
  452. data/third_party/abseil-cpp/absl/synchronization/mutex.h +199 -94
  453. data/third_party/abseil-cpp/absl/synchronization/notification.cc +5 -5
  454. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  455. data/third_party/abseil-cpp/absl/time/clock.cc +29 -30
  456. data/third_party/abseil-cpp/absl/time/clock.h +3 -0
  457. data/third_party/abseil-cpp/absl/time/duration.cc +2 -2
  458. data/third_party/abseil-cpp/absl/time/format.cc +3 -10
  459. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  460. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +131 -91
  461. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  462. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +185 -0
  463. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  464. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  465. data/third_party/abseil-cpp/absl/time/time.cc +4 -4
  466. data/third_party/abseil-cpp/absl/time/time.h +14 -13
  467. data/third_party/abseil-cpp/absl/types/compare.h +64 -63
  468. data/third_party/abseil-cpp/absl/types/internal/span.h +6 -6
  469. data/third_party/abseil-cpp/absl/types/optional.h +31 -4
  470. data/third_party/abseil-cpp/absl/types/optional_ref.h +295 -0
  471. data/third_party/{boringssl-with-bazel/crypto/x509/x_val.cc → abseil-cpp/absl/types/source_location.cc} +4 -14
  472. data/third_party/abseil-cpp/absl/types/source_location.h +172 -0
  473. data/third_party/abseil-cpp/absl/types/span.h +67 -38
  474. data/third_party/abseil-cpp/absl/types/variant.h +75 -18
  475. data/third_party/abseil-cpp/absl/utility/utility.h +112 -16
  476. data/third_party/boringssl-with-bazel/crypto/aes/aes.cc +3 -0
  477. data/third_party/boringssl-with-bazel/crypto/armv8_feature_parsing.h +67 -0
  478. data/third_party/boringssl-with-bazel/crypto/asn1/a_bitstr.cc +143 -105
  479. data/third_party/boringssl-with-bazel/crypto/asn1/a_bool.cc +5 -8
  480. data/third_party/boringssl-with-bazel/crypto/asn1/a_d2i_fp.cc +3 -3
  481. data/third_party/boringssl-with-bazel/crypto/asn1/a_dup.cc +6 -6
  482. data/third_party/boringssl-with-bazel/crypto/asn1/a_gentm.cc +33 -12
  483. data/third_party/boringssl-with-bazel/crypto/asn1/a_i2d_fp.cc +7 -6
  484. data/third_party/boringssl-with-bazel/crypto/asn1/a_int.cc +80 -52
  485. data/third_party/boringssl-with-bazel/crypto/asn1/a_mbstr.cc +7 -4
  486. data/third_party/boringssl-with-bazel/crypto/asn1/a_object.cc +70 -72
  487. data/third_party/boringssl-with-bazel/crypto/asn1/a_strex.cc +38 -42
  488. data/third_party/boringssl-with-bazel/crypto/asn1/a_strnid.cc +41 -39
  489. data/third_party/boringssl-with-bazel/crypto/asn1/a_time.cc +59 -35
  490. data/third_party/boringssl-with-bazel/crypto/asn1/a_type.cc +275 -15
  491. data/third_party/boringssl-with-bazel/crypto/asn1/a_utctm.cc +32 -13
  492. data/third_party/boringssl-with-bazel/crypto/asn1/asn1_lib.cc +128 -30
  493. data/third_party/boringssl-with-bazel/crypto/asn1/asn_pack.cc +10 -10
  494. data/third_party/boringssl-with-bazel/crypto/asn1/f_int.cc +1 -1
  495. data/third_party/boringssl-with-bazel/crypto/asn1/f_string.cc +1 -1
  496. data/third_party/boringssl-with-bazel/crypto/asn1/internal.h +261 -115
  497. data/third_party/boringssl-with-bazel/crypto/asn1/posix_time.cc +8 -5
  498. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_dec.cc +373 -725
  499. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_enc.cc +211 -526
  500. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_fre.cc +22 -19
  501. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_new.cc +26 -24
  502. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_typ.cc +19 -5
  503. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_utl.cc +47 -51
  504. data/third_party/boringssl-with-bazel/crypto/base64/base64.cc +14 -15
  505. data/third_party/boringssl-with-bazel/crypto/bcm_support.h +7 -29
  506. data/third_party/boringssl-with-bazel/crypto/bio/bio.cc +234 -176
  507. data/third_party/boringssl-with-bazel/crypto/bio/bio_mem.cc +72 -86
  508. data/third_party/boringssl-with-bazel/crypto/bio/connect.cc +153 -199
  509. data/third_party/boringssl-with-bazel/crypto/bio/errno.cc +3 -1
  510. data/third_party/boringssl-with-bazel/crypto/bio/fd.cc +56 -55
  511. data/third_party/boringssl-with-bazel/crypto/bio/file.cc +70 -78
  512. data/third_party/boringssl-with-bazel/crypto/bio/hexdump.cc +6 -4
  513. data/third_party/boringssl-with-bazel/crypto/bio/internal.h +69 -17
  514. data/third_party/boringssl-with-bazel/crypto/bio/pair.cc +117 -136
  515. data/third_party/boringssl-with-bazel/crypto/bio/printf.cc +1 -1
  516. data/third_party/boringssl-with-bazel/crypto/bio/socket.cc +116 -50
  517. data/third_party/boringssl-with-bazel/crypto/bio/socket_helper.cc +53 -5
  518. data/third_party/boringssl-with-bazel/crypto/blake2/blake2.cc +9 -5
  519. data/third_party/boringssl-with-bazel/crypto/bn/bn_asn1.cc +2 -2
  520. data/third_party/boringssl-with-bazel/crypto/bn/convert.cc +56 -70
  521. data/third_party/boringssl-with-bazel/crypto/bn/div.cc +102 -0
  522. data/third_party/boringssl-with-bazel/crypto/bn/exponentiation.cc +26 -42
  523. data/third_party/boringssl-with-bazel/crypto/bn/sqrt.cc +93 -0
  524. data/third_party/boringssl-with-bazel/crypto/buf/buf.cc +6 -5
  525. data/third_party/boringssl-with-bazel/crypto/bytestring/asn1_compat.cc +6 -5
  526. data/third_party/boringssl-with-bazel/crypto/bytestring/ber.cc +22 -20
  527. data/third_party/boringssl-with-bazel/crypto/bytestring/cbb.cc +119 -59
  528. data/third_party/boringssl-with-bazel/crypto/bytestring/cbs.cc +115 -31
  529. data/third_party/boringssl-with-bazel/crypto/bytestring/internal.h +79 -24
  530. data/third_party/boringssl-with-bazel/crypto/bytestring/unicode.cc +2 -2
  531. data/third_party/boringssl-with-bazel/crypto/chacha/chacha.cc +5 -3
  532. data/third_party/boringssl-with-bazel/crypto/chacha/internal.h +23 -22
  533. data/third_party/boringssl-with-bazel/crypto/cipher/derive_key.cc +14 -18
  534. data/third_party/boringssl-with-bazel/crypto/cipher/e_aesctrhmac.cc +73 -58
  535. data/third_party/boringssl-with-bazel/crypto/cipher/e_aeseax.cc +132 -70
  536. data/third_party/boringssl-with-bazel/crypto/cipher/e_aesgcmsiv.cc +390 -249
  537. data/third_party/boringssl-with-bazel/crypto/cipher/e_chacha20poly1305.cc +200 -137
  538. data/third_party/boringssl-with-bazel/crypto/cipher/e_des.cc +45 -29
  539. data/third_party/boringssl-with-bazel/crypto/cipher/e_null.cc +9 -5
  540. data/third_party/boringssl-with-bazel/crypto/cipher/e_rc2.cc +43 -28
  541. data/third_party/boringssl-with-bazel/crypto/cipher/e_rc4.cc +7 -5
  542. data/third_party/boringssl-with-bazel/crypto/cipher/e_tls.cc +250 -237
  543. data/third_party/boringssl-with-bazel/crypto/cipher/get_cipher.cc +12 -12
  544. data/third_party/boringssl-with-bazel/crypto/cipher/internal.h +59 -59
  545. data/third_party/boringssl-with-bazel/crypto/cipher/tls_cbc.cc +111 -111
  546. data/third_party/boringssl-with-bazel/crypto/cms/cms.cc +48 -42
  547. data/third_party/boringssl-with-bazel/crypto/conf/conf.cc +69 -63
  548. data/third_party/boringssl-with-bazel/crypto/conf/internal.h +11 -12
  549. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_apple.cc +8 -5
  550. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_fuchsia.cc +6 -1
  551. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_linux.cc +7 -1
  552. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_openbsd.cc +7 -21
  553. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_sysreg.cc +15 -41
  554. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_win.cc +16 -3
  555. data/third_party/boringssl-with-bazel/crypto/cpu_arm_freebsd.cc +4 -2
  556. data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.cc +54 -31
  557. data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.h +79 -101
  558. data/third_party/boringssl-with-bazel/crypto/cpu_intel.cc +51 -45
  559. data/third_party/boringssl-with-bazel/crypto/crypto.cc +26 -55
  560. data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519.cc +28 -25
  561. data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519_tables.h +6 -6
  562. data/third_party/boringssl-with-bazel/crypto/curve25519/internal.h +14 -15
  563. data/third_party/boringssl-with-bazel/crypto/curve25519/spake25519.cc +23 -20
  564. data/third_party/boringssl-with-bazel/crypto/des/des.cc +27 -19
  565. data/third_party/boringssl-with-bazel/crypto/des/internal.h +4 -9
  566. data/third_party/boringssl-with-bazel/crypto/dh/dh_asn1.cc +34 -49
  567. data/third_party/boringssl-with-bazel/crypto/dh/params.cc +44 -41
  568. data/third_party/boringssl-with-bazel/crypto/digest/digest_extra.cc +87 -40
  569. data/third_party/boringssl-with-bazel/crypto/dsa/dsa.cc +237 -260
  570. data/third_party/boringssl-with-bazel/crypto/dsa/dsa_asn1.cc +100 -173
  571. data/third_party/boringssl-with-bazel/crypto/dsa/internal.h +23 -21
  572. data/third_party/boringssl-with-bazel/crypto/ec/ec_asn1.cc +181 -209
  573. data/third_party/boringssl-with-bazel/crypto/ec/ec_derive.cc +26 -28
  574. data/third_party/boringssl-with-bazel/crypto/ec/hash_to_curve.cc +265 -174
  575. data/third_party/boringssl-with-bazel/crypto/ec/internal.h +54 -18
  576. data/third_party/boringssl-with-bazel/crypto/ecdh/ecdh.cc +7 -5
  577. data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_asn1.cc +50 -70
  578. data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_p1363.cc +54 -0
  579. data/third_party/boringssl-with-bazel/crypto/engine/engine.cc +7 -7
  580. data/third_party/boringssl-with-bazel/crypto/err/err.cc +116 -105
  581. data/third_party/boringssl-with-bazel/crypto/err/internal.h +8 -21
  582. data/third_party/boringssl-with-bazel/crypto/evp/evp.cc +238 -166
  583. data/third_party/boringssl-with-bazel/crypto/evp/evp_asn1.cc +202 -234
  584. data/third_party/boringssl-with-bazel/crypto/evp/evp_ctx.cc +260 -159
  585. data/third_party/boringssl-with-bazel/crypto/evp/evp_kem.cc +82 -0
  586. data/third_party/boringssl-with-bazel/crypto/evp/internal.h +292 -137
  587. data/third_party/boringssl-with-bazel/crypto/evp/p_dh.cc +198 -25
  588. data/third_party/boringssl-with-bazel/crypto/evp/p_dsa.cc +333 -0
  589. data/third_party/boringssl-with-bazel/crypto/evp/p_ec.cc +427 -42
  590. data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519.cc +270 -14
  591. data/third_party/boringssl-with-bazel/crypto/evp/p_hkdf.cc +70 -102
  592. data/third_party/boringssl-with-bazel/crypto/evp/p_mldsa.cc +549 -0
  593. data/third_party/boringssl-with-bazel/crypto/evp/p_mlkem.cc +485 -0
  594. data/third_party/boringssl-with-bazel/crypto/evp/p_rsa.cc +666 -158
  595. data/third_party/boringssl-with-bazel/crypto/evp/p_x25519.cc +290 -28
  596. data/third_party/boringssl-with-bazel/crypto/evp/p_xwing.cc +273 -0
  597. data/third_party/boringssl-with-bazel/crypto/evp/pbkdf.cc +14 -7
  598. data/third_party/boringssl-with-bazel/crypto/evp/print.cc +34 -89
  599. data/third_party/boringssl-with-bazel/crypto/evp/scrypt.cc +23 -21
  600. data/third_party/boringssl-with-bazel/crypto/evp/sign.cc +23 -42
  601. data/third_party/boringssl-with-bazel/crypto/ex_data.cc +40 -41
  602. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes.cc.inc +34 -28
  603. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes_nohw.cc.inc +119 -121
  604. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cbc.cc.inc +16 -14
  605. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cfb.cc.inc +12 -10
  606. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ctr.cc.inc +7 -5
  607. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm.cc.inc +39 -29
  608. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm_nohw.cc.inc +15 -13
  609. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/internal.h +193 -177
  610. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/key_wrap.cc.inc +5 -3
  611. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/mode_wrappers.cc.inc +7 -3
  612. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ofb.cc.inc +7 -5
  613. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm.cc +24 -19
  614. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm_interface.h +512 -384
  615. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/add.cc.inc +7 -5
  616. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc +63 -44
  617. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bn.cc.inc +40 -37
  618. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bytes.cc.inc +27 -22
  619. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/cmp.cc.inc +9 -7
  620. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/ctx.cc.inc +62 -126
  621. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div.cc.inc +92 -167
  622. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div_extra.cc.inc +15 -12
  623. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/exponentiation.cc.inc +96 -93
  624. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd.cc.inc +73 -92
  625. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd_extra.cc.inc +59 -71
  626. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/generic.cc.inc +54 -57
  627. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/internal.h +333 -255
  628. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/jacobi.cc.inc +12 -19
  629. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery.cc.inc +80 -95
  630. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery_inv.cc.inc +53 -96
  631. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/mul.cc.inc +58 -419
  632. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/prime.cc.inc +164 -213
  633. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/random.cc.inc +27 -26
  634. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.cc.inc +12 -10
  635. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.h +47 -49
  636. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/shift.cc.inc +14 -17
  637. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/sqrt.cc.inc +19 -108
  638. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/aead.cc.inc +427 -105
  639. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/cipher.cc.inc +412 -212
  640. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aes.cc.inc +230 -225
  641. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aesccm.cc.inc +115 -84
  642. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/internal.h +374 -27
  643. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cmac/cmac.cc.inc +28 -23
  644. data/third_party/boringssl-with-bazel/crypto/fipsmodule/delocate.h +36 -40
  645. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/check.cc.inc +68 -78
  646. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/dh.cc.inc +154 -196
  647. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/internal.h +24 -24
  648. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digest.cc.inc +40 -69
  649. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digests.cc.inc +13 -7
  650. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/internal.h +13 -11
  651. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/md32_common.h +86 -81
  652. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digestsign/digestsign.cc.inc +38 -34
  653. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec.cc.inc +187 -196
  654. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_key.cc.inc +196 -154
  655. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_montgomery.cc.inc +65 -125
  656. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/felem.cc.inc +85 -22
  657. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/internal.h +281 -287
  658. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/oct.cc.inc +23 -22
  659. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256.cc.inc +514 -573
  660. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256_internal.h +193 -0
  661. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/scalar.cc.inc +44 -39
  662. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple.cc.inc +58 -90
  663. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple_mul.cc.inc +39 -34
  664. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/util.cc.inc +6 -3
  665. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/wnaf.cc.inc +23 -20
  666. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdh/ecdh.cc.inc +6 -3
  667. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +47 -37
  668. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/internal.h +5 -10
  669. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/internal.h +38 -0
  670. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/jitter.cc.inc +463 -0
  671. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/sha512.cc.inc +329 -0
  672. data/third_party/boringssl-with-bazel/crypto/fipsmodule/hkdf/hkdf.cc.inc +8 -6
  673. data/third_party/boringssl-with-bazel/crypto/fipsmodule/hmac/hmac.cc.inc +19 -16
  674. data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/internal.h +41 -15
  675. data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/keccak.cc.inc +172 -44
  676. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/fips_known_values.inc +5 -5
  677. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/mldsa.cc.inc +1632 -766
  678. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/fips_known_values.inc +5 -5
  679. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/mlkem.cc.inc +740 -436
  680. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/android_entropy_client.cc.inc +82 -0
  681. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/ctrdrbg.cc.inc +240 -53
  682. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/internal.h +41 -26
  683. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/rand.cc.inc +221 -218
  684. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/internal.h +64 -67
  685. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/padding.cc.inc +49 -57
  686. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa.cc.inc +247 -234
  687. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa_impl.cc.inc +392 -692
  688. data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/fips.cc.inc +10 -10
  689. data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/self_check.cc.inc +479 -449
  690. data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/internal.h +34 -11
  691. data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +46 -43
  692. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/internal.h +61 -70
  693. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha1.cc.inc +27 -13
  694. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha256.cc.inc +46 -30
  695. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha512.cc.inc +47 -47
  696. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/address.h +98 -73
  697. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.cc.inc +108 -98
  698. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.h +14 -24
  699. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.cc.inc +94 -91
  700. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.h +19 -31
  701. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/params.h +156 -56
  702. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +318 -132
  703. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.cc.inc +234 -81
  704. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.h +20 -34
  705. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.cc.inc +97 -96
  706. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.h +10 -20
  707. data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/internal.h +2 -16
  708. data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/kdf.cc.inc +26 -26
  709. data/third_party/boringssl-with-bazel/crypto/fuzzer_mode.cc +5 -5
  710. data/third_party/boringssl-with-bazel/crypto/hpke/hpke.cc +461 -97
  711. data/third_party/boringssl-with-bazel/crypto/hrss/hrss.cc +153 -149
  712. data/third_party/boringssl-with-bazel/crypto/hrss/internal.h +9 -13
  713. data/third_party/boringssl-with-bazel/crypto/internal.h +531 -394
  714. data/third_party/boringssl-with-bazel/crypto/kyber/internal.h +117 -12
  715. data/third_party/boringssl-with-bazel/crypto/kyber/kyber.cc +59 -58
  716. data/third_party/boringssl-with-bazel/crypto/lhash/internal.h +38 -37
  717. data/third_party/boringssl-with-bazel/crypto/lhash/lhash.cc +68 -65
  718. data/third_party/boringssl-with-bazel/crypto/md4/md4.cc +19 -6
  719. data/third_party/boringssl-with-bazel/crypto/md5/internal.h +6 -9
  720. data/third_party/boringssl-with-bazel/crypto/md5/md5.cc +18 -6
  721. data/third_party/boringssl-with-bazel/crypto/mem.cc +61 -65
  722. data/third_party/boringssl-with-bazel/crypto/mem_internal.h +671 -0
  723. data/third_party/boringssl-with-bazel/crypto/mldsa/mldsa.cc +238 -32
  724. data/third_party/boringssl-with-bazel/crypto/mlkem/mlkem.cc +21 -65
  725. data/third_party/boringssl-with-bazel/crypto/obj/obj.cc +132 -157
  726. data/third_party/boringssl-with-bazel/crypto/obj/obj_dat.h +79 -1
  727. data/third_party/boringssl-with-bazel/crypto/obj/obj_xref.cc +14 -11
  728. data/third_party/boringssl-with-bazel/crypto/params_internal.h +30 -0
  729. data/third_party/boringssl-with-bazel/crypto/pem/internal.h +20 -15
  730. data/third_party/boringssl-with-bazel/crypto/pem/pem_all.cc +20 -19
  731. data/third_party/boringssl-with-bazel/crypto/pem/pem_info.cc +72 -76
  732. data/third_party/boringssl-with-bazel/crypto/pem/pem_lib.cc +215 -217
  733. data/third_party/boringssl-with-bazel/crypto/pem/pem_oth.cc +6 -6
  734. data/third_party/boringssl-with-bazel/crypto/pem/pem_pk8.cc +13 -13
  735. data/third_party/boringssl-with-bazel/crypto/pem/pem_pkey.cc +11 -11
  736. data/third_party/boringssl-with-bazel/crypto/pkcs7/internal.h +12 -17
  737. data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7.cc +29 -27
  738. data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7_x509.cc +55 -49
  739. data/third_party/boringssl-with-bazel/crypto/pkcs8/internal.h +21 -26
  740. data/third_party/boringssl-with-bazel/crypto/pkcs8/p5_pbev2.cc +33 -31
  741. data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8.cc +73 -81
  742. data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8_x509.cc +139 -138
  743. data/third_party/boringssl-with-bazel/crypto/poly1305/internal.h +3 -7
  744. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305.cc +5 -4
  745. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_arm.cc +43 -47
  746. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_vec.cc +29 -26
  747. data/third_party/boringssl-with-bazel/crypto/pool/internal.h +64 -20
  748. data/third_party/boringssl-with-bazel/crypto/pool/pool.cc +177 -157
  749. data/third_party/boringssl-with-bazel/crypto/rand/deterministic.cc +9 -16
  750. data/third_party/boringssl-with-bazel/crypto/rand/fork_detect.cc +70 -42
  751. data/third_party/boringssl-with-bazel/crypto/rand/forkunsafe.cc +7 -7
  752. data/third_party/boringssl-with-bazel/crypto/rand/getentropy.cc +6 -13
  753. data/third_party/boringssl-with-bazel/crypto/rand/internal.h +16 -4
  754. data/third_party/boringssl-with-bazel/crypto/rand/ios.cc +4 -11
  755. data/third_party/boringssl-with-bazel/crypto/rand/rand.cc +11 -9
  756. data/third_party/boringssl-with-bazel/crypto/rand/trusty.cc +4 -11
  757. data/third_party/boringssl-with-bazel/crypto/rand/urandom.cc +16 -195
  758. data/third_party/boringssl-with-bazel/crypto/rand/windows.cc +12 -19
  759. data/third_party/boringssl-with-bazel/crypto/refcount.cc +7 -17
  760. data/third_party/boringssl-with-bazel/crypto/rsa/internal.h +22 -7
  761. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_asn1.cc +199 -78
  762. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_crypt.cc +49 -50
  763. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_extra.cc +11 -0
  764. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_print.cc +4 -6
  765. data/third_party/boringssl-with-bazel/crypto/sha/sha1.cc +3 -0
  766. data/third_party/boringssl-with-bazel/crypto/sha/sha256.cc +3 -1
  767. data/third_party/boringssl-with-bazel/crypto/sha/sha512.cc +6 -4
  768. data/third_party/boringssl-with-bazel/crypto/siphash/siphash.cc +2 -0
  769. data/third_party/boringssl-with-bazel/crypto/slhdsa/slhdsa.cc +43 -6
  770. data/third_party/boringssl-with-bazel/crypto/spake2plus/internal.h +31 -31
  771. data/third_party/boringssl-with-bazel/crypto/spake2plus/spake2plus.cc +1 -1
  772. data/third_party/boringssl-with-bazel/crypto/stack/stack.cc +89 -130
  773. data/third_party/boringssl-with-bazel/crypto/thread.cc +14 -14
  774. data/third_party/boringssl-with-bazel/crypto/thread_none.cc +10 -13
  775. data/third_party/boringssl-with-bazel/crypto/thread_pthread.cc +22 -35
  776. data/third_party/boringssl-with-bazel/crypto/thread_win.cc +29 -40
  777. data/third_party/boringssl-with-bazel/crypto/trust_token/internal.h +81 -88
  778. data/third_party/boringssl-with-bazel/crypto/trust_token/pmbtoken.cc +160 -144
  779. data/third_party/boringssl-with-bazel/crypto/trust_token/trust_token.cc +96 -80
  780. data/third_party/boringssl-with-bazel/crypto/trust_token/voprf.cc +90 -87
  781. data/third_party/boringssl-with-bazel/crypto/x509/a_digest.cc +5 -5
  782. data/third_party/boringssl-with-bazel/crypto/x509/a_sign.cc +51 -48
  783. data/third_party/boringssl-with-bazel/crypto/x509/a_verify.cc +30 -34
  784. data/third_party/boringssl-with-bazel/crypto/x509/algorithm.cc +47 -16
  785. data/third_party/boringssl-with-bazel/crypto/x509/asn1_gen.cc +41 -43
  786. data/third_party/boringssl-with-bazel/crypto/x509/by_dir.cc +183 -237
  787. data/third_party/boringssl-with-bazel/crypto/x509/by_file.cc +29 -30
  788. data/third_party/boringssl-with-bazel/crypto/x509/internal.h +276 -180
  789. data/third_party/boringssl-with-bazel/crypto/x509/name_print.cc +15 -13
  790. data/third_party/boringssl-with-bazel/crypto/x509/policy.cc +415 -525
  791. data/third_party/boringssl-with-bazel/crypto/x509/rsa_pss.cc +94 -271
  792. data/third_party/boringssl-with-bazel/crypto/x509/t_crl.cc +11 -8
  793. data/third_party/boringssl-with-bazel/crypto/x509/t_req.cc +26 -23
  794. data/third_party/boringssl-with-bazel/crypto/x509/t_x509.cc +26 -22
  795. data/third_party/boringssl-with-bazel/crypto/x509/t_x509a.cc +3 -1
  796. data/third_party/boringssl-with-bazel/crypto/x509/v3_akey.cc +69 -76
  797. data/third_party/boringssl-with-bazel/crypto/x509/v3_akeya.cc +2 -2
  798. data/third_party/boringssl-with-bazel/crypto/x509/v3_alt.cc +112 -69
  799. data/third_party/boringssl-with-bazel/crypto/x509/v3_bcons.cc +15 -14
  800. data/third_party/boringssl-with-bazel/crypto/x509/v3_bitst.cc +16 -18
  801. data/third_party/boringssl-with-bazel/crypto/x509/v3_conf.cc +62 -67
  802. data/third_party/boringssl-with-bazel/crypto/x509/v3_cpols.cc +143 -170
  803. data/third_party/boringssl-with-bazel/crypto/x509/v3_crld.cc +121 -165
  804. data/third_party/boringssl-with-bazel/crypto/x509/v3_enum.cc +13 -12
  805. data/third_party/boringssl-with-bazel/crypto/x509/v3_extku.cc +17 -34
  806. data/third_party/boringssl-with-bazel/crypto/x509/v3_genn.cc +20 -10
  807. data/third_party/boringssl-with-bazel/crypto/x509/v3_ia5.cc +22 -18
  808. data/third_party/boringssl-with-bazel/crypto/x509/v3_info.cc +45 -47
  809. data/third_party/boringssl-with-bazel/crypto/x509/v3_int.cc +35 -33
  810. data/third_party/boringssl-with-bazel/crypto/x509/v3_lib.cc +106 -61
  811. data/third_party/boringssl-with-bazel/crypto/x509/v3_ncons.cc +642 -358
  812. data/third_party/boringssl-with-bazel/crypto/x509/v3_ocsp.cc +25 -22
  813. data/third_party/boringssl-with-bazel/crypto/x509/v3_pcons.cc +15 -14
  814. data/third_party/boringssl-with-bazel/crypto/x509/v3_pmaps.cc +16 -15
  815. data/third_party/boringssl-with-bazel/crypto/x509/v3_prn.cc +6 -6
  816. data/third_party/boringssl-with-bazel/crypto/x509/v3_purp.cc +150 -137
  817. data/third_party/boringssl-with-bazel/crypto/x509/v3_skey.cc +23 -26
  818. data/third_party/boringssl-with-bazel/crypto/x509/v3_utl.cc +151 -178
  819. data/third_party/boringssl-with-bazel/crypto/x509/x509.cc +1 -1
  820. data/third_party/boringssl-with-bazel/crypto/x509/x509_att.cc +32 -30
  821. data/third_party/boringssl-with-bazel/crypto/x509/x509_cmp.cc +95 -88
  822. data/third_party/boringssl-with-bazel/crypto/x509/x509_d2.cc +9 -9
  823. data/third_party/boringssl-with-bazel/crypto/x509/x509_def.cc +6 -8
  824. data/third_party/boringssl-with-bazel/crypto/x509/x509_ext.cc +46 -24
  825. data/third_party/boringssl-with-bazel/crypto/x509/x509_lu.cc +211 -195
  826. data/third_party/boringssl-with-bazel/crypto/x509/x509_obj.cc +20 -16
  827. data/third_party/boringssl-with-bazel/crypto/x509/x509_req.cc +37 -46
  828. data/third_party/boringssl-with-bazel/crypto/x509/x509_set.cc +62 -90
  829. data/third_party/boringssl-with-bazel/crypto/x509/x509_trs.cc +18 -13
  830. data/third_party/boringssl-with-bazel/crypto/x509/x509_v3.cc +33 -33
  831. data/third_party/boringssl-with-bazel/crypto/x509/x509_vfy.cc +109 -110
  832. data/third_party/boringssl-with-bazel/crypto/x509/x509_vpm.cc +56 -47
  833. data/third_party/boringssl-with-bazel/crypto/x509/x509cset.cc +27 -40
  834. data/third_party/boringssl-with-bazel/crypto/x509/x509name.cc +77 -67
  835. data/third_party/boringssl-with-bazel/crypto/x509/x509rset.cc +5 -17
  836. data/third_party/boringssl-with-bazel/crypto/x509/x509spki.cc +13 -13
  837. data/third_party/boringssl-with-bazel/crypto/x509/x_algor.cc +131 -24
  838. data/third_party/boringssl-with-bazel/crypto/x509/x_all.cc +72 -39
  839. data/third_party/boringssl-with-bazel/crypto/x509/x_attrib.cc +10 -4
  840. data/third_party/boringssl-with-bazel/crypto/x509/x_crl.cc +77 -44
  841. data/third_party/boringssl-with-bazel/crypto/x509/x_exten.cc +6 -0
  842. data/third_party/boringssl-with-bazel/crypto/x509/x_name.cc +311 -383
  843. data/third_party/boringssl-with-bazel/crypto/x509/x_pubkey.cc +129 -82
  844. data/third_party/boringssl-with-bazel/crypto/x509/x_req.cc +11 -6
  845. data/third_party/boringssl-with-bazel/crypto/x509/x_sig.cc +4 -4
  846. data/third_party/boringssl-with-bazel/crypto/x509/x_spki.cc +11 -1
  847. data/third_party/boringssl-with-bazel/crypto/x509/x_x509.cc +285 -280
  848. data/third_party/boringssl-with-bazel/crypto/x509/x_x509a.cc +60 -60
  849. data/third_party/boringssl-with-bazel/crypto/xwing/xwing.cc +257 -0
  850. data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_64_win_asm.inc +301 -0
  851. data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_win_asm.inc +301 -0
  852. data/third_party/boringssl-with-bazel/gen/crypto/err_data.cc +526 -500
  853. data/third_party/boringssl-with-bazel/include/openssl/aead.h +286 -114
  854. data/third_party/boringssl-with-bazel/include/openssl/aes.h +43 -43
  855. data/third_party/boringssl-with-bazel/include/openssl/asm_base.h +29 -16
  856. data/third_party/boringssl-with-bazel/include/openssl/asn1.h +641 -631
  857. data/third_party/boringssl-with-bazel/include/openssl/asn1t.h +7 -9
  858. data/third_party/boringssl-with-bazel/include/openssl/base.h +34 -54
  859. data/third_party/boringssl-with-bazel/include/openssl/base64.h +30 -30
  860. data/third_party/boringssl-with-bazel/include/openssl/bio.h +373 -316
  861. data/third_party/boringssl-with-bazel/include/openssl/blake2.h +15 -11
  862. data/third_party/boringssl-with-bazel/include/openssl/blowfish.h +10 -3
  863. data/third_party/boringssl-with-bazel/include/openssl/bn.h +298 -306
  864. data/third_party/boringssl-with-bazel/include/openssl/buf.h +14 -14
  865. data/third_party/boringssl-with-bazel/include/openssl/bytestring.h +272 -207
  866. data/third_party/boringssl-with-bazel/include/openssl/cast.h +45 -8
  867. data/third_party/boringssl-with-bazel/include/openssl/chacha.h +3 -3
  868. data/third_party/boringssl-with-bazel/include/openssl/cipher.h +334 -152
  869. data/third_party/boringssl-with-bazel/include/openssl/cmac.h +13 -13
  870. data/third_party/boringssl-with-bazel/include/openssl/cms.h +35 -34
  871. data/third_party/boringssl-with-bazel/include/openssl/conf.h +15 -14
  872. data/third_party/boringssl-with-bazel/include/openssl/crypto.h +15 -13
  873. data/third_party/boringssl-with-bazel/include/openssl/ctrdrbg.h +49 -15
  874. data/third_party/boringssl-with-bazel/include/openssl/curve25519.h +24 -24
  875. data/third_party/boringssl-with-bazel/include/openssl/des.h +22 -16
  876. data/third_party/boringssl-with-bazel/include/openssl/dh.h +95 -95
  877. data/third_party/boringssl-with-bazel/include/openssl/digest.h +140 -71
  878. data/third_party/boringssl-with-bazel/include/openssl/dsa.h +101 -101
  879. data/third_party/boringssl-with-bazel/include/openssl/ec.h +143 -119
  880. data/third_party/boringssl-with-bazel/include/openssl/ec_key.h +97 -97
  881. data/third_party/boringssl-with-bazel/include/openssl/ecdh.h +9 -9
  882. data/third_party/boringssl-with-bazel/include/openssl/ecdsa.h +89 -46
  883. data/third_party/boringssl-with-bazel/include/openssl/engine.h +5 -5
  884. data/third_party/boringssl-with-bazel/include/openssl/err.h +73 -71
  885. data/third_party/boringssl-with-bazel/include/openssl/evp.h +824 -344
  886. data/third_party/boringssl-with-bazel/include/openssl/evp_errors.h +9 -2
  887. data/third_party/boringssl-with-bazel/include/openssl/ex_data.h +27 -32
  888. data/third_party/boringssl-with-bazel/include/openssl/hkdf.h +6 -6
  889. data/third_party/boringssl-with-bazel/include/openssl/hmac.h +31 -31
  890. data/third_party/boringssl-with-bazel/include/openssl/hpke.h +133 -117
  891. data/third_party/boringssl-with-bazel/include/openssl/hrss.h +14 -8
  892. data/third_party/boringssl-with-bazel/include/openssl/kdf.h +20 -19
  893. data/third_party/boringssl-with-bazel/include/openssl/lhash.h +4 -25
  894. data/third_party/boringssl-with-bazel/include/openssl/md4.h +14 -7
  895. data/third_party/boringssl-with-bazel/include/openssl/md5.h +7 -7
  896. data/third_party/boringssl-with-bazel/include/openssl/mem.h +38 -38
  897. data/third_party/boringssl-with-bazel/include/openssl/mldsa.h +380 -24
  898. data/third_party/boringssl-with-bazel/include/openssl/mlkem.h +43 -43
  899. data/third_party/boringssl-with-bazel/include/openssl/nid.h +1297 -2
  900. data/third_party/boringssl-with-bazel/include/openssl/obj.h +49 -49
  901. data/third_party/boringssl-with-bazel/include/openssl/opensslconf.h +30 -0
  902. data/third_party/boringssl-with-bazel/include/openssl/params.h +42 -0
  903. data/third_party/boringssl-with-bazel/include/openssl/pem.h +39 -30
  904. data/third_party/boringssl-with-bazel/include/openssl/pkcs7.h +40 -40
  905. data/third_party/boringssl-with-bazel/include/openssl/pkcs8.h +69 -63
  906. data/third_party/boringssl-with-bazel/include/openssl/poly1305.h +8 -5
  907. data/third_party/boringssl-with-bazel/include/openssl/pool.h +54 -25
  908. data/third_party/boringssl-with-bazel/include/openssl/posix_time.h +6 -6
  909. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols.h +7866 -0
  910. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_S.h +585 -0
  911. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_c.h +305 -0
  912. data/third_party/boringssl-with-bazel/include/openssl/rand.h +18 -18
  913. data/third_party/boringssl-with-bazel/include/openssl/rc4.h +4 -4
  914. data/third_party/boringssl-with-bazel/include/openssl/ripemd.h +15 -10
  915. data/third_party/boringssl-with-bazel/include/openssl/rsa.h +272 -235
  916. data/third_party/boringssl-with-bazel/include/openssl/service_indicator.h +4 -81
  917. data/third_party/boringssl-with-bazel/include/openssl/sha.h +43 -166
  918. data/third_party/boringssl-with-bazel/include/openssl/sha2.h +201 -0
  919. data/third_party/boringssl-with-bazel/include/openssl/slhdsa.h +100 -48
  920. data/third_party/boringssl-with-bazel/include/openssl/span.h +190 -75
  921. data/third_party/boringssl-with-bazel/include/openssl/ssl.h +2168 -1567
  922. data/third_party/boringssl-with-bazel/include/openssl/ssl3.h +11 -69
  923. data/third_party/boringssl-with-bazel/include/openssl/stack.h +135 -80
  924. data/third_party/boringssl-with-bazel/include/openssl/target.h +13 -1
  925. data/third_party/boringssl-with-bazel/include/openssl/thread.h +0 -10
  926. data/third_party/boringssl-with-bazel/include/openssl/tls1.h +31 -310
  927. data/third_party/boringssl-with-bazel/include/openssl/tls_prf.h +47 -0
  928. data/third_party/boringssl-with-bazel/include/openssl/trust_token.h +97 -92
  929. data/third_party/boringssl-with-bazel/include/openssl/type_check.h +1 -1
  930. data/third_party/boringssl-with-bazel/include/openssl/x509.h +1805 -1857
  931. data/third_party/boringssl-with-bazel/include/openssl/x509v3.h +1 -1
  932. data/third_party/boringssl-with-bazel/include/openssl/xwing.h +115 -0
  933. data/third_party/boringssl-with-bazel/ssl/bio_ssl.cc +24 -19
  934. data/third_party/boringssl-with-bazel/ssl/d1_both.cc +59 -57
  935. data/third_party/boringssl-with-bazel/ssl/d1_lib.cc +53 -42
  936. data/third_party/boringssl-with-bazel/ssl/d1_pkt.cc +4 -4
  937. data/third_party/boringssl-with-bazel/ssl/d1_srtp.cc +2 -2
  938. data/third_party/boringssl-with-bazel/ssl/dtls_method.cc +10 -10
  939. data/third_party/boringssl-with-bazel/ssl/dtls_record.cc +6 -6
  940. data/third_party/boringssl-with-bazel/ssl/encrypted_client_hello.cc +61 -71
  941. data/third_party/boringssl-with-bazel/ssl/extensions.cc +967 -366
  942. data/third_party/boringssl-with-bazel/ssl/handoff.cc +77 -38
  943. data/third_party/boringssl-with-bazel/ssl/handshake.cc +63 -30
  944. data/third_party/boringssl-with-bazel/ssl/handshake_client.cc +129 -85
  945. data/third_party/boringssl-with-bazel/ssl/handshake_server.cc +116 -68
  946. data/third_party/boringssl-with-bazel/ssl/internal.h +983 -1207
  947. data/third_party/boringssl-with-bazel/ssl/s3_both.cc +34 -29
  948. data/third_party/boringssl-with-bazel/ssl/s3_lib.cc +4 -3
  949. data/third_party/boringssl-with-bazel/ssl/s3_pkt.cc +12 -12
  950. data/third_party/boringssl-with-bazel/ssl/ssl_aead_ctx.cc +5 -5
  951. data/third_party/boringssl-with-bazel/ssl/ssl_asn1.cc +114 -59
  952. data/third_party/boringssl-with-bazel/ssl/ssl_buffer.cc +17 -18
  953. data/third_party/boringssl-with-bazel/ssl/ssl_cert.cc +99 -61
  954. data/third_party/boringssl-with-bazel/ssl/ssl_cipher.cc +143 -134
  955. data/third_party/boringssl-with-bazel/ssl/ssl_credential.cc +188 -90
  956. data/third_party/boringssl-with-bazel/ssl/ssl_file.cc +132 -225
  957. data/third_party/boringssl-with-bazel/ssl/ssl_key_share.cc +79 -7
  958. data/third_party/boringssl-with-bazel/ssl/ssl_lib.cc +698 -302
  959. data/third_party/boringssl-with-bazel/ssl/ssl_privkey.cc +102 -45
  960. data/third_party/boringssl-with-bazel/ssl/ssl_session.cc +117 -102
  961. data/third_party/boringssl-with-bazel/ssl/ssl_transcript.cc +3 -3
  962. data/third_party/boringssl-with-bazel/ssl/ssl_versions.cc +24 -24
  963. data/third_party/boringssl-with-bazel/ssl/ssl_x509.cc +184 -170
  964. data/third_party/boringssl-with-bazel/ssl/t1_enc.cc +12 -10
  965. data/third_party/boringssl-with-bazel/ssl/tls13_both.cc +86 -54
  966. data/third_party/boringssl-with-bazel/ssl/tls13_client.cc +176 -90
  967. data/third_party/boringssl-with-bazel/ssl/tls13_enc.cc +166 -112
  968. data/third_party/boringssl-with-bazel/ssl/tls13_server.cc +188 -97
  969. data/third_party/boringssl-with-bazel/ssl/tls_method.cc +23 -23
  970. data/third_party/boringssl-with-bazel/ssl/tls_record.cc +17 -14
  971. data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_bareminimum.c.inc +47 -0
  972. data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_platform.c.inc +137 -0
  973. data/third_party/boringssl-with-bazel/third_party/fiat/curve25519_64_adx.h +37 -33
  974. data/third_party/boringssl-with-bazel/third_party/fiat/p256_64.h +4 -93
  975. data/third_party/boringssl-with-bazel/third_party/fiat/p256_64_msvc.h +4 -69
  976. data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_32.br.c.inc +71 -0
  977. data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_64.br.c.inc +84 -0
  978. data/third_party/boringssl-with-bazel/third_party/fiat/p256_point.br.c.inc +166 -0
  979. metadata +77 -52
  980. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +0 -240
  981. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +0 -56
  982. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb.h +0 -157
  983. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c +0 -72
  984. data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +0 -181
  985. data/third_party/abseil-cpp/absl/base/internal/identity.h +0 -39
  986. data/third_party/abseil-cpp/absl/base/internal/nullability_deprecated.h +0 -106
  987. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -105
  988. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -50
  989. data/third_party/abseil-cpp/absl/strings/string_view.cc +0 -257
  990. data/third_party/boringssl-with-bazel/crypto/evp/p_dh_asn1.cc +0 -142
  991. data/third_party/boringssl-with-bazel/crypto/evp/p_dsa_asn1.cc +0 -279
  992. data/third_party/boringssl-with-bazel/crypto/evp/p_ec_asn1.cc +0 -286
  993. data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519_asn1.cc +0 -225
  994. data/third_party/boringssl-with-bazel/crypto/evp/p_rsa_asn1.cc +0 -198
  995. data/third_party/boringssl-with-bazel/crypto/evp/p_x25519_asn1.cc +0 -237
  996. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p224-64.cc.inc +0 -1163
  997. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.cc.inc +0 -741
  998. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.h +0 -207
  999. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/blinding.cc.inc +0 -147
  1000. data/third_party/boringssl-with-bazel/crypto/rand/getrandom_fillin.h +0 -64
  1001. data/third_party/boringssl-with-bazel/crypto/rand/passive.cc +0 -178
  1002. data/third_party/boringssl-with-bazel/crypto/x509/ext_dat.h +0 -92
  1003. data/third_party/boringssl-with-bazel/include/openssl/bcm_public.h +0 -82
  1004. data/third_party/boringssl-with-bazel/include/openssl/experimental/kyber.h +0 -146
@@ -20,8 +20,12 @@
20
20
  #include <array>
21
21
  #include <cassert>
22
22
  #include <cmath>
23
+ #include <cstdint>
24
+ #include <cstring>
23
25
  #include <limits>
26
+ #include <optional>
24
27
  #include <string>
28
+ #include <type_traits>
25
29
 
26
30
  #include "absl/base/attributes.h"
27
31
  #include "absl/base/config.h"
@@ -31,8 +35,9 @@
31
35
  #include "absl/numeric/bits.h"
32
36
  #include "absl/numeric/int128.h"
33
37
  #include "absl/numeric/internal/representation.h"
38
+ #include "absl/strings/internal/str_format/extension.h"
34
39
  #include "absl/strings/numbers.h"
35
- #include "absl/types/optional.h"
40
+ #include "absl/strings/string_view.h"
36
41
  #include "absl/types/span.h"
37
42
 
38
43
  namespace absl {
@@ -96,7 +101,7 @@ class StackArray {
96
101
  // Requires: `0 <= carry <= 9`
97
102
  template <typename Int>
98
103
  inline char MultiplyBy10WithCarry(Int* v, char carry) {
99
- using BiggerInt = absl::conditional_t<sizeof(Int) == 4, uint64_t, uint128>;
104
+ using BiggerInt = std::conditional_t<sizeof(Int) == 4, uint64_t, uint128>;
100
105
  BiggerInt tmp =
101
106
  10 * static_cast<BiggerInt>(*v) + static_cast<BiggerInt>(carry);
102
107
  *v = static_cast<Int>(tmp);
@@ -133,7 +138,7 @@ class BinaryToDecimal {
133
138
  // We will left shift a uint128 by `exp` bits, so we need `128+exp` total
134
139
  // bits. Round up to 32.
135
140
  // See constructor for details about adding `10%` to the value.
136
- return static_cast<size_t>((128 + exp + 31) / 32 * 11 / 10);
141
+ return static_cast<size_t>(((128 + exp + 31) / 32 * 11 + 9) / 10);
137
142
  }
138
143
 
139
144
  public:
@@ -245,6 +250,12 @@ class BinaryToDecimal {
245
250
  // Requires `-exp < 0` and
246
251
  // `-exp >= limits<MaxFloatType>::min_exponent - limits<MaxFloatType>::digits`.
247
252
  class FractionalDigitGenerator {
253
+ private:
254
+ static constexpr size_t ChunksNeeded(int exp) {
255
+ // We need 128 bits for mantissa and `exp` bits for exponent.
256
+ return static_cast<size_t>((128 + exp + 31) / 32);
257
+ }
258
+
248
259
  public:
249
260
  // Run the conversion for `v * 2^exp` and call `f(generator)`.
250
261
  // This function will allocate enough stack space to perform the conversion.
@@ -252,13 +263,15 @@ class FractionalDigitGenerator {
252
263
  uint128 v, int exp, absl::FunctionRef<void(FractionalDigitGenerator)> f) {
253
264
  using Limits = std::numeric_limits<MaxFloatType>;
254
265
  assert(-exp < 0);
255
- assert(-exp >= Limits::min_exponent - 128);
266
+ // We need enough precision to cover all digits of MaxFloatType, and we add
267
+ // 128 bits of headroom for fractional digit generation.
268
+ const int margin = Limits::digits + 128;
269
+ assert(-exp >= Limits::min_exponent - margin);
256
270
  static_assert(StackArray::kMaxCapacity >=
257
- (Limits::digits + 128 - Limits::min_exponent + 31) / 32,
271
+ ChunksNeeded(margin - Limits::min_exponent),
258
272
  "");
259
273
  StackArray::RunWithCapacity(
260
- static_cast<size_t>((Limits::digits + exp + 31) / 32),
261
- [=](absl::Span<uint32_t> input) {
274
+ ChunksNeeded(exp), [=](absl::Span<uint32_t> input) {
262
275
  f(FractionalDigitGenerator(input, v, exp));
263
276
  });
264
277
  }
@@ -451,6 +464,71 @@ char* PrintFractionalDigitsFast(uint128 v,
451
464
  return p;
452
465
  }
453
466
 
467
+ struct FractionalDigitPrinterResult {
468
+ char* end;
469
+ size_t skipped_zeros;
470
+ bool nonzero_remainder;
471
+ };
472
+
473
+ FractionalDigitPrinterResult PrintFractionalDigitsScientific(
474
+ uint64_t v, char* start, int exp, size_t precision, bool skip_zeros) {
475
+ char* p = start;
476
+ v <<= (64 - exp);
477
+
478
+ size_t skipped_zeros = 0;
479
+ while (v != 0 && precision > 0) {
480
+ char carry = MultiplyBy10WithCarry(&v, 0);
481
+ if (skip_zeros) {
482
+ if (carry == 0) {
483
+ ++skipped_zeros;
484
+ continue;
485
+ }
486
+ skip_zeros = false;
487
+ }
488
+ *p++ = carry + '0';
489
+ --precision;
490
+ }
491
+ return {p, skipped_zeros, v != 0};
492
+ }
493
+
494
+ FractionalDigitPrinterResult PrintFractionalDigitsScientific(
495
+ uint128 v, char* start, int exp, size_t precision, bool skip_zeros) {
496
+ char* p = start;
497
+ v <<= (128 - exp);
498
+ auto high = static_cast<uint64_t>(v >> 64);
499
+ auto low = static_cast<uint64_t>(v);
500
+
501
+ size_t skipped_zeros = 0;
502
+ while (precision > 0 && low != 0) {
503
+ char carry = MultiplyBy10WithCarry(&low, 0);
504
+ carry = MultiplyBy10WithCarry(&high, carry);
505
+ if (skip_zeros) {
506
+ if (carry == 0) {
507
+ ++skipped_zeros;
508
+ continue;
509
+ }
510
+ skip_zeros = false;
511
+ }
512
+ *p++ = carry + '0';
513
+ --precision;
514
+ }
515
+
516
+ while (precision > 0 && high != 0) {
517
+ char carry = MultiplyBy10WithCarry(&high, 0);
518
+ if (skip_zeros) {
519
+ if (carry == 0) {
520
+ ++skipped_zeros;
521
+ continue;
522
+ }
523
+ skip_zeros = false;
524
+ }
525
+ *p++ = carry + '0';
526
+ --precision;
527
+ }
528
+
529
+ return {p, skipped_zeros, high != 0 || low != 0};
530
+ }
531
+
454
532
  struct FormatState {
455
533
  char sign_char;
456
534
  size_t precision;
@@ -575,7 +653,8 @@ void FormatFFast(Int v, int exp, const FormatState &state) {
575
653
  // Prints `v*2^exp` with the options from `state`.
576
654
  // This one is guaranteed to not have fractional digits, so we don't have to
577
655
  // worry about anything after the `.`.
578
- void FormatFPositiveExpSlow(uint128 v, int exp, const FormatState &state) {
656
+ void FormatFPositiveExpSlow(uint128 v, int exp, const FormatState& state,
657
+ bool strip_trailing_zeros = false) {
579
658
  BinaryToDecimal::RunConversion(v, exp, [&](BinaryToDecimal btd) {
580
659
  const size_t total_digits =
581
660
  btd.TotalDigits() + (state.ShouldPrintDot() ? state.precision + 1 : 0);
@@ -592,9 +671,12 @@ void FormatFPositiveExpSlow(uint128 v, int exp, const FormatState &state) {
592
671
  state.sink->Append(btd.CurrentDigits());
593
672
  } while (btd.AdvanceDigits());
594
673
 
595
- if (state.ShouldPrintDot())
674
+ if (state.ShouldPrintDot() && !strip_trailing_zeros) {
596
675
  state.sink->Append(1, '.');
597
- state.sink->Append(state.precision, '0');
676
+ }
677
+ if (!strip_trailing_zeros) {
678
+ state.sink->Append(state.precision, '0');
679
+ }
598
680
  state.sink->Append(padding.right_spaces, ' ');
599
681
  });
600
682
  }
@@ -604,20 +686,21 @@ void FormatFPositiveExpSlow(uint128 v, int exp, const FormatState &state) {
604
686
  // Prints `v*2^exp` with the options from `state`.
605
687
  // This one is guaranteed to be < 1.0, so we don't have to worry about integral
606
688
  // digits.
607
- void FormatFNegativeExpSlow(uint128 v, int exp, const FormatState &state) {
689
+ void FormatFNegativeExpSlow(uint128 v, int exp, const FormatState& state,
690
+ size_t digits_to_trim = 0) {
691
+ const bool print_dot =
692
+ (state.precision > digits_to_trim) || state.conv.has_alt_flag();
608
693
  const size_t total_digits =
609
- /* 0 */ 1 + (state.ShouldPrintDot() ? state.precision + 1 : 0);
694
+ /* 0 */ 1 + (print_dot ? (state.precision - digits_to_trim) + 1 : 0);
610
695
  auto padding =
611
696
  ExtraWidthToPadding(total_digits + (state.sign_char ? 1 : 0), state);
612
697
  padding.zeros += 1;
613
698
  state.sink->Append(padding.left_spaces, ' ');
614
699
  if (state.sign_char != '\0') state.sink->Append(1, state.sign_char);
615
700
  state.sink->Append(padding.zeros, '0');
616
-
617
- if (state.ShouldPrintDot()) state.sink->Append(1, '.');
618
-
701
+ if (print_dot) state.sink->Append(1, '.');
619
702
  // Print digits
620
- size_t digits_to_go = state.precision;
703
+ size_t digits_to_go = state.precision - digits_to_trim;
621
704
 
622
705
  FractionalDigitGenerator::RunConversion(
623
706
  v, exp, [&](FractionalDigitGenerator digit_gen) {
@@ -1081,25 +1164,6 @@ void RoundUp(Buffer *buffer, int *exp) {
1081
1164
  }
1082
1165
  }
1083
1166
 
1084
- void PrintExponent(int exp, char e, Buffer *out) {
1085
- out->push_back(e);
1086
- if (exp < 0) {
1087
- out->push_back('-');
1088
- exp = -exp;
1089
- } else {
1090
- out->push_back('+');
1091
- }
1092
- // Exponent digits.
1093
- if (exp > 99) {
1094
- out->push_back(static_cast<char>(exp / 100 + '0'));
1095
- out->push_back(static_cast<char>(exp / 10 % 10 + '0'));
1096
- out->push_back(static_cast<char>(exp % 10 + '0'));
1097
- } else {
1098
- out->push_back(static_cast<char>(exp / 10 + '0'));
1099
- out->push_back(static_cast<char>(exp % 10 + '0'));
1100
- }
1101
- }
1102
-
1103
1167
  template <typename Float, typename Int>
1104
1168
  constexpr bool CanFitMantissa() {
1105
1169
  return
@@ -1115,8 +1179,8 @@ constexpr bool CanFitMantissa() {
1115
1179
  template <typename Float>
1116
1180
  struct Decomposed {
1117
1181
  using MantissaType =
1118
- absl::conditional_t<std::is_same<long double, Float>::value, uint128,
1119
- uint64_t>;
1182
+ std::conditional_t<std::is_same<long double, Float>::value, uint128,
1183
+ uint64_t>;
1120
1184
  static_assert(std::numeric_limits<Float>::digits <= sizeof(MantissaType) * 8,
1121
1185
  "");
1122
1186
  MantissaType mantissa;
@@ -1157,180 +1221,831 @@ size_t PrintIntegralDigits(Int digits, Buffer* out) {
1157
1221
  return printed;
1158
1222
  }
1159
1223
 
1160
- // Back out 'extra_digits' digits and round up if necessary.
1161
- void RemoveExtraPrecision(size_t extra_digits,
1162
- bool has_leftover_value,
1163
- Buffer* out,
1164
- int* exp_out) {
1165
- // Back out the extra digits
1166
- out->end -= extra_digits;
1167
-
1168
- bool needs_to_round_up = [&] {
1169
- // We look at the digit just past the end.
1170
- // There must be 'extra_digits' extra valid digits after end.
1171
- if (*out->end > '5') return true;
1172
- if (*out->end < '5') return false;
1173
- if (has_leftover_value || std::any_of(out->end + 1, out->end + extra_digits,
1174
- [](char c) { return c != '0'; }))
1175
- return true;
1224
+ std::optional<int> GetOneDigit(BinaryToDecimal& btd,
1225
+ absl::string_view& digits_view) {
1226
+ if (digits_view.empty() && !btd.AdvanceDigits()) {
1227
+ return std::nullopt;
1228
+ }
1229
+ char d = digits_view.front();
1230
+ digits_view.remove_prefix(1);
1231
+ return d - '0';
1232
+ }
1176
1233
 
1177
- // Ends in ...50*, round to even.
1178
- return out->last_digit() % 2 == 1;
1179
- }();
1234
+ struct DigitRun {
1235
+ std::optional<int> digit;
1236
+ size_t nines;
1237
+ };
1238
+
1239
+ DigitRun GetDigits(BinaryToDecimal& btd, absl::string_view& digits_view) {
1240
+ auto peek_digit = [&]() -> std::optional<int> {
1241
+ if (digits_view.empty()) {
1242
+ if (!btd.AdvanceDigits()) return std::nullopt;
1243
+ digits_view = btd.CurrentDigits();
1244
+ }
1245
+ return digits_view.front() - '0';
1246
+ };
1180
1247
 
1181
- if (needs_to_round_up) {
1182
- RoundUp<FormatStyle::Precision>(out, exp_out);
1248
+ auto digit_before_nines = GetOneDigit(btd, digits_view);
1249
+ if (!digit_before_nines.has_value()) return {std::nullopt, 0};
1250
+
1251
+ auto next_digit = peek_digit();
1252
+ size_t num_nines = 0;
1253
+ while (next_digit == 9) {
1254
+ // consume the 9
1255
+ GetOneDigit(btd, digits_view);
1256
+ ++num_nines;
1257
+ next_digit = peek_digit();
1183
1258
  }
1259
+ return digit_before_nines == 9 ? DigitRun{std::nullopt, num_nines + 1}
1260
+ : DigitRun{digit_before_nines, num_nines};
1184
1261
  }
1185
1262
 
1186
- // Print the value into the buffer.
1187
- // This will not include the exponent, which will be returned in 'exp_out' for
1188
- // Precision mode.
1189
- template <typename Int, typename Float, FormatStyle mode>
1190
- bool FloatToBufferImpl(Int int_mantissa,
1191
- int exp,
1192
- size_t precision,
1193
- Buffer* out,
1194
- int* exp_out) {
1195
- assert((CanFitMantissa<Float, Int>()));
1196
-
1197
- const int int_bits = std::numeric_limits<Int>::digits;
1198
-
1199
- // In precision mode, we start printing one char to the right because it will
1200
- // also include the '.'
1201
- // In fixed mode we put the dot afterwards on the right.
1202
- out->begin = out->end =
1203
- out->data + 1 + kMaxFixedPrecision + (mode == FormatStyle::Precision);
1204
-
1205
- if (exp >= 0) {
1206
- if (std::numeric_limits<Float>::digits + exp > int_bits) {
1207
- // The value will overflow the Int
1208
- return false;
1263
+ template <typename Int>
1264
+ void FormatE(Int mantissa, int exp, bool uppercase, const FormatState& state) {
1265
+ if (exp > 0) {
1266
+ const int total_bits =
1267
+ static_cast<int>(sizeof(Int) * 8) - LeadingZeros(mantissa) + exp;
1268
+ if (total_bits > 128) {
1269
+ FormatEPositiveExpSlow(mantissa, exp, uppercase, state);
1270
+ return;
1209
1271
  }
1210
- size_t digits_printed = PrintIntegralDigits<mode>(int_mantissa << exp, out);
1211
- size_t digits_to_zero_pad = precision;
1212
- if (mode == FormatStyle::Precision) {
1213
- *exp_out = static_cast<int>(digits_printed - 1);
1214
- if (digits_to_zero_pad < digits_printed - 1) {
1215
- RemoveExtraPrecision(digits_printed - 1 - digits_to_zero_pad, false,
1216
- out, exp_out);
1217
- return true;
1218
- }
1219
- digits_to_zero_pad -= digits_printed - 1;
1272
+ } else {
1273
+ if (ABSL_PREDICT_FALSE(exp < -128)) {
1274
+ FormatENegativeExpSlow(mantissa, exp, uppercase, state);
1275
+ return;
1220
1276
  }
1221
- for (; digits_to_zero_pad-- > 0;) out->push_back('0');
1222
- return true;
1223
1277
  }
1278
+ FormatEFast(mantissa, exp, uppercase, state);
1279
+ }
1224
1280
 
1225
- exp = -exp;
1226
- // We need at least 4 empty bits for the next decimal digit.
1227
- // We will multiply by 10.
1228
- if (exp > int_bits - 4) return false;
1229
-
1230
- const Int mask = (Int{1} << exp) - 1;
1231
-
1232
- // Print the integral part first.
1233
- size_t digits_printed = PrintIntegralDigits<mode>(int_mantissa >> exp, out);
1234
- int_mantissa &= mask;
1281
+ // Guaranteed to fit into 128 bits at this point
1282
+ template <typename Int>
1283
+ void FormatEFast(Int v, int exp, bool uppercase, const FormatState& state) {
1284
+ if (!v) {
1285
+ absl::string_view mantissa_str = state.ShouldPrintDot() ? "0." : "0";
1286
+ FinalPrint(state, mantissa_str, 0, state.precision,
1287
+ uppercase ? "E+00" : "e+00");
1288
+ return;
1289
+ }
1290
+ constexpr int kInputBits = sizeof(Int) * 8;
1291
+ constexpr int kMaxFractionalDigits = 128;
1292
+ constexpr int kBufferSize = 2 + // '.' + rounding
1293
+ kMaxFixedPrecision + // Integral
1294
+ kMaxFractionalDigits; // Fractional
1295
+ const int total_bits = kInputBits - LeadingZeros(v) + exp;
1296
+ char buffer[kBufferSize];
1297
+ char* integral_start = buffer + 2;
1298
+ char* integral_end = buffer + 2 + kMaxFixedPrecision;
1299
+ char* final_start;
1300
+ char* final_end;
1301
+ bool zero_integral = false;
1302
+ int scientific_exp = 0;
1303
+ size_t digits_printed = 0;
1304
+ size_t trailing_zeros = 0;
1305
+ bool has_more_non_zero = false;
1306
+
1307
+ auto check_integral_zeros =
1308
+ [](char* const begin, char* const end,
1309
+ const size_t precision, size_t digits_processed) -> bool {
1310
+ // When considering rounding to even, we care about the digits after the
1311
+ // round digit which means the total digits to move from the start is
1312
+ // precision + 2 since the first digit we print before the decimal point
1313
+ // is not a part of precision.
1314
+ size_t digit_upper_bound = precision + 2;
1315
+ if (digits_processed > digit_upper_bound) {
1316
+ return std::any_of(begin + digit_upper_bound, end,
1317
+ [](char c) { return c != '0'; });
1318
+ }
1319
+ return false;
1320
+ };
1235
1321
 
1236
- size_t fractional_count = precision;
1237
- if (mode == FormatStyle::Precision) {
1238
- if (digits_printed == 0) {
1239
- // Find the first non-zero digit, when in Precision mode.
1240
- *exp_out = 0;
1241
- if (int_mantissa) {
1242
- while (int_mantissa <= mask) {
1243
- int_mantissa *= 10;
1244
- --*exp_out;
1245
- }
1246
- }
1247
- out->push_front(static_cast<char>(int_mantissa >> exp) + '0');
1248
- out->push_back('.');
1249
- int_mantissa &= mask;
1322
+ if (exp >= 0) {
1323
+ integral_end = total_bits <= 64 ? numbers_internal::FastIntToBuffer(
1324
+ static_cast<uint64_t>(v) << exp, integral_start)
1325
+ : numbers_internal::FastIntToBuffer(
1326
+ static_cast<uint128>(v) << exp, integral_start);
1327
+ *integral_end = '0';
1328
+ final_start = integral_start;
1329
+ // Integral is guaranteed to be non-zero at this point.
1330
+ scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
1331
+ digits_printed = static_cast<size_t>(integral_end - integral_start);
1332
+ final_end = integral_end;
1333
+ has_more_non_zero = check_integral_zeros(integral_start, integral_end,
1334
+ state.precision, digits_printed);
1335
+ } else {
1336
+ exp = -exp;
1337
+ if (exp < kInputBits) {
1338
+ integral_end =
1339
+ numbers_internal::FastIntToBuffer(v >> exp, integral_start);
1340
+ }
1341
+ *integral_end = '0';
1342
+ // We didn't move integral_start and it gets set to 0 in
1343
+ zero_integral = exp >= kInputBits || v >> exp == 0;
1344
+ if (!zero_integral) {
1345
+ digits_printed = static_cast<size_t>(integral_end - integral_start);
1346
+ has_more_non_zero = check_integral_zeros(integral_start, integral_end,
1347
+ state.precision, digits_printed);
1348
+ final_end = integral_end;
1349
+ }
1350
+ // Print fractional digits
1351
+ char* fractional_start = integral_end;
1352
+
1353
+ size_t digits_to_print = (state.precision + 1) >= digits_printed
1354
+ ? state.precision + 1 - digits_printed
1355
+ : 0;
1356
+ bool print_extra = digits_printed <= state.precision + 1;
1357
+ auto [fractional_end, skipped_zeros, has_nonzero_rem] =
1358
+ exp <= 64 ? PrintFractionalDigitsScientific(
1359
+ v, fractional_start, exp, digits_to_print + print_extra,
1360
+ zero_integral)
1361
+ : PrintFractionalDigitsScientific(
1362
+ static_cast<uint128>(v), fractional_start, exp,
1363
+ digits_to_print + print_extra, zero_integral);
1364
+ final_end = fractional_end;
1365
+ *fractional_end = '0';
1366
+ has_more_non_zero |= has_nonzero_rem;
1367
+ digits_printed += static_cast<size_t>(fractional_end - fractional_start);
1368
+ if (zero_integral) {
1369
+ scientific_exp = -1 * static_cast<int>(skipped_zeros + 1);
1250
1370
  } else {
1251
- // We already have a digit, and a '.'
1252
- *exp_out = static_cast<int>(digits_printed - 1);
1253
- if (fractional_count < digits_printed - 1) {
1254
- // If we had enough digits, return right away.
1255
- // The code below will try to round again otherwise.
1256
- RemoveExtraPrecision(digits_printed - 1 - fractional_count,
1257
- int_mantissa != 0, out, exp_out);
1258
- return true;
1371
+ scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
1372
+ }
1373
+ // Don't do any rounding here, we will do it ourselves.
1374
+ final_start = zero_integral ? fractional_start : integral_start;
1375
+ }
1376
+
1377
+ // For rounding
1378
+ if (digits_printed >= state.precision + 1) {
1379
+ final_start[-1] = '0';
1380
+ char* round_digit_ptr = final_start + 1 + state.precision;
1381
+ if (*round_digit_ptr > '5') {
1382
+ RoundUp(round_digit_ptr - 1);
1383
+ } else if (*round_digit_ptr == '5') {
1384
+ if (has_more_non_zero) {
1385
+ RoundUp(round_digit_ptr - 1);
1386
+ } else {
1387
+ RoundToEven(round_digit_ptr - 1);
1259
1388
  }
1260
- fractional_count -= digits_printed - 1;
1261
1389
  }
1390
+ final_end = round_digit_ptr;
1391
+ if (final_start[-1] == '1') {
1392
+ --final_start;
1393
+ ++scientific_exp;
1394
+ --final_end;
1395
+ }
1396
+ } else {
1397
+ // Need to pad with zeros.
1398
+ trailing_zeros = state.precision - (digits_printed - 1);
1262
1399
  }
1263
1400
 
1264
- auto get_next_digit = [&] {
1265
- int_mantissa *= 10;
1266
- char digit = static_cast<char>(int_mantissa >> exp);
1267
- int_mantissa &= mask;
1268
- return digit;
1269
- };
1401
+ if (state.precision > 0 || state.ShouldPrintDot()) {
1402
+ final_start[-1] = *final_start;
1403
+ *final_start = '.';
1404
+ --final_start;
1405
+ }
1270
1406
 
1271
- // Print fractional_count more digits, if available.
1272
- for (; fractional_count > 0; --fractional_count) {
1273
- out->push_back(get_next_digit() + '0');
1407
+ // We need to add 2 to the buffer size for the +/- sign and the e
1408
+ constexpr size_t kExpBufferSize = numbers_internal::kFastToBufferSize + 2;
1409
+ char exp_buffer[kExpBufferSize];
1410
+ char* exp_ptr_start = exp_buffer;
1411
+ char* exp_ptr = exp_ptr_start;
1412
+ *exp_ptr++ = uppercase ? 'E' : 'e';
1413
+ if (scientific_exp >= 0) {
1414
+ *exp_ptr++ = '+';
1415
+ } else {
1416
+ *exp_ptr++ = '-';
1417
+ scientific_exp = -scientific_exp;
1274
1418
  }
1275
1419
 
1276
- char next_digit = get_next_digit();
1277
- if (next_digit > 5 ||
1278
- (next_digit == 5 && (int_mantissa || out->last_digit() % 2 == 1))) {
1279
- RoundUp<mode>(out, exp_out);
1420
+ if (scientific_exp < 10) {
1421
+ *exp_ptr++ = '0';
1280
1422
  }
1423
+ exp_ptr = numbers_internal::FastIntToBuffer(scientific_exp, exp_ptr);
1424
+ FinalPrint(state,
1425
+ absl::string_view(final_start,
1426
+ static_cast<size_t>(final_end - final_start)),
1427
+ 0, trailing_zeros,
1428
+ absl::string_view(exp_ptr_start,
1429
+ static_cast<size_t>(exp_ptr - exp_ptr_start)));
1430
+ }
1281
1431
 
1282
- return true;
1432
+ void FormatENegativeExpSlow(uint128 mantissa, int exp, bool uppercase,
1433
+ const FormatState& state,
1434
+ size_t digits_to_trim = 0) {
1435
+ assert(exp < 0);
1436
+
1437
+ FractionalDigitGenerator::RunConversion(
1438
+ mantissa, -exp,
1439
+ [&](FractionalDigitGenerator digit_gen) {
1440
+ int first_digit = 0;
1441
+ size_t nines = 0;
1442
+ int num_leading_zeros = 0;
1443
+ while (digit_gen.HasMoreDigits()) {
1444
+ auto digits = digit_gen.GetDigits();
1445
+ if (digits.digit_before_nine != 0) {
1446
+ first_digit = digits.digit_before_nine;
1447
+ nines = digits.num_nines;
1448
+ break;
1449
+ } else if (digits.num_nines > 0) {
1450
+ // This also means the first digit is 0
1451
+ first_digit = 9;
1452
+ nines = digits.num_nines - 1;
1453
+ num_leading_zeros++;
1454
+ break;
1455
+ }
1456
+ num_leading_zeros++;
1457
+ }
1458
+ size_t precision = state.precision;
1459
+ if (precision > digits_to_trim) {
1460
+ precision -= digits_to_trim;
1461
+ } else {
1462
+ precision = 0;
1463
+ }
1464
+ bool change_to_zeros = false;
1465
+ if (nines >= precision || state.precision == 0) {
1466
+ bool round_up = false;
1467
+ if (nines == precision) {
1468
+ round_up = digit_gen.IsGreaterThanHalf();
1469
+ } else {
1470
+ round_up = nines > 0 || digit_gen.IsGreaterThanHalf();
1471
+ }
1472
+ if (round_up) {
1473
+ first_digit = (first_digit == 9 ? 1 : first_digit + 1);
1474
+ num_leading_zeros -= (first_digit == 1);
1475
+ change_to_zeros = true;
1476
+ }
1477
+ }
1478
+ int scientific_exp = -(num_leading_zeros + 1);
1479
+ assert(scientific_exp < 0);
1480
+ char exp_buffer[numbers_internal::kFastToBufferSize];
1481
+ char* exp_start = exp_buffer;
1482
+ *exp_start++ = '-';
1483
+ if (scientific_exp > -10) {
1484
+ *exp_start++ = '0';
1485
+ }
1486
+ scientific_exp *= -1;
1487
+ char* exp_end =
1488
+ numbers_internal::FastIntToBuffer(scientific_exp, exp_start);
1489
+ const size_t total_digits =
1490
+ 1 // First digit
1491
+ +
1492
+ ((precision > 0 || state.conv.has_alt_flag()) ? 1
1493
+ : 0) // Decimal point
1494
+ + precision // Digits after decimal
1495
+ + 1 // 'e' or 'E'
1496
+ + static_cast<size_t>(exp_end - exp_buffer); // Exponent digits
1497
+
1498
+ const auto padding = ExtraWidthToPadding(
1499
+ total_digits + (state.sign_char != '\0' ? 1 : 0), state);
1500
+ state.sink->Append(padding.left_spaces, ' ');
1501
+
1502
+ if (state.sign_char != '\0') {
1503
+ state.sink->Append(1, state.sign_char);
1504
+ }
1505
+
1506
+ state.sink->Append(1, static_cast<char>(first_digit + '0'));
1507
+ if (precision > 0 || state.conv.has_alt_flag()) {
1508
+ state.sink->Append(1, '.');
1509
+ }
1510
+ size_t digits_to_go = precision;
1511
+ size_t nines_to_print = std::min(nines, digits_to_go);
1512
+ state.sink->Append(nines_to_print, change_to_zeros ? '0' : '9');
1513
+ digits_to_go -= nines_to_print;
1514
+ while (digits_to_go > 0 && digit_gen.HasMoreDigits()) {
1515
+ auto digits = digit_gen.GetDigits();
1516
+
1517
+ if (digits.num_nines + 1 < digits_to_go) {
1518
+ state.sink->Append(1, digits.digit_before_nine + '0');
1519
+ state.sink->Append(digits.num_nines, '9');
1520
+ digits_to_go -= digits.num_nines + 1;
1521
+ } else {
1522
+ bool round_up = false;
1523
+ if (digits.num_nines + 1 > digits_to_go) {
1524
+ round_up = true;
1525
+ } else if (digit_gen.IsGreaterThanHalf()) {
1526
+ round_up = true;
1527
+ } else if (digit_gen.IsExactlyHalf()) {
1528
+ round_up =
1529
+ digits.num_nines != 0 || digits.digit_before_nine % 2 == 1;
1530
+ }
1531
+ if (round_up) {
1532
+ state.sink->Append(1, digits.digit_before_nine + '1');
1533
+ --digits_to_go;
1534
+ } else {
1535
+ state.sink->Append(1, digits.digit_before_nine + '0');
1536
+ state.sink->Append(digits_to_go - 1, '9');
1537
+ digits_to_go = 0;
1538
+ }
1539
+ break;
1540
+ }
1541
+ }
1542
+ state.sink->Append(digits_to_go, '0');
1543
+ state.sink->Append(1, uppercase ? 'E' : 'e');
1544
+ state.sink->Append(absl::string_view(
1545
+ exp_buffer, static_cast<size_t>(exp_end - exp_buffer)));
1546
+ state.sink->Append(padding.right_spaces, ' ');
1547
+ });
1283
1548
  }
1284
1549
 
1285
- template <FormatStyle mode, typename Float>
1286
- bool FloatToBuffer(Decomposed<Float> decomposed,
1287
- size_t precision,
1288
- Buffer* out,
1289
- int* exp) {
1290
- if (precision > kMaxFixedPrecision) return false;
1291
-
1292
- // Try with uint64_t.
1293
- if (CanFitMantissa<Float, std::uint64_t>() &&
1294
- FloatToBufferImpl<std::uint64_t, Float, mode>(
1295
- static_cast<std::uint64_t>(decomposed.mantissa), decomposed.exponent,
1296
- precision, out, exp))
1297
- return true;
1550
+ void FormatEPositiveExpSlow(uint128 mantissa, int exp, bool uppercase,
1551
+ const FormatState& state,
1552
+ size_t digits_to_trim = 0) {
1553
+ BinaryToDecimal::RunConversion(
1554
+ mantissa, exp, [&](BinaryToDecimal btd) {
1555
+ int scientific_exp = static_cast<int>(btd.TotalDigits() - 1);
1556
+ absl::string_view digits_view = btd.CurrentDigits();
1557
+
1558
+ size_t digits_to_go = state.precision + 1;
1559
+ auto [first_digit_opt, nines] = GetDigits(btd, digits_view);
1560
+ if (!first_digit_opt.has_value() && nines == 0) {
1561
+ return;
1562
+ }
1298
1563
 
1299
- #if defined(ABSL_HAVE_INTRINSIC_INT128)
1300
- // If that is not enough, try with __uint128_t.
1301
- return CanFitMantissa<Float, __uint128_t>() &&
1302
- FloatToBufferImpl<__uint128_t, Float, mode>(
1303
- static_cast<__uint128_t>(decomposed.mantissa), decomposed.exponent,
1304
- precision, out, exp);
1305
- #endif
1306
- return false;
1564
+ int first_digit = first_digit_opt.value_or(9);
1565
+ if (!first_digit_opt) {
1566
+ --nines;
1567
+ }
1568
+
1569
+ // At this point we are guaranteed to have some sort of first digit
1570
+ bool change_to_zeros = false;
1571
+ if (nines + 1 >= digits_to_go) {
1572
+ // Everything we need to print is in the first DigitRun
1573
+ auto next_digit_opt = GetDigits(btd, digits_view).digit;
1574
+ if (nines == state.precision) {
1575
+ change_to_zeros = next_digit_opt.value_or(0) > 4;
1576
+ } else {
1577
+ change_to_zeros = true;
1578
+ }
1579
+ if (change_to_zeros) {
1580
+ if (first_digit != 9) {
1581
+ first_digit = first_digit + 1;
1582
+ } else {
1583
+ first_digit = 1;
1584
+ ++scientific_exp;
1585
+ }
1586
+ }
1587
+ }
1588
+
1589
+ char exp_buffer[numbers_internal::kFastToBufferSize];
1590
+ char* exp_buffer_end =
1591
+ numbers_internal::FastIntToBuffer(scientific_exp, exp_buffer);
1592
+ const bool print_dot =
1593
+ (state.precision > digits_to_trim) || state.conv.has_alt_flag();
1594
+ const size_t exp_size =
1595
+ static_cast<size_t>(exp_buffer_end - exp_buffer) + 2 +
1596
+ (scientific_exp < 10 ? 1 : 0);
1597
+ const size_t total_digits_out = 1 + (print_dot ? 1 : 0) +
1598
+ (state.precision - digits_to_trim) +
1599
+ exp_size;
1600
+
1601
+ const auto padding = ExtraWidthToPadding(
1602
+ total_digits_out + (state.sign_char != '\0' ? 1 : 0), state);
1603
+
1604
+ state.sink->Append(padding.left_spaces, ' ');
1605
+ if (state.sign_char != '\0') {
1606
+ state.sink->Append(1, state.sign_char);
1607
+ }
1608
+ state.sink->Append(1, static_cast<char>(first_digit + '0'));
1609
+ --digits_to_go;
1610
+ if (print_dot) {
1611
+ state.sink->Append(1, '.');
1612
+ }
1613
+
1614
+ size_t remaining_to_print = state.precision - digits_to_trim;
1615
+ auto append_with_trim = [&](size_t count, char c) {
1616
+ size_t to_append = std::min(count, remaining_to_print);
1617
+ if (to_append > 0) {
1618
+ state.sink->Append(to_append, c);
1619
+ remaining_to_print -= to_append;
1620
+ }
1621
+ };
1622
+
1623
+ size_t nines_to_append = std::min(digits_to_go, nines);
1624
+ append_with_trim(nines_to_append, change_to_zeros ? '0' : '9');
1625
+ digits_to_go -= nines_to_append;
1626
+
1627
+ while (digits_to_go > 0) {
1628
+ auto [digit_opt, curr_nines] = GetDigits(btd, digits_view);
1629
+ if (!digit_opt.has_value()) break;
1630
+ int digit = *digit_opt;
1631
+ if (curr_nines + 1 < digits_to_go) {
1632
+ append_with_trim(1, static_cast<char>(digit + '0'));
1633
+ append_with_trim(curr_nines, '9');
1634
+ digits_to_go -= curr_nines + 1;
1635
+ } else {
1636
+ bool need_round_up = false;
1637
+ auto next_digit_opt = GetDigits(btd, digits_view).digit;
1638
+ if (digits_to_go == 1) {
1639
+ need_round_up = curr_nines > 0 || next_digit_opt > 4;
1640
+ } else if (digits_to_go == curr_nines + 1) {
1641
+ // Only round if next digit is > 4
1642
+ need_round_up = next_digit_opt.value_or(0) > 4;
1643
+ } else {
1644
+ // we know we need to round since nine is after precision ends
1645
+ need_round_up = true;
1646
+ }
1647
+ append_with_trim(1, static_cast<char>(digit + need_round_up + '0'));
1648
+ append_with_trim(digits_to_go - 1, need_round_up ? '0' : '9');
1649
+ digits_to_go = 0;
1650
+ }
1651
+ }
1652
+
1653
+ if (digits_to_go > 0) {
1654
+ append_with_trim(digits_to_go, '0');
1655
+ }
1656
+
1657
+ state.sink->Append(1, uppercase ? 'E' : 'e');
1658
+ state.sink->Append(1, scientific_exp >= 0 ? '+' : '-');
1659
+ if (scientific_exp < 10) {
1660
+ state.sink->Append(1, '0');
1661
+ }
1662
+ state.sink->Append(absl::string_view(
1663
+ exp_buffer, static_cast<size_t>(exp_buffer_end - exp_buffer)));
1664
+ state.sink->Append(padding.right_spaces, ' ');
1665
+ });
1307
1666
  }
1308
1667
 
1309
- void WriteBufferToSink(char sign_char, absl::string_view str,
1310
- const FormatConversionSpecImpl &conv,
1311
- FormatSinkImpl *sink) {
1312
- size_t left_spaces = 0, zeros = 0, right_spaces = 0;
1313
- size_t missing_chars = 0;
1314
- if (conv.width() >= 0) {
1315
- const size_t conv_width_size_t = static_cast<size_t>(conv.width());
1316
- const size_t existing_chars =
1317
- str.size() + static_cast<size_t>(sign_char != 0);
1318
- if (conv_width_size_t > existing_chars)
1319
- missing_chars = conv_width_size_t - existing_chars;
1320
- }
1321
- if (conv.has_left_flag()) {
1322
- right_spaces = missing_chars;
1323
- } else if (conv.has_zero_flag()) {
1324
- zeros = missing_chars;
1668
+ //
1669
+ template <typename Int>
1670
+ void FormatGFast(Int v, int exp, bool uppercase, const FormatState& state) {
1671
+ if (!v) {
1672
+ absl::string_view mantissa_str =
1673
+ state.ShouldPrintDot() && state.conv.has_alt_flag() ? "0." : "0";
1674
+ FinalPrint(state, mantissa_str, 0,
1675
+ state.conv.has_alt_flag() * state.precision, "");
1676
+ return;
1677
+ }
1678
+ constexpr int kInputBits = sizeof(Int) * 8;
1679
+ constexpr int kMaxFractionalDigits = 128;
1680
+ // We need enough headroom to the left of our starting pointer to support
1681
+ // a potential prefix shift for values between 1e-1 and 1e-4.
1682
+ // The prefix "0.000" is 5 chars, plus potential rounding carry (1 char).
1683
+ constexpr int kHeadroom = 32;
1684
+ constexpr int kBufferSize = kHeadroom + // headroom + rounding + '.'
1685
+ kMaxFixedPrecision + // Integral
1686
+ kMaxFractionalDigits; // Fractional
1687
+ const int total_bits = kInputBits - LeadingZeros(v) + exp;
1688
+ char buffer[kBufferSize];
1689
+ char* integral_start = buffer + kHeadroom;
1690
+ char* integral_end = buffer + kHeadroom + kMaxFixedPrecision;
1691
+ char* final_start;
1692
+ char* final_end;
1693
+ bool zero_integral = false;
1694
+ int scientific_exp = 0;
1695
+ size_t digits_printed = 0;
1696
+ size_t trailing_zeros = 0;
1697
+ bool has_more_non_zero = false;
1698
+
1699
+ auto check_integral_zeros = [](char* const begin, char* const end,
1700
+ const size_t precision,
1701
+ size_t digits_processed) -> bool {
1702
+ // When considering rounding to even, we care about the digits after the
1703
+ // round digit which means the total digits to move from the start is
1704
+ // precision + 2 since the first digit we print before the decimal point
1705
+ // is not a part of precision.
1706
+ size_t digit_upper_bound = precision + 2;
1707
+ if (digits_processed > digit_upper_bound) {
1708
+ return std::any_of(begin + digit_upper_bound, end,
1709
+ [](char c) { return c != '0'; });
1710
+ }
1711
+ return false;
1712
+ };
1713
+
1714
+ if (exp >= 0) {
1715
+ integral_end = total_bits <= 64
1716
+ ? numbers_internal::FastIntToBuffer(
1717
+ static_cast<uint64_t>(v) << exp, integral_start)
1718
+ : numbers_internal::FastIntToBuffer(
1719
+ static_cast<uint128>(v) << exp, integral_start);
1720
+ *integral_end = '0';
1721
+ final_start = integral_start;
1722
+ // Integral is guaranteed to be non-zero at this point.
1723
+ scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
1724
+ digits_printed = static_cast<size_t>(integral_end - integral_start);
1725
+ final_end = integral_end;
1726
+ has_more_non_zero = check_integral_zeros(integral_start, integral_end,
1727
+ state.precision, digits_printed);
1728
+ } else {
1729
+ exp = -exp;
1730
+ if (exp < kInputBits) {
1731
+ integral_end =
1732
+ numbers_internal::FastIntToBuffer(v >> exp, integral_start);
1733
+ }
1734
+ *integral_end = '0';
1735
+ // We didn't move integral_start and it gets set to 0 in
1736
+ zero_integral = exp >= kInputBits || v >> exp == 0;
1737
+ if (!zero_integral) {
1738
+ digits_printed = static_cast<size_t>(integral_end - integral_start);
1739
+ has_more_non_zero = check_integral_zeros(integral_start, integral_end,
1740
+ state.precision, digits_printed);
1741
+ final_end = integral_end;
1742
+ }
1743
+ // Print fractional digits
1744
+ char* fractional_start = integral_end;
1745
+
1746
+ size_t digits_to_print = (state.precision + 1) >= digits_printed
1747
+ ? state.precision + 1 - digits_printed
1748
+ : 0;
1749
+ bool print_extra = digits_printed <= state.precision + 1;
1750
+ auto [fractional_end, skipped_zeros, has_nonzero_rem] =
1751
+ exp <= 64 ? PrintFractionalDigitsScientific(
1752
+ v, fractional_start, exp, digits_to_print + print_extra,
1753
+ zero_integral)
1754
+ : PrintFractionalDigitsScientific(
1755
+ static_cast<uint128>(v), fractional_start, exp,
1756
+ digits_to_print + print_extra, zero_integral);
1757
+ final_end = fractional_end;
1758
+ *fractional_end = '0';
1759
+ has_more_non_zero |= has_nonzero_rem;
1760
+ digits_printed += static_cast<size_t>(fractional_end - fractional_start);
1761
+ if (zero_integral) {
1762
+ scientific_exp = -1 * static_cast<int>(skipped_zeros + 1);
1763
+ } else {
1764
+ scientific_exp = static_cast<int>(integral_end - integral_start) - 1;
1765
+ }
1766
+ // Don't do any rounding here, we will do it ourselves.
1767
+ final_start = zero_integral ? fractional_start : integral_start;
1768
+ }
1769
+
1770
+ // For rounding
1771
+ if (digits_printed >= state.precision + 1) {
1772
+ final_start[-1] = '0';
1773
+ char* round_digit_ptr = final_start + 1 + state.precision;
1774
+ if (*round_digit_ptr > '5') {
1775
+ RoundUp(round_digit_ptr - 1);
1776
+ } else if (*round_digit_ptr == '5') {
1777
+ if (has_more_non_zero) {
1778
+ RoundUp(round_digit_ptr - 1);
1779
+ } else {
1780
+ RoundToEven(round_digit_ptr - 1);
1781
+ }
1782
+ }
1783
+ final_end = round_digit_ptr;
1784
+ if (final_start[-1] == '1') {
1785
+ --final_start;
1786
+ ++scientific_exp;
1787
+ --final_end;
1788
+ }
1789
+ } else {
1790
+ // Need to pad with zeros.
1791
+ trailing_zeros = state.precision - (digits_printed - 1);
1792
+ }
1793
+
1794
+ if (state.precision > 0 || state.ShouldPrintDot()) {
1795
+ final_start[-1] = *final_start;
1796
+ *final_start = '.';
1797
+ --final_start;
1798
+ }
1799
+ // We have scientific exp at this point
1800
+ if ((scientific_exp < 0 ||
1801
+ state.precision + 1 > static_cast<size_t>(scientific_exp)) &&
1802
+ scientific_exp >= -4) {
1803
+ if (scientific_exp < 0) {
1804
+ // Have 1.23456, needs 0.00123456
1805
+ // Move the first digit
1806
+ final_start[1] = *final_start;
1807
+ if (!state.ShouldPrintDot()) {
1808
+ ++final_end;
1809
+ }
1810
+ // Add some zeros
1811
+ for (; scientific_exp < -1; ++scientific_exp) {
1812
+ *final_start = '0';
1813
+ --final_start;
1814
+ }
1815
+ *final_start-- = '.';
1816
+ *final_start = '0';
1817
+ } else if (scientific_exp > 0) {
1818
+ // Have 1.23456, needs 1234.56
1819
+ // Move the '.' scientific_exp positions to the right.
1820
+ std::rotate(final_start + 1, final_start + 2,
1821
+ final_start + scientific_exp + 2);
1822
+ }
1823
+ scientific_exp = 0;
1824
+ }
1825
+ auto const& conv = state.conv;
1826
+ if (!conv.has_alt_flag()) {
1827
+ trailing_zeros = 0;
1828
+ while (final_end[-1] == '0') {
1829
+ --final_end;
1830
+ }
1831
+ if (final_end[-1] == '.') --final_end;
1832
+ }
1833
+ if (scientific_exp) {
1834
+ // We need to add 2 to the buffer size for the +/- sign and the e
1835
+ constexpr size_t kExpBufferSize = numbers_internal::kFastToBufferSize + 2;
1836
+ char exp_buffer[kExpBufferSize];
1837
+ char* exp_ptr_start = exp_buffer;
1838
+ char* exp_ptr = exp_ptr_start;
1839
+ *exp_ptr++ = uppercase ? 'E' : 'e';
1840
+ if (scientific_exp >= 0) {
1841
+ *exp_ptr++ = '+';
1842
+ } else {
1843
+ *exp_ptr++ = '-';
1844
+ scientific_exp = -scientific_exp;
1845
+ }
1846
+
1847
+ if (scientific_exp < 10) {
1848
+ *exp_ptr++ = '0';
1849
+ }
1850
+ exp_ptr = numbers_internal::FastIntToBuffer(scientific_exp, exp_ptr);
1851
+ FinalPrint(state,
1852
+ absl::string_view(
1853
+ final_start, static_cast<size_t>((final_end - final_start))),
1854
+ 0, trailing_zeros,
1855
+ absl::string_view(exp_ptr_start,
1856
+ static_cast<size_t>(exp_ptr - exp_ptr_start)));
1325
1857
  } else {
1326
- left_spaces = missing_chars;
1858
+ FinalPrint(state,
1859
+ absl::string_view(
1860
+ final_start, static_cast<size_t>((final_end - final_start))),
1861
+ 0, trailing_zeros, "");
1327
1862
  }
1863
+ }
1328
1864
 
1329
- sink->Append(left_spaces, ' ');
1330
- if (sign_char != '\0') sink->Append(1, sign_char);
1331
- sink->Append(zeros, '0');
1332
- sink->Append(str);
1333
- sink->Append(right_spaces, ' ');
1865
+ template <typename Int>
1866
+ void FormatGNegativeExpSlow(Int mantissa, int exp, bool uppercase,
1867
+ const FormatState& state) {
1868
+ // Most of the code here is to decide whether to use E-style or F-style
1869
+ // formatting, with the actual formatting done in FormatENegativeExpSlow and
1870
+ // FormatFNegativeExpSlow.
1871
+ FractionalDigitGenerator::RunConversion(
1872
+ mantissa, -exp, [&](FractionalDigitGenerator digit_gen) {
1873
+ int first_digit = 0;
1874
+ size_t nines = 0;
1875
+ int num_leading_zeros = 0;
1876
+ size_t num_trailing_zeros = 0;
1877
+ while (digit_gen.HasMoreDigits()) {
1878
+ auto digits = digit_gen.GetDigits();
1879
+ if (digits.digit_before_nine != 0) {
1880
+ first_digit = digits.digit_before_nine;
1881
+ nines = digits.num_nines;
1882
+ break;
1883
+ } else if (digits.num_nines > 0) {
1884
+ // This also means the first digit is 0
1885
+ first_digit = 9;
1886
+ nines = digits.num_nines - 1;
1887
+ num_leading_zeros++;
1888
+ break;
1889
+ }
1890
+ num_leading_zeros++;
1891
+ }
1892
+ if (nines >= state.precision || state.precision == 0) {
1893
+ bool round_up = false;
1894
+ if (nines == state.precision) {
1895
+ round_up = digit_gen.IsGreaterThanHalf();
1896
+ } else {
1897
+ round_up = nines > 0 || digit_gen.IsGreaterThanHalf();
1898
+ }
1899
+ if (round_up) {
1900
+ first_digit = (first_digit == 9 ? 1 : first_digit + 1);
1901
+ num_leading_zeros -= (first_digit == 1);
1902
+ num_trailing_zeros = state.precision;
1903
+ }
1904
+ }
1905
+ int scientific_exp = -(num_leading_zeros + 1);
1906
+ assert(scientific_exp < 0);
1907
+ size_t digits_to_go = state.precision + 1;
1908
+ if (state.conv.has_alt_flag()) {
1909
+ num_trailing_zeros = 0;
1910
+ }
1911
+ if (!state.conv.has_alt_flag() && !num_trailing_zeros) {
1912
+ num_trailing_zeros = (first_digit == 0);
1913
+ digits_to_go -= std::min(digits_to_go, nines + 1);
1914
+ while (digits_to_go > 0 && digit_gen.HasMoreDigits()) {
1915
+ auto digits = digit_gen.GetDigits();
1916
+ if (digits.num_nines + 1 < digits_to_go) {
1917
+ if (digits.digit_before_nine == 0 && digits.num_nines == 0) {
1918
+ ++num_trailing_zeros;
1919
+ } else {
1920
+ num_trailing_zeros = 0;
1921
+ }
1922
+ digits_to_go -= digits.num_nines + 1;
1923
+ } else {
1924
+ bool round_up = false;
1925
+ if (digits.num_nines + 1 > digits_to_go) {
1926
+ round_up = true;
1927
+ } else if (digit_gen.IsGreaterThanHalf()) {
1928
+ round_up = true;
1929
+ } else if (digit_gen.IsExactlyHalf()) {
1930
+ round_up =
1931
+ digits.num_nines != 0 || digits.digit_before_nine % 2 == 1;
1932
+ }
1933
+
1934
+ if (digits_to_go == 1) {
1935
+ if (digits.digit_before_nine + (round_up ? 1 : 0) == 0) {
1936
+ ++num_trailing_zeros;
1937
+ } else {
1938
+ num_trailing_zeros = 0;
1939
+ }
1940
+ } else {
1941
+ num_trailing_zeros = round_up ? digits_to_go - 1 : 0;
1942
+ }
1943
+ digits_to_go = 0;
1944
+ }
1945
+ }
1946
+ }
1947
+ if (!num_trailing_zeros) {
1948
+ num_trailing_zeros = !state.conv.has_alt_flag() * digits_to_go;
1949
+ }
1950
+ if (scientific_exp <= -4) {
1951
+ FormatENegativeExpSlow(static_cast<uint128>(mantissa), exp, uppercase,
1952
+ state, num_trailing_zeros);
1953
+ } else {
1954
+ FormatState f_state = state;
1955
+ f_state.precision = static_cast<size_t>(
1956
+ static_cast<int>(state.precision) - scientific_exp);
1957
+ FormatFNegativeExpSlow(static_cast<uint128>(mantissa), -exp, f_state,
1958
+ num_trailing_zeros);
1959
+ }
1960
+ });
1961
+ }
1962
+ template <typename Int>
1963
+ void FormatGPositiveExpSlow(Int mantissa, int exp, bool uppercase,
1964
+ const FormatState& state) {
1965
+ BinaryToDecimal::RunConversion(mantissa, exp, [&](BinaryToDecimal btd) {
1966
+ int scientific_exp = static_cast<int>(btd.TotalDigits()) - 1;
1967
+ absl::string_view digits = btd.CurrentDigits();
1968
+ size_t digits_to_go = state.precision + 1;
1969
+ auto [first_digit_opt, nines] = GetDigits(btd, digits);
1970
+ int first_digit = first_digit_opt.value_or(9);
1971
+ if (!first_digit_opt) {
1972
+ --nines;
1973
+ }
1974
+ // At this point we are guaranteed to have some sort of first digit
1975
+ bool change_to_zeros = false;
1976
+ size_t num_trailing_zeros = 0;
1977
+ if (nines + 1 >= digits_to_go) {
1978
+ // Everything we need to print is in the first DigitRun
1979
+ auto next_digit_opt = GetDigits(btd, digits).digit;
1980
+ if (nines == state.precision) {
1981
+ change_to_zeros = next_digit_opt.value_or(0) > 4;
1982
+ } else {
1983
+ change_to_zeros = true;
1984
+ }
1985
+ if (change_to_zeros) {
1986
+ if (first_digit != 9) {
1987
+ first_digit = first_digit + 1;
1988
+ } else {
1989
+ first_digit = 1;
1990
+ ++scientific_exp;
1991
+ }
1992
+ num_trailing_zeros = state.precision;
1993
+ }
1994
+ }
1995
+ if (state.conv.has_alt_flag()) {
1996
+ num_trailing_zeros = 0;
1997
+ }
1998
+ // At this point the number of trailing zeros is not covered by the first
1999
+ // DigitRun
2000
+ if (!state.conv.has_alt_flag() && !num_trailing_zeros) {
2001
+ num_trailing_zeros = first_digit == 0;
2002
+ digits_to_go -= std::min(digits_to_go, nines + 1);
2003
+ while (digits_to_go > 0) {
2004
+ auto [digit_opt, curr_nines] = GetDigits(btd, digits);
2005
+ if (!digit_opt.has_value()) {
2006
+ break;
2007
+ }
2008
+ if (curr_nines + 1 < digits_to_go) {
2009
+ int digit = *digit_opt;
2010
+ // If the previous one was a 0 we are too
2011
+ if (digit == 0 && curr_nines == 0) {
2012
+ ++num_trailing_zeros;
2013
+ --digits_to_go;
2014
+ } else {
2015
+ num_trailing_zeros = 0;
2016
+ --digits_to_go;
2017
+ digits_to_go -= std::min(digits_to_go, curr_nines);
2018
+ }
2019
+ } else {
2020
+ auto next_digit_opt = GetDigits(btd, digits).digit;
2021
+ if (digits_to_go == 1) {
2022
+ if (*digit_opt == 0) {
2023
+ if (curr_nines || next_digit_opt > 4) {
2024
+ num_trailing_zeros = 0;
2025
+ } else {
2026
+ ++num_trailing_zeros;
2027
+ }
2028
+ } else {
2029
+ num_trailing_zeros = 0;
2030
+ }
2031
+ } else if (digits_to_go == curr_nines + 1) {
2032
+ num_trailing_zeros = next_digit_opt > 4 ? digits_to_go - 1 : 0;
2033
+ } else {
2034
+ num_trailing_zeros = digits_to_go - 1;
2035
+ }
2036
+ digits_to_go = 0;
2037
+ }
2038
+ }
2039
+ }
2040
+ assert(scientific_exp >= 0);
2041
+ // By this point the exponent is accurate
2042
+ if (static_cast<size_t>(scientific_exp) > state.precision) {
2043
+ FormatEPositiveExpSlow(mantissa, exp, uppercase, state,
2044
+ num_trailing_zeros);
2045
+ } else {
2046
+ FormatFPositiveExpSlow(mantissa, exp, state, !state.conv.has_alt_flag());
2047
+ }
2048
+ });
1334
2049
  }
1335
2050
 
1336
2051
  template <typename Float>
@@ -1356,12 +2071,8 @@ bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
1356
2071
  size_t precision =
1357
2072
  conv.precision() < 0 ? 6 : static_cast<size_t>(conv.precision());
1358
2073
 
1359
- int exp = 0;
1360
-
1361
2074
  auto decomposed = Decompose(abs_v);
1362
2075
 
1363
- Buffer buffer;
1364
-
1365
2076
  FormatConversionChar c = conv.conversion_char();
1366
2077
 
1367
2078
  if (c == FormatConversionCharInternal::f ||
@@ -1371,46 +2082,33 @@ bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
1371
2082
  return true;
1372
2083
  } else if (c == FormatConversionCharInternal::e ||
1373
2084
  c == FormatConversionCharInternal::E) {
1374
- if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
1375
- &exp)) {
1376
- return FallbackToSnprintf(v, conv, sink);
1377
- }
1378
- if (!conv.has_alt_flag() && buffer.back() == '.') buffer.pop_back();
1379
- PrintExponent(
1380
- exp, FormatConversionCharIsUpper(conv.conversion_char()) ? 'E' : 'e',
1381
- &buffer);
2085
+ FormatE(decomposed.mantissa, decomposed.exponent,
2086
+ FormatConversionCharIsUpper(conv.conversion_char()),
2087
+ {sign_char, precision, conv, sink});
2088
+ return true;
1382
2089
  } else if (c == FormatConversionCharInternal::g ||
1383
2090
  c == FormatConversionCharInternal::G) {
1384
2091
  precision = std::max(precision, size_t{1}) - 1;
1385
- if (!FloatToBuffer<FormatStyle::Precision>(decomposed, precision, &buffer,
1386
- &exp)) {
1387
- return FallbackToSnprintf(v, conv, sink);
1388
- }
1389
- if ((exp < 0 || precision + 1 > static_cast<size_t>(exp)) && exp >= -4) {
1390
- if (exp < 0) {
1391
- // Have 1.23456, needs 0.00123456
1392
- // Move the first digit
1393
- buffer.begin[1] = *buffer.begin;
1394
- // Add some zeros
1395
- for (; exp < -1; ++exp) *buffer.begin-- = '0';
1396
- *buffer.begin-- = '.';
1397
- *buffer.begin = '0';
1398
- } else if (exp > 0) {
1399
- // Have 1.23456, needs 1234.56
1400
- // Move the '.' exp positions to the right.
1401
- std::rotate(buffer.begin + 1, buffer.begin + 2, buffer.begin + exp + 2);
1402
- }
1403
- exp = 0;
1404
- }
1405
- if (!conv.has_alt_flag()) {
1406
- while (buffer.back() == '0') buffer.pop_back();
1407
- if (buffer.back() == '.') buffer.pop_back();
1408
- }
1409
- if (exp) {
1410
- PrintExponent(
1411
- exp, FormatConversionCharIsUpper(conv.conversion_char()) ? 'E' : 'e',
1412
- &buffer);
2092
+ constexpr int input_bits = sizeof(decomposed.mantissa) * 8;
2093
+ const int total_bits =
2094
+ input_bits - LeadingZeros(decomposed.mantissa) + decomposed.exponent;
2095
+ if (decomposed.exponent >= 0 && total_bits > 128) {
2096
+ FormatGPositiveExpSlow(
2097
+ decomposed.mantissa, decomposed.exponent,
2098
+ FormatConversionCharIsUpper(conv.conversion_char()),
2099
+ {sign_char, precision, conv, sink});
2100
+ return true;
2101
+ } else if (decomposed.exponent < -128) {
2102
+ FormatGNegativeExpSlow(
2103
+ decomposed.mantissa, decomposed.exponent,
2104
+ FormatConversionCharIsUpper(conv.conversion_char()),
2105
+ {sign_char, precision, conv, sink});
2106
+ return true;
1413
2107
  }
2108
+ FormatGFast(decomposed.mantissa, decomposed.exponent,
2109
+ FormatConversionCharIsUpper(conv.conversion_char()),
2110
+ {sign_char, precision, conv, sink});
2111
+ return true;
1414
2112
  } else if (c == FormatConversionCharInternal::a ||
1415
2113
  c == FormatConversionCharInternal::A) {
1416
2114
  bool uppercase = (c == FormatConversionCharInternal::A);
@@ -1420,14 +2118,6 @@ bool FloatToSink(const Float v, const FormatConversionSpecImpl &conv,
1420
2118
  } else {
1421
2119
  return false;
1422
2120
  }
1423
-
1424
- WriteBufferToSink(
1425
- sign_char,
1426
- absl::string_view(buffer.begin,
1427
- static_cast<size_t>(buffer.end - buffer.begin)),
1428
- conv, sink);
1429
-
1430
- return true;
1431
2121
  }
1432
2122
 
1433
2123
  } // namespace