rbs 3.9.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +74 -0
  3. data/.clangd +2 -0
  4. data/.github/dependabot.yml +14 -14
  5. data/.github/workflows/bundle-update.yml +60 -0
  6. data/.github/workflows/c-check.yml +58 -0
  7. data/.github/workflows/comments.yml +5 -3
  8. data/.github/workflows/dependabot.yml +2 -2
  9. data/.github/workflows/ruby.yml +40 -32
  10. data/.github/workflows/rust.yml +95 -0
  11. data/.github/workflows/typecheck.yml +2 -2
  12. data/.github/workflows/windows.yml +3 -3
  13. data/.gitignore +4 -0
  14. data/.rubocop.yml +2 -2
  15. data/.vscode/extensions.json +5 -0
  16. data/.vscode/settings.json +19 -0
  17. data/CHANGELOG.md +284 -0
  18. data/README.md +38 -1
  19. data/Rakefile +144 -29
  20. data/Steepfile +2 -0
  21. data/config.yml +634 -62
  22. data/core/array.rbs +307 -227
  23. data/core/basic_object.rbs +9 -8
  24. data/core/binding.rbs +0 -2
  25. data/core/builtin.rbs +2 -2
  26. data/core/class.rbs +6 -5
  27. data/core/comparable.rbs +55 -34
  28. data/core/complex.rbs +104 -78
  29. data/core/dir.rbs +61 -49
  30. data/core/encoding.rbs +12 -15
  31. data/core/enumerable.rbs +188 -87
  32. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  33. data/core/enumerator.rbs +65 -2
  34. data/core/errno.rbs +11 -2
  35. data/core/errors.rbs +58 -29
  36. data/core/exception.rbs +13 -13
  37. data/core/fiber.rbs +74 -54
  38. data/core/file.rbs +280 -177
  39. data/core/file_test.rbs +3 -3
  40. data/core/float.rbs +257 -92
  41. data/core/gc.rbs +425 -281
  42. data/core/hash.rbs +1045 -739
  43. data/core/integer.rbs +135 -137
  44. data/core/io/buffer.rbs +53 -42
  45. data/core/io/wait.rbs +13 -35
  46. data/core/io.rbs +196 -148
  47. data/core/kernel.rbs +216 -155
  48. data/core/marshal.rbs +4 -4
  49. data/core/match_data.rbs +15 -13
  50. data/core/math.rbs +107 -66
  51. data/core/method.rbs +69 -33
  52. data/core/module.rbs +244 -106
  53. data/core/nil_class.rbs +7 -6
  54. data/core/numeric.rbs +74 -63
  55. data/core/object.rbs +9 -11
  56. data/core/object_space.rbs +30 -23
  57. data/core/pathname.rbs +1322 -0
  58. data/core/proc.rbs +95 -58
  59. data/core/process.rbs +222 -202
  60. data/core/ractor.rbs +371 -515
  61. data/core/random.rbs +21 -3
  62. data/core/range.rbs +159 -57
  63. data/core/rational.rbs +60 -89
  64. data/core/rbs/unnamed/argf.rbs +60 -53
  65. data/core/rbs/unnamed/env_class.rbs +19 -14
  66. data/core/rbs/unnamed/main_class.rbs +123 -0
  67. data/core/rbs/unnamed/random.rbs +11 -118
  68. data/core/regexp.rbs +258 -214
  69. data/core/ruby.rbs +53 -0
  70. data/core/ruby_vm.rbs +38 -34
  71. data/core/rubygems/config_file.rbs +5 -5
  72. data/core/rubygems/errors.rbs +4 -71
  73. data/core/rubygems/requirement.rbs +5 -5
  74. data/core/rubygems/rubygems.rbs +16 -82
  75. data/core/rubygems/version.rbs +2 -3
  76. data/core/set.rbs +490 -360
  77. data/core/signal.rbs +26 -16
  78. data/core/string.rbs +3303 -1365
  79. data/core/struct.rbs +27 -26
  80. data/core/symbol.rbs +41 -34
  81. data/core/thread.rbs +135 -74
  82. data/core/time.rbs +81 -50
  83. data/core/trace_point.rbs +41 -35
  84. data/core/true_class.rbs +2 -2
  85. data/core/unbound_method.rbs +24 -16
  86. data/core/warning.rbs +7 -7
  87. data/docs/aliases.md +79 -0
  88. data/docs/collection.md +3 -3
  89. data/docs/config.md +171 -0
  90. data/docs/encoding.md +56 -0
  91. data/docs/gem.md +0 -1
  92. data/docs/inline.md +576 -0
  93. data/docs/sigs.md +3 -3
  94. data/docs/syntax.md +46 -16
  95. data/docs/type_fingerprint.md +21 -0
  96. data/exe/rbs +1 -1
  97. data/ext/rbs_extension/ast_translation.c +1513 -0
  98. data/ext/rbs_extension/ast_translation.h +37 -0
  99. data/ext/rbs_extension/class_constants.c +185 -0
  100. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +22 -1
  101. data/ext/rbs_extension/compat.h +10 -0
  102. data/ext/rbs_extension/extconf.rb +25 -1
  103. data/ext/rbs_extension/legacy_location.c +294 -0
  104. data/ext/rbs_extension/legacy_location.h +82 -0
  105. data/ext/rbs_extension/main.c +468 -24
  106. data/ext/rbs_extension/rbs_extension.h +6 -21
  107. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  108. data/ext/rbs_extension/rbs_string_bridging.h +24 -0
  109. data/include/rbs/ast.h +1022 -0
  110. data/include/rbs/defines.h +86 -0
  111. data/include/rbs/lexer.h +206 -0
  112. data/include/rbs/location.h +40 -0
  113. data/include/rbs/parser.h +153 -0
  114. data/include/rbs/string.h +47 -0
  115. data/include/rbs/util/rbs_allocator.h +59 -0
  116. data/include/rbs/util/rbs_assert.h +20 -0
  117. data/include/rbs/util/rbs_buffer.h +83 -0
  118. data/include/rbs/util/rbs_constant_pool.h +6 -70
  119. data/include/rbs/util/rbs_encoding.h +282 -0
  120. data/include/rbs/util/rbs_unescape.h +24 -0
  121. data/include/rbs.h +9 -2
  122. data/lib/rbs/annotate/formatter.rb +3 -13
  123. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  124. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  125. data/lib/rbs/ast/annotation.rb +1 -1
  126. data/lib/rbs/ast/comment.rb +1 -1
  127. data/lib/rbs/ast/declarations.rb +10 -10
  128. data/lib/rbs/ast/members.rb +14 -14
  129. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  130. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  131. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  132. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  133. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  134. data/lib/rbs/ast/ruby/members.rb +723 -0
  135. data/lib/rbs/ast/type_param.rb +24 -4
  136. data/lib/rbs/buffer.rb +105 -20
  137. data/lib/rbs/cli/diff.rb +16 -15
  138. data/lib/rbs/cli/validate.rb +63 -126
  139. data/lib/rbs/cli.rb +56 -24
  140. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  141. data/lib/rbs/collection/sources/git.rb +1 -0
  142. data/lib/rbs/collection.rb +0 -1
  143. data/lib/rbs/definition.rb +6 -1
  144. data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
  145. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  146. data/lib/rbs/definition_builder.rb +177 -20
  147. data/lib/rbs/diff.rb +7 -1
  148. data/lib/rbs/environment/class_entry.rb +69 -0
  149. data/lib/rbs/environment/module_entry.rb +66 -0
  150. data/lib/rbs/environment.rb +402 -214
  151. data/lib/rbs/environment_loader.rb +2 -8
  152. data/lib/rbs/errors.rb +31 -21
  153. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  154. data/lib/rbs/inline_parser.rb +542 -0
  155. data/lib/rbs/location_aux.rb +36 -4
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +0 -7
  159. data/lib/rbs/parser_aux.rb +35 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -2
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  166. data/lib/rbs/source.rb +99 -0
  167. data/lib/rbs/subtractor.rb +7 -4
  168. data/lib/rbs/test/type_check.rb +19 -2
  169. data/lib/rbs/type_name.rb +1 -8
  170. data/lib/rbs/types.rb +91 -79
  171. data/lib/rbs/unit_test/convertibles.rb +1 -0
  172. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  173. data/lib/rbs/validator.rb +2 -2
  174. data/lib/rbs/version.rb +1 -1
  175. data/lib/rbs.rb +13 -2
  176. data/lib/rdoc/discover.rb +1 -1
  177. data/lib/rdoc_plugin/parser.rb +3 -3
  178. data/rbs.gemspec +4 -2
  179. data/rust/.gitignore +1 -0
  180. data/rust/Cargo.lock +378 -0
  181. data/rust/Cargo.toml +7 -0
  182. data/rust/ruby-rbs/Cargo.toml +22 -0
  183. data/rust/ruby-rbs/build.rs +764 -0
  184. data/rust/ruby-rbs/examples/locations.rs +60 -0
  185. data/rust/ruby-rbs/src/lib.rs +1 -0
  186. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  187. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  188. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  189. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  190. data/rust/ruby-rbs-sys/build.rs +204 -0
  191. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  192. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  193. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  194. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  195. data/schema/typeParam.json +17 -1
  196. data/sig/ancestor_builder.rbs +1 -1
  197. data/sig/annotate/formatter.rbs +2 -2
  198. data/sig/annotate/rdoc_annotater.rbs +1 -1
  199. data/sig/ast/ruby/annotations.rbs +421 -0
  200. data/sig/ast/ruby/comment_block.rbs +127 -0
  201. data/sig/ast/ruby/declarations.rbs +158 -0
  202. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  203. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  204. data/sig/ast/ruby/members.rbs +178 -0
  205. data/sig/buffer.rbs +63 -5
  206. data/sig/cli/diff.rbs +5 -11
  207. data/sig/cli/validate.rbs +12 -8
  208. data/sig/cli.rbs +18 -18
  209. data/sig/definition.rbs +6 -0
  210. data/sig/definition_builder.rbs +3 -1
  211. data/sig/environment/class_entry.rbs +50 -0
  212. data/sig/environment/module_entry.rbs +50 -0
  213. data/sig/environment.rbs +94 -87
  214. data/sig/errors.rbs +26 -20
  215. data/sig/inline_parser/comment_association.rbs +71 -0
  216. data/sig/inline_parser.rbs +124 -0
  217. data/sig/location.rbs +32 -7
  218. data/sig/locator.rbs +0 -2
  219. data/sig/manifest.yaml +0 -1
  220. data/sig/method_builder.rbs +9 -4
  221. data/sig/namespace.rbs +0 -5
  222. data/sig/parser.rbs +67 -13
  223. data/sig/prototype/helpers.rbs +2 -0
  224. data/sig/resolver/type_name_resolver.rbs +35 -7
  225. data/sig/source.rbs +48 -0
  226. data/sig/type_param.rbs +13 -8
  227. data/sig/typename.rbs +0 -5
  228. data/sig/types.rbs +10 -8
  229. data/sig/unit_test/spy.rbs +0 -8
  230. data/sig/unit_test/type_assertions.rbs +11 -0
  231. data/src/ast.c +1604 -0
  232. data/src/lexer.c +3194 -0
  233. data/src/lexer.re +154 -0
  234. data/src/lexstate.c +212 -0
  235. data/src/location.c +31 -0
  236. data/src/parser.c +4205 -0
  237. data/src/string.c +41 -0
  238. data/src/util/rbs_allocator.c +165 -0
  239. data/src/util/rbs_assert.c +19 -0
  240. data/src/util/rbs_buffer.c +54 -0
  241. data/src/util/rbs_constant_pool.c +18 -92
  242. data/src/util/rbs_encoding.c +21308 -0
  243. data/src/util/rbs_unescape.c +167 -0
  244. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  245. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  246. data/stdlib/cgi/0/core.rbs +9 -393
  247. data/stdlib/cgi/0/manifest.yaml +1 -0
  248. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  249. data/stdlib/coverage/0/coverage.rbs +7 -4
  250. data/stdlib/date/0/date.rbs +92 -79
  251. data/stdlib/date/0/date_time.rbs +25 -24
  252. data/stdlib/delegate/0/delegator.rbs +10 -7
  253. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  254. data/stdlib/digest/0/digest.rbs +110 -0
  255. data/stdlib/erb/0/erb.rbs +748 -347
  256. data/stdlib/etc/0/etc.rbs +55 -50
  257. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  258. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  259. data/stdlib/io-console/0/io-console.rbs +2 -2
  260. data/stdlib/json/0/json.rbs +226 -179
  261. data/stdlib/monitor/0/monitor.rbs +3 -3
  262. data/stdlib/net-http/0/net-http.rbs +162 -134
  263. data/stdlib/objspace/0/objspace.rbs +17 -34
  264. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  265. data/stdlib/open3/0/open3.rbs +469 -10
  266. data/stdlib/openssl/0/openssl.rbs +475 -357
  267. data/stdlib/optparse/0/optparse.rbs +26 -17
  268. data/stdlib/pathname/0/pathname.rbs +11 -1381
  269. data/stdlib/pp/0/pp.rbs +9 -8
  270. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  271. data/stdlib/pstore/0/pstore.rbs +35 -30
  272. data/stdlib/psych/0/psych.rbs +65 -12
  273. data/stdlib/psych/0/store.rbs +2 -4
  274. data/stdlib/pty/0/pty.rbs +9 -6
  275. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  276. data/stdlib/rdoc/0/code_object.rbs +4 -3
  277. data/stdlib/rdoc/0/comment.rbs +2 -0
  278. data/stdlib/rdoc/0/options.rbs +76 -0
  279. data/stdlib/rdoc/0/parser.rbs +1 -1
  280. data/stdlib/rdoc/0/rdoc.rbs +7 -5
  281. data/stdlib/rdoc/0/store.rbs +2 -2
  282. data/stdlib/resolv/0/resolv.rbs +25 -68
  283. data/stdlib/ripper/0/ripper.rbs +25 -19
  284. data/stdlib/securerandom/0/manifest.yaml +2 -0
  285. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  286. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  287. data/stdlib/singleton/0/singleton.rbs +3 -0
  288. data/stdlib/socket/0/addrinfo.rbs +9 -9
  289. data/stdlib/socket/0/basic_socket.rbs +3 -3
  290. data/stdlib/socket/0/ip_socket.rbs +10 -8
  291. data/stdlib/socket/0/socket.rbs +23 -10
  292. data/stdlib/socket/0/tcp_server.rbs +1 -1
  293. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  294. data/stdlib/socket/0/udp_socket.rbs +1 -1
  295. data/stdlib/socket/0/unix_server.rbs +1 -1
  296. data/stdlib/stringio/0/stringio.rbs +1177 -85
  297. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  298. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  299. data/stdlib/time/0/time.rbs +8 -6
  300. data/stdlib/timeout/0/timeout.rbs +63 -7
  301. data/stdlib/tsort/0/cyclic.rbs +3 -0
  302. data/stdlib/tsort/0/tsort.rbs +7 -6
  303. data/stdlib/uri/0/common.rbs +42 -20
  304. data/stdlib/uri/0/file.rbs +3 -3
  305. data/stdlib/uri/0/generic.rbs +26 -18
  306. data/stdlib/uri/0/http.rbs +2 -2
  307. data/stdlib/uri/0/ldap.rbs +2 -2
  308. data/stdlib/uri/0/mailto.rbs +3 -3
  309. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  310. data/stdlib/zlib/0/deflate.rbs +4 -3
  311. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  312. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  313. data/stdlib/zlib/0/inflate.rbs +1 -1
  314. data/stdlib/zlib/0/need_dict.rbs +1 -1
  315. data/stdlib/zlib/0/zstream.rbs +1 -0
  316. metadata +121 -18
  317. data/ext/rbs_extension/lexer.c +0 -2728
  318. data/ext/rbs_extension/lexer.h +0 -179
  319. data/ext/rbs_extension/lexer.re +0 -147
  320. data/ext/rbs_extension/lexstate.c +0 -175
  321. data/ext/rbs_extension/location.c +0 -325
  322. data/ext/rbs_extension/location.h +0 -85
  323. data/ext/rbs_extension/parser.c +0 -2982
  324. data/ext/rbs_extension/parser.h +0 -18
  325. data/ext/rbs_extension/parserstate.c +0 -411
  326. data/ext/rbs_extension/parserstate.h +0 -163
  327. data/ext/rbs_extension/unescape.c +0 -32
  328. data/include/rbs/ruby_objs.h +0 -72
  329. data/src/constants.c +0 -153
  330. data/src/ruby_objs.c +0 -799
