grpc 1.47.0 → 1.48.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -20,6 +20,8 @@ bsd = RUBY_PLATFORM =~ /bsd/
20
20
  darwin = RUBY_PLATFORM =~ /darwin/
21
21
  linux = RUBY_PLATFORM =~ /linux/
22
22
  cross_compiling = ENV['RCD_HOST_RUBY_VERSION'] # set by rake-compiler-dock in build containers
23
+ # TruffleRuby uses the Sulong LLVM runtime, which is different from Apple's.
24
+ apple_toolchain = darwin && RUBY_ENGINE != 'truffleruby'
23
25
 
24
26
  grpc_root = File.expand_path(File.join(File.dirname(__FILE__), '../../../..'))
25
27
 
@@ -27,30 +29,53 @@ grpc_config = ENV['GRPC_CONFIG'] || 'opt'
27
29
 
28
30
  ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
29
31
 
30
- if ENV['AR'].nil? || ENV['AR'].size == 0
31
- ENV['AR'] = RbConfig::CONFIG['AR']
32
+ def env_unset?(name)
33
+ ENV[name].nil? || ENV[name].size == 0
32
34
  end
33
- if ENV['CC'].nil? || ENV['CC'].size == 0
34
- ENV['CC'] = RbConfig::CONFIG['CC']
35
+
36
+ def rbconfig_set?(name)
37
+ RbConfig::CONFIG[name] && RbConfig::CONFIG[name].size > 0
35
38
  end
36
- if ENV['CXX'].nil? || ENV['CXX'].size == 0
37
- ENV['CXX'] = RbConfig::CONFIG['CXX']
39
+
40
+ def inherit_rbconfig(name)
41
+ ENV[name] = RbConfig::CONFIG[name] if env_unset?(name) && rbconfig_set?(name)
38
42
  end
39
- if ENV['LD'].nil? || ENV['LD'].size == 0
40
- ENV['LD'] = ENV['CC']
43
+
44
+ def env_append(name, string)
45
+ ENV[name] ||= ''
46
+ ENV[name] += ' ' + string
47
+ end
48
+
49
+ inherit_rbconfig 'AR'
50
+ inherit_rbconfig 'CC'
51
+ inherit_rbconfig 'CXX'
52
+ inherit_rbconfig 'RANLIB'
53
+ inherit_rbconfig 'STRIP'
54
+ inherit_rbconfig 'CPPFLAGS'
55
+ inherit_rbconfig 'LDFLAGS'
56
+
57
+ ENV['LD'] = ENV['CC'] if env_unset?('LD')
58
+ ENV['LDXX'] = ENV['CXX'] if env_unset?('LDXX')
59
+
60
+ if RUBY_ENGINE == 'truffleruby'
61
+ # ensure we can find the system's OpenSSL
62
+ env_append 'CPPFLAGS', RbConfig::CONFIG['cppflags']
41
63
  end
42
64
 
43
- if darwin && !cross_compiling
65
+ if apple_toolchain && !cross_compiling
44
66
  ENV['AR'] = 'libtool'
45
67
  ENV['ARFLAGS'] = '-o'
46
68
  end
47
69
 
48
- ENV['EMBED_OPENSSL'] = 'true'
49
- ENV['EMBED_ZLIB'] = 'true'
70
+ # Don't embed on TruffleRuby (constant-time crypto is unsafe with Sulong, slow build times)
71
+ ENV['EMBED_OPENSSL'] = (RUBY_ENGINE != 'truffleruby').to_s
72
+ # Don't embed on TruffleRuby (the system zlib is already linked for the zlib C extension, slow build times)
73
+ ENV['EMBED_ZLIB'] = (RUBY_ENGINE != 'truffleruby').to_s
74
+
50
75
  ENV['EMBED_CARES'] = 'true'
51
76
 
52
77
  ENV['ARCH_FLAGS'] = RbConfig::CONFIG['ARCH_FLAG']
53
- if darwin && !cross_compiling
78
+ if apple_toolchain && !cross_compiling
54
79
  if RUBY_PLATFORM =~ /arm64/
