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.
- checksums.yaml +4 -4
- data/.clang-format +74 -0
- data/.clangd +2 -0
- data/.github/dependabot.yml +14 -14
- data/.github/workflows/bundle-update.yml +60 -0
- data/.github/workflows/c-check.yml +58 -0
- data/.github/workflows/comments.yml +5 -3
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/ruby.yml +40 -32
- data/.github/workflows/rust.yml +95 -0
- data/.github/workflows/typecheck.yml +2 -2
- data/.github/workflows/windows.yml +3 -3
- data/.gitignore +4 -0
- data/.rubocop.yml +2 -2
- data/.vscode/extensions.json +5 -0
- data/.vscode/settings.json +19 -0
- data/CHANGELOG.md +284 -0
- data/README.md +38 -1
- data/Rakefile +144 -29
- data/Steepfile +2 -0
- data/config.yml +634 -62
- data/core/array.rbs +307 -227
- data/core/basic_object.rbs +9 -8
- data/core/binding.rbs +0 -2
- data/core/builtin.rbs +2 -2
- data/core/class.rbs +6 -5
- data/core/comparable.rbs +55 -34
- data/core/complex.rbs +104 -78
- data/core/dir.rbs +61 -49
- data/core/encoding.rbs +12 -15
- data/core/enumerable.rbs +188 -87
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator.rbs +65 -2
- data/core/errno.rbs +11 -2
- data/core/errors.rbs +58 -29
- data/core/exception.rbs +13 -13
- data/core/fiber.rbs +74 -54
- data/core/file.rbs +280 -177
- data/core/file_test.rbs +3 -3
- data/core/float.rbs +257 -92
- data/core/gc.rbs +425 -281
- data/core/hash.rbs +1045 -739
- data/core/integer.rbs +135 -137
- data/core/io/buffer.rbs +53 -42
- data/core/io/wait.rbs +13 -35
- data/core/io.rbs +196 -148
- data/core/kernel.rbs +216 -155
- data/core/marshal.rbs +4 -4
- data/core/match_data.rbs +15 -13
- data/core/math.rbs +107 -66
- data/core/method.rbs +69 -33
- data/core/module.rbs +244 -106
- data/core/nil_class.rbs +7 -6
- data/core/numeric.rbs +74 -63
- data/core/object.rbs +9 -11
- data/core/object_space.rbs +30 -23
- data/core/pathname.rbs +1322 -0
- data/core/proc.rbs +95 -58
- data/core/process.rbs +222 -202
- data/core/ractor.rbs +371 -515
- data/core/random.rbs +21 -3
- data/core/range.rbs +159 -57
- data/core/rational.rbs +60 -89
- data/core/rbs/unnamed/argf.rbs +60 -53
- data/core/rbs/unnamed/env_class.rbs +19 -14
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +11 -118
- data/core/regexp.rbs +258 -214
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +38 -34
- data/core/rubygems/config_file.rbs +5 -5
- data/core/rubygems/errors.rbs +4 -71
- data/core/rubygems/requirement.rbs +5 -5
- data/core/rubygems/rubygems.rbs +16 -82
- data/core/rubygems/version.rbs +2 -3
- data/core/set.rbs +490 -360
- data/core/signal.rbs +26 -16
- data/core/string.rbs +3303 -1365
- data/core/struct.rbs +27 -26
- data/core/symbol.rbs +41 -34
- data/core/thread.rbs +135 -74
- data/core/time.rbs +81 -50
- data/core/trace_point.rbs +41 -35
- data/core/true_class.rbs +2 -2
- data/core/unbound_method.rbs +24 -16
- data/core/warning.rbs +7 -7
- data/docs/aliases.md +79 -0
- data/docs/collection.md +3 -3
- data/docs/config.md +171 -0
- data/docs/encoding.md +56 -0
- data/docs/gem.md +0 -1
- data/docs/inline.md +576 -0
- data/docs/sigs.md +3 -3
- data/docs/syntax.md +46 -16
- data/docs/type_fingerprint.md +21 -0
- data/exe/rbs +1 -1
- data/ext/rbs_extension/ast_translation.c +1513 -0
- data/ext/rbs_extension/ast_translation.h +37 -0
- data/ext/rbs_extension/class_constants.c +185 -0
- data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +22 -1
- data/ext/rbs_extension/compat.h +10 -0
- data/ext/rbs_extension/extconf.rb +25 -1
- data/ext/rbs_extension/legacy_location.c +294 -0
- data/ext/rbs_extension/legacy_location.h +82 -0
- data/ext/rbs_extension/main.c +468 -24
- data/ext/rbs_extension/rbs_extension.h +6 -21
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/include/rbs/ast.h +1022 -0
- data/include/rbs/defines.h +86 -0
- data/include/rbs/lexer.h +206 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +153 -0
- data/include/rbs/string.h +47 -0
- data/include/rbs/util/rbs_allocator.h +59 -0
- data/include/rbs/util/rbs_assert.h +20 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +6 -70
- data/include/rbs/util/rbs_encoding.h +282 -0
- data/include/rbs/util/rbs_unescape.h +24 -0
- data/include/rbs.h +9 -2
- data/lib/rbs/annotate/formatter.rb +3 -13
- data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
- data/lib/rbs/annotate/rdoc_source.rb +1 -1
- data/lib/rbs/ast/annotation.rb +1 -1
- data/lib/rbs/ast/comment.rb +1 -1
- data/lib/rbs/ast/declarations.rb +10 -10
- data/lib/rbs/ast/members.rb +14 -14
- data/lib/rbs/ast/ruby/annotations.rb +409 -0
- data/lib/rbs/ast/ruby/comment_block.rb +245 -0
- data/lib/rbs/ast/ruby/declarations.rb +281 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +723 -0
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +105 -20
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +63 -126
- data/lib/rbs/cli.rb +56 -24
- data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
- data/lib/rbs/collection/sources/git.rb +1 -0
- data/lib/rbs/collection.rb +0 -1
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
- data/lib/rbs/definition_builder/method_builder.rb +65 -30
- data/lib/rbs/definition_builder.rb +177 -20
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +402 -214
- data/lib/rbs/environment_loader.rb +2 -8
- data/lib/rbs/errors.rb +31 -21
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +542 -0
- data/lib/rbs/location_aux.rb +36 -4
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/namespace.rb +0 -7
- data/lib/rbs/parser_aux.rb +35 -7
- data/lib/rbs/prototype/helpers.rb +57 -0
- data/lib/rbs/prototype/rb.rb +3 -28
- data/lib/rbs/prototype/rbi.rb +3 -20
- data/lib/rbs/prototype/runtime.rb +10 -2
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +116 -38
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +7 -4
- data/lib/rbs/test/type_check.rb +19 -2
- data/lib/rbs/type_name.rb +1 -8
- data/lib/rbs/types.rb +91 -79
- data/lib/rbs/unit_test/convertibles.rb +1 -0
- data/lib/rbs/unit_test/type_assertions.rb +35 -8
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +13 -2
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +3 -3
- data/rbs.gemspec +4 -2
- data/rust/.gitignore +1 -0
- data/rust/Cargo.lock +378 -0
- data/rust/Cargo.toml +7 -0
- data/rust/ruby-rbs/Cargo.toml +22 -0
- data/rust/ruby-rbs/build.rs +764 -0
- data/rust/ruby-rbs/examples/locations.rs +60 -0
- data/rust/ruby-rbs/src/lib.rs +1 -0
- data/rust/ruby-rbs/src/node/mod.rs +742 -0
- data/rust/ruby-rbs/tests/sanity.rs +47 -0
- data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
- data/rust/ruby-rbs-sys/Cargo.toml +23 -0
- data/rust/ruby-rbs-sys/build.rs +204 -0
- data/rust/ruby-rbs-sys/src/lib.rs +50 -0
- data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
- data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
- data/rust/ruby-rbs-sys/wrapper.h +1 -0
- data/schema/typeParam.json +17 -1
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/annotate/formatter.rbs +2 -2
- data/sig/annotate/rdoc_annotater.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +421 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +178 -0
- data/sig/buffer.rbs +63 -5
- data/sig/cli/diff.rbs +5 -11
- data/sig/cli/validate.rbs +12 -8
- data/sig/cli.rbs +18 -18
- data/sig/definition.rbs +6 -0
- data/sig/definition_builder.rbs +3 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +94 -87
- data/sig/errors.rbs +26 -20
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +124 -0
- data/sig/location.rbs +32 -7
- data/sig/locator.rbs +0 -2
- data/sig/manifest.yaml +0 -1
- data/sig/method_builder.rbs +9 -4
- data/sig/namespace.rbs +0 -5
- data/sig/parser.rbs +67 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +35 -7
- data/sig/source.rbs +48 -0
- data/sig/type_param.rbs +13 -8
- data/sig/typename.rbs +0 -5
- data/sig/types.rbs +10 -8
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +11 -0
- data/src/ast.c +1604 -0
- data/src/lexer.c +3194 -0
- data/src/lexer.re +154 -0
- data/src/lexstate.c +212 -0
- data/src/location.c +31 -0
- data/src/parser.c +4205 -0
- data/src/string.c +41 -0
- data/src/util/rbs_allocator.c +165 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +18 -92
- data/src/util/rbs_encoding.c +21308 -0
- data/src/util/rbs_unescape.c +167 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
- data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
- data/stdlib/cgi/0/core.rbs +9 -393
- data/stdlib/cgi/0/manifest.yaml +1 -0
- data/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/stdlib/coverage/0/coverage.rbs +7 -4
- data/stdlib/date/0/date.rbs +92 -79
- data/stdlib/date/0/date_time.rbs +25 -24
- data/stdlib/delegate/0/delegator.rbs +10 -7
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/digest/0/digest.rbs +110 -0
- data/stdlib/erb/0/erb.rbs +748 -347
- data/stdlib/etc/0/etc.rbs +55 -50
- data/stdlib/fileutils/0/fileutils.rbs +158 -139
- data/stdlib/forwardable/0/forwardable.rbs +13 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +226 -179
- data/stdlib/monitor/0/monitor.rbs +3 -3
- data/stdlib/net-http/0/net-http.rbs +162 -134
- data/stdlib/objspace/0/objspace.rbs +17 -34
- data/stdlib/open-uri/0/open-uri.rbs +48 -8
- data/stdlib/open3/0/open3.rbs +469 -10
- data/stdlib/openssl/0/openssl.rbs +475 -357
- data/stdlib/optparse/0/optparse.rbs +26 -17
- data/stdlib/pathname/0/pathname.rbs +11 -1381
- data/stdlib/pp/0/pp.rbs +9 -8
- data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
- data/stdlib/pstore/0/pstore.rbs +35 -30
- data/stdlib/psych/0/psych.rbs +65 -12
- data/stdlib/psych/0/store.rbs +2 -4
- data/stdlib/pty/0/pty.rbs +9 -6
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +4 -3
- data/stdlib/rdoc/0/comment.rbs +2 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/rdoc.rbs +7 -5
- data/stdlib/rdoc/0/store.rbs +2 -2
- data/stdlib/resolv/0/resolv.rbs +25 -68
- data/stdlib/ripper/0/ripper.rbs +25 -19
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -20
- data/stdlib/shellwords/0/shellwords.rbs +2 -2
- data/stdlib/singleton/0/singleton.rbs +3 -0
- data/stdlib/socket/0/addrinfo.rbs +9 -9
- data/stdlib/socket/0/basic_socket.rbs +3 -3
- data/stdlib/socket/0/ip_socket.rbs +10 -8
- data/stdlib/socket/0/socket.rbs +23 -10
- data/stdlib/socket/0/tcp_server.rbs +1 -1
- data/stdlib/socket/0/tcp_socket.rbs +11 -3
- data/stdlib/socket/0/udp_socket.rbs +1 -1
- data/stdlib/socket/0/unix_server.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +1177 -85
- data/stdlib/strscan/0/string_scanner.rbs +27 -25
- data/stdlib/tempfile/0/tempfile.rbs +25 -21
- data/stdlib/time/0/time.rbs +8 -6
- data/stdlib/timeout/0/timeout.rbs +63 -7
- data/stdlib/tsort/0/cyclic.rbs +3 -0
- data/stdlib/tsort/0/tsort.rbs +7 -6
- data/stdlib/uri/0/common.rbs +42 -20
- data/stdlib/uri/0/file.rbs +3 -3
- data/stdlib/uri/0/generic.rbs +26 -18
- data/stdlib/uri/0/http.rbs +2 -2
- data/stdlib/uri/0/ldap.rbs +2 -2
- data/stdlib/uri/0/mailto.rbs +3 -3
- data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
- data/stdlib/zlib/0/deflate.rbs +4 -3
- data/stdlib/zlib/0/gzip_reader.rbs +6 -6
- data/stdlib/zlib/0/gzip_writer.rbs +14 -12
- data/stdlib/zlib/0/inflate.rbs +1 -1
- data/stdlib/zlib/0/need_dict.rbs +1 -1
- data/stdlib/zlib/0/zstream.rbs +1 -0
- metadata +121 -18
- data/ext/rbs_extension/lexer.c +0 -2728
- data/ext/rbs_extension/lexer.h +0 -179
- data/ext/rbs_extension/lexer.re +0 -147
- data/ext/rbs_extension/lexstate.c +0 -175
- data/ext/rbs_extension/location.c +0 -325
- data/ext/rbs_extension/location.h +0 -85
- data/ext/rbs_extension/parser.c +0 -2982
- data/ext/rbs_extension/parser.h +0 -18
- data/ext/rbs_extension/parserstate.c +0 -411
- data/ext/rbs_extension/parserstate.h +0 -163
- data/ext/rbs_extension/unescape.c +0 -32
- data/include/rbs/ruby_objs.h +0 -72
- data/src/constants.c +0 -153
- 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
|
|
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
|
|
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 { ... }
|
|
368
|
-
# - Thread.new(*args, &proc)
|
|
369
|
-
# - Thread.new(*args) { |args| ... }
|
|
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
|
-
#
|
|
620
|
+
# <code>"sleep"</code>
|
|
615
621
|
# : Returned if this thread is sleeping or waiting on I/O
|
|
616
622
|
#
|
|
617
|
-
#
|
|
623
|
+
# <code>"run"</code>
|
|
618
624
|
# : When this thread is executing
|
|
619
625
|
#
|
|
620
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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
|
|
874
|
-
# ExceptionClass is the interrupt handled by the given block. The
|
|
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
|
-
#
|
|
881
|
+
# <code>:immediate</code>
|
|
878
882
|
# : Invoke interrupts immediately.
|
|
879
883
|
#
|
|
880
|
-
#
|
|
884
|
+
# <code>:on_blocking</code>
|
|
881
885
|
# : Invoke interrupts while *BlockingOperation*.
|
|
882
886
|
#
|
|
883
|
-
#
|
|
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
|
|
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
|
-
# -
|
|
958
|
-
# -
|
|
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
|
|
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
|
-
#
|
|
1111
|
-
# However, this might handle the exception much later, or not at all
|
|
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
|
|
1191
|
-
# option. The default is
|
|
1192
|
-
# zero or positive, the error backtraces, produced
|
|
1193
|
-
# are abbreviated and the extra lines are replaced by
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
1396
|
-
#
|
|
1397
|
-
#
|
|
1398
|
-
#
|
|
1399
|
-
#
|
|
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
|
-
#
|
|
1405
|
-
#
|
|
1406
|
-
#
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1507
|
-
# - mutex.
|
|
1567
|
+
# rdoc-file=thread_sync.rb
|
|
1568
|
+
# - mutex.lock -> self
|
|
1508
1569
|
# -->
|
|
1509
|
-
#
|
|
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
|
-
# *
|
|
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
|
|
1575
|
-
# the queue as usual.
|
|
1576
|
-
# * when
|
|
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.
|