data/core/thread.rbs CHANGED
@@ -14,8 +14,8 @@
14
14
  #
15
15
  # thr.join #=> "What's the big deal"
16
16
  #
17
- # If we don't call `thr.join` before the main thread terminates, then all other
18
- # threads including `thr` will be killed.
17
+ # If we don't call <code>thr.join</code> before the main thread terminates, then
18
+ # all other threads including `thr` will be killed.
19
19
  #
20
20
  # Alternatively, you can use an array for handling multiple threads at once,
21
21
  # like in the following example:
@@ -105,8 +105,8 @@
105
105
  # p Thread.current.thread_variable_get(:foo) # => 2
106
106
  # }.join
107
107
  #
108
- # You can see that the thread-local `:foo` carried over into the fiber and was
109
- # changed to `2` by the end of the thread.
108
+ # You can see that the thread-local <code>:foo</code> carried over into the
109
+ # fiber and was changed to `2` by the end of the thread.
110
110
  #
111
111
  # This example makes use of #thread_variable_set to create new thread-locals,
112
112
  # and #thread_variable_get to reference them.
@@ -265,7 +265,10 @@ class Thread < Object
265
265
  # -->
266
266
  # Terminates `thr` and schedules another thread to be run, returning the
267
267
  # terminated Thread. If this is the main thread, or the last thread, exits the