55
80
  ENV['ARCH_FLAGS'] = '-arch arm64'
56
81
  else
@@ -58,9 +83,11 @@ if darwin && !cross_compiling
58
83
  end
59
84
  end
60
85
 
61
- ENV['CPPFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
62
- ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\"" '
63
- ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.47.0\"" '
86
+ env_append 'CPPFLAGS', '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
87
+ env_append 'CPPFLAGS', '-DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\""'
88
+
89
+ require_relative '../../lib/grpc/version'
90
+ env_append 'CPPFLAGS', '-DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"' + GRPC::VERSION + '\""'
64
91
 
65
92
  output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
66
93
  grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
@@ -85,8 +112,9 @@ end
85
112
  $CFLAGS << ' -I' + File.join(grpc_root, 'include')
86
113
 
87
114
  ext_export_file = File.join(grpc_root, 'src', 'ruby', 'ext', 'grpc', 'ext-export')
115
+ ext_export_file += '-truffleruby' if RUBY_ENGINE == 'truffleruby'
88
116
  $LDFLAGS << ' -Wl,--version-script="' + ext_export_file + '.gcc"' if linux
89
- $LDFLAGS << ' -Wl,-exported_symbols_list,"' + ext_export_file + '.clang"' if darwin
117
+ $LDFLAGS << ' -Wl,-exported_symbols_list,"' + ext_export_file + '.clang"' if apple_toolchain
90
118
 
91
119
  $LDFLAGS << ' ' + File.join(grpc_lib_dir, 'libgrpc.a') unless windows
92
120
  if grpc_config == 'gcov'
@@ -99,7 +127,10 @@ if grpc_config == 'dbg'
99
127
  end
100
128
 
101
129
  $LDFLAGS << ' -Wl,-wrap,memcpy' if linux
102
- $LDFLAGS << ' -static-libgcc -static-libstdc++' if linux
130
+ # Do not statically link standard libraries on TruffleRuby as this does not work when compiling to bitcode
131
+ if linux && RUBY_ENGINE != 'truffleruby'
132
+ $LDFLAGS << ' -static-libgcc -static-libstdc++'
133
+ end
103
134
  $LDFLAGS << ' -static' if windows
104
135
 
105
136
  $CFLAGS << ' -std=c11 '
@@ -112,7 +143,7 @@ puts 'Generating Makefile for ' + output
112
143
  create_makefile(output)
113
144
 
114
145
  strip_tool = RbConfig::CONFIG['STRIP']
115
- strip_tool += ' -x' if darwin
146
+ strip_tool += ' -x' if apple_toolchain
116
147
 
117
148
  if grpc_config == 'opt'
118
149
  File.open('Makefile.new', 'w') do |o|
@@ -278,7 +278,7 @@ extern grpc_resource_quota_resize_type grpc_resource_quota_resize_import;
278
278
  typedef void(*grpc_resource_quota_set_max_threads_type)(grpc_resource_quota* resource_quota, int new_max_threads);
279
279
  extern grpc_resource_quota_set_max_threads_type grpc_resource_quota_set_max_threads_import;
280
280
  #define grpc_resource_quota_set_max_threads grpc_resource_quota_set_max_threads_import
281
- typedef grpc_slice(*grpc_dump_xds_configs_type)();
281
+ typedef grpc_slice(*grpc_dump_xds_configs_type)(void);
282
282
  extern grpc_dump_xds_configs_type grpc_dump_xds_configs_import;
283
283
  #define grpc_dump_xds_configs grpc_dump_xds_configs_import
284
284
  typedef const grpc_arg_pointer_vtable*(*grpc_resource_quota_arg_vtable_type)(void);
@@ -43,7 +43,7 @@ module GRPC
43
43
  debug_error_string = nil)
44
44
  exception_message = "#{code}:#{details}"
45
45
  if debug_error_string
46
- exception_message += ". debug_error_string:#{debug_error_string}"
46
+ exception_message += ". debug_error_string:{#{debug_error_string}}"
47
47
  end
48
48
  super(exception_message)
