grpc 1.57.0 → 1.58.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (402) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +534 -284
  3. data/include/grpc/event_engine/event_engine.h +0 -1
  4. data/include/grpc/event_engine/memory_allocator.h +2 -2
  5. data/include/grpc/impl/channel_arg_names.h +371 -0
  6. data/include/grpc/impl/grpc_types.h +1 -353
  7. data/include/grpc/module.modulemap +1 -0
  8. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -1
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +2 -1
  10. data/src/core/ext/filters/client_channel/client_channel.cc +7 -3
  11. data/src/core/ext/filters/client_channel/http_proxy.cc +1 -1
  12. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +10 -5
  13. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +5 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +4 -2
  17. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +115 -109
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +0 -5
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +7 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +1 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +11 -3
  24. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +8 -5
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -1
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +102 -11
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +9 -4
  29. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +4 -1
  30. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_plugin.cc +6 -0
  31. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +41 -14
  32. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
  33. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -2
  34. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +1 -1
  35. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  36. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  37. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  38. data/src/core/ext/filters/client_channel/subchannel.cc +9 -5
  39. data/src/core/ext/filters/client_channel/subchannel.h +8 -2
  40. data/src/core/ext/filters/deadline/deadline_filter.cc +1 -1
  41. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
  42. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  43. data/src/core/ext/filters/http/message_compress/compression_filter.cc +1 -0
  44. data/src/core/ext/filters/http/server/http_server_filter.cc +1 -1
  45. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -0
  46. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +4 -7
  47. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -0
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +8 -12
  49. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +357 -358
  50. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -18
  51. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +63 -4
  52. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +7 -2
  53. data/src/core/ext/transport/chttp2/transport/internal.h +30 -57
  54. data/src/core/ext/transport/chttp2/transport/parsing.cc +16 -7
  55. data/src/core/ext/transport/chttp2/transport/ping_abuse_policy.cc +80 -0
  56. data/src/core/ext/transport/chttp2/transport/ping_abuse_policy.h +55 -0
  57. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +98 -0
  58. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +73 -0
  59. data/src/core/ext/transport/chttp2/transport/writing.cc +81 -89
  60. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -0
  61. data/src/core/ext/xds/xds_client_grpc.cc +1 -0
  62. data/src/core/ext/xds/xds_http_fault_filter.cc +1 -2
  63. data/src/core/ext/xds/xds_http_fault_filter.h +1 -2
  64. data/src/core/ext/xds/xds_http_filters.h +2 -4
  65. data/src/core/ext/xds/xds_http_rbac_filter.cc +3 -8
  66. data/src/core/ext/xds/xds_http_rbac_filter.h +1 -2
  67. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +1 -2
  68. data/src/core/ext/xds/xds_http_stateful_session_filter.h +1 -2
  69. data/src/core/ext/xds/xds_lb_policy_registry.cc +3 -6
  70. data/src/core/ext/xds/xds_routing.cc +2 -2
  71. data/src/core/ext/xds/xds_transport_grpc.cc +1 -0
  72. data/src/core/lib/avl/avl.h +10 -173
  73. data/src/core/lib/channel/call_tracer.cc +289 -0
  74. data/src/core/lib/channel/call_tracer.h +35 -0
  75. data/src/core/lib/channel/channel_args.cc +84 -79
  76. data/src/core/lib/channel/channel_args.h +29 -17
  77. data/src/core/lib/channel/connected_channel.cc +0 -1
  78. data/src/core/lib/channel/promise_based_filter.cc +4 -1
  79. data/src/core/lib/compression/compression_internal.cc +8 -4
  80. data/src/core/lib/debug/stats_data.cc +93 -21
  81. data/src/core/lib/debug/stats_data.h +41 -0
  82. data/src/core/lib/event_engine/ares_resolver.cc +712 -0
  83. data/src/core/lib/event_engine/ares_resolver.h +150 -0
  84. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -3
  85. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  86. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +229 -0
  87. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +117 -0
  88. data/src/core/lib/event_engine/forkable.cc +15 -1
  89. data/src/core/lib/event_engine/forkable.h +15 -0
  90. data/src/core/lib/event_engine/grpc_polled_fd.h +73 -0
  91. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +25 -3
  92. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +10 -1
  93. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +197 -0
  94. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +3 -3
  95. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +47 -1
  96. data/src/core/lib/event_engine/posix_engine/posix_engine.h +12 -1
  97. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -0
  98. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -0
  99. data/src/core/lib/event_engine/thread_pool/thread_count.cc +58 -0
  100. data/src/core/lib/event_engine/thread_pool/thread_count.h +161 -0
  101. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +7 -0
  102. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +86 -111
  103. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +15 -61
  104. data/src/core/lib/event_engine/windows/windows_endpoint.cc +3 -4
  105. data/src/core/lib/experiments/config.cc +14 -0
  106. data/src/core/lib/experiments/experiments.cc +141 -304
  107. data/src/core/lib/experiments/experiments.h +16 -17
  108. data/src/core/lib/gprpp/ref_counted.h +3 -1
  109. data/src/core/lib/gprpp/ref_counted_string.cc +44 -0
  110. data/src/core/lib/gprpp/ref_counted_string.h +146 -0
  111. data/src/core/lib/gprpp/time.h +2 -2
  112. data/src/core/lib/gprpp/work_serializer.cc +36 -0
  113. data/src/core/lib/gprpp/work_serializer.h +5 -0
  114. data/src/core/lib/http/httpcli_security_connector.cc +1 -0
  115. data/src/core/lib/iomgr/buffer_list.cc +2 -0
  116. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +7 -22
  117. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  118. data/src/core/lib/promise/detail/basic_seq.h +1 -372
  119. data/src/core/lib/promise/detail/seq_state.h +2076 -0
  120. data/src/core/lib/promise/seq.h +19 -2
  121. data/src/core/lib/promise/sleep.h +5 -10
  122. data/src/core/lib/promise/try_seq.h +34 -2
  123. data/src/core/lib/resource_quota/api.cc +1 -0
  124. data/src/core/lib/resource_quota/arena.cc +2 -0
  125. data/src/core/lib/resource_quota/arena.h +42 -8
  126. data/src/core/lib/resource_quota/memory_quota.cc +0 -1
  127. data/src/core/lib/resource_quota/resource_quota.h +1 -0
  128. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  129. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  130. data/src/core/lib/security/credentials/external/aws_request_signer.cc +8 -0
  131. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  132. data/src/core/lib/security/credentials/jwt/json_token.cc +17 -0
  133. data/src/core/lib/security/credentials/jwt/json_token.h +4 -0
  134. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +42 -0
  135. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -0
  136. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +4 -0
  137. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -0
  138. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -0
  139. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -0
  140. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -0
  141. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -0
  142. data/src/core/lib/security/transport/client_auth_filter.cc +8 -5
  143. data/src/core/lib/security/transport/security_handshaker.cc +1 -0
  144. data/src/core/lib/security/transport/server_auth_filter.cc +2 -0
  145. data/src/core/lib/surface/call.cc +32 -8
  146. data/src/core/lib/surface/channel.cc +1 -0
  147. data/src/core/lib/surface/completion_queue.cc +10 -0
  148. data/src/core/lib/surface/init.cc +1 -0
  149. data/src/core/lib/surface/server.cc +67 -64
  150. data/src/core/lib/surface/server.h +1 -15
  151. data/src/core/lib/surface/version.cc +2 -2
  152. data/src/core/tsi/alts/crypt/aes_gcm.cc +27 -2
  153. data/src/core/tsi/ssl_transport_security.cc +11 -0
  154. data/src/ruby/lib/grpc/generic/active_call.rb +9 -14
  155. data/src/ruby/lib/grpc/version.rb +1 -1
  156. data/src/ruby/pb/test/client.rb +16 -0
  157. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -3
  158. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -2
  159. data/third_party/abseil-cpp/absl/base/attributes.h +58 -5
  160. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  161. data/third_party/abseil-cpp/absl/base/casts.h +8 -8
  162. data/third_party/abseil-cpp/absl/base/config.h +89 -106
  163. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +26 -1
  164. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +2 -2
  165. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +50 -39
  166. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +2 -1
  167. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +17 -18
  168. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +32 -3
  169. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +24 -4
  170. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +31 -73
  171. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +9 -8
  172. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -11
  173. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +23 -32
  174. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +2 -3
  175. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  176. data/third_party/abseil-cpp/absl/base/policy_checks.h +3 -3
  177. data/third_party/abseil-cpp/absl/base/prefetch.h +198 -0
  178. data/third_party/abseil-cpp/absl/container/fixed_array.h +54 -29
  179. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -1
  180. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -2
  181. data/third_party/abseil-cpp/absl/container/inlined_vector.h +167 -79
  182. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  183. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +3 -21
  184. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +1 -1
  185. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +46 -0
  186. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -0
  187. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +85 -26
  188. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +35 -18
  189. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +70 -29
  190. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +437 -236
  191. data/third_party/abseil-cpp/absl/crc/crc32c.h +8 -1
  192. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +14 -8
  193. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -35
  194. data/third_party/abseil-cpp/absl/crc/internal/crc.h +2 -10
  195. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +1 -1
  196. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +1 -1
  197. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +4 -4
  198. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +8 -10
  199. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +17 -19
  200. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +8 -8
  201. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +2 -1
  202. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +59 -23
  203. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +1 -1
  204. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +1 -1
  205. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +1 -1
  206. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +43 -19
  207. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -0
  208. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +1 -1
  209. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.cc +1 -1
  210. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -2
  211. data/third_party/abseil-cpp/absl/flags/internal/flag.h +16 -15
  212. data/third_party/abseil-cpp/absl/flags/internal/flag_msvc.inc +1 -1
  213. data/third_party/abseil-cpp/absl/flags/marshalling.cc +43 -2
  214. data/third_party/abseil-cpp/absl/flags/marshalling.h +5 -0
  215. data/third_party/abseil-cpp/absl/functional/any_invocable.h +9 -1
  216. data/third_party/abseil-cpp/absl/functional/bind_front.h +1 -1
  217. data/third_party/abseil-cpp/absl/functional/function_ref.h +3 -3
  218. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +37 -24
  219. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +19 -9
  220. data/third_party/abseil-cpp/absl/hash/hash.h +7 -4
  221. data/third_party/abseil-cpp/absl/hash/internal/hash.h +38 -15
  222. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +6 -0
  223. data/third_party/abseil-cpp/absl/meta/type_traits.h +48 -373
  224. data/third_party/abseil-cpp/absl/numeric/bits.h +4 -4
  225. data/third_party/abseil-cpp/absl/numeric/int128.cc +20 -8
  226. data/third_party/abseil-cpp/absl/numeric/int128.h +36 -39
  227. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +0 -3
  228. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +47 -30
  229. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -3
  230. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  231. data/third_party/abseil-cpp/absl/random/internal/platform.h +1 -1
  232. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +4 -0
  233. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +1 -1
  234. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +1 -1
  235. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +1 -1
  236. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +4 -0
  237. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +12 -24
  238. data/third_party/abseil-cpp/absl/status/status.cc +11 -7
  239. data/third_party/abseil-cpp/absl/status/status.h +11 -2
  240. data/third_party/abseil-cpp/absl/status/statusor.h +22 -8
  241. data/third_party/abseil-cpp/absl/strings/ascii.cc +54 -6
  242. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -4
  243. data/third_party/abseil-cpp/absl/strings/charconv.h +2 -2
  244. data/third_party/abseil-cpp/absl/strings/cord.cc +1 -2
  245. data/third_party/abseil-cpp/absl/strings/cord.h +32 -5
  246. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +23 -1
  247. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +18 -0
  248. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +2 -5
  249. data/third_party/abseil-cpp/absl/strings/escaping.cc +10 -32
  250. data/third_party/abseil-cpp/absl/strings/escaping.h +1 -1
  251. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +2 -4
  252. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +3 -3
  253. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +0 -1
  254. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +15 -13
  255. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +13 -4
  256. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +8 -0
  257. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +5 -3
  258. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +4 -7
  259. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +8 -0
  260. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +2 -2
  261. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +46 -20
  262. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +1 -34
  263. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +2 -1
  264. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +23 -0
  265. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +1 -0
  266. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +2 -77
  267. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +4 -112
  268. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +1 -1
  269. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +10 -31
  270. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -8
  271. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +5 -20
  272. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +1 -0
  273. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +1 -1
  274. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +9 -9
  275. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +56 -6
  276. data/third_party/abseil-cpp/absl/strings/match.cc +87 -0
  277. data/third_party/abseil-cpp/absl/strings/match.h +19 -0
  278. data/third_party/abseil-cpp/absl/strings/numbers.cc +154 -122
  279. data/third_party/abseil-cpp/absl/strings/numbers.h +1 -6
  280. data/third_party/abseil-cpp/absl/strings/str_cat.cc +7 -50
  281. data/third_party/abseil-cpp/absl/strings/str_cat.h +83 -15
  282. data/third_party/abseil-cpp/absl/strings/str_format.h +6 -3
  283. data/third_party/abseil-cpp/absl/strings/str_split.cc +9 -6
  284. data/third_party/abseil-cpp/absl/strings/string_view.cc +26 -4
  285. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +5 -0
  286. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +63 -43
  287. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +111 -0
  288. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.h +63 -0
  289. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +11 -7
  290. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +225 -0
  291. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +122 -114
  292. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +12 -8
  293. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +10 -1
  294. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +167 -0
  295. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h +60 -0
  296. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +122 -0
  297. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h +65 -0
  298. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +91 -0
  299. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.h +56 -0
  300. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +19 -113
  301. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +42 -0
  302. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.h +90 -0
  303. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +151 -0
  304. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.h +70 -0
  305. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +407 -411
  306. data/third_party/abseil-cpp/absl/synchronization/mutex.h +152 -118
  307. data/third_party/abseil-cpp/absl/time/clock.cc +6 -7
  308. data/third_party/abseil-cpp/absl/time/duration.cc +24 -26
  309. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -0
  310. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  311. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +3 -3
  312. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +8 -6
  313. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +6 -3
  314. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +4 -2
  315. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +4 -0
  316. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +322 -295
  317. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +8 -17
  318. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +51 -33
  319. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +7 -2
  320. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +128 -2
  321. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +1 -1
  322. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +5 -1
  323. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +34 -34
  324. data/third_party/abseil-cpp/absl/time/time.cc +9 -2
  325. data/third_party/abseil-cpp/absl/time/time.h +115 -15
  326. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -52
  327. data/third_party/abseil-cpp/absl/types/internal/span.h +2 -2
  328. data/third_party/abseil-cpp/absl/types/internal/variant.h +2 -2
  329. data/third_party/abseil-cpp/absl/types/optional.h +15 -13
  330. data/third_party/abseil-cpp/absl/types/span.h +1 -2
  331. data/third_party/boringssl-with-bazel/err_data.c +15 -14
  332. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +7 -3
  333. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +7 -7
  334. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +7 -3
  335. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +5 -5
  336. data/third_party/boringssl-with-bazel/src/crypto/bio/errno.c +92 -0
  337. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +4 -48
  338. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +11 -6
  339. data/third_party/boringssl-with-bazel/src/crypto/bio/internal.h +16 -6
  340. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
  341. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +9 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +1 -1
  343. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +3 -7
  344. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +0 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.c +0 -1
  346. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.c +0 -2
  347. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +0 -1
  348. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c +93 -0
  349. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c +0 -1
  351. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c +0 -2
  352. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c +4 -0
  353. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +5 -0
  354. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +9 -14
  355. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +4 -6
  356. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +10 -11
  357. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c +37 -8
  358. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +38 -19
  359. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +7 -0
  360. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +39 -16
  361. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c +4 -7
  362. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +7 -0
  363. data/third_party/boringssl-with-bazel/src/crypto/internal.h +13 -21
  364. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +6 -23
  365. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +4 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +5 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -6
  368. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +0 -3
  369. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c +1 -3
  370. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +2 -3
  371. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -1
  372. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +11 -1
  373. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -1
  374. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +7 -9
  375. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +6 -2
  376. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +22 -20
  377. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +4 -0
  378. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +20 -12
  379. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +50 -3
  380. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -4
  381. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  382. data/third_party/boringssl-with-bazel/src/ssl/ssl_file.cc +4 -4
  383. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -0
  384. metadata +39 -31
  385. data/src/core/lib/promise/detail/basic_join.h +0 -197
  386. data/src/core/lib/promise/detail/switch.h +0 -1455
  387. data/src/core/lib/promise/try_join.h +0 -82
  388. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -403
  389. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_freebsd.c +0 -62
  390. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm.c +0 -38
  391. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +0 -31
  392. data/third_party/re2/util/benchmark.h +0 -156
  393. data/third_party/re2/util/flags.h +0 -26
  394. data/third_party/re2/util/malloc_counter.h +0 -19
  395. data/third_party/re2/util/pcre.cc +0 -1025
  396. data/third_party/re2/util/pcre.h +0 -681
  397. data/third_party/re2/util/test.h +0 -50
  398. data/third_party/upb/upb/mini_table.h +0 -36
  399. data/third_party/zlib/gzclose.c +0 -25
  400. data/third_party/zlib/gzlib.c +0 -639
  401. data/third_party/zlib/gzread.c +0 -650
  402. data/third_party/zlib/gzwrite.c +0 -677