268
- # process.
268
+ # process. Note that the caller does not wait for the thread to terminate if the
269
+ # receiver is different from the currently running thread. The termination is
270
+ # asynchronous, and the thread can still run a small amount of ruby code before
271
+ # exiting.
269
272
  #
270
273
  def kill: () -> Thread?
271
274
 
@@ -334,7 +337,10 @@ class Thread < Object
334
337
  # <!-- rdoc-file=thread.c -->
335
338
  # Terminates `thr` and schedules another thread to be run, returning the
336
339
  # terminated Thread. If this is the main thread, or the last thread, exits the
337
- # process.
340
+ # process. Note that the caller does not wait for the thread to terminate if the
341
+ # receiver is different from the currently running thread. The termination is
342
+ # asynchronous, and the thread can still run a small amount of ruby code before
343
+ # exiting.
338
344
  #
339
345
  def exit: () -> Thread?
340
346
 
@@ -364,9 +370,9 @@ class Thread < Object
364
370
 
365
371
  # <!--
366
372
  # rdoc-file=thread.c
367
- # - Thread.new { ... } -> thread
368
- # - Thread.new(*args, &proc) -> thread
369
- # - Thread.new(*args) { |args| ... } -> thread
373
+ # - Thread.new { ... } -> thread
374
+ # - Thread.new(*args, &proc) -> thread
375
+ # - Thread.new(*args) { |args| ... } -> thread
370
376
  # -->
