rbs 4.0.0.dev.4 → 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 (281) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +18 -11
  5. data/.github/workflows/comments.yml +5 -3
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +27 -34
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +2 -2
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/CHANGELOG.md +323 -0
  13. data/README.md +1 -1
  14. data/Rakefile +43 -33
  15. data/Steepfile +1 -0
  16. data/config.yml +426 -24
  17. data/core/array.rbs +307 -227
  18. data/core/basic_object.rbs +9 -8
  19. data/core/binding.rbs +0 -2
  20. data/core/builtin.rbs +2 -2
  21. data/core/class.rbs +6 -5
  22. data/core/comparable.rbs +55 -34
  23. data/core/complex.rbs +104 -78
  24. data/core/dir.rbs +61 -49
  25. data/core/encoding.rbs +12 -15
  26. data/core/enumerable.rbs +179 -87
  27. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  28. data/core/enumerator.rbs +65 -2
  29. data/core/errno.rbs +11 -2
  30. data/core/errors.rbs +58 -29
  31. data/core/exception.rbs +13 -13
  32. data/core/fiber.rbs +74 -54
  33. data/core/file.rbs +280 -177
  34. data/core/file_test.rbs +3 -3
  35. data/core/float.rbs +257 -92
  36. data/core/gc.rbs +425 -281
  37. data/core/hash.rbs +1045 -739
  38. data/core/integer.rbs +135 -137
  39. data/core/io/buffer.rbs +53 -42
  40. data/core/io/wait.rbs +13 -35
  41. data/core/io.rbs +192 -144
  42. data/core/kernel.rbs +216 -155
  43. data/core/marshal.rbs +4 -4
  44. data/core/match_data.rbs +15 -13
  45. data/core/math.rbs +107 -66
  46. data/core/method.rbs +69 -33
  47. data/core/module.rbs +244 -106
  48. data/core/nil_class.rbs +7 -6
  49. data/core/numeric.rbs +74 -63
  50. data/core/object.rbs +9 -11
  51. data/core/object_space.rbs +30 -23
  52. data/core/pathname.rbs +1322 -0
  53. data/core/proc.rbs +95 -58
  54. data/core/process.rbs +222 -202
  55. data/core/ractor.rbs +371 -515
  56. data/core/random.rbs +21 -3
  57. data/core/range.rbs +159 -57
  58. data/core/rational.rbs +60 -89
  59. data/core/rbs/unnamed/argf.rbs +60 -53
  60. data/core/rbs/unnamed/env_class.rbs +19 -14
  61. data/core/rbs/unnamed/main_class.rbs +123 -0
  62. data/core/rbs/unnamed/random.rbs +11 -118
  63. data/core/regexp.rbs +258 -214
  64. data/core/ruby.rbs +53 -0
  65. data/core/ruby_vm.rbs +38 -34
  66. data/core/rubygems/config_file.rbs +5 -5
  67. data/core/rubygems/errors.rbs +4 -71
  68. data/core/rubygems/requirement.rbs +5 -5
  69. data/core/rubygems/rubygems.rbs +16 -82
  70. data/core/rubygems/version.rbs +2 -3
  71. data/core/set.rbs +490 -360
  72. data/core/signal.rbs +26 -16
  73. data/core/string.rbs +3234 -1285
  74. data/core/struct.rbs +27 -26
  75. data/core/symbol.rbs +41 -34
  76. data/core/thread.rbs +135 -67
  77. data/core/time.rbs +81 -50
  78. data/core/trace_point.rbs +41 -35
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +24 -16
  81. data/core/warning.rbs +7 -7
  82. data/docs/aliases.md +79 -0
  83. data/docs/collection.md +3 -3
  84. data/docs/config.md +171 -0
  85. data/docs/encoding.md +56 -0
  86. data/docs/gem.md +0 -1
  87. data/docs/inline.md +576 -0
  88. data/docs/sigs.md +3 -3
  89. data/docs/syntax.md +46 -16
  90. data/docs/type_fingerprint.md +21 -0
  91. data/exe/rbs +1 -1
  92. data/ext/rbs_extension/ast_translation.c +544 -116
  93. data/ext/rbs_extension/ast_translation.h +3 -0
  94. data/ext/rbs_extension/class_constants.c +16 -2
  95. data/ext/rbs_extension/class_constants.h +8 -0
  96. data/ext/rbs_extension/extconf.rb +5 -1
  97. data/ext/rbs_extension/legacy_location.c +33 -56
  98. data/ext/rbs_extension/legacy_location.h +37 -0
  99. data/ext/rbs_extension/main.c +44 -35
  100. data/include/rbs/ast.h +448 -173
  101. data/include/rbs/defines.h +27 -0
  102. data/include/rbs/lexer.h +30 -11
  103. data/include/rbs/location.h +25 -44
  104. data/include/rbs/parser.h +6 -6
  105. data/include/rbs/string.h +0 -2
  106. data/include/rbs/util/rbs_allocator.h +34 -13
  107. data/include/rbs/util/rbs_assert.h +12 -1
  108. data/include/rbs/util/rbs_constant_pool.h +0 -3
  109. data/include/rbs/util/rbs_encoding.h +2 -0
  110. data/include/rbs/util/rbs_unescape.h +2 -1
  111. data/include/rbs.h +8 -0
  112. data/lib/rbs/ast/annotation.rb +1 -1
  113. data/lib/rbs/ast/comment.rb +1 -1
  114. data/lib/rbs/ast/declarations.rb +10 -10
  115. data/lib/rbs/ast/members.rb +14 -14
  116. data/lib/rbs/ast/ruby/annotations.rb +293 -3
  117. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  118. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  119. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  120. data/lib/rbs/ast/ruby/members.rb +532 -22
  121. data/lib/rbs/ast/type_param.rb +24 -4
  122. data/lib/rbs/buffer.rb +20 -15
  123. data/lib/rbs/cli/diff.rb +16 -15
  124. data/lib/rbs/cli/validate.rb +38 -106
  125. data/lib/rbs/cli.rb +52 -19
  126. data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
  127. data/lib/rbs/collection/sources/git.rb +1 -0
  128. data/lib/rbs/definition.rb +1 -1
  129. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  130. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  131. data/lib/rbs/definition_builder.rb +147 -25
  132. data/lib/rbs/diff.rb +7 -1
  133. data/lib/rbs/environment.rb +227 -74
  134. data/lib/rbs/environment_loader.rb +0 -6
  135. data/lib/rbs/errors.rb +27 -18
  136. data/lib/rbs/inline_parser.rb +342 -6
  137. data/lib/rbs/location_aux.rb +1 -1
  138. data/lib/rbs/locator.rb +5 -1
  139. data/lib/rbs/method_type.rb +5 -3
  140. data/lib/rbs/parser_aux.rb +20 -7
  141. data/lib/rbs/prototype/helpers.rb +57 -0
  142. data/lib/rbs/prototype/rb.rb +3 -28
  143. data/lib/rbs/prototype/rbi.rb +3 -20
  144. data/lib/rbs/prototype/runtime.rb +8 -0
  145. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  146. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  147. data/lib/rbs/subtractor.rb +3 -1
  148. data/lib/rbs/test/type_check.rb +19 -2
  149. data/lib/rbs/type_name.rb +1 -1
  150. data/lib/rbs/types.rb +88 -78
  151. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  152. data/lib/rbs/validator.rb +2 -2
  153. data/lib/rbs/version.rb +1 -1
  154. data/lib/rbs.rb +1 -2
  155. data/lib/rdoc/discover.rb +1 -1
  156. data/lib/rdoc_plugin/parser.rb +1 -1
  157. data/rbs.gemspec +4 -3
  158. data/rust/.gitignore +1 -0
  159. data/rust/Cargo.lock +378 -0
  160. data/rust/Cargo.toml +7 -0
  161. data/rust/ruby-rbs/Cargo.toml +22 -0
  162. data/rust/ruby-rbs/build.rs +764 -0
  163. data/rust/ruby-rbs/examples/locations.rs +60 -0
  164. data/rust/ruby-rbs/src/lib.rs +1 -0
  165. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  166. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  167. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  168. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  169. data/rust/ruby-rbs-sys/build.rs +204 -0
  170. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  171. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  172. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  173. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  174. data/schema/typeParam.json +17 -1
  175. data/sig/ast/ruby/annotations.rbs +315 -4
  176. data/sig/ast/ruby/comment_block.rbs +8 -0
  177. data/sig/ast/ruby/declarations.rbs +102 -4
  178. data/sig/ast/ruby/members.rbs +108 -2
  179. data/sig/cli/diff.rbs +5 -11
  180. data/sig/cli/validate.rbs +12 -8
  181. data/sig/cli.rbs +18 -18
  182. data/sig/definition.rbs +6 -1
  183. data/sig/definition_builder.rbs +2 -0
  184. data/sig/environment.rbs +70 -12
  185. data/sig/errors.rbs +13 -14
  186. data/sig/inline_parser.rbs +39 -2
  187. data/sig/locator.rbs +0 -2
  188. data/sig/manifest.yaml +0 -1
  189. data/sig/method_builder.rbs +3 -1
  190. data/sig/parser.rbs +31 -13
  191. data/sig/prototype/helpers.rbs +2 -0
  192. data/sig/resolver/type_name_resolver.rbs +35 -7
  193. data/sig/source.rbs +3 -3
  194. data/sig/type_param.rbs +13 -8
  195. data/sig/types.rbs +6 -7
  196. data/sig/unit_test/spy.rbs +0 -8
  197. data/sig/unit_test/type_assertions.rbs +11 -0
  198. data/src/ast.c +410 -153
  199. data/src/lexer.c +1392 -1313
  200. data/src/lexer.re +3 -0
  201. data/src/lexstate.c +58 -37
  202. data/src/location.c +8 -48
  203. data/src/parser.c +977 -516
  204. data/src/string.c +0 -48
  205. data/src/util/rbs_allocator.c +89 -71
  206. data/src/util/rbs_assert.c +1 -1
  207. data/src/util/rbs_buffer.c +2 -2
  208. data/src/util/rbs_constant_pool.c +10 -14
  209. data/src/util/rbs_encoding.c +4 -8
  210. data/src/util/rbs_unescape.c +56 -20
  211. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  212. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  213. data/stdlib/cgi/0/core.rbs +9 -393
  214. data/stdlib/cgi/0/manifest.yaml +1 -0
  215. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  216. data/stdlib/coverage/0/coverage.rbs +7 -4
  217. data/stdlib/date/0/date.rbs +92 -79
  218. data/stdlib/date/0/date_time.rbs +25 -24
  219. data/stdlib/delegate/0/delegator.rbs +10 -7
  220. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  221. data/stdlib/digest/0/digest.rbs +110 -0
  222. data/stdlib/erb/0/erb.rbs +748 -347
  223. data/stdlib/etc/0/etc.rbs +55 -50
  224. data/stdlib/fileutils/0/fileutils.rbs +158 -139
  225. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  226. data/stdlib/io-console/0/io-console.rbs +2 -2
  227. data/stdlib/json/0/json.rbs +217 -136
  228. data/stdlib/monitor/0/monitor.rbs +3 -3
  229. data/stdlib/net-http/0/net-http.rbs +162 -134
  230. data/stdlib/objspace/0/objspace.rbs +17 -34
  231. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  232. data/stdlib/open3/0/open3.rbs +469 -10
  233. data/stdlib/openssl/0/openssl.rbs +475 -357
  234. data/stdlib/optparse/0/optparse.rbs +26 -17
  235. data/stdlib/pathname/0/pathname.rbs +11 -1381
  236. data/stdlib/pp/0/pp.rbs +9 -8
  237. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  238. data/stdlib/pstore/0/pstore.rbs +35 -30
  239. data/stdlib/psych/0/psych.rbs +65 -12
  240. data/stdlib/psych/0/store.rbs +2 -4
  241. data/stdlib/pty/0/pty.rbs +9 -6
  242. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  243. data/stdlib/rdoc/0/code_object.rbs +2 -1
  244. data/stdlib/rdoc/0/parser.rbs +1 -1
  245. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  246. data/stdlib/rdoc/0/store.rbs +1 -1
  247. data/stdlib/resolv/0/resolv.rbs +25 -68
  248. data/stdlib/ripper/0/ripper.rbs +22 -19
  249. data/stdlib/securerandom/0/manifest.yaml +2 -0
  250. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  251. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  252. data/stdlib/singleton/0/singleton.rbs +3 -0
  253. data/stdlib/socket/0/addrinfo.rbs +7 -7
  254. data/stdlib/socket/0/basic_socket.rbs +3 -3
  255. data/stdlib/socket/0/ip_socket.rbs +10 -8
  256. data/stdlib/socket/0/socket.rbs +23 -10
  257. data/stdlib/socket/0/tcp_server.rbs +1 -1
  258. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  259. data/stdlib/socket/0/udp_socket.rbs +1 -1
  260. data/stdlib/socket/0/unix_server.rbs +1 -1
  261. data/stdlib/stringio/0/stringio.rbs +1177 -85
  262. data/stdlib/strscan/0/string_scanner.rbs +27 -25
  263. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  264. data/stdlib/time/0/time.rbs +8 -6
  265. data/stdlib/timeout/0/timeout.rbs +63 -7
  266. data/stdlib/tsort/0/cyclic.rbs +3 -0
  267. data/stdlib/tsort/0/tsort.rbs +7 -6
  268. data/stdlib/uri/0/common.rbs +42 -20
  269. data/stdlib/uri/0/file.rbs +3 -3
  270. data/stdlib/uri/0/generic.rbs +26 -18
  271. data/stdlib/uri/0/http.rbs +2 -2
  272. data/stdlib/uri/0/ldap.rbs +2 -2
  273. data/stdlib/uri/0/mailto.rbs +3 -3
  274. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  275. data/stdlib/zlib/0/deflate.rbs +4 -3
  276. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  277. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  278. data/stdlib/zlib/0/inflate.rbs +1 -1
  279. data/stdlib/zlib/0/need_dict.rbs +1 -1
  280. data/stdlib/zlib/0/zstream.rbs +1 -0
  281. metadata +50 -6
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
  #