@@ -31,7 +31,9 @@
31
31
  #include <utility>
32
32
 
33
33
  #include "absl/base/attributes.h"
34
+ #include "absl/base/internal/endian.h"
34
35
  #include "absl/base/internal/raw_logging.h"
36
+ #include "absl/base/optimization.h"
35
37
  #include "absl/numeric/bits.h"
36
38
  #include "absl/strings/ascii.h"
37
39
  #include "absl/strings/charconv.h"
@@ -136,82 +138,132 @@ bool SimpleAtob(absl::string_view str, bool* out) {
136
138
 
137
139
  namespace {
138
140
 
139
- // Used to optimize printing a decimal number's final digit.
140
- const char one_ASCII_final_digits[10][2] {
141
- {'0', 0}, {'1', 0}, {'2', 0}, {'3', 0}, {'4', 0},
142
- {'5', 0}, {'6', 0}, {'7', 0}, {'8', 0}, {'9', 0},
143
- };
141
+ // Various routines to encode integers to strings.
142
+
143
+ // We split data encodings into a group of 2 digits, 4 digits, 8 digits as
144
+ // it's easier to combine powers of two into scalar arithmetic.
145
+
146
+ // Previous implementation used a lookup table of 200 bytes for every 2 bytes
147
+ // and it was memory bound, any L1 cache miss would result in a much slower
148
+ // result. When benchmarking with a cache eviction rate of several percent,
149
+ // this implementation proved to be better.
150
+
151
+ // These constants represent '00', '0000' and '00000000' as ascii strings in
152
+ // integers. We can add these numbers if we encode to bytes from 0 to 9. as
153
+ // 'i' = '0' + i for 0 <= i <= 9.
154
+ constexpr uint32_t kTwoZeroBytes = 0x0101 * '0';
155
+ constexpr uint64_t kFourZeroBytes = 0x01010101 * '0';
156
+ constexpr uint64_t kEightZeroBytes = 0x0101010101010101ull * '0';
157
+
158
+ // * 103 / 1024 is a division by 10 for values from 0 to 99. It's also a
159
+ // division of a structure [k takes 2 bytes][m takes 2 bytes], then * 103 / 1024
160
+ // will be [k / 10][m / 10]. It allows parallel division.
161
+ constexpr uint64_t kDivisionBy10Mul = 103u;
162
+ constexpr uint64_t kDivisionBy10Div = 1 << 10;
163
+
164
+ // * 10486 / 1048576 is a division by 100 for values from 0 to 9999.
165
+ constexpr uint64_t kDivisionBy100Mul = 10486u;
166
+ constexpr uint64_t kDivisionBy100Div = 1 << 20;
167
+
168
+ // Encode functions write the ASCII output of input `n` to `out_str`.
169
+ inline char* EncodeHundred(uint32_t n, char* out_str) {
170
+ int num_digits = static_cast<int>(n - 10) >> 8;
171
+ uint32_t base = kTwoZeroBytes;
172
+ uint32_t div10 = (n * kDivisionBy10Mul) / kDivisionBy10Div;
173
+ uint32_t mod10 = n - 10u * div10;
174
+ base += div10 + (mod10 << 8);
175
+ base >>= num_digits & 8;
176
+ little_endian::Store16(out_str, static_cast<uint16_t>(base));
177
+ return out_str + 2 + num_digits;
178
+ }
144
179
 
145
- } // namespace
180
+ inline char* EncodeTenThousand(uint32_t n, char* out_str) {
181
+ // We split lower 2 digits and upper 2 digits of n into 2 byte consecutive
182
+ // blocks. 123 -> [\0\1][\0\23]. We divide by 10 both blocks
183
+ // (it's 1 division + zeroing upper bits), and compute modulo 10 as well "in
184
+ // parallel". Then we combine both results to have both ASCII digits,
185
+ // strip trailing zeros, add ASCII '0000' and return.
186
+ uint32_t div100 = (n * kDivisionBy100Mul) / kDivisionBy100Div;
187
+ uint32_t mod100 = n - 100ull * div100;
188
+ uint32_t hundreds = (mod100 << 16) + div100;
189
+ uint32_t tens = (hundreds * kDivisionBy10Mul) / kDivisionBy10Div;
190
+ tens &= (0xFull << 16) | 0xFull;
191
+ tens += (hundreds - 10ull * tens) << 8;
192
+ ABSL_ASSUME(tens != 0);
193
+ // The result can contain trailing zero bits, we need to strip them to a first
194
+ // significant byte in a final representation. For example, for n = 123, we
195
+ // have tens to have representation \0\1\2\3. We do `& -8` to round
196
+ // to a multiple to 8 to strip zero bytes, not all zero bits.
197
+ // countr_zero to help.
198
+ // 0 minus 8 to make MSVC happy.
199
+ uint32_t zeroes = static_cast<uint32_t>(absl::countr_zero(tens)) & (0 - 8ull);
200
+ tens += kFourZeroBytes;
201
+ tens >>= zeroes;
202
+ little_endian::Store32(out_str, tens);
203
+ return out_str + sizeof(tens) - zeroes / 8;
204
+ }
146
205
 
147
- char* numbers_internal::FastIntToBuffer(uint32_t i, char* buffer) {
148
- uint32_t digits;
149
- // The idea of this implementation is to trim the number of divides to as few
150
- // as possible, and also reducing memory stores and branches, by going in
151
- // steps of two digits at a time rather than one whenever possible.
152
- // The huge-number case is first, in the hopes that the compiler will output
153
- // that case in one branch-free block of code, and only output conditional
154
- // branches into it from below.
155
- if (i >= 1000000000) { // >= 1,000,000,000
156
- digits = i / 100000000; // 100,000,000
157
- i -= digits * 100000000;
158
- PutTwoDigits(digits, buffer);
159
- buffer += 2;
160
- lt100_000_000:
161
- digits = i / 1000000; // 1,000,000
162
- i -= digits * 1000000;
163
- PutTwoDigits(digits, buffer);
164
- buffer += 2;
165
- lt1_000_000:
166
- digits = i / 10000; // 10,000
167
- i -= digits * 10000;
168
- PutTwoDigits(digits, buffer);
169
- buffer += 2;
170
- lt10_000:
171
- digits = i / 100;
172
- i -= digits * 100;
173
- PutTwoDigits(digits, buffer);
174
- buffer += 2;
175
- lt100:
176
- digits = i;
177
- PutTwoDigits(digits, buffer);
178
- buffer += 2;
179
- *buffer = 0;
180
- return buffer;
181
- }
206
+ // Prepare functions return an integer that should be written to out_str
207
+ // (but possibly include trailing zeros).
208
+ // For hi < 10000, lo < 10000 returns uint64_t as encoded in ASCII with
209
+ // possibly trailing zeroes of the number hi * 10000 + lo.
210
+ inline uint64_t PrepareTenThousands(uint64_t hi, uint64_t lo) {
211
+ uint64_t merged = hi | (lo << 32);
212
+ uint64_t div100 = ((merged * kDivisionBy100Mul) / kDivisionBy100Div) &
213
+ ((0x7Full << 32) | 0x7Full);
214
+ uint64_t mod100 = merged - 100ull * div100;
215
+ uint64_t hundreds = (mod100 << 16) + div100;
216
+ uint64_t tens = (hundreds * kDivisionBy10Mul) / kDivisionBy10Div;
217
+ tens &= (0xFull << 48) | (0xFull << 32) | (0xFull << 16) | 0xFull;
218
+ tens += (hundreds - 10ull * tens) << 8;
219
+ return tens;
220
+ }
182
221
 
183
- if (i < 100) {
184
- digits = i;
185
- if (i >= 10) goto lt100;
186
- memcpy(buffer, one_ASCII_final_digits[i], 2);
187
- return buffer + 1;
222
+ inline char* EncodeFullU32(uint32_t n, char* out_str) {
223
+ if (n < 100'000'000) {
224
+ uint64_t bottom = PrepareTenThousands(n / 10000, n % 10000);
225
+ ABSL_ASSUME(bottom != 0);
226
+ // 0 minus 8 to make MSVC happy.
227
+ uint32_t zeroes = static_cast<uint32_t>(absl::countr_zero(bottom))
228
+ & (0 - 8ull);
229
+ uint64_t bottom_res = bottom + kEightZeroBytes;
230
+ bottom_res >>= zeroes;
231
+ little_endian::Store64(out_str, bottom_res);
232
+ return out_str + sizeof(bottom) - zeroes / 8;
188
233
  }
189
- if (i < 10000) { // 10,000
190
- if (i >= 1000) goto lt10_000;
191
- digits = i / 100;
192
- i -= digits * 100;
193
- *buffer++ = '0' + static_cast<char>(digits);
194
- goto lt100;
195
- }
196
- if (i < 1000000) { // 1,000,000
197
- if (i >= 100000) goto lt1_000_000;
198
- digits = i / 10000; // 10,000
199
- i -= digits * 10000;
200
- *buffer++ = '0' + static_cast<char>(digits);
201
- goto lt10_000;
234
+ uint32_t top = n / 100'000'000;
235
+ n %= 100'000'000;
236
+ uint64_t bottom = PrepareTenThousands(n / 10000, n % 10000);
237
+ uint64_t bottom_res = bottom + kEightZeroBytes;
238
+ out_str = EncodeHundred(top, out_str);
239
+ little_endian::Store64(out_str, bottom_res);
240
+ return out_str + sizeof(bottom);
241
+ }
242
+
243
+ } // namespace
244
+
245
+ void numbers_internal::PutTwoDigits(uint32_t i, char* buf) {
246
+ assert(i < 100);
247
+ uint32_t base = kTwoZeroBytes;
248
+ uint32_t div10 = (i * kDivisionBy10Mul) / kDivisionBy10Div;
249
+ uint32_t mod10 = i - 10u * div10;
250
+ base += div10 + (mod10 << 8);
251
+ little_endian::Store16(buf, static_cast<uint16_t>(base));
252
+ }
253
+
254
+ char* numbers_internal::FastIntToBuffer(uint32_t n, char* out_str) {
255
+ if (n < 100) {
256
+ out_str = EncodeHundred(n, out_str);
257
+ goto set_last_zero;
202
258
  }
203
- if (i < 100000000) { // 100,000,000
204
- if (i >= 10000000) goto lt100_000_000;
205
- digits = i / 1000000; // 1,000,000
206
- i -= digits * 1000000;
207
- *buffer++ = '0' + static_cast<char>(digits);
208
- goto lt1_000_000;
259
+ if (n < 10000) {
260
+ out_str = EncodeTenThousand(n, out_str);
261
+ goto set_last_zero;
209
262
  }
210
- // we already know that i < 1,000,000,000
211
- digits = i / 100000000; // 100,000,000
212
- i -= digits * 100000000;
213
- *buffer++ = '0' + static_cast<char>(digits);
214
- goto lt100_000_000;
263
+ out_str = EncodeFullU32(n, out_str);
264
+ set_last_zero:
265
+ *out_str = '\0';
266
+ return out_str;
215
267
  }
216
268
 
217
269
  char* numbers_internal::FastIntToBuffer(int32_t i, char* buffer) {
@@ -219,7 +271,7 @@ char* numbers_internal::FastIntToBuffer(int32_t i, char* buffer) {
219
271
  if (i < 0) {
220
272
  *buffer++ = '-';
221
273
  // We need to do the negation in modular (i.e., "unsigned")
222
- // arithmetic; MSVC++ apprently warns for plain "-u", so
274
+ // arithmetic; MSVC++ apparently warns for plain "-u", so
223
275
  // we write the equivalent expression "0 - u" instead.
224
276
  u = 0 - u;
225
277
  }
@@ -230,41 +282,40 @@ char* numbers_internal::FastIntToBuffer(uint64_t i, char* buffer) {
230
282
  uint32_t u32 = static_cast<uint32_t>(i);
231
283
  if (u32 == i) return numbers_internal::FastIntToBuffer(u32, buffer);
232
284
 
233
- // Here we know i has at least 10 decimal digits.
234
- uint64_t top_1to11 = i / 1000000000;
235
- u32 = static_cast<uint32_t>(i - top_1to11 * 1000000000);
236
- uint32_t top_1to11_32 = static_cast<uint32_t>(top_1to11);
285
+ // 10**9 < 2**32 <= i < 10**10, we can do 2+8
286
+ uint64_t div08 = i / 100'000'000ull;
287
+ uint64_t mod08 = i % 100'000'000ull;
288
+ uint64_t mod_result =
289
+ PrepareTenThousands(mod08 / 10000, mod08 % 10000) + kEightZeroBytes;
290
+ if (i < 10'000'000'000ull) {
291
+ buffer = EncodeHundred(static_cast<uint32_t>(div08), buffer);
292
+ little_endian::Store64(buffer, mod_result);
293
+ buffer += 8;
294
+ goto set_last_zero;
295
+ }
237
296
 
238
- if (top_1to11_32 == top_1to11) {
239
- buffer = numbers_internal::FastIntToBuffer(top_1to11_32, buffer);
297
+ // i < 10**16, in this case 8+8
298
+ if (i < 10'000'000'000'000'000ull) {
299
+ buffer = EncodeFullU32(static_cast<uint32_t>(div08), buffer);
300
+ little_endian::Store64(buffer, mod_result);
301
+ buffer += 8;
302
+ goto set_last_zero;
240
303
  } else {
241
- // top_1to11 has more than 32 bits too; print it in two steps.
242
- uint32_t top_8to9 = static_cast<uint32_t>(top_1to11 / 100);
243
- uint32_t mid_2 = static_cast<uint32_t>(top_1to11 - top_8to9 * 100);
244
- buffer = numbers_internal::FastIntToBuffer(top_8to9, buffer);
245
- PutTwoDigits(mid_2, buffer);
246
- buffer += 2;
304
+ // 4 + 8 + 8
305
+ uint64_t div016 = i / 10'000'000'000'000'000ull;
306
+ buffer = EncodeTenThousand(static_cast<uint32_t>(div016), buffer);
307
+ uint64_t mid_result = div08 - div016 * 100'000'000ull;
308
+ mid_result = PrepareTenThousands(mid_result / 10000, mid_result % 10000) +
309
+ kEightZeroBytes;
310
+ little_endian::Store64(buffer, mid_result);
311
+ buffer += 8;
312
+ little_endian::Store64(buffer, mod_result);
313
+ buffer += 8;
314
+ goto set_last_zero;
247
315
  }
248
-
249
- // We have only 9 digits now, again the maximum uint32_t can handle fully.
250
- uint32_t digits = u32 / 10000000; // 10,000,000
251
- u32 -= digits * 10000000;
252
- PutTwoDigits(digits, buffer);
253
- buffer += 2;
254
- digits = u32 / 100000; // 100,000
255
- u32 -= digits * 100000;
256
- PutTwoDigits(digits, buffer);
257
- buffer += 2;
258
- digits = u32 / 1000; // 1,000
259
- u32 -= digits * 1000;
260
- PutTwoDigits(digits, buffer);
261
- buffer += 2;
262
- digits = u32 / 10;
263
- u32 -= digits * 10;
264
- PutTwoDigits(digits, buffer);
265
- buffer += 2;
266
- memcpy(buffer, one_ASCII_final_digits[u32], 2);
267
- return buffer + 1;
316
+ set_last_zero:
317
+ *buffer = '\0';
318
+ return buffer;
268
319
  }
269
320
 
270
321
  char* numbers_internal::FastIntToBuffer(int64_t i, char* buffer) {
@@ -1048,25 +1099,6 @@ ABSL_CONST_INIT ABSL_DLL const char kHexTable[513] =
1048
1099
  "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
1049
1100
  "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
1050
1101
 
1051
- ABSL_CONST_INIT ABSL_DLL const char two_ASCII_digits[100][2] = {
1052
- {'0', '0'}, {'0', '1'}, {'0', '2'}, {'0', '3'}, {'0', '4'}, {'0', '5'},
1053
- {'0', '6'}, {'0', '7'}, {'0', '8'}, {'0', '9'}, {'1', '0'}, {'1', '1'},
1054
- {'1', '2'}, {'1', '3'}, {'1', '4'}, {'1', '5'}, {'1', '6'}, {'1', '7'},
1055
- {'1', '8'}, {'1', '9'}, {'2', '0'}, {'2', '1'}, {'2', '2'}, {'2', '3'},
1056
- {'2', '4'}, {'2', '5'}, {'2', '6'}, {'2', '7'}, {'2', '8'}, {'2', '9'},
1057
- {'3', '0'}, {'3', '1'}, {'3', '2'}, {'3', '3'}, {'3', '4'}, {'3', '5'},
1058
- {'3', '6'}, {'3', '7'}, {'3', '8'}, {'3', '9'}, {'4', '0'}, {'4', '1'},
1059
- {'4', '2'}, {'4', '3'}, {'4', '4'}, {'4', '5'}, {'4', '6'}, {'4', '7'},
1060
- {'4', '8'}, {'4', '9'}, {'5', '0'}, {'5', '1'}, {'5', '2'}, {'5', '3'},
1061
- {'5', '4'}, {'5', '5'}, {'5', '6'}, {'5', '7'}, {'5', '8'}, {'5', '9'},
1062
- {'6', '0'}, {'6', '1'}, {'6', '2'}, {'6', '3'}, {'6', '4'}, {'6', '5'},
1063
- {'6', '6'}, {'6', '7'}, {'6', '8'}, {'6', '9'}, {'7', '0'}, {'7', '1'},
1064
- {'7', '2'}, {'7', '3'}, {'7', '4'}, {'7', '5'}, {'7', '6'}, {'7', '7'},
1065
- {'7', '8'}, {'7', '9'}, {'8', '0'}, {'8', '1'}, {'8', '2'}, {'8', '3'},
1066
- {'8', '4'}, {'8', '5'}, {'8', '6'}, {'8', '7'}, {'8', '8'}, {'8', '9'},
1067
- {'9', '0'}, {'9', '1'}, {'9', '2'}, {'9', '3'}, {'9', '4'}, {'9', '5'},
1068
- {'9', '6'}, {'9', '7'}, {'9', '8'}, {'9', '9'}};
1069
-
1070
1102
  bool safe_strto32_base(absl::string_view text, int32_t* value, int base) {
1071
1103
  return safe_int_internal<int32_t>(text, value, base);
1072
1104
  }
@@ -125,8 +125,6 @@ namespace numbers_internal {
125
125
  ABSL_DLL extern const char kHexChar[17]; // 0123456789abcdef
126
126
  ABSL_DLL extern const char
127
127
  kHexTable[513]; // 000102030405060708090a0b0c0d0e0f1011...
128
- ABSL_DLL extern const char
129
- two_ASCII_digits[100][2]; // 00, 01, 02, 03...
130
128
 
131
129
  // Writes a two-character representation of 'i' to 'buf'. 'i' must be in the
132
130
  // range 0 <= i < 100, and buf must have space for two characters. Example:
@@ -134,10 +132,7 @@ ABSL_DLL extern const char
134
132
  // PutTwoDigits(42, buf);
135
133
  // // buf[0] == '4'
136
134
  // // buf[1] == '2'
137
- inline void PutTwoDigits(size_t i, char* buf) {
138
- assert(i < 100);
139
- memcpy(buf, two_ASCII_digits[i], 2);
140
- }
135
+ void PutTwoDigits(uint32_t i, char* buf);
141
136
 
142
137
  // safe_strto?() functions for implementing SimpleAtoi()
143
138
 
@@ -30,55 +30,6 @@
30
30
  namespace absl {
31
31
  ABSL_NAMESPACE_BEGIN
32
32
 
33
- AlphaNum::AlphaNum(Hex hex) {
34
- static_assert(numbers_internal::kFastToBufferSize >= 32,
35
- "This function only works when output buffer >= 32 bytes long");
36
- char* const end = &digits_[numbers_internal::kFastToBufferSize];
37
- auto real_width =
38
- absl::numbers_internal::FastHexToBufferZeroPad16(hex.value, end - 16);
39
- if (real_width >= hex.width) {
40
- piece_ = absl::string_view(end - real_width, real_width);
41
- } else {
42
- // Pad first 16 chars because FastHexToBufferZeroPad16 pads only to 16 and
43
- // max pad width can be up to 20.
44
- std::memset(end - 32, hex.fill, 16);
45
- // Patch up everything else up to the real_width.
46
- std::memset(end - real_width - 16, hex.fill, 16);
47
- piece_ = absl::string_view(end - hex.width, hex.width);
48
- }
49
- }
50
-
51
- AlphaNum::AlphaNum(Dec dec) {
52
- assert(dec.width <= numbers_internal::kFastToBufferSize);
53
- char* const end = &digits_[numbers_internal::kFastToBufferSize];
54
- char* const minfill = end - dec.width;
55
- char* writer = end;
56
- uint64_t value = dec.value;
57
- bool neg = dec.neg;
58
- while (value > 9) {
59
- *--writer = '0' + (value % 10);
60
- value /= 10;
61
- }
62
- *--writer = '0' + static_cast<char>(value);
63
- if (neg) *--writer = '-';
64
-
65
- ptrdiff_t fillers = writer - minfill;
66
- if (fillers > 0) {
67
- // Tricky: if the fill character is ' ', then it's <fill><+/-><digits>
68
- // But...: if the fill character is '0', then it's <+/-><fill><digits>
69
- bool add_sign_again = false;
70
- if (neg && dec.fill == '0') { // If filling with '0',
71
- ++writer; // ignore the sign we just added
72
- add_sign_again = true; // and re-add the sign later.
73
- }
74
- writer -= fillers;
75
- std::fill_n(writer, fillers, dec.fill);
76
- if (add_sign_again) *--writer = '-';
77
- }
78
-
79
- piece_ = absl::string_view(writer, static_cast<size_t>(end - writer));
80
- }
81
-
82
33
  // ----------------------------------------------------------------------
83
34
  // StrCat()
84
35
  // This merges the given strings or integers, with no delimiter. This
@@ -195,7 +146,13 @@ void AppendPieces(std::string* dest,
195
146
 
196
147
  void StrAppend(std::string* dest, const AlphaNum& a) {
197
148
  ASSERT_NO_OVERLAP(*dest, a);
198
- dest->append(a.data(), a.size());
149
+ std::string::size_type old_size = dest->size();
150
+ strings_internal::STLStringResizeUninitializedAmortized(dest,
151
+ old_size + a.size());
152
+ char* const begin = &(*dest)[0];
153
+ char* out = begin + old_size;
154
+ out = Append(out, a);
155
+ assert(out == begin + dest->size());
199
156
  }
200
157
 
201
158
  void StrAppend(std::string* dest, const AlphaNum& a, const AlphaNum& b) {
@@ -87,13 +87,16 @@
87
87
  #ifndef ABSL_STRINGS_STR_CAT_H_
88
88
  #define ABSL_STRINGS_STR_CAT_H_
89
89
 
90
+ #include <algorithm>
90
91
  #include <array>
91
92
  #include <cstdint>
93
+ #include <cstring>
92
94
  #include <string>
93
95
  #include <type_traits>
94
96
  #include <utility>
95
97
  #include <vector>
96
98
 
99
+ #include "absl/base/attributes.h"
97
100
  #include "absl/base/port.h"
98
101
  #include "absl/strings/internal/has_absl_stringify.h"
99
102
  #include "absl/strings/internal/stringify_sink.h"
@@ -201,6 +204,27 @@ struct Hex {
201
204
  explicit Hex(Pointee* v, PadSpec spec = absl::kNoPad)
202
205
  : Hex(spec, reinterpret_cast<uintptr_t>(v)) {}
203
206
 
207
+ template <typename S>
208
+ friend void AbslStringify(S& sink, Hex hex) {
209
+ static_assert(
210
+ numbers_internal::kFastToBufferSize >= 32,
211
+ "This function only works when output buffer >= 32 bytes long");
212
+ char buffer[numbers_internal::kFastToBufferSize];
213
+ char* const end = &buffer[numbers_internal::kFastToBufferSize];
214
+ auto real_width =
215
+ absl::numbers_internal::FastHexToBufferZeroPad16(hex.value, end - 16);
216
+ if (real_width >= hex.width) {
217
+ sink.Append(absl::string_view(end - real_width, real_width));
218
+ } else {
219
+ // Pad first 16 chars because FastHexToBufferZeroPad16 pads only to 16 and
220
+ // max pad width can be up to 20.
221
+ std::memset(end - 32, hex.fill, 16);
222
+ // Patch up everything else up to the real_width.
223
+ std::memset(end - real_width - 16, hex.fill, 16);
224
+ sink.Append(absl::string_view(end - hex.width, hex.width));
225
+ }
226
+ }
227
+
204
228
  private:
205
229
  Hex(PadSpec spec, uint64_t v)
206
230
  : value(v),
@@ -235,6 +259,38 @@ struct Dec {
235
259
  : spec - absl::kZeroPad2 + 2),
236
260
  fill(spec >= absl::kSpacePad2 ? ' ' : '0'),
237
261
  neg(v < 0) {}
262
+
263
+ template <typename S>
264
+ friend void AbslStringify(S& sink, Dec dec) {
265
+ assert(dec.width <= numbers_internal::kFastToBufferSize);
266
+ char buffer[numbers_internal::kFastToBufferSize];
267
+ char* const end = &buffer[numbers_internal::kFastToBufferSize];
268
+ char* const minfill = end - dec.width;
269
+ char* writer = end;
270
+ uint64_t val = dec.value;
271
+ while (val > 9) {
272
+ *--writer = '0' + (val % 10);
273
+ val /= 10;
274
+ }
275
+ *--writer = '0' + static_cast<char>(val);
276
+ if (dec.neg) *--writer = '-';
277
+
278
+ ptrdiff_t fillers = writer - minfill;
279
+ if (fillers > 0) {
280
+ // Tricky: if the fill character is ' ', then it's <fill><+/-><digits>
281
+ // But...: if the fill character is '0', then it's <+/-><fill><digits>
282
+ bool add_sign_again = false;
283
+ if (dec.neg && dec.fill == '0') { // If filling with '0',
284
+ ++writer; // ignore the sign we just added
285
+ add_sign_again = true; // and re-add the sign later.
286
+ }
287
+ writer -= fillers;
288
+ std::fill_n(writer, fillers, dec.fill);
289
+ if (add_sign_again) *--writer = '-';
290
+ }
291
+
292
+ sink.Append(absl::string_view(writer, static_cast<size_t>(end - writer)));
293
+ }
238
294
  };
239
295
 
240
296
  // -----------------------------------------------------------------------------
@@ -282,28 +338,30 @@ class AlphaNum {
282
338
  AlphaNum(double f) // NOLINT(runtime/explicit)
283
339
  : piece_(digits_, numbers_internal::SixDigitsToBuffer(f, digits_)) {}
284
340
 
285
- AlphaNum(Hex hex); // NOLINT(runtime/explicit)
286
- AlphaNum(Dec dec); // NOLINT(runtime/explicit)
287
-
288
341
  template <size_t size>
289
342
  AlphaNum( // NOLINT(runtime/explicit)
290
- const strings_internal::AlphaNumBuffer<size>& buf)
343
+ const strings_internal::AlphaNumBuffer<size>& buf
344
+ ABSL_ATTRIBUTE_LIFETIME_BOUND)
291
345
  : piece_(&buf.data[0], buf.size) {}
292
346
 
293
- AlphaNum(const char* c_str) // NOLINT(runtime/explicit)
294
- : piece_(NullSafeStringView(c_str)) {} // NOLINT(runtime/explicit)
295
- AlphaNum(absl::string_view pc) : piece_(pc) {} // NOLINT(runtime/explicit)
347
+ AlphaNum(const char* c_str // NOLINT(runtime/explicit)
348
+ ABSL_ATTRIBUTE_LIFETIME_BOUND)
349
+ : piece_(NullSafeStringView(c_str)) {}
350
+ AlphaNum(absl::string_view pc // NOLINT(runtime/explicit)
351
+ ABSL_ATTRIBUTE_LIFETIME_BOUND)
352
+ : piece_(pc) {}
296
353
 
297
354
  template <typename T, typename = typename std::enable_if<
298
355
  strings_internal::HasAbslStringify<T>::value>::type>
299
- AlphaNum( // NOLINT(runtime/explicit)
300
- const T& v, // NOLINT(runtime/explicit)
301
- strings_internal::StringifySink&& sink = {}) // NOLINT(runtime/explicit)
356
+ AlphaNum( // NOLINT(runtime/explicit)
357
+ const T& v ABSL_ATTRIBUTE_LIFETIME_BOUND,
358
+ strings_internal::StringifySink&& sink ABSL_ATTRIBUTE_LIFETIME_BOUND = {})
302
359
  : piece_(strings_internal::ExtractStringification(sink, v)) {}
303
360
 
304
361
  template <typename Allocator>
305
362
  AlphaNum( // NOLINT(runtime/explicit)
306
- const std::basic_string<char, std::char_traits<char>, Allocator>& str)
363
+ const std::basic_string<char, std::char_traits<char>, Allocator>& str
364
+ ABSL_ATTRIBUTE_LIFETIME_BOUND)
307
365
  : piece_(str) {}
308
366
 
309
367
  // Use string literals ":" instead of character literals ':'.
@@ -316,14 +374,24 @@ class AlphaNum {
316
374
  const char* data() const { return piece_.data(); }
317
375
  absl::string_view Piece() const { return piece_; }
318
376
 
319
- // Normal enums are already handled by the integer formatters.
320
- // This overload matches only scoped enums.
377
+ // Match unscoped enums. Use integral promotion so that a `char`-backed
378
+ // enum becomes a wider integral type AlphaNum will accept.
321
379
  template <typename T,
322
380
  typename = typename std::enable_if<
323
- std::is_enum<T>{} && !std::is_convertible<T, int>{} &&
381
+ std::is_enum<T>{} && std::is_convertible<T, int>{} &&
324
382
  !strings_internal::HasAbslStringify<T>::value>::type>
325
383
  AlphaNum(T e) // NOLINT(runtime/explicit)
326
- : AlphaNum(static_cast<typename std::underlying_type<T>::type>(e)) {}
384
+ : AlphaNum(+e) {}
385
+
386
+ // This overload matches scoped enums. We must explicitly cast to the
387
+ // underlying type, but use integral promotion for the same reason as above.
388
+ template <typename T,
389
+ typename std::enable_if<
390
+ std::is_enum<T>{} && !std::is_convertible<T, int>{} &&
391
+ !strings_internal::HasAbslStringify<T>::value,
392
+ char*>::type = nullptr>
393
+ AlphaNum(T e) // NOLINT(runtime/explicit)
394
+ : AlphaNum(+static_cast<typename std::underlying_type<T>::type>(e)) {}
327
395
 
328
396
  // vector<bool>::reference and const_reference require special help to
329
397
  // convert to `AlphaNum` because it requires two user defined conversions.
@@ -36,10 +36,12 @@
36
36
  // * `absl::StreamFormat()` to more efficiently write a format string to a
37
37
  // stream, such as`std::cout`.
38
38
  // * `absl::PrintF()`, `absl::FPrintF()` and `absl::SNPrintF()` as
39
- // replacements for `std::printf()`, `std::fprintf()` and `std::snprintf()`.
39
+ // drop-in replacements for `std::printf()`, `std::fprintf()` and
40
+ // `std::snprintf()`.
40
41
  //
41
- // Note: a version of `std::sprintf()` is not supported as it is
42
- // generally unsafe due to buffer overflows.
42
+ // Note: An `absl::SPrintF()` drop-in replacement is not supported as it
43
+ // is generally unsafe due to buffer overflows. Use `absl::StrFormat` which
44
+ // returns the string as output instead of expecting a pre-allocated buffer.
43
45
  //
44
46
  // Additionally, you can provide a format string (and its associated arguments)
45
47
  // using one of the following abstractions:
@@ -257,6 +259,7 @@ class FormatCountCapture {
257
259
  // * Characters: `char`, `signed char`, `unsigned char`
258
260
  // * Integers: `int`, `short`, `unsigned short`, `unsigned`, `long`,
259
261
  // `unsigned long`, `long long`, `unsigned long long`
262
+ // * Enums: printed as their underlying integral value
260
263
  // * Floating-point: `float`, `double`, `long double`
261
264
  //
262
265
  // However, in the `str_format` library, a format conversion specifies a broader
@@ -60,19 +60,23 @@ absl::string_view GenericFind(absl::string_view text,
60
60
  // Finds using absl::string_view::find(), therefore the length of the found
61
61
  // delimiter is delimiter.length().
62
62
  struct LiteralPolicy {
63
- size_t Find(absl::string_view text, absl::string_view delimiter, size_t pos) {
63
+ static size_t Find(absl::string_view text, absl::string_view delimiter,
64
+ size_t pos) {
64
65
  return text.find(delimiter, pos);
65
66
  }
66
- size_t Length(absl::string_view delimiter) { return delimiter.length(); }
67
+ static size_t Length(absl::string_view delimiter) {
68
+ return delimiter.length();
69
+ }
67
70
  };
68
71
 
69
72
  // Finds using absl::string_view::find_first_of(), therefore the length of the
70
73
  // found delimiter is 1.
71
74
  struct AnyOfPolicy {
72
- size_t Find(absl::string_view text, absl::string_view delimiter, size_t pos) {
75
+ static size_t Find(absl::string_view text, absl::string_view delimiter,
76
+ size_t pos) {
73
77
  return text.find_first_of(delimiter, pos);
74
78
  }
75
- size_t Length(absl::string_view /* delimiter */) { return 1; }
79
+ static size_t Length(absl::string_view /* delimiter */) { return 1; }
76
80
  };
77
81
 
78
82
  } // namespace
@@ -123,8 +127,7 @@ ByLength::ByLength(ptrdiff_t length) : length_(length) {
123
127
  ABSL_RAW_CHECK(length > 0, "");
124
128
  }
125
129
 
126
- absl::string_view ByLength::Find(absl::string_view text,
127
- size_t pos) const {
130
+ absl::string_view ByLength::Find(absl::string_view text, size_t pos) const {
128
131
  pos = std::min(pos, text.size()); // truncate `pos`
129
132
  absl::string_view substr = text.substr(pos);
130
133
  // If the string is shorter than the chunk size we say we