371
377
  # Creates a new thread executing the given block.
372
378
  #
@@ -611,13 +617,13 @@ class Thread < Object
611
617
  # -->
612
618
  # Returns the status of `thr`.
613
619
  #
614
- # `"sleep"`
620
+ # <code>"sleep"</code>
615
621
  # : Returned if this thread is sleeping or waiting on I/O
616
622
  #
617
- # `"run"`
623
+ # <code>"run"</code>
618
624
  # : When this thread is executing
619
625
  #
620
- # `"aborting"`
626
+ # <code>"aborting"</code>
621
627
  # : If this thread is aborting
622
628
  #
623
629
  # `false`
@@ -660,7 +666,10 @@ class Thread < Object
660
666
  # <!-- rdoc-file=thread.c -->
661
667
  # Terminates `thr` and schedules another thread to be run, returning the
662
668
  # terminated Thread. If this is the main thread, or the last thread, exits the
663
- # process.
669
+ # process. Note that the caller does not wait for the thread to terminate if the
670
+ # receiver is different from the currently running thread. The termination is
671
+ # asynchronous, and the thread can still run a small amount of ruby code before
672
+ # exiting.
664
673
  #
665
674
  def terminate: () -> Thread?
666
675
 
@@ -760,7 +769,8 @@ class Thread < Object
760
769
  # Marks a given thread as eligible for scheduling, however it may still remain