@@ -863,17 +874,17 @@ class Thread < Object
863
874
  # Thread#raise, Thread#kill, signal trap (not supported yet) and main thread
864
875
  # termination (if main thread terminates, then all other thread will be killed).
865
876
  #
866
- # The given `hash` has pairs like `ExceptionClass => :TimingSymbol`. Where the
867
- # ExceptionClass is the interrupt handled by the given block. The TimingSymbol
868
- # 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:
869
880
  #
870
- # `:immediate`
881
+ # <code>:immediate</code>
871
882
  # : Invoke interrupts immediately.
872
883
  #
873
- # `:on_blocking`
884
+ # <code>:on_blocking</code>
874
885
  # : Invoke interrupts while *BlockingOperation*.
875
886
  #
876
- # `:never`
887
+ # <code>:never</code>
877
888
  # : Never invoke all interrupts.
878
889
  #
879
890
  #
@@ -897,8 +908,8 @@ class Thread < Object
897
908
  #
898
909
  # In this example, we can guard from Thread#raise exceptions.
899
910
  #
900
- # Using the `:never` TimingSymbol the RuntimeError exception will always be
901
- # 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
902
913
  # ::handle_interrupt block we can purposefully handle RuntimeError exceptions.
903
914
  #
904
915
  # th = Thread.new do