49
49
  @code = code
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.47.0'
17
+ VERSION = '1.48.0.pre1'
18
18
  end
@@ -498,31 +498,10 @@ describe 'ClientStub' do # rubocop:disable Metrics/BlockLength
498
498
  /Header values must be of type string or array/)
499
499
  end
500
500
 
501
- def run_server_streamer_against_client_with_unmarshal_error(
502
- expected_input, replys)
503
- wakey_thread do |notifier|
504
- c = expect_server_to_be_invoked(notifier)
505
- expect(c.remote_read).to eq(expected_input)
506
- begin
507
- replys.each { |r| c.remote_send(r) }
508
- rescue GRPC::Core::CallError
509
- # An attempt to write to the client might fail. This is ok
510
- # because the client call is expected to fail when
511
- # unmarshalling the first response, and to cancel the call,
512
- # and there is a race as for when the server-side call will
513
- # start to fail.
514
- p 'remote_send failed (allowed because call expected to cancel)'
515
- ensure
516
- c.send_status(OK, 'OK', true)
517
- close_active_server_call(c)
518
- end
519
- end
520
- end
521
-
522
501
  it 'the call terminates when there is an unmarshalling error' do
523
502
  server_port = create_test_server
524
503
  host = "localhost:#{server_port}"
525
- th = run_server_streamer_against_client_with_unmarshal_error(
504
+ th = run_server_streamer_handle_client_cancellation(
526
505
  @sent_msg, @replys)
527
506
  stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
528
507
 
@@ -597,7 +576,8 @@ describe 'ClientStub' do # rubocop:disable Metrics/BlockLength
597
576
  it 'raises GRPC::Cancelled after the call has been cancelled' do
598
577
  server_port = create_test_server
599
578
  host = "localhost:#{server_port}"
600
- th = run_server_streamer(@sent_msg, @replys, @pass)
579
+ th = run_server_streamer_handle_client_cancellation(
580
+ @sent_msg, @replys)
601
581
  stub = GRPC::ClientStub.new(host, :this_channel_is_insecure)
602
582
  resp = get_responses(stub, run_start_call_first: false)
603
583
  expect(resp.next).to eq('reply_1')
@@ -1037,6 +1017,26 @@ describe 'ClientStub' do # rubocop:disable Metrics/BlockLength
1037
1017
  end
1038
1018
  end
1039
1019
 
1020
+ def run_server_streamer_handle_client_cancellation(
1021
+ expected_input, replys)
1022
+ wakey_thread do |notifier|
1023
+ c = expect_server_to_be_invoked(notifier)
1024
+ expect(c.remote_read).to eq(expected_input)
1025
+ begin
1026
+ replys.each { |r| c.remote_send(r) }
1027
+ rescue GRPC::Core::CallError
1028
+ # An attempt to write to the client might fail. This is ok
1029
+ # because the client call is expected to cancel the call,
1030
+ # and there is a race as for when the server-side call will
1031
+ # start to fail.
1032
+ p 'remote_send failed (allowed because call expected to cancel)'
1033
+ ensure
1034
+ c.send_status(OK, 'OK', true)
1035
+ close_active_server_call(c)
1036
+ end
1037
+ end
1038
+ end
1039
+
1040
1040
  def run_request_response(expected_input, resp, status,
1041
1041
  expected_metadata: {},
1042
1042
  server_initial_md: {},
@@ -166,7 +166,7 @@ container_algorithm_internal::ContainerDifferenceType<const C> c_distance(
166
166
  // c_all_of()
167
167
  //
168
168
  // Container-based version of the <algorithm> `std::all_of()` function to
169
- // test a condition on all elements within a container.
169
+ // test if all elements within a container satisfy a condition.
170
170
  template <typename C, typename Pred>
171
171
  bool c_all_of(const C& c, Pred&& pred) {
172
172
  return std::all_of(container_algorithm_internal::c_begin(c),
@@ -136,9 +136,10 @@
136
136
  // for further information.
137
137
  // The MinGW compiler doesn't complain about the weak attribute until the link
138
138
  // step, presumably because Windows doesn't use ELF binaries.
139
- #if (ABSL_HAVE_ATTRIBUTE(weak) || \
140
- (defined(__GNUC__) && !defined(__clang__))) && \
141
- (!defined(_WIN32) || __clang_major__ < 9) && !defined(__MINGW32__)
139
+ #if (ABSL_HAVE_ATTRIBUTE(weak) || \
140
+ (defined(__GNUC__) && !defined(__clang__))) && \
141
+ (!defined(_WIN32) || (defined(__clang__) && __clang_major__ >= 9)) && \
142
+ !defined(__MINGW32__)
142
143
  #undef ABSL_ATTRIBUTE_WEAK
143
144
  #define ABSL_ATTRIBUTE_WEAK __attribute__((weak))
144
145
  #define ABSL_HAVE_ATTRIBUTE_WEAK 1
@@ -212,6 +213,9 @@
212
213
  // https://gcc.gnu.org/gcc-4.8/changes.html
213
214
  #if ABSL_HAVE_ATTRIBUTE(no_sanitize_address)
214
215
  #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
216
+ #elif defined(_MSC_VER) && _MSC_VER >= 1928
217
+ // https://docs.microsoft.com/en-us/cpp/cpp/no-sanitize-address
218
+ #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __declspec(no_sanitize_address)
215
219
  #else
216
220
  #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS
217
221
  #endif
@@ -311,7 +315,6 @@
311
315
  __attribute__((section(#name))) __attribute__((noinline))
312
316
  #endif
313
317
 
314
-
315
318
  // ABSL_ATTRIBUTE_SECTION_VARIABLE
316
319
  //
317
320
  // Tells the compiler/linker to put a given variable into a section and define
@@ -338,8 +341,8 @@
338
341
  // a no-op on ELF but not on Mach-O.
339
342
  //
340
343
  #ifndef ABSL_DECLARE_ATTRIBUTE_SECTION_VARS
341
- #define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) \
342
- extern char __start_##name[] ABSL_ATTRIBUTE_WEAK; \
344
+ #define ABSL_DECLARE_ATTRIBUTE_SECTION_VARS(name) \
345
+ extern char __start_##name[] ABSL_ATTRIBUTE_WEAK; \
343
346
  extern char __stop_##name[] ABSL_ATTRIBUTE_WEAK
344
347
  #endif
345
348
  #ifndef ABSL_DEFINE_ATTRIBUTE_SECTION_VARS
@@ -400,6 +403,9 @@
400
403
  //
401
404
  // Tells the compiler to warn about unused results.
402
405
  //
406
+ // For code or headers that are assured to only build with C++17 and up, prefer
407
+ // just using the standard `[[nodiscard]]` directly over this macro.
408
+ //
403
409
  // When annotating a function, it must appear as the first part of the
404
410
  // declaration or definition. The compiler will warn if the return value from
405
411
  // such a function is unused:
@@ -426,9 +432,10 @@
426
432
  // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425
427
433
  //
428
434
  // Note: past advice was to place the macro after the argument list.
429
- #if ABSL_HAVE_ATTRIBUTE(nodiscard)
430
- #define ABSL_MUST_USE_RESULT [[nodiscard]]
431
- #elif defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result)
435
+ //
436
+ // TODO(b/176172494): Use ABSL_HAVE_CPP_ATTRIBUTE(nodiscard) when all code is
437
+ // compliant with the stricter [[nodiscard]].
438
+ #if defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result)
432
439
  #define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))
433
440
  #else
434
441
  #define ABSL_MUST_USE_RESULT
@@ -498,7 +505,7 @@
498
505
  #define ABSL_XRAY_NEVER_INSTRUMENT [[clang::xray_never_instrument]]
499
506
  #if ABSL_HAVE_CPP_ATTRIBUTE(clang::xray_log_args)
500
507
  #define ABSL_XRAY_LOG_ARGS(N) \
501
- [[clang::xray_always_instrument, clang::xray_log_args(N)]]
508
+ [[clang::xray_always_instrument, clang::xray_log_args(N)]]
502
509
  #else
503
510
  #define ABSL_XRAY_LOG_ARGS(N) [[clang::xray_always_instrument]]
504
511
  #endif
@@ -642,6 +649,9 @@
642
649
  // declarations. The macro argument is used as a custom diagnostic message (e.g.
643
650
  // suggestion of a better alternative).
644
651
  //
652
+ // For code or headers that are assured to only build with C++14 and up, prefer
653
+ // just using the standard `[[deprecated("message")]]` directly over this macro.
654
+ //
645
655
  // Examples:
646
656
  //
647
657
  // class ABSL_DEPRECATED("Use Bar instead") Foo {...};
@@ -652,14 +662,17 @@
652
662
  // ABSL_DEPRECATED("Use DoThat() instead")
653
663
  // void DoThis();
654
664
  //
665
+ // enum FooEnum {
666
+ // kBar ABSL_DEPRECATED("Use kBaz instead"),
667
+ // };
668
+ //
655
669
  // Every usage of a deprecated entity will trigger a warning when compiled with
656
- // clang's `-Wdeprecated-declarations` option. This option is turned off by
657
- // default, but the warnings will be reported by clang-tidy.
658
- #if defined(__clang__) && defined(__cplusplus) && __cplusplus >= 201103L
670
+ // GCC/Clang's `-Wdeprecated-declarations` option. Google's production toolchain
671
+ // turns this warning off by default, instead relying on clang-tidy to report
672
+ // new uses of deprecated code.
673
+ #if ABSL_HAVE_ATTRIBUTE(deprecated)
659
674
  #define ABSL_DEPRECATED(message) __attribute__((deprecated(message)))
660
- #endif
661
-
662
- #ifndef ABSL_DEPRECATED
675
+ #else
663
676
  #define ABSL_DEPRECATED(message)
664
677
  #endif
665
678
 
@@ -669,9 +682,18 @@
669
682
  // not compile (on supported platforms) unless the variable has a constant
670
683
  // initializer. This is useful for variables with static and thread storage
671
684
  // duration, because it guarantees that they will not suffer from the so-called
672
- // "static init order fiasco". Prefer to put this attribute on the most visible
673
- // declaration of the variable, if there's more than one, because code that
674
- // accesses the variable can then use the attribute for optimization.
685
+ // "static init order fiasco".
686
+ //
687
+ // This attribute must be placed on the initializing declaration of the
688
+ // variable. Some compilers will give a -Wmissing-constinit warning when this
689
+ // attribute is placed on some other declaration but missing from the
690
+ // initializing declaration.
691
+ //
692
+ // In some cases (notably with thread_local variables), `ABSL_CONST_INIT` can
693
+ // also be used in a non-initializing declaration to tell the compiler that a
694
+ // variable is already initialized, reducing overhead that would otherwise be
695
+ // incurred by a hidden guard variable. Thus annotating all declarations with
696
+ // this attribute is recommended to potentially enhance optimization.
675
697
  //
676
698
  // Example:
677
699
  //
@@ -680,14 +702,19 @@
680
702
  // ABSL_CONST_INIT static MyType my_var;
681
703
  // };
682
704
  //
683
- // MyType MyClass::my_var = MakeMyType(...);
705
+ // ABSL_CONST_INIT MyType MyClass::my_var = MakeMyType(...);
706
+ //
707
+ // For code or headers that are assured to only build with C++20 and up, prefer
708
+ // just using the standard `constinit` keyword directly over this macro.
684
709
  //
685
710
  // Note that this attribute is redundant if the variable is declared constexpr.
686
- #if ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
711
+ #if defined(__cpp_constinit) && __cpp_constinit >= 201907L
712
+ #define ABSL_CONST_INIT constinit
713
+ #elif ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
687
714
  #define ABSL_CONST_INIT [[clang::require_constant_initialization]]
688
715
  #else
689
716
  #define ABSL_CONST_INIT
690
- #endif // ABSL_HAVE_CPP_ATTRIBUTE(clang::require_constant_initialization)
717
+ #endif
691
718
 
692
719
  // ABSL_ATTRIBUTE_PURE_FUNCTION
693
720
  //
@@ -29,6 +29,10 @@
29
29
  #include <type_traits>
30
30
  #include <utility>
31
31
 
32
+ #if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
33
+ #include <bit> // For std::bit_cast.
34
+ #endif // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
35
+
32
36
  #include "absl/base/internal/identity.h"
33
37
  #include "absl/base/macros.h"
34
38
  #include "absl/meta/type_traits.h"
@@ -36,19 +40,6 @@
36
40
  namespace absl {
37
41
  ABSL_NAMESPACE_BEGIN
38
42
 
39
- namespace internal_casts {
40
-
41
- template <class Dest, class Source>
42
- struct is_bitcastable
43
- : std::integral_constant<
44
- bool,
45
- sizeof(Dest) == sizeof(Source) &&
46
- type_traits_internal::is_trivially_copyable<Source>::value &&
47
- type_traits_internal::is_trivially_copyable<Dest>::value &&
48
- std::is_default_constructible<Dest>::value> {};
49
-
50
- } // namespace internal_casts
51
-
52
43
  // implicit_cast()
53
44
  //
54
45
  // Performs an implicit conversion between types following the language
@@ -105,81 +96,83 @@ constexpr To implicit_cast(typename absl::internal::identity_t<To> to) {
105
96
 
106
97
  // bit_cast()
107
98
  //
108
- // Performs a bitwise cast on a type without changing the underlying bit
109
- // representation of that type's value. The two types must be of the same size
110
- // and both types must be trivially copyable. As with most casts, use with
111
- // caution. A `bit_cast()` might be needed when you need to temporarily treat a
112
- // type as some other type, such as in the following cases:
99
+ // Creates a value of the new type `Dest` whose representation is the same as
100
+ // that of the argument, which is of (deduced) type `Source` (a "bitwise cast";
101
+ // every bit in the value representation of the result is equal to the
102
+ // corresponding bit in the object representation of the source). Source and
103
+ // destination types must be of the same size, and both types must be trivially
104
+ // copyable.
113
105
  //
114
- // * Serialization (casting temporarily to `char *` for those purposes is
115
- // always allowed by the C++ standard)
116
- // * Managing the individual bits of a type within mathematical operations
117
- // that are not normally accessible through that type
118
- // * Casting non-pointer types to pointer types (casting the other way is
119
- // allowed by `reinterpret_cast()` but round-trips cannot occur the other
120
- // way).
121
- //
122
- // Example:
106
+ // As with most casts, use with caution. A `bit_cast()` might be needed when you
107
+ // need to treat a value as the value of some other type, for example, to access
108
+ // the individual bits of an object which are not normally accessible through
109
+ // the object's type, such as for working with the binary representation of a
110
+ // floating point value:
123
111
  //
124
112
  // float f = 3.14159265358979;
125
- // int i = bit_cast<int32_t>(f);
113
+ // int i = bit_cast<int>(f);
126
114
  // // i = 0x40490fdb
127
115
  //
128
- // Casting non-pointer types to pointer types and then dereferencing them
129
- // traditionally produces undefined behavior.
116
+ // Reinterpreting and accessing a value directly as a different type (as shown
117
+ // below) usually results in undefined behavior.
130
118
  //
131
119
  // Example:
132
120
  //
133
121
  // // WRONG
134
- // float f = 3.14159265358979; // WRONG
135
- // int i = * reinterpret_cast<int*>(&f); // WRONG
122
+ // float f = 3.14159265358979;
123
+ // int i = reinterpret_cast<int&>(f); // Wrong
124
+ // int j = *reinterpret_cast<int*>(&f); // Equally wrong
125
+ // int k = *bit_cast<int*>(&f); // Equally wrong
136
126
  //
137
- // The address-casting method produces undefined behavior according to the ISO
138
- // C++ specification section [basic.lval]. Roughly, this section says: if an
139
- // object in memory has one type, and a program accesses it with a different
140
- // type, the result is undefined behavior for most values of "different type".
127
+ // Reinterpret-casting results in undefined behavior according to the ISO C++
128
+ // specification, section [basic.lval]. Roughly, this section says: if an object
129
+ // in memory has one type, and a program accesses it with a different type, the
130
+ // result is undefined behavior for most "different type".
131
+ //
132
+ // Using bit_cast on a pointer and then dereferencing it is no better than using
133
+ // reinterpret_cast. You should only use bit_cast on the value itself.
141
134
  //
142
135
  // Such casting results in type punning: holding an object in memory of one type
143
136
  // and reading its bits back using a different type. A `bit_cast()` avoids this
144
- // issue by implementing its casts using `memcpy()`, which avoids introducing
145
- // this undefined behavior.
146
- //
147
- // NOTE: The requirements here are more strict than the bit_cast of standard
148
- // proposal p0476 due to the need for workarounds and lack of intrinsics.
149
- // Specifically, this implementation also requires `Dest` to be
150
- // default-constructible.
151
- template <
152
- typename Dest, typename Source,
153
- typename std::enable_if<internal_casts::is_bitcastable<Dest, Source>::value,
154
- int>::type = 0>
137
+ // issue by copying the object representation to a new value, which avoids
138
+ // introducing this undefined behavior (since the original value is never
139
+ // accessed in the wrong way).
140
+ //
141
+ // The requirements of `absl::bit_cast` are more strict than that of
142
+ // `std::bit_cast` unless compiler support is available. Specifically, without
143
+ // compiler support, this implementation also requires `Dest` to be
144
+ // default-constructible. In C++20, `absl::bit_cast` is replaced by
145
+ // `std::bit_cast`.
146
+ #if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
147
+
148
+ using std::bit_cast;
149
+
150
+ #else // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
151
+
152
+ template <typename Dest, typename Source,
153
+ typename std::enable_if<
154
+ sizeof(Dest) == sizeof(Source) &&
155
+ type_traits_internal::is_trivially_copyable<Source>::value &&
156
+ type_traits_internal::is_trivially_copyable<Dest>::value
157
+ #if !ABSL_HAVE_BUILTIN(__builtin_bit_cast)
158
+ && std::is_default_constructible<Dest>::value
159
+ #endif // !ABSL_HAVE_BUILTIN(__builtin_bit_cast)
160
+ ,
161
+ int>::type = 0>
162
+ #if ABSL_HAVE_BUILTIN(__builtin_bit_cast)
163
+ inline constexpr Dest bit_cast(const Source& source) {
164
+ return __builtin_bit_cast(Dest, source);
165
+ }
166
+ #else // ABSL_HAVE_BUILTIN(__builtin_bit_cast)
155
167
  inline Dest bit_cast(const Source& source) {
156
168
  Dest dest;
157
169
  memcpy(static_cast<void*>(std::addressof(dest)),
158
170
  static_cast<const void*>(std::addressof(source)), sizeof(dest));
159
171
  return dest;
160
172
  }
173
+ #endif // ABSL_HAVE_BUILTIN(__builtin_bit_cast)
161
174
 
162
- // NOTE: This overload is only picked if the requirements of bit_cast are
163
- // not met. It is therefore UB, but is provided temporarily as previous
164
- // versions of this function template were unchecked. Do not use this in
165
- // new code.
166
- template <
167
- typename Dest, typename Source,
168
- typename std::enable_if<
169
- !internal_casts::is_bitcastable<Dest, Source>::value,
170
- int>::type = 0>
171
- ABSL_DEPRECATED(
172
- "absl::bit_cast type requirements were violated. Update the types "
173
- "being used such that they are the same size and are both "
174
- "TriviallyCopyable.")
175
- inline Dest bit_cast(const Source& source) {
176
- static_assert(sizeof(Dest) == sizeof(Source),
177
- "Source and destination types should have equal sizes.");
178
-
179
- Dest dest;
180
- memcpy(&dest, &source, sizeof(dest));
181
- return dest;
182
- }
175
+ #endif // defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L
183
176
 
184
177
  ABSL_NAMESPACE_END
185
178
  } // namespace absl