761
770
  # blocked on I/O.
762
771
  #
763
- # **Note:** This does not invoke the scheduler, see #run for more information.
772
+ # <strong>Note:</strong> This does not invoke the scheduler, see #run for more
773
+ # information.
764
774
  #
765
775
  # c = Thread.new { Thread.stop; puts "hey!" }
766
776
  # sleep 0.1 while c.status!='sleep'
@@ -781,7 +791,8 @@ class Thread < Object
781
791
  # When set to `true`, if any thread is aborted by an exception, the raised
782
792
  # exception will be re-raised in the main thread.
783
793
  #
784
- # Can also be specified by the global $DEBUG flag or command line option `-d`.
794
+ # Can also be specified by the global $DEBUG flag or command line option
795
+ # <code>-d</code>.
785
796
  #
786
797
  # See also ::abort_on_exception=.
787
798
  #
@@ -829,13 +840,6 @@ class Thread < Object
829
840
  #
830
841
  def self.each_caller_location: () { (Backtrace::Location) -> void } -> nil
831
842
 
832
- # Wraps the block in a single, VM-global
833
- # [Mutex\#synchronize](https://ruby-doc.org/core-2.6.3/Mutex.html#method-i-synchronize)
834
- # , returning the value of the block. A thread executing inside the
835
- # exclusive section will only block other threads which also use the
836
- # [::exclusive](Thread.downloaded.ruby_doc#method-c-exclusive) mechanism.
837
- def self.exclusive: () { () -> untyped } -> untyped
838
-
839
843
  # <!--
840
844
  # rdoc-file=thread.c
841
845
  # - Thread.exit -> thread
@@ -870,17 +874,17 @@ class Thread < Object
870
874
  # Thread#raise, Thread#kill, signal trap (not supported yet) and main thread
871
875
  # termination (if main thread terminates, then all other thread will be killed).
872
876
  #
873
- # The given `hash` has pairs like `ExceptionClass => :TimingSymbol`. Where the
874
- # ExceptionClass is the interrupt handled by the given block. The TimingSymbol
875
- # can be one of the following symbols:
877
+ # The given `hash` has pairs like <code>ExceptionClass => :TimingSymbol</code>.
878
+ # Where the ExceptionClass is the interrupt handled by the given block. The
879
+ # TimingSymbol can be one of the following symbols:
876
880
  #
877
- # `:immediate`
881
+ # <code>:immediate</code>
878
882
  # : Invoke interrupts immediately.
879
883
  #
880
- # `:on_blocking`
884
+ # <code>:on_blocking</code>
881
885
  # : Invoke interrupts while *BlockingOperation*.
882
886
  #
883
- # `:never`
887
+ # <code>:never</code>
884
888
  # : Never invoke all interrupts.
885
889
  #
886
890
  #
@@ -904,8 +908,8 @@ class Thread < Object
904
908
  #
905
909
  # In this example, we can guard from Thread#raise exceptions.
906
910
  #
907
- # Using the `:never` TimingSymbol the RuntimeError exception will always be
908
- # ignored in the first block of the main thread. In the second
911
+ # Using the <code>:never</code> TimingSymbol the RuntimeError exception will
912
+ # always be ignored in the first block of the main thread. In the second
909
913
  # ::handle_interrupt block we can purposefully handle RuntimeError exceptions.
910
914
  #
911
915
  # th = Thread.new do
@@ -954,12 +958,11 @@ class Thread < Object
954
958
 