@@ -947,12 +958,11 @@ class Thread < Object
947
958
 
948
959
  # <!--
949
960
  # rdoc-file=thread.c
950
- # - thr.raise
951
- # - thr.raise(string)
952
- # - thr.raise(exception [, string [, array]])
961
+ # - raise(exception, message = exception.to_s, backtrace = nil, cause: $!)
962
+ # - raise(message = nil, cause: $!)
953
963
  # -->
954
964
  # Raises an exception from the given thread. The caller does not have to be
955
- # `thr`. See Kernel#raise for more information.
965
+ # `thr`. See Kernel#raise for more information on arguments.
956
966
  #
957
967
  # Thread.abort_on_exception = true
958
968
  # a = Thread.new { sleep(200) }
@@ -965,8 +975,8 @@ class Thread < Object
965
975
  # from prog.rb:2:in `new'
966
976
  # from prog.rb:2
967
977
  #
968
- def raise: (?String message) -> nil
969
- | (_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
970
980
 
971
981
  # <!--
972
982
  # rdoc-file=thread.c
@@ -1022,7 +1032,8 @@ class Thread < Object
1022
1032
  # Since Thread::handle_interrupt can be used to defer asynchronous events, this
1023
1033
  # method can be used to determine if there are any deferred events.
1024
1034
  #
1025
- # 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.
1026
1037
  #
1027
1038
  # For example, the following method processes deferred asynchronous events
1028
1039
  # immediately.
@@ -1100,9 +1111,9 @@ class Thread < Object
1100
1111
  # where it is raised rather then let it kill the Thread.
1101
1112
  # * If it is guaranteed the Thread will be joined with Thread#join or
1102
1113
  # Thread#value, then it is safe to disable this report with
1103
- # `Thread.current.report_on_exception = false` when starting the Thread.
1104
- # However, this might handle the exception much later, or not at all if the
1105
- # 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.
1106
1117
  #
1107
1118
  # See also ::report_on_exception=.
1108
1119
  #
@@ -1180,10 +1191,11 @@ class Thread::Backtrace < Object
1180
1191
  # rdoc-file=vm_backtrace.c
1181
1192
  # - Thread::Backtrace::limit -> integer
1182
1193
  # -->
1183
- # Returns maximum backtrace length set by `--backtrace-limit` command-line
1184
- # option. The default is `-1` which means unlimited backtraces. If the value is
1185
- # zero or positive, the error backtraces, produced by Exception#full_message,
1186
- # 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>
1187
1199
  #
1188
1200
  # $ ruby -r net/http -e "p Thread::Backtrace.limit; Net::HTTP.get(URI('http://wrong.address'))"
1189
1201
  # - 1
@@ -1249,7 +1261,7 @@ end
1249
1261
  # puts call.to_s
1250
1262
  # end
1251
1263
  #
1252
- # Running `ruby caller_locations.rb` will produce:
1264
+ # Running <code>ruby caller_locations.rb</code> will produce:
1253
1265
  #
1254
1266
  # caller_locations.rb:2:in `a'
1255
1267
  # caller_locations.rb:5:in `b'
@@ -1269,7 +1281,7 @@ end
1269
1281
  # puts call.to_s
1270
1282
  # end
1271
1283
  #
1272
- # Now run `ruby foo.rb` and you should see:
1284
+ # Now run <code>ruby foo.rb</code> and you should see:
1273
1285
  #
1274
1286
  # init.rb:4:in `initialize'
1275
1287
  # init.rb:8:in `new'
@@ -1352,7 +1364,8 @@ class Thread::Backtrace::Location
1352
1364
  # -->
1353
1365
  # Returns the line number of this frame.
1354
1366
  #
1355
- # For example, using `caller_locations.rb` from Thread::Backtrace::Location
1367
+ # For example, using <code>caller_locations.rb</code> from
1368
+ # Thread::Backtrace::Location
1356
1369
  #
1357
1370
  # loc = c(0..1).first
1358
1371
  # loc.lineno #=> 2
@@ -1367,7 +1380,8 @@ class Thread::Backtrace::Location
1367
1380
  # unless the frame is in the main script, in which case it will be the script
1368
1381
  # location passed on the command line.
1369
1382
  #
1370
- # For example, using `caller_locations.rb` from Thread::Backtrace::Location
1383
+ # For example, using <code>caller_locations.rb</code> from
1384
+ # Thread::Backtrace::Location
1371
1385
  #
1372
1386
  # loc = c(0..1).first
1373
1387
  # loc.path #=> caller_locations.rb
@@ -1378,28 +1392,80 @@ end
1378
1392
  # <!-- rdoc-file=thread_sync.c -->
1379
1393
  # ConditionVariable objects augment class Mutex. Using condition variables, it
1380
1394
  # is possible to suspend while in the middle of a critical section until a
1381
- # 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.
1382
1422
  #
1383
1423
  # Example:
1384
1424
  #
1385
1425
  # mutex = Thread::Mutex.new
1386
- # resource = Thread::ConditionVariable.new
1387
1426
  #
1388
- # a = Thread.new {
1389
- # mutex.synchronize {
1390
- # # Thread 'a' now needs the resource
1391
- # resource.wait(mutex)
1392
- # # 'a' can now have the resource
1393
- # }
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
+ # }
1394
1449
  # }
1395
1450
  #
1396
1451
  # b = Thread.new {
1397
- # mutex.synchronize {
1398
- # # Thread 'b' has finished using the resource
1399
- # resource.signal
1400
- # }
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
+ # }
1401
1463
  # }
1402
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
+ #
1403
1469
  class Thread::ConditionVariable < Object
1404
1470
  # <!--
1405
1471
  # rdoc-file=thread_sync.c
@@ -1426,6 +1492,8 @@ class Thread::ConditionVariable < Object
1426
1492
  # If `timeout` is given, this method returns after `timeout` seconds passed,
1427
1493
  # even if no other thread doesn't signal.
1428
1494
  #
1495
+ # This method may wake up spuriously due to underlying implementation details.
1496
+ #
1429
1497
  # Returns the slept result on `mutex`.
1430
1498
  #
1431
1499
  def wait: (Thread::Mutex mutex, ?Time::_Timeout? timeout) -> Integer?
@@ -1453,7 +1521,7 @@ end
1453
1521
  #
1454
1522
  class Thread::Mutex < Object
1455
1523
  # <!--
1456
- # rdoc-file=thread_sync.c
1524
+ # rdoc-file=thread_sync.rb
1457
1525
  # - mutex.lock -> self
1458
1526
  # -->
1459
1527
  # Attempts to grab the lock and waits if it isn't available. Raises
@@ -1462,7 +1530,7 @@ class Thread::Mutex < Object
1462
1530
  def lock: () -> self
1463
1531
 
1464
1532
  # <!--
1465
- # rdoc-file=thread_sync.c
1533
+ # rdoc-file=thread_sync.rb
1466
1534
  # - mutex.locked? -> true or false
1467
1535
  # -->
1468
1536
  # Returns `true` if this lock is currently held by some thread.
@@ -1470,7 +1538,7 @@ class Thread::Mutex < Object
1470
1538
  def locked?: () -> bool
1471
1539
 
1472
1540
  # <!--
1473
- # rdoc-file=thread_sync.c
1541
+ # rdoc-file=thread_sync.rb
1474
1542
  # - mutex.owned? -> true or false
1475
1543
  # -->
1476
1544
  # Returns `true` if this lock is currently held by current thread.
@@ -1478,7 +1546,7 @@ class Thread::Mutex < Object
1478
1546
  def owned?: () -> bool
1479
1547
 
1480
1548
  # <!--
1481
- # rdoc-file=thread_sync.c
1549
+ # rdoc-file=thread_sync.rb
1482
1550
  # - mutex.synchronize { ... } -> result of the block
1483
1551
  # -->
1484
1552
  # Obtains a lock, runs the block, and releases the lock when the block
@@ -1487,7 +1555,7 @@ class Thread::Mutex < Object
1487
1555
  def synchronize: [X] () { () -> X } -> X
1488
1556
 
1489
1557
  # <!--
1490
- # rdoc-file=thread_sync.c
1558
+ # rdoc-file=thread_sync.rb
1491
1559
  # - mutex.try_lock -> true or false
1492
1560
  # -->
1493
1561
  # Attempts to obtain the lock and returns immediately. Returns `true` if the
@@ -1496,11 +1564,11 @@ class Thread::Mutex < Object
1496
1564
  def try_lock: () -> bool
1497
1565
 
1498
1566
  # <!--
1499
- # rdoc-file=thread_sync.c
1500
- # - mutex.unlock -> self
1567
+ # rdoc-file=thread_sync.rb
1568
+ # - mutex.lock -> self
1501
1569
  # -->
1502
- # Releases the lock. Raises `ThreadError` if `mutex` wasn't locked by the
1503
- # 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.
1504
1572
  #
1505
1573
  def unlock: () -> self
1506
1574
  end
@@ -1558,16 +1626,16 @@ class Thread::Queue[Elem = untyped] < Object
1558
1626
  #
1559
1627
  # After the call to close completes, the following are true:
1560
1628
  #
1561
- # * `closed?` will return true
1629
+ # * <code>closed?</code> will return true
1562
1630
  #
1563
1631
  # * `close` will be ignored.
1564
1632
  #
1565
1633
  # * calling enq/push/<< will raise a `ClosedQueueError`.
1566
1634
  #
1567
- # * when `empty?` is false, calling deq/pop/shift will return an object from
1568
- # the queue as usual.
1569
- # * when `empty?` is true, deq(false) will not suspend the thread and will
1570
- # 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`.
1571
1639
  #
1572
1640
  # ClosedQueueError is inherited from StopIteration, so that you can break loop
1573
1641
  # block.