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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +14 -14
- data/.github/workflows/bundle-update.yml +60 -0
- data/.github/workflows/c-check.yml +18 -11
- data/.github/workflows/comments.yml +5 -3
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/ruby.yml +27 -34
- data/.github/workflows/rust.yml +95 -0
- data/.github/workflows/typecheck.yml +2 -2
- data/.github/workflows/windows.yml +2 -2
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +323 -0
- data/README.md +1 -1
- data/Rakefile +43 -33
- data/Steepfile +1 -0
- data/config.yml +426 -24
- 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 +179 -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 +192 -144
- 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 +3234 -1285
- data/core/struct.rbs +27 -26
- data/core/symbol.rbs +41 -34
- data/core/thread.rbs +135 -67
- 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 +544 -116
- data/ext/rbs_extension/ast_translation.h +3 -0
- data/ext/rbs_extension/class_constants.c +16 -2
- data/ext/rbs_extension/class_constants.h +8 -0
- data/ext/rbs_extension/extconf.rb +5 -1
- data/ext/rbs_extension/legacy_location.c +33 -56
- data/ext/rbs_extension/legacy_location.h +37 -0
- data/ext/rbs_extension/main.c +44 -35
- data/include/rbs/ast.h +448 -173
- data/include/rbs/defines.h +27 -0
- data/include/rbs/lexer.h +30 -11
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +6 -6
- data/include/rbs/string.h +0 -2
- data/include/rbs/util/rbs_allocator.h +34 -13
- data/include/rbs/util/rbs_assert.h +12 -1
- data/include/rbs/util/rbs_constant_pool.h +0 -3
- data/include/rbs/util/rbs_encoding.h +2 -0
- data/include/rbs/util/rbs_unescape.h +2 -1
- data/include/rbs.h +8 -0
- 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 +293 -3
- data/lib/rbs/ast/ruby/comment_block.rb +24 -0
- data/lib/rbs/ast/ruby/declarations.rb +198 -3
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
- data/lib/rbs/ast/ruby/members.rb +532 -22
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +20 -15
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +38 -106
- data/lib/rbs/cli.rb +52 -19
- data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
- data/lib/rbs/collection/sources/git.rb +1 -0
- data/lib/rbs/definition.rb +1 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
- data/lib/rbs/definition_builder/method_builder.rb +20 -0
- data/lib/rbs/definition_builder.rb +147 -25
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment.rb +227 -74
- data/lib/rbs/environment_loader.rb +0 -6
- data/lib/rbs/errors.rb +27 -18
- data/lib/rbs/inline_parser.rb +342 -6
- data/lib/rbs/location_aux.rb +1 -1
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/parser_aux.rb +20 -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 +8 -0
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +116 -38
- data/lib/rbs/subtractor.rb +3 -1
- data/lib/rbs/test/type_check.rb +19 -2
- data/lib/rbs/type_name.rb +1 -1
- data/lib/rbs/types.rb +88 -78
- 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 +1 -2
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +1 -1
- data/rbs.gemspec +4 -3
- 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/ast/ruby/annotations.rbs +315 -4
- data/sig/ast/ruby/comment_block.rbs +8 -0
- data/sig/ast/ruby/declarations.rbs +102 -4
- data/sig/ast/ruby/members.rbs +108 -2
- 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 -1
- data/sig/definition_builder.rbs +2 -0
- data/sig/environment.rbs +70 -12
- data/sig/errors.rbs +13 -14
- data/sig/inline_parser.rbs +39 -2
- data/sig/locator.rbs +0 -2
- data/sig/manifest.yaml +0 -1
- data/sig/method_builder.rbs +3 -1
- data/sig/parser.rbs +31 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +35 -7
- data/sig/source.rbs +3 -3
- data/sig/type_param.rbs +13 -8
- data/sig/types.rbs +6 -7
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +11 -0
- data/src/ast.c +410 -153
- data/src/lexer.c +1392 -1313
- data/src/lexer.re +3 -0
- data/src/lexstate.c +58 -37
- data/src/location.c +8 -48
- data/src/parser.c +977 -516
- data/src/string.c +0 -48
- data/src/util/rbs_allocator.c +89 -71
- data/src/util/rbs_assert.c +1 -1
- data/src/util/rbs_buffer.c +2 -2
- data/src/util/rbs_constant_pool.c +10 -14
- data/src/util/rbs_encoding.c +4 -8
- data/src/util/rbs_unescape.c +56 -20
- 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 +217 -136
- 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 +2 -1
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/rdoc.rbs +1 -1
- data/stdlib/rdoc/0/store.rbs +1 -1
- data/stdlib/resolv/0/resolv.rbs +25 -68
- data/stdlib/ripper/0/ripper.rbs +22 -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 +7 -7
- 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 +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
|
|
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
|
#
|
|
@@ -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
|
|
867
|
-
# ExceptionClass is the interrupt handled by the given block. The
|
|
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
|
-
#
|
|
881
|
+
# <code>:immediate</code>
|
|
871
882
|
# : Invoke interrupts immediately.
|
|
872
883
|
#
|
|
873
|
-
#
|
|
884
|
+
# <code>:on_blocking</code>
|
|
874
885
|
# : Invoke interrupts while *BlockingOperation*.
|
|
875
886
|
#
|
|
876
|
-
#
|
|
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
|
|
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
|
-
# -
|
|
951
|
-
# -
|
|
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
|
|
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
|
-
#
|
|
1104
|
-
# However, this might handle the exception much later, or not at all
|
|
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
|
|
1184
|
-
# option. The default is
|
|
1185
|
-
# zero or positive, the error backtraces, produced
|
|
1186
|
-
# 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>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
1389
|
-
#
|
|
1390
|
-
#
|
|
1391
|
-
#
|
|
1392
|
-
#
|
|
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
|
-
#
|
|
1398
|
-
#
|
|
1399
|
-
#
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1500
|
-
# - mutex.
|
|
1567
|
+
# rdoc-file=thread_sync.rb
|
|
1568
|
+
# - mutex.lock -> self
|
|
1501
1569
|
# -->
|
|
1502
|
-
#
|
|
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
|
-
# *
|
|
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
|
|
1568
|
-
# the queue as usual.
|
|
1569
|
-
# * when
|
|
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.
|