955
959
  # <!--
956
960
  # rdoc-file=thread.c
957
- # - thr.raise
958
- # - thr.raise(string)
959
- # - thr.raise(exception [, string [, array]])
961
+ # - raise(exception, message = exception.to_s, backtrace = nil, cause: $!)
962
+ # - raise(message = nil, cause: $!)
960
963
  # -->
961
964
  # Raises an exception from the given thread. The caller does not have to be
962
- # `thr`. See Kernel#raise for more information.
965
+ # `thr`. See Kernel#raise for more information on arguments.
963
966
  #
964
967
  # Thread.abort_on_exception = true
965
968
  # a = Thread.new { sleep(200) }
@@ -972,8 +975,8 @@ class Thread < Object
972
975
  # from prog.rb:2:in `new'
973
976
  # from prog.rb:2
974
977
  #
975
- def raise: (?String message) -> nil
976
- | (_Exception, ?_ToS message, ?Array[Thread::Backtrace::Location] | Array[String] | nil backtrace) -> nil
978
+ def raise: (?String message, ?cause: Exception?) -> nil
979
+ | (_Exception, ?_ToS message, ?Array[Thread::Backtrace::Location] | Array[String] | nil backtrace, ?cause: Exception?) -> nil
977
980
 
978
981
  # <!--
979
982
  # rdoc-file=thread.c
@@ -1029,7 +1032,8 @@ class Thread < Object
1029
1032
  # Since Thread::handle_interrupt can be used to defer asynchronous events, this
1030
1033
  # method can be used to determine if there are any deferred events.
1031
1034
  #
1032
- # If you find this method returns true, then you may finish `:never` blocks.
1035
+ # If you find this method returns true, then you may finish <code>:never</code>
1036
+ # blocks.
1033
1037
  #
1034
1038
  # For example, the following method processes deferred asynchronous events
1035
1039
  # immediately.
@@ -1107,9 +1111,9 @@ class Thread < Object
1107
1111
  # where it is raised rather then let it kill the Thread.
1108
1112
  # * If it is guaranteed the Thread will be joined with Thread#join or
1109
1113
  # Thread#value, then it is safe to disable this report with
1110
- # `Thread.current.report_on_exception = false` when starting the Thread.
1111
- # However, this might handle the exception much later, or not at all if the
1112
- # Thread is never joined due to the parent thread being blocked, etc.
1114
+ # <code>Thread.current.report_on_exception = false</code> when starting the
1115
+ # Thread. However, this might handle the exception much later, or not at all
1116
+ # if the Thread is never joined due to the parent thread being blocked, etc.
1113
1117
  #
1114
1118
  # See also ::report_on_exception=.
1115
1119
  #
@@ -1187,10 +1191,11 @@ class Thread::Backtrace < Object
1187
1191
  # rdoc-file=vm_backtrace.c
1188
1192
  # - Thread::Backtrace::limit -> integer
1189
1193
  # -->
1190
- # Returns maximum backtrace length set by `--backtrace-limit` command-line
1191
- # option. The default is `-1` which means unlimited backtraces. If the value is
1192
- # zero or positive, the error backtraces, produced by Exception#full_message,
1193
- # are abbreviated and the extra lines are replaced by `... 3 levels... `
1194
+ # Returns maximum backtrace length set by <code>--backtrace-limit</code>
1195
+ # command-line option. The default is <code>-1</code> which means unlimited
1196
+ # backtraces. If the value is zero or positive, the error backtraces, produced
1197
+ # by Exception#full_message, are abbreviated and the extra lines are replaced by
1198
+ # <code>... 3 levels... </code>
1194
1199
  #
1195
1200
  # $ ruby -r net/http -e "p Thread::Backtrace.limit; Net::HTTP.get(URI('http://wrong.address'))"
1196
1201
  # - 1
@@ -1256,7 +1261,7 @@ end
1256
1261
  # puts call.to_s
1257
1262
  # end
1258
1263
  #
1259
- # Running `ruby caller_locations.rb` will produce:
1264
+ # Running <code>ruby caller_locations.rb</code> will produce:
1260
1265
  #
1261
1266
  # caller_locations.rb:2:in `a'
1262
1267
  # caller_locations.rb:5:in `b'
@@ -1276,7 +1281,7 @@ end
1276
1281
  # puts call.to_s
1277
1282
  # end
1278
1283
  #
1279
- # Now run `ruby foo.rb` and you should see:
1284
+ # Now run <code>ruby foo.rb</code> and you should see:
1280
1285
  #
1281
1286
  # init.rb:4:in `initialize'
1282
1287
  # init.rb:8:in `new'
@@ -1359,7 +1364,8 @@ class Thread::Backtrace::Location
1359
1364
  # -->
1360
1365
  # Returns the line number of this frame.
1361
1366
  #
1362
- # For example, using `caller_locations.rb` from Thread::Backtrace::Location
1367
+ # For example, using <code>caller_locations.rb</code> from
1368
+ # Thread::Backtrace::Location
1363
1369
  #
1364
1370
  # loc = c(0..1).first
1365
1371
  # loc.lineno #=> 2
@@ -1374,7 +1380,8 @@ class Thread::Backtrace::Location
1374
1380
  # unless the frame is in the main script, in which case it will be the script
1375
1381
  # location passed on the command line.
1376
1382
  #
1377
- # For example, using `caller_locations.rb` from Thread::Backtrace::Location
1383
+ # For example, using <code>caller_locations.rb</code> from
1384
+ # Thread::Backtrace::Location
1378
1385
  #
1379
1386
  # loc = c(0..1).first
1380
1387
  # loc.path #=> caller_locations.rb
@@ -1385,28 +1392,80 @@ end
1385
1392
  # <!-- rdoc-file=thread_sync.c -->
1386
1393
  # ConditionVariable objects augment class Mutex. Using condition variables, it
1387
1394
  # is possible to suspend while in the middle of a critical section until a
1388
- # resource becomes available.
1395
+ # condition is met, such as a resource becomes available.
1396
+ #
1397
+ # Due to non-deterministic scheduling and spurious wake-ups, users of condition
1398
+ # variables should always use a separate boolean predicate (such as reading from
1399
+ # a boolean variable) to check if the condition is actually met before starting
1400
+ # to wait, and should wait in a loop, re-checking the condition every time the
1401
+ # ConditionVariable is waken up. The idiomatic way of using condition variables
1402
+ # is calling the `wait` method in an `until` loop with the predicate as the loop
1403
+ # condition.
1404
+ #
1405
+ # condvar.wait(mutex) until condition_is_met
1406
+ #
1407
+ # In the example below, we use the boolean variable `resource_available` (which
1408
+ # is protected by `mutex`) to indicate the availability of the resource, and use
1409
+ # `condvar` to wait for that variable to become true. Note that:
1410
+ #
1411
+ # 1. Thread `b` may be scheduled before thread `a1` and `a2`, and may run so
1412
+ # fast that it have already made the resource available before either `a1`
1413
+ # or `a2` starts. Therefore, `a1` and `a2` should check if
1414
+ # `resource_available` is already true before starting to wait.
1415
+ # 2. The `wait` method may spuriously wake up without signalling. Therefore,
1416
+ # thread `a1` and `a2` should recheck `resource_available` after the `wait`
1417
+ # method returns, and go back to wait if the condition is not actually met.
1418
+ # 3. It is possible that thread `a2` starts right after thread `a1` is waken up
1419
+ # by `b`. Thread `a2` may have acquired the `mutex` and consumed the
1420
+ # resource before thread `a1` acquires the `mutex`. This necessitates
1421
+ # rechecking after `wait`, too.
1389
1422
  #
1390
1423
  # Example:
1391
1424
  #
1392
1425
  # mutex = Thread::Mutex.new
1393
- # resource = Thread::ConditionVariable.new
1394
1426
  #
1395
- # a = Thread.new {
1396
- # mutex.synchronize {
1397
- # # Thread 'a' now needs the resource
1398
- # resource.wait(mutex)
1399
- # # 'a' can now have the resource
1400
- # }
1427
+ # resource_available = false
1428
+ # condvar = Thread::ConditionVariable.new
1429
+ #
1430
+ # a1 = Thread.new {
1431
+ # # Thread 'a1' waits for the resource to become available and consumes
1432
+ # # the resource.
1433
+ # mutex.synchronize {
1434
+ # condvar.wait(mutex) until resource_available
1435
+ # # After the loop, 'resource_available' is guaranteed to be true.
1436
+ #
1437
+ # resource_available = false
1438
+ # puts "a1 consumed the resource"
1439
+ # }
1440
+ # }
1441
+ #
1442
+ # a2 = Thread.new {
1443
+ # # Thread 'a2' behaves like 'a1'.
1444
+ # mutex.synchronize {
1445
+ # condvar.wait(mutex) until resource_available
1446
+ # resource_available = false
1447
+ # puts "a2 consumed the resource"
1448
+ # }
1401
1449
  # }
1402
1450
  #
1403
1451
  # b = Thread.new {
1404
- # mutex.synchronize {
1405
- # # Thread 'b' has finished using the resource
1406
- # resource.signal
1407
- # }
1452
+ # # Thread 'b' periodically makes the resource available.
1453
+ # loop {
1454
+ # mutex.synchronize {
1455
+ # resource_available = true
1456
+ #
1457
+ # # Notify one waiting thread if any. It is possible that neither
1458
+ # # 'a1' nor 'a2 is waiting on 'condvar' at this moment. That's OK.
1459
+ # condvar.signal
1460
+ # }
1461
+ # sleep 1
1462
+ # }
1408
1463
  # }
1409
1464
  #
1465
+ # # Eventually both 'a1' and 'a2' will have their resources, albeit in an
1466
+ # # unspecified order.
1467
+ # [a1, a2].each {|th| th.join}
1468
+ #
1410
1469
  class Thread::ConditionVariable < Object
1411
1470
  # <!--
1412
1471
  # rdoc-file=thread_sync.c
@@ -1433,6 +1492,8 @@ class Thread::ConditionVariable < Object
1433
1492
  # If `timeout` is given, this method returns after `timeout` seconds passed,
1434
1493
  # even if no other thread doesn't signal.
1435
1494
  #
1495
+ # This method may wake up spuriously due to underlying implementation details.
1496
+ #
1436
1497
  # Returns the slept result on `mutex`.
1437
1498
  #
1438
1499
  def wait: (Thread::Mutex mutex, ?Time::_Timeout? timeout) -> Integer?
@@ -1460,7 +1521,7 @@ end
1460
1521
  #
1461
1522
  class Thread::Mutex < Object
1462
1523
  # <!--
1463
- # rdoc-file=thread_sync.c
1524
+ # rdoc-file=thread_sync.rb
1464
1525
  # - mutex.lock -> self
1465
1526
  # -->
1466
1527
  # Attempts to grab the lock and waits if it isn't available. Raises
@@ -1469,7 +1530,7 @@ class Thread::Mutex < Object
1469
1530
  def lock: () -> self
1470
1531
 
1471
1532
  # <!--
1472
- # rdoc-file=thread_sync.c
1533
+ # rdoc-file=thread_sync.rb
1473
1534
  # - mutex.locked? -> true or false
1474
1535
  # -->
1475
1536
  # Returns `true` if this lock is currently held by some thread.
@@ -1477,7 +1538,7 @@ class Thread::Mutex < Object
1477
1538
  def locked?: () -> bool
1478
1539
 
1479
1540
  # <!--
1480
- # rdoc-file=thread_sync.c
1541
+ # rdoc-file=thread_sync.rb
1481
1542
  # - mutex.owned? -> true or false
1482
1543
  # -->
1483
1544
  # Returns `true` if this lock is currently held by current thread.
@@ -1485,7 +1546,7 @@ class Thread::Mutex < Object
1485
1546
  def owned?: () -> bool
1486
1547
 
1487
1548
  # <!--
1488
- # rdoc-file=thread_sync.c
1549
+ # rdoc-file=thread_sync.rb
1489
1550
  # - mutex.synchronize { ... } -> result of the block
1490
1551
  # -->
1491
1552
  # Obtains a lock, runs the block, and releases the lock when the block
@@ -1494,7 +1555,7 @@ class Thread::Mutex < Object
1494
1555
  def synchronize: [X] () { () -> X } -> X
1495
1556
 
1496
1557
  # <!--
1497
- # rdoc-file=thread_sync.c
1558
+ # rdoc-file=thread_sync.rb
1498
1559
  # - mutex.try_lock -> true or false
1499
1560
  # -->
1500
1561
  # Attempts to obtain the lock and returns immediately. Returns `true` if the
@@ -1503,11 +1564,11 @@ class Thread::Mutex < Object
1503
1564
  def try_lock: () -> bool
1504
1565
 
1505
1566
  # <!--
1506
- # rdoc-file=thread_sync.c
1507
- # - mutex.unlock -> self
1567
+ # rdoc-file=thread_sync.rb
1568
+ # - mutex.lock -> self
1508
1569
  # -->
1509
- # Releases the lock. Raises `ThreadError` if `mutex` wasn't locked by the
1510
- # current thread.
1570
+ # Attempts to grab the lock and waits if it isn't available. Raises
1571
+ # `ThreadError` if `mutex` was locked by the current thread.
1511
1572
  #
1512
1573
  def unlock: () -> self
1513
1574
  end
@@ -1565,16 +1626,16 @@ class Thread::Queue[Elem = untyped] < Object
1565
1626
  #
1566
1627
  # After the call to close completes, the following are true:
1567
1628
  #
1568
- # * `closed?` will return true
1629
+ # * <code>closed?</code> will return true
1569
1630
  #
1570
1631
  # * `close` will be ignored.
1571
1632
  #
1572
1633
  # * calling enq/push/<< will raise a `ClosedQueueError`.
1573
1634
  #
1574
- # * when `empty?` is false, calling deq/pop/shift will return an object from
1575
- # the queue as usual.
1576
- # * when `empty?` is true, deq(false) will not suspend the thread and will
1577
- # return nil. deq(true) will raise a `ThreadError`.
1635
+ # * when <code>empty?</code> is false, calling deq/pop/shift will return an
1636
+ # object from the queue as usual.
1637
+ # * when <code>empty?</code> is true, deq(false) will not suspend the thread
1638
+ # and will return nil. deq(true) will raise a `ThreadError`.
1578
1639
  #
1579
1640
  # ClosedQueueError is inherited from StopIteration, so that you can break loop
1580
1641
  # block.