rbs 4.1.0.pre.2-java
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 +7 -0
- data/.clang-format +75 -0
- data/.clangd +2 -0
- data/.github/dependabot.yml +24 -0
- data/.github/workflows/bundle-update.yml +63 -0
- data/.github/workflows/c-check.yml +61 -0
- data/.github/workflows/comments.yml +37 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/jruby.yml +67 -0
- data/.github/workflows/milestone.yml +83 -0
- data/.github/workflows/ruby.yml +158 -0
- data/.github/workflows/rust.yml +184 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +39 -0
- data/.github/workflows/wasm.yml +53 -0
- data/.github/workflows/windows.yml +49 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +72 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +2292 -0
- data/COPYING +56 -0
- data/README.md +240 -0
- data/Rakefile +869 -0
- data/Steepfile +53 -0
- data/config.yml +913 -0
- data/core/array.rbs +4142 -0
- data/core/basic_object.rbs +376 -0
- data/core/binding.rbs +148 -0
- data/core/builtin.rbs +278 -0
- data/core/class.rbs +223 -0
- data/core/comparable.rbs +192 -0
- data/core/complex.rbs +812 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +993 -0
- data/core/encoding.rbs +1368 -0
- data/core/enumerable.rbs +2506 -0
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +705 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +682 -0
- data/core/errors.rbs +789 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +570 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2045 -0
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1316 -0
- data/core/gc.rbs +788 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +2183 -0
- data/core/integer.rbs +1374 -0
- data/core/io/buffer.rbs +995 -0
- data/core/io/wait.rbs +48 -0
- data/core/io.rbs +3472 -0
- data/core/kernel.rbs +3172 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +637 -0
- data/core/math.rbs +770 -0
- data/core/method.rbs +422 -0
- data/core/module.rbs +1856 -0
- data/core/nil_class.rbs +210 -0
- data/core/numeric.rbs +832 -0
- data/core/object.rbs +108 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +197 -0
- data/core/pathname.rbs +1322 -0
- data/core/proc.rbs +905 -0
- data/core/process.rbs +2316 -0
- data/core/ractor.rbs +924 -0
- data/core/random.rbs +255 -0
- data/core/range.rbs +1209 -0
- data/core/rational.rbs +502 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +1236 -0
- data/core/rbs/unnamed/env_class.rbs +1214 -0
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +186 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1974 -0
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +809 -0
- data/core/rubygems/basic_specification.rbs +6 -0
- data/core/rubygems/config_file.rbs +38 -0
- data/core/rubygems/dependency_installer.rbs +6 -0
- data/core/rubygems/errors.rbs +109 -0
- data/core/rubygems/installer.rbs +15 -0
- data/core/rubygems/path_support.rbs +6 -0
- data/core/rubygems/platform.rbs +7 -0
- data/core/rubygems/request_set.rbs +49 -0
- data/core/rubygems/requirement.rbs +148 -0
- data/core/rubygems/rubygems.rbs +1105 -0
- data/core/rubygems/source_list.rbs +15 -0
- data/core/rubygems/specification.rbs +23 -0
- data/core/rubygems/stream_ui.rbs +5 -0
- data/core/rubygems/uninstaller.rbs +10 -0
- data/core/rubygems/version.rbs +293 -0
- data/core/set.rbs +751 -0
- data/core/signal.rbs +110 -0
- data/core/string.rbs +5532 -0
- data/core/struct.rbs +668 -0
- data/core/symbol.rbs +482 -0
- data/core/thread.rbs +1826 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1793 -0
- data/core/trace_point.rbs +483 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +337 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +107 -0
- data/docs/aliases.md +79 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/config.md +171 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/encoding.md +56 -0
- data/docs/gem.md +56 -0
- data/docs/inline.md +634 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/rust.md +96 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +940 -0
- data/docs/tools.md +17 -0
- data/docs/type_fingerprint.md +21 -0
- data/docs/wasm_serialization.md +80 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/ast_translation.c +1855 -0
- data/ext/rbs_extension/ast_translation.h +41 -0
- data/ext/rbs_extension/class_constants.c +187 -0
- data/ext/rbs_extension/class_constants.h +104 -0
- data/ext/rbs_extension/compat.h +10 -0
- data/ext/rbs_extension/extconf.rb +40 -0
- data/ext/rbs_extension/legacy_location.c +294 -0
- data/ext/rbs_extension/legacy_location.h +82 -0
- data/ext/rbs_extension/main.c +613 -0
- data/ext/rbs_extension/rbs_extension.h +16 -0
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/ast.h +1047 -0
- data/include/rbs/defines.h +99 -0
- data/include/rbs/lexer.h +207 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +153 -0
- data/include/rbs/serialize.h +39 -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 +155 -0
- data/include/rbs/util/rbs_encoding.h +282 -0
- data/include/rbs/util/rbs_unescape.h +24 -0
- data/include/rbs.h +14 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +82 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/lib/rbs/annotate.rb +8 -0
- data/lib/rbs/ast/annotation.rb +29 -0
- data/lib/rbs/ast/comment.rb +29 -0
- data/lib/rbs/ast/declarations.rb +472 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/lib/rbs/ast/ruby/declarations.rb +291 -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 +762 -0
- data/lib/rbs/ast/type_param.rb +235 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +189 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +84 -0
- data/lib/rbs/cli/validate.rb +294 -0
- data/lib/rbs/cli.rb +1253 -0
- data/lib/rbs/collection/cleaner.rb +38 -0
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/lib/rbs/collection/config.rb +81 -0
- data/lib/rbs/collection/installer.rb +32 -0
- data/lib/rbs/collection/sources/base.rb +14 -0
- data/lib/rbs/collection/sources/git.rb +265 -0
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/lib/rbs/collection/sources.rb +38 -0
- data/lib/rbs/collection.rb +16 -0
- data/lib/rbs/constant.rb +28 -0
- data/lib/rbs/definition.rb +415 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
- data/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/lib/rbs/definition_builder.rb +1054 -0
- data/lib/rbs/diff.rb +131 -0
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +1028 -0
- data/lib/rbs/environment_loader.rb +167 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +634 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +568 -0
- data/lib/rbs/location_aux.rb +170 -0
- data/lib/rbs/locator.rb +247 -0
- data/lib/rbs/method_type.rb +145 -0
- data/lib/rbs/namespace.rb +154 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +142 -0
- data/lib/rbs/prototype/helpers.rb +197 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +816 -0
- data/lib/rbs/prototype/rbi.rb +625 -0
- data/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
- data/lib/rbs/prototype/runtime.rb +680 -0
- data/lib/rbs/repository.rb +127 -0
- data/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +204 -0
- data/lib/rbs/test/errors.rb +80 -0
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +212 -0
- data/lib/rbs/test/observer.rb +19 -0
- data/lib/rbs/test/setup.rb +84 -0
- data/lib/rbs/test/setup_helper.rb +50 -0
- data/lib/rbs/test/tester.rb +167 -0
- data/lib/rbs/test/type_check.rb +457 -0
- data/lib/rbs/test.rb +112 -0
- data/lib/rbs/type_alias_dependency.rb +100 -0
- data/lib/rbs/type_alias_regularity.rb +126 -0
- data/lib/rbs/type_name.rb +122 -0
- data/lib/rbs/types.rb +1604 -0
- data/lib/rbs/unit_test/convertibles.rb +177 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +186 -0
- data/lib/rbs/variance_calculator.rb +189 -0
- data/lib/rbs/vendorer.rb +71 -0
- data/lib/rbs/version.rb +5 -0
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
- data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
- data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
- data/lib/rbs/wasm/jars/asm-util.jar +0 -0
- data/lib/rbs/wasm/jars/asm.jar +0 -0
- data/lib/rbs/wasm/jars/compiler.jar +0 -0
- data/lib/rbs/wasm/jars/log.jar +0 -0
- data/lib/rbs/wasm/jars/runtime.jar +0 -0
- data/lib/rbs/wasm/jars/wasi.jar +0 -0
- data/lib/rbs/wasm/jars/wasm.jar +0 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/rbs_parser.wasm +0 -0
- data/lib/rbs/wasm/runtime.rb +217 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs/writer.rb +424 -0
- data/lib/rbs.rb +117 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs.gemspec +68 -0
- data/schema/annotation.json +14 -0
- data/schema/comment.json +26 -0
- data/schema/decls.json +326 -0
- data/schema/function.json +87 -0
- data/schema/location.json +56 -0
- data/schema/members.json +266 -0
- data/schema/methodType.json +50 -0
- data/schema/typeParam.json +52 -0
- data/schema/types.json +317 -0
- data/sig/ancestor_builder.rbs +163 -0
- data/sig/ancestor_graph.rbs +60 -0
- data/sig/annotate/annotations.rbs +102 -0
- data/sig/annotate/formatter.rbs +24 -0
- data/sig/annotate/rdoc_annotater.rbs +85 -0
- data/sig/annotate/rdoc_source.rbs +32 -0
- data/sig/annotation.rbs +27 -0
- data/sig/ast/ruby/annotations.rbs +470 -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 +198 -0
- data/sig/buffer.rbs +108 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +15 -0
- data/sig/cli/validate.rbs +47 -0
- data/sig/cli.rbs +89 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +68 -0
- data/sig/collection/config.rbs +46 -0
- data/sig/collection/installer.rbs +17 -0
- data/sig/collection/sources.rbs +214 -0
- data/sig/collection.rbs +4 -0
- data/sig/comment.rbs +26 -0
- data/sig/constant.rbs +21 -0
- data/sig/declarations.rbs +274 -0
- data/sig/definition.rbs +232 -0
- data/sig/definition_builder.rbs +181 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +286 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +408 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +126 -0
- data/sig/location.rbs +135 -0
- data/sig/locator.rbs +56 -0
- data/sig/manifest.yaml +5 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +89 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +161 -0
- data/sig/parser.rbs +164 -0
- data/sig/prototype/helpers.rbs +29 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +96 -0
- data/sig/prototype/rbi.rbs +75 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +21 -0
- data/sig/rdoc/rbs.rbs +67 -0
- data/sig/repository.rbs +85 -0
- data/sig/resolver/constant_resolver.rbs +92 -0
- data/sig/resolver/context.rbs +34 -0
- data/sig/resolver/type_name_resolver.rbs +61 -0
- data/sig/rewriter.rbs +45 -0
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/enumerable.rbs +5 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +41 -0
- data/sig/source.rbs +48 -0
- data/sig/substitution.rbs +48 -0
- data/sig/subtractor.rbs +37 -0
- data/sig/test/errors.rbs +52 -0
- data/sig/test/guranteed.rbs +9 -0
- data/sig/test/type_check.rbs +19 -0
- data/sig/test.rbs +82 -0
- data/sig/type_alias_dependency.rbs +53 -0
- data/sig/type_alias_regularity.rbs +98 -0
- data/sig/type_param.rbs +115 -0
- data/sig/typename.rbs +89 -0
- data/sig/types.rbs +578 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +22 -0
- data/sig/unit_test/type_assertions.rbs +211 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/util.rbs +9 -0
- data/sig/validator.rbs +63 -0
- data/sig/variance_calculator.rbs +87 -0
- data/sig/vendorer.rbs +51 -0
- data/sig/version.rbs +3 -0
- data/sig/visitor.rbs +47 -0
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/sig/writer.rbs +127 -0
- data/src/ast.c +1628 -0
- data/src/lexer.c +3217 -0
- data/src/lexer.re +155 -0
- data/src/lexstate.c +217 -0
- data/src/location.c +31 -0
- data/src/parser.c +4255 -0
- data/src/serialize.c +958 -0
- data/src/string.c +41 -0
- data/src/util/rbs_allocator.c +162 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +268 -0
- data/src/util/rbs_encoding.c +21308 -0
- data/src/util/rbs_unescape.c +167 -0
- data/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/stdlib/abbrev/0/array.rbs +26 -0
- data/stdlib/base64/0/base64.rbs +355 -0
- data/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +911 -0
- data/stdlib/cgi/0/manifest.yaml +4 -0
- data/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/stdlib/coverage/0/coverage.rbs +266 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1598 -0
- data/stdlib/date/0/date_time.rbs +617 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +187 -0
- data/stdlib/delegate/0/kernel.rbs +47 -0
- data/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/stdlib/digest/0/digest.rbs +687 -0
- data/stdlib/erb/0/erb.rbs +933 -0
- data/stdlib/etc/0/etc.rbs +884 -0
- data/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
- data/stdlib/json/0/json.rbs +1963 -0
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +45 -0
- data/stdlib/logger/0/log_device.rbs +100 -0
- data/stdlib/logger/0/logger.rbs +796 -0
- data/stdlib/logger/0/manifest.yaml +2 -0
- data/stdlib/logger/0/period.rbs +17 -0
- data/stdlib/logger/0/severity.rbs +34 -0
- data/stdlib/minitest/0/kernel.rbs +42 -0
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/stdlib/minitest/0/minitest.rbs +115 -0
- data/stdlib/monitor/0/monitor.rbs +363 -0
- data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/stdlib/net-http/0/manifest.yaml +3 -0
- data/stdlib/net-http/0/net-http.rbs +5580 -0
- data/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/stdlib/nkf/0/nkf.rbs +402 -0
- data/stdlib/objspace/0/objspace.rbs +470 -0
- data/stdlib/observable/0/observable.rbs +217 -0
- data/stdlib/open-uri/0/manifest.yaml +4 -0
- data/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/stdlib/open3/0/open3.rbs +606 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12231 -0
- data/stdlib/optparse/0/optparse.rbs +1734 -0
- data/stdlib/pathname/0/pathname.rbs +36 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +301 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +608 -0
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/psych/0/dbm.rbs +237 -0
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +455 -0
- data/stdlib/psych/0/store.rbs +57 -0
- data/stdlib/pty/0/pty.rbs +240 -0
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +52 -0
- data/stdlib/rdoc/0/comment.rbs +61 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/stdlib/rdoc/0/ri.rbs +17 -0
- data/stdlib/rdoc/0/store.rbs +48 -0
- data/stdlib/rdoc/0/top_level.rbs +97 -0
- data/stdlib/resolv/0/manifest.yaml +3 -0
- data/stdlib/resolv/0/resolv.rbs +1787 -0
- data/stdlib/ripper/0/ripper.rbs +1654 -0
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +134 -0
- data/stdlib/socket/0/addrinfo.rbs +666 -0
- data/stdlib/socket/0/basic_socket.rbs +590 -0
- data/stdlib/socket/0/constants.rbs +2295 -0
- data/stdlib/socket/0/ip_socket.rbs +94 -0
- data/stdlib/socket/0/socket.rbs +4170 -0
- data/stdlib/socket/0/socket_error.rbs +5 -0
- data/stdlib/socket/0/tcp_server.rbs +192 -0
- data/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/stdlib/socket/0/udp_socket.rbs +133 -0
- data/stdlib/socket/0/unix_server.rbs +169 -0
- data/stdlib/socket/0/unix_socket.rbs +172 -0
- data/stdlib/stringio/0/stringio.rbs +1681 -0
- data/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/stdlib/time/0/time.rbs +434 -0
- data/stdlib/timeout/0/timeout.rbs +137 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +8 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +410 -0
- data/stdlib/uri/0/common.rbs +621 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1116 -0
- data/stdlib/uri/0/http.rbs +104 -0
- data/stdlib/uri/0/https.rbs +14 -0
- data/stdlib/uri/0/ldap.rbs +230 -0
- data/stdlib/uri/0/ldaps.rbs +14 -0
- data/stdlib/uri/0/mailto.rbs +92 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/stdlib/uri/0/ws.rbs +13 -0
- data/stdlib/uri/0/wss.rbs +9 -0
- data/stdlib/yaml/0/manifest.yaml +2 -0
- data/stdlib/yaml/0/yaml.rbs +1 -0
- data/stdlib/zlib/0/buf_error.rbs +10 -0
- data/stdlib/zlib/0/data_error.rbs +10 -0
- data/stdlib/zlib/0/deflate.rbs +211 -0
- data/stdlib/zlib/0/error.rbs +20 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/stdlib/zlib/0/gzip_writer.rbs +168 -0
- data/stdlib/zlib/0/inflate.rbs +180 -0
- data/stdlib/zlib/0/mem_error.rbs +10 -0
- data/stdlib/zlib/0/need_dict.rbs +13 -0
- data/stdlib/zlib/0/stream_end.rbs +11 -0
- data/stdlib/zlib/0/stream_error.rbs +11 -0
- data/stdlib/zlib/0/version_error.rbs +11 -0
- data/stdlib/zlib/0/zlib.rbs +449 -0
- data/stdlib/zlib/0/zstream.rbs +201 -0
- data/wasm/README.md +59 -0
- data/wasm/rbs_wasm.c +411 -0
- metadata +660 -0
data/core/ractor.rbs
ADDED
|
@@ -0,0 +1,924 @@
|
|
|
1
|
+
# <!-- rdoc-file=ractor.rb -->
|
|
2
|
+
# Ractor.new creates a new Ractor, which can run in parallel with other ractors.
|
|
3
|
+
#
|
|
4
|
+
# # The simplest ractor
|
|
5
|
+
# r = Ractor.new {puts "I am in Ractor!"}
|
|
6
|
+
# r.join # wait for it to finish
|
|
7
|
+
# # Here, "I am in Ractor!" is printed
|
|
8
|
+
#
|
|
9
|
+
# Ractors do not share all objects with each other. There are two main benefits
|
|
10
|
+
# to this: across ractors, thread-safety concerns such as data-races and
|
|
11
|
+
# race-conditions are not possible. The other benefit is parallelism.
|
|
12
|
+
#
|
|
13
|
+
# To achieve this, object sharing is limited across ractors. Unlike in threads,
|
|
14
|
+
# ractors can't access all the objects available in other ractors. For example,
|
|
15
|
+
# objects normally available through variables in the outer scope are prohibited
|
|
16
|
+
# from being used across ractors.
|
|
17
|
+
#
|
|
18
|
+
# a = 1
|
|
19
|
+
# r = Ractor.new {puts "I am in Ractor! a=#{a}"}
|
|
20
|
+
# # fails immediately with
|
|
21
|
+
# # ArgumentError (can not isolate a Proc because it accesses outer variables (a).)
|
|
22
|
+
#
|
|
23
|
+
# The object must be explicitly shared:
|
|
24
|
+
# a = 1
|
|
25
|
+
# r = Ractor.new(a) { |a1| puts "I am in Ractor! a=#{a1}"}
|
|
26
|
+
#
|
|
27
|
+
# On CRuby (the default implementation), the Global Virtual Machine Lock (GVL)
|
|
28
|
+
# is held per ractor, so ractors can run in parallel. This is unlike the
|
|
29
|
+
# situation with threads on CRuby.
|
|
30
|
+
#
|
|
31
|
+
# Instead of accessing shared state, objects should be passed to and from
|
|
32
|
+
# ractors by sending and receiving them as messages.
|
|
33
|
+
#
|
|
34
|
+
# a = 1
|
|
35
|
+
# r = Ractor.new do
|
|
36
|
+
# a_in_ractor = receive # receive blocks the Thread until our default port gets sent a message
|
|
37
|
+
# puts "I am in Ractor! a=#{a_in_ractor}"
|
|
38
|
+
# end
|
|
39
|
+
# r.send(a) # pass it
|
|
40
|
+
# r.join
|
|
41
|
+
# # Here, "I am in Ractor! a=1" is printed
|
|
42
|
+
#
|
|
43
|
+
# In addition to that, any arguments passed to Ractor.new are passed to the
|
|
44
|
+
# block and available there as if received by Ractor.receive, and the last block
|
|
45
|
+
# value can be received with Ractor#value.
|
|
46
|
+
#
|
|
47
|
+
# ## Shareable and unshareable objects
|
|
48
|
+
#
|
|
49
|
+
# When an object is sent to a ractor, it's important to understand whether the
|
|
50
|
+
# object is shareable or unshareable. Most Ruby objects are unshareable objects.
|
|
51
|
+
# Even frozen objects can be unshareable if they contain (through their instance
|
|
52
|
+
# variables) unfrozen objects.
|
|
53
|
+
#
|
|
54
|
+
# Shareable objects are those which can be used by several ractors at once
|
|
55
|
+
# without compromising thread-safety, for example numbers, `true` and `false`.
|
|
56
|
+
# Ractor.shareable? allows you to check this, and Ractor.make_shareable tries to
|
|
57
|
+
# make the object shareable if it's not already and gives an error if it can't
|
|
58
|
+
# do it.
|
|
59
|
+
#
|
|
60
|
+
# Ractor.shareable?(1) #=> true -- numbers and other immutable basic values are shareable
|
|
61
|
+
# Ractor.shareable?('foo') #=> false, unless the string is frozen due to # frozen_string_literal: true
|
|
62
|
+
# Ractor.shareable?('foo'.freeze) #=> true
|
|
63
|
+
# Ractor.shareable?([Object.new].freeze) #=> false, inner object is unfrozen
|
|
64
|
+
#
|
|
65
|
+
# ary = ['hello', 'world']
|
|
66
|
+
# ary.frozen? #=> false
|
|
67
|
+
# ary[0].frozen? #=> false
|
|
68
|
+
# Ractor.make_shareable(ary)
|
|
69
|
+
# ary.frozen? #=> true
|
|
70
|
+
# ary[0].frozen? #=> true
|
|
71
|
+
# ary[1].frozen? #=> true
|
|
72
|
+
#
|
|
73
|
+
# When a shareable object is sent via #send, no additional processing occurs on
|
|
74
|
+
# it and it becomes usable by both ractors. When an unshareable object is sent,
|
|
75
|
+
# it can be either *copied* or *moved*. Copying is the default, and it copies
|
|
76
|
+
# the object fully by deep cloning (Object#clone) the non-shareable parts of its
|
|
77
|
+
# structure.
|
|
78
|
+
#
|
|
79
|
+
# data = ['foo'.dup, 'bar'.freeze]
|
|
80
|
+
# r = Ractor.new do
|
|
81
|
+
# data2 = Ractor.receive
|
|
82
|
+
# puts "In ractor: #{data2.object_id}, #{data2[0].object_id}, #{data2[1].object_id}"
|
|
83
|
+
# end
|
|
84
|
+
# r.send(data)
|
|
85
|
+
# r.join
|
|
86
|
+
# puts "Outside : #{data.object_id}, #{data[0].object_id}, #{data[1].object_id}"
|
|
87
|
+
#
|
|
88
|
+
# This will output something like:
|
|
89
|
+
#
|
|
90
|
+
# In ractor: 8, 16, 24
|
|
91
|
+
# Outside : 32, 40, 24
|
|
92
|
+
#
|
|
93
|
+
# Note that the object ids of the array and the non-frozen string inside the
|
|
94
|
+
# array have changed in the ractor because they are different objects. The
|
|
95
|
+
# second array's element, which is a shareable frozen string, is the same
|
|
96
|
+
# object.
|
|
97
|
+
#
|
|
98
|
+
# Deep cloning of objects may be slow, and sometimes impossible. Alternatively,
|
|
99
|
+
# <code>move: true</code> may be used during sending. This will *move* the
|
|
100
|
+
# unshareable object to the receiving ractor, making it inaccessible to the
|
|
101
|
+
# sending ractor.
|
|
102
|
+
#
|
|
103
|
+
# data = ['foo', 'bar']
|
|
104
|
+
# r = Ractor.new do
|
|
105
|
+
# data_in_ractor = Ractor.receive
|
|
106
|
+
# puts "In ractor: #{data_in_ractor.object_id}, #{data_in_ractor[0].object_id}"
|
|
107
|
+
# end
|
|
108
|
+
# r.send(data, move: true)
|
|
109
|
+
# r.join
|
|
110
|
+
# puts "Outside: moved? #{Ractor::MovedObject === data}"
|
|
111
|
+
# puts "Outside: #{data.inspect}"
|
|
112
|
+
#
|
|
113
|
+
# This will output:
|
|
114
|
+
#
|
|
115
|
+
# In ractor: 100, 120
|
|
116
|
+
# Outside: moved? true
|
|
117
|
+
# test.rb:9:in `method_missing': can not send any methods to a moved object (Ractor::MovedError)
|
|
118
|
+
#
|
|
119
|
+
# Notice that even `inspect` and more basic methods like `__id__` are
|
|
120
|
+
# inaccessible on a moved object.
|
|
121
|
+
#
|
|
122
|
+
# `Class` and `Module` objects are shareable and their class/module definitions
|
|
123
|
+
# are shared between ractors. Ractor objects are also shareable. All operations
|
|
124
|
+
# on shareable objects are thread-safe across ractors. Defining mutable,
|
|
125
|
+
# shareable objects in Ruby is not possible, but C extensions can introduce
|
|
126
|
+
# them.
|
|
127
|
+
#
|
|
128
|
+
# It is prohibited to access (get) instance variables of shareable objects in
|
|
129
|
+
# other ractors if the values of the variables aren't shareable. This can occur
|
|
130
|
+
# because modules/classes are shareable, but they can have instance variables
|
|
131
|
+
# whose values are not. In non-main ractors, it's also prohibited to set
|
|
132
|
+
# instance variables on classes/modules (even if the value is shareable).
|
|
133
|
+
#
|
|
134
|
+
# class C
|
|
135
|
+
# class << self
|
|
136
|
+
# attr_accessor :tricky
|
|
137
|
+
# end
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
# C.tricky = "unshareable".dup
|
|
141
|
+
#
|
|
142
|
+
# r = Ractor.new(C) do |cls|
|
|
143
|
+
# puts "I see #{cls}"
|
|
144
|
+
# puts "I can't see #{cls.tricky}"
|
|
145
|
+
# cls.tricky = true # doesn't get here, but this would also raise an error
|
|
146
|
+
# end
|
|
147
|
+
# r.join
|
|
148
|
+
# # I see C
|
|
149
|
+
# # can not access instance variables of classes/modules from non-main Ractors (RuntimeError)
|
|
150
|
+
#
|
|
151
|
+
# Ractors can access constants if they are shareable. The main Ractor is the
|
|
152
|
+
# only one that can access non-shareable constants.
|
|
153
|
+
#
|
|
154
|
+
# GOOD = 'good'.freeze
|
|
155
|
+
# BAD = 'bad'.dup
|
|
156
|
+
#
|
|
157
|
+
# r = Ractor.new do
|
|
158
|
+
# puts "GOOD=#{GOOD}"
|
|
159
|
+
# puts "BAD=#{BAD}"
|
|
160
|
+
# end
|
|
161
|
+
# r.join
|
|
162
|
+
# # GOOD=good
|
|
163
|
+
# # can not access non-shareable objects in constant Object::BAD by non-main Ractor. (NameError)
|
|
164
|
+
#
|
|
165
|
+
# # Consider the same C class from above
|
|
166
|
+
#
|
|
167
|
+
# r = Ractor.new do
|
|
168
|
+
# puts "I see #{C}"
|
|
169
|
+
# puts "I can't see #{C.tricky}"
|
|
170
|
+
# end
|
|
171
|
+
# r.join
|
|
172
|
+
# # I see C
|
|
173
|
+
# # can not access instance variables of classes/modules from non-main Ractors (RuntimeError)
|
|
174
|
+
#
|
|
175
|
+
# See also the description of <code># shareable_constant_value</code> pragma in
|
|
176
|
+
# [Comments syntax](rdoc-ref:syntax/comments.rdoc) explanation.
|
|
177
|
+
#
|
|
178
|
+
# ## Ractors vs threads
|
|
179
|
+
#
|
|
180
|
+
# Each ractor has its own main Thread. New threads can be created from inside
|
|
181
|
+
# ractors (and, on CRuby, they share the GVL with other threads of this ractor).
|
|
182
|
+
#
|
|
183
|
+
# r = Ractor.new do
|
|
184
|
+
# a = 1
|
|
185
|
+
# Thread.new {puts "Thread in ractor: a=#{a}"}.join
|
|
186
|
+
# end
|
|
187
|
+
# r.join
|
|
188
|
+
# # Here "Thread in ractor: a=1" will be printed
|
|
189
|
+
#
|
|
190
|
+
# ## Note on code examples
|
|
191
|
+
#
|
|
192
|
+
# In the examples below, sometimes we use the following method to wait for
|
|
193
|
+
# ractors to make progress or finish.
|
|
194
|
+
#
|
|
195
|
+
# def wait
|
|
196
|
+
# sleep(0.1)
|
|
197
|
+
# end
|
|
198
|
+
#
|
|
199
|
+
# This is **only for demonstration purposes** and shouldn't be used in a real
|
|
200
|
+
# code. Most of the time, #join is used to wait for ractors to finish and
|
|
201
|
+
# Ractor.receive is used to wait for messages.
|
|
202
|
+
#
|
|
203
|
+
# ## Reference
|
|
204
|
+
#
|
|
205
|
+
# See [Ractor design doc](rdoc-ref:ractor.md) for more details.
|
|
206
|
+
#
|
|
207
|
+
class Ractor
|
|
208
|
+
# <!--
|
|
209
|
+
# rdoc-file=ractor.rb
|
|
210
|
+
# - _require(feature)
|
|
211
|
+
# -->
|
|
212
|
+
# internal method
|
|
213
|
+
#
|
|
214
|
+
def self._require: (String feature) -> bool
|
|
215
|
+
|
|
216
|
+
# <!--
|
|
217
|
+
# rdoc-file=ractor.rb
|
|
218
|
+
# - [](sym)
|
|
219
|
+
# -->
|
|
220
|
+
# Gets a value from ractor-local storage for the current Ractor.
|
|
221
|
+
#
|
|
222
|
+
def self.[]: (Symbol) -> untyped
|
|
223
|
+
|
|
224
|
+
# <!--
|
|
225
|
+
# rdoc-file=ractor.rb
|
|
226
|
+
# - []=(sym, val)
|
|
227
|
+
# -->
|
|
228
|
+
# Sets a value in ractor-local storage for the current Ractor.
|
|
229
|
+
#
|
|
230
|
+
def self.[]=: (Symbol, untyped) -> untyped
|
|
231
|
+
|
|
232
|
+
# <!--
|
|
233
|
+
# rdoc-file=ractor.rb
|
|
234
|
+
# - count()
|
|
235
|
+
# -->
|
|
236
|
+
# Returns the number of ractors currently running or blocking (waiting).
|
|
237
|
+
#
|
|
238
|
+
# Ractor.count #=> 1
|
|
239
|
+
# r = Ractor.new(name: 'example') { Ractor.receive }
|
|
240
|
+
# Ractor.count #=> 2 (main + example ractor)
|
|
241
|
+
# r << 42 # r's Ractor.receive will resume
|
|
242
|
+
# r.join # wait for r's termination
|
|
243
|
+
# Ractor.count #=> 1
|
|
244
|
+
#
|
|
245
|
+
def self.count: () -> Integer
|
|
246
|
+
|
|
247
|
+
# <!--
|
|
248
|
+
# rdoc-file=ractor.rb
|
|
249
|
+
# - current()
|
|
250
|
+
# -->
|
|
251
|
+
# Returns the currently executing Ractor.
|
|
252
|
+
#
|
|
253
|
+
# Ractor.current #=> #<Ractor:#1 running>
|
|
254
|
+
#
|
|
255
|
+
def self.current: () -> untyped
|
|
256
|
+
|
|
257
|
+
# <!--
|
|
258
|
+
# rdoc-file=ractor.rb
|
|
259
|
+
# - main()
|
|
260
|
+
# -->
|
|
261
|
+
# Returns the main ractor.
|
|
262
|
+
#
|
|
263
|
+
def self.main: () -> Ractor
|
|
264
|
+
|
|
265
|
+
# <!--
|
|
266
|
+
# rdoc-file=ractor.rb
|
|
267
|
+
# - main?()
|
|
268
|
+
# -->
|
|
269
|
+
# Returns true if the current ractor is the main ractor.
|
|
270
|
+
#
|
|
271
|
+
def self.main?: () -> boolish
|
|
272
|
+
|
|
273
|
+
# <!--
|
|
274
|
+
# rdoc-file=ractor.rb
|
|
275
|
+
# - Ractor.make_shareable(obj, copy: false) -> shareable_obj
|
|
276
|
+
# -->
|
|
277
|
+
# Makes `obj` shareable between ractors.
|
|
278
|
+
#
|
|
279
|
+
# `obj` and all the objects it refers to will be frozen, unless they are already
|
|
280
|
+
# shareable.
|
|
281
|
+
#
|
|
282
|
+
# If `copy` keyword is `true`, it will copy objects before freezing them, and
|
|
283
|
+
# will not modify `obj` or its internal objects.
|
|
284
|
+
#
|
|
285
|
+
# Note that the specification and implementation of this method are not mature
|
|
286
|
+
# and may be changed in the future.
|
|
287
|
+
#
|
|
288
|
+
# obj = ['test']
|
|
289
|
+
# Ractor.shareable?(obj) #=> false
|
|
290
|
+
# Ractor.make_shareable(obj) #=> ["test"]
|
|
291
|
+
# Ractor.shareable?(obj) #=> true
|
|
292
|
+
# obj.frozen? #=> true
|
|
293
|
+
# obj[0].frozen? #=> true
|
|
294
|
+
#
|
|
295
|
+
# # Copy vs non-copy versions:
|
|
296
|
+
# obj1 = ['test']
|
|
297
|
+
# obj1s = Ractor.make_shareable(obj1)
|
|
298
|
+
# obj1.frozen? #=> true
|
|
299
|
+
# obj1s.object_id == obj1.object_id #=> true
|
|
300
|
+
# obj2 = ['test']
|
|
301
|
+
# obj2s = Ractor.make_shareable(obj2, copy: true)
|
|
302
|
+
# obj2.frozen? #=> false
|
|
303
|
+
# obj2s.frozen? #=> true
|
|
304
|
+
# obj2s.object_id == obj2.object_id #=> false
|
|
305
|
+
# obj2s[0].object_id == obj2[0].object_id #=> false
|
|
306
|
+
#
|
|
307
|
+
# See also the "Shareable and unshareable objects" section in the Ractor class
|
|
308
|
+
# docs.
|
|
309
|
+
#
|
|
310
|
+
def self.make_shareable: [T] (T obj, ?copy: boolish) -> T
|
|
311
|
+
|
|
312
|
+
# <!--
|
|
313
|
+
# rdoc-file=ractor.rb
|
|
314
|
+
# - Ractor.new(*args, name: nil) {|*args| block } -> ractor
|
|
315
|
+
# -->
|
|
316
|
+
# Creates a new Ractor with args and a block.
|
|
317
|
+
#
|
|
318
|
+
# The given block (Proc) is isolated (can't access any outer variables). `self`
|
|
319
|
+
# inside the block will refer to the current Ractor.
|
|
320
|
+
#
|
|
321
|
+
# r = Ractor.new { puts "Hi, I am #{self.inspect}" }
|
|
322
|
+
# r.join
|
|
323
|
+
# # Prints "Hi, I am #<Ractor:#2 test.rb:1 running>"
|
|
324
|
+
#
|
|
325
|
+
# Any `args` passed are propagated to the block arguments by the same rules as
|
|
326
|
+
# objects sent via #send/Ractor.receive. If an argument in `args` is not
|
|
327
|
+
# shareable, it will be copied (via deep cloning, which might be inefficient).
|
|
328
|
+
#
|
|
329
|
+
# arg = [1, 2, 3]
|
|
330
|
+
# puts "Passing: #{arg} (##{arg.object_id})"
|
|
331
|
+
# r = Ractor.new(arg) {|received_arg|
|
|
332
|
+
# puts "Received: #{received_arg} (##{received_arg.object_id})"
|
|
333
|
+
# }
|
|
334
|
+
# r.join
|
|
335
|
+
# # Prints:
|
|
336
|
+
# # Passing: [1, 2, 3] (#280)
|
|
337
|
+
# # Received: [1, 2, 3] (#300)
|
|
338
|
+
#
|
|
339
|
+
# Ractor's `name` can be set for debugging purposes:
|
|
340
|
+
#
|
|
341
|
+
# r = Ractor.new(name: 'my ractor') {}; r.join
|
|
342
|
+
# p r
|
|
343
|
+
# #=> #<Ractor:#3 my ractor test.rb:1 terminated>
|
|
344
|
+
#
|
|
345
|
+
def self.new: (*untyped args, ?name: string) { (?) -> untyped } -> Ractor
|
|
346
|
+
|
|
347
|
+
# <!--
|
|
348
|
+
# rdoc-file=ractor.rb
|
|
349
|
+
# - Ractor.receive -> obj
|
|
350
|
+
# -->
|
|
351
|
+
# Receives a message from the current ractor's default port.
|
|
352
|
+
#
|
|
353
|
+
def self.receive: () -> untyped
|
|
354
|
+
|
|
355
|
+
# <!--
|
|
356
|
+
# rdoc-file=ractor.rb
|
|
357
|
+
# - recv()
|
|
358
|
+
# -->
|
|
359
|
+
#
|
|
360
|
+
alias self.recv self.receive
|
|
361
|
+
|
|
362
|
+
# <!--
|
|
363
|
+
# rdoc-file=ractor.rb
|
|
364
|
+
# - Ractor.select(*ractors_or_ports) -> [ractor or port, obj]
|
|
365
|
+
# -->
|
|
366
|
+
# Blocks the current Thread until one of the given ports has received a message.
|
|
367
|
+
# Returns an array of two elements where the first element is the Port and the
|
|
368
|
+
# second is the received object. This method can also accept Ractor objects
|
|
369
|
+
# themselves, and in that case will wait until one has terminated and return a
|
|
370
|
+
# two-element array where the first element is the ractor and the second is its
|
|
371
|
+
# termination value.
|
|
372
|
+
#
|
|
373
|
+
# p1, p2 = Ractor::Port.new, Ractor::Port.new
|
|
374
|
+
# ps = [p1, p2]
|
|
375
|
+
# rs = 2.times.map do |i|
|
|
376
|
+
# Ractor.new(ps.shift, i) do |p, i|
|
|
377
|
+
# sleep rand(0.99)
|
|
378
|
+
# p.send("r#{i}")
|
|
379
|
+
# sleep rand(0.99)
|
|
380
|
+
# "r#{i} done"
|
|
381
|
+
# end
|
|
382
|
+
# end
|
|
383
|
+
#
|
|
384
|
+
# waiting_on = [p1, p2, *rs]
|
|
385
|
+
# until waiting_on.empty?
|
|
386
|
+
# received_on, obj = Ractor.select(*waiting_on)
|
|
387
|
+
# waiting_on.delete(received_on)
|
|
388
|
+
# puts obj
|
|
389
|
+
# end
|
|
390
|
+
#
|
|
391
|
+
# # r0
|
|
392
|
+
# # r1
|
|
393
|
+
# # r1 done
|
|
394
|
+
# # r0 done
|
|
395
|
+
#
|
|
396
|
+
# The following example is almost equivalent to
|
|
397
|
+
# <code>ractors.map(&:value)</code> except the thread is unblocked when any of
|
|
398
|
+
# the ractors has terminated as opposed to waiting for their termination in the
|
|
399
|
+
# array element order.
|
|
400
|
+
#
|
|
401
|
+
# values = []
|
|
402
|
+
# until ractors.empty?
|
|
403
|
+
# r, val = Ractor.select(*ractors)
|
|
404
|
+
# ractors.delete(r)
|
|
405
|
+
# values << val
|
|
406
|
+
# end
|
|
407
|
+
#
|
|
408
|
+
def self.select: (?) -> Array[untyped]
|
|
409
|
+
|
|
410
|
+
# <!--
|
|
411
|
+
# rdoc-file=ractor.rb
|
|
412
|
+
# - Ractor.shareable?(obj) -> true | false
|
|
413
|
+
# -->
|
|
414
|
+
# Checks if the object is shareable by ractors.
|
|
415
|
+
#
|
|
416
|
+
# Ractor.shareable?(1) #=> true -- numbers are shareable
|
|
417
|
+
# Ractor.shareable?('foo') #=> false, unless the string is frozen due to # frozen_string_literal: true
|
|
418
|
+
# Ractor.shareable?('foo'.freeze) #=> true
|
|
419
|
+
#
|
|
420
|
+
# See also the "Shareable and unshareable objects" section in the Ractor class
|
|
421
|
+
# docs.
|
|
422
|
+
#
|
|
423
|
+
def self.shareable?: (untyped obj) -> bool
|
|
424
|
+
|
|
425
|
+
# <!--
|
|
426
|
+
# rdoc-file=ractor.rb
|
|
427
|
+
# - Ractor.shareable_proc(self: nil){} -> shareable proc
|
|
428
|
+
# -->
|
|
429
|
+
# Returns a shareable copy of the given block's Proc. The value of `self` in the
|
|
430
|
+
# Proc will be replaced with the value passed via the <code>self:</code>
|
|
431
|
+
# keyword, or `nil` if not given.
|
|
432
|
+
#
|
|
433
|
+
# In a shareable Proc, access to any outer variables if prohibited.
|
|
434
|
+
#
|
|
435
|
+
# a = 42
|
|
436
|
+
# Ractor.shareable_proc{ p a }
|
|
437
|
+
# #=> can not isolate a Proc because it accesses outer variables (a). (ArgumentError)
|
|
438
|
+
#
|
|
439
|
+
# The value of `self` in the Proc must be a shareable object.
|
|
440
|
+
#
|
|
441
|
+
# Ractor.shareable_proc(self: self){}
|
|
442
|
+
# #=> self should be shareable: main (Ractor::IsolationError)
|
|
443
|
+
#
|
|
444
|
+
def self.shareable_proc: [T] () { (?) [self: nil] -> T } -> ^(?) [self: nil] -> T
|
|
445
|
+
| [T, S] (self: S) { (?) [self: S] -> T } -> ^(?) [self: S] -> T
|
|
446
|
+
|
|
447
|
+
# <!--
|
|
448
|
+
# rdoc-file=ractor.rb
|
|
449
|
+
# - Ractor.shareable_lambda(self: nil){} -> shareable lambda
|
|
450
|
+
# -->
|
|
451
|
+
# Same as Ractor.shareable_proc, but returns a lambda Proc.
|
|
452
|
+
#
|
|
453
|
+
def self.shareable_lambda: [T] () { (?) [self: nil] -> T } -> ^(?) [self: nil] -> T
|
|
454
|
+
| [T, S] (self: S) { (?) [self: S] -> T } -> ^(?) [self: S] -> T
|
|
455
|
+
|
|
456
|
+
# <!--
|
|
457
|
+
# rdoc-file=ractor.rb
|
|
458
|
+
# - Ractor.store_if_absent(key){ init_block }
|
|
459
|
+
# -->
|
|
460
|
+
# If the corresponding ractor-local value is not set, yields a value with
|
|
461
|
+
# init_block and stores the value in a thread-safe manner. This method returns
|
|
462
|
+
# the stored value.
|
|
463
|
+
#
|
|
464
|
+
# (1..10).map{
|
|
465
|
+
# Thread.new(it){|i|
|
|
466
|
+
# Ractor.store_if_absent(:s){ f(); i }
|
|
467
|
+
# #=> return stored value of key :s
|
|
468
|
+
# }
|
|
469
|
+
# }.map(&:value).uniq.size #=> 1 and f() is called only once
|
|
470
|
+
#
|
|
471
|
+
def self.store_if_absent: [A] (Symbol) { (nil) -> A } -> A
|
|
472
|
+
|
|
473
|
+
# <!--
|
|
474
|
+
# rdoc-file=ractor.rb
|
|
475
|
+
# - <<(...)
|
|
476
|
+
# -->
|
|
477
|
+
#
|
|
478
|
+
alias << send
|
|
479
|
+
|
|
480
|
+
# <!--
|
|
481
|
+
# rdoc-file=ractor.rb
|
|
482
|
+
# - [](sym)
|
|
483
|
+
# -->
|
|
484
|
+
# Gets a value from ractor-local storage for the current Ractor. Obsolete, use
|
|
485
|
+
# Ractor.[] instead.
|
|
486
|
+
#
|
|
487
|
+
%a{deprecated: Use Ractor.[] instead}
|
|
488
|
+
def []: (interned sym) -> untyped
|
|
489
|
+
|
|
490
|
+
# <!--
|
|
491
|
+
# rdoc-file=ractor.rb
|
|
492
|
+
# - []=(sym, val)
|
|
493
|
+
# -->
|
|
494
|
+
# Sets a value in ractor-local storage for the current Ractor. Obsolete, use
|
|
495
|
+
# Ractor.[]= instead.
|
|
496
|
+
#
|
|
497
|
+
%a{deprecated: Use Ractor.[]= instead}
|
|
498
|
+
def []=: [T] (interned sym, T val) -> T
|
|
499
|
+
|
|
500
|
+
# <!--
|
|
501
|
+
# rdoc-file=ractor.rb
|
|
502
|
+
# - ractor.default_port -> port object
|
|
503
|
+
# -->
|
|
504
|
+
# Returns the default port of the Ractor.
|
|
505
|
+
#
|
|
506
|
+
def default_port: () -> Port[untyped]
|
|
507
|
+
|
|
508
|
+
# <!--
|
|
509
|
+
# rdoc-file=ractor.rb
|
|
510
|
+
# - inspect()
|
|
511
|
+
# -->
|
|
512
|
+
#
|
|
513
|
+
def inspect: () -> String
|
|
514
|
+
|
|
515
|
+
# <!--
|
|
516
|
+
# rdoc-file=ractor.rb
|
|
517
|
+
# - ractor.join -> self
|
|
518
|
+
# -->
|
|
519
|
+
# Waits for the termination of the Ractor. If the Ractor was aborted (terminated
|
|
520
|
+
# by an unhandled exception), the exception is raised in the current ractor.
|
|
521
|
+
#
|
|
522
|
+
# Ractor.new{}.join #=> ractor
|
|
523
|
+
#
|
|
524
|
+
# Ractor.new{ raise "foo" }.join
|
|
525
|
+
# #=> raises the exception "foo (RuntimeError)"
|
|
526
|
+
#
|
|
527
|
+
def join: () -> self
|
|
528
|
+
|
|
529
|
+
# <!--
|
|
530
|
+
# rdoc-file=ractor.rb
|
|
531
|
+
# - name()
|
|
532
|
+
# -->
|
|
533
|
+
# Returns the name set in Ractor.new, or `nil`.
|
|
534
|
+
#
|
|
535
|
+
def name: () -> String?
|
|
536
|
+
|
|
537
|
+
# <!--
|
|
538
|
+
# rdoc-file=ractor.rb
|
|
539
|
+
# - ractor.monitor(port) -> self
|
|
540
|
+
# -->
|
|
541
|
+
# Registers the port as a monitoring port for this ractor. When the ractor
|
|
542
|
+
# terminates, the port receives a Symbol object.
|
|
543
|
+
#
|
|
544
|
+
# * <code>:exited</code> is sent if the ractor terminates without an unhandled
|
|
545
|
+
# exception.
|
|
546
|
+
# * <code>:aborted</code> is sent if the ractor terminates by an unhandled
|
|
547
|
+
# exception.
|
|
548
|
+
#
|
|
549
|
+
# r = Ractor.new{ some_task() }
|
|
550
|
+
# r.monitor(port = Ractor::Port.new)
|
|
551
|
+
# port.receive #=> :exited and r is terminated
|
|
552
|
+
#
|
|
553
|
+
# r = Ractor.new{ raise "foo" }
|
|
554
|
+
# r.monitor(port = Ractor::Port.new)
|
|
555
|
+
# port.receive #=> :aborted and r is terminated by the RuntimeError "foo"
|
|
556
|
+
#
|
|
557
|
+
def monitor: [T < Symbol] (Port[T]) -> untyped
|
|
558
|
+
|
|
559
|
+
# <!--
|
|
560
|
+
# rdoc-file=ractor.rb
|
|
561
|
+
# - ractor.send(msg, move: false) -> self
|
|
562
|
+
# -->
|
|
563
|
+
# This is equivalent to Port#send to the ractor's #default_port.
|
|
564
|
+
#
|
|
565
|
+
def send: (untyped obj, ?move: boolish) -> Ractor
|
|
566
|
+
|
|
567
|
+
# <!--
|
|
568
|
+
# rdoc-file=ractor.rb
|
|
569
|
+
# - to_s()
|
|
570
|
+
# -->
|
|
571
|
+
#
|
|
572
|
+
alias to_s inspect
|
|
573
|
+
|
|
574
|
+
# <!--
|
|
575
|
+
# rdoc-file=ractor.rb
|
|
576
|
+
# - ractor.unmonitor(port) -> self
|
|
577
|
+
# -->
|
|
578
|
+
# Unregisters the port from the monitoring ports for this ractor.
|
|
579
|
+
#
|
|
580
|
+
def unmonitor: (Port[untyped]) -> self
|
|
581
|
+
|
|
582
|
+
# <!--
|
|
583
|
+
# rdoc-file=ractor.rb
|
|
584
|
+
# - ractor.value -> obj
|
|
585
|
+
# -->
|
|
586
|
+
# Waits for `ractor` to complete and returns its value or raises the exception
|
|
587
|
+
# which terminated the Ractor. The termination value will be moved to the
|
|
588
|
+
# calling Ractor. Therefore, at most 1 Ractor can receive another ractor's
|
|
589
|
+
# termination value.
|
|
590
|
+
#
|
|
591
|
+
# r = Ractor.new{ [1, 2] }
|
|
592
|
+
# r.value #=> [1, 2] (unshareable object)
|
|
593
|
+
#
|
|
594
|
+
# Ractor.new(r){|r| r.value} #=> Ractor::Error
|
|
595
|
+
#
|
|
596
|
+
def value: () -> untyped
|
|
597
|
+
|
|
598
|
+
private
|
|
599
|
+
|
|
600
|
+
# <!--
|
|
601
|
+
# rdoc-file=ractor.rb
|
|
602
|
+
# - receive()
|
|
603
|
+
# -->
|
|
604
|
+
# same as Ractor.receive
|
|
605
|
+
#
|
|
606
|
+
def receive: () -> untyped
|
|
607
|
+
|
|
608
|
+
# <!--
|
|
609
|
+
# rdoc-file=ractor.rb
|
|
610
|
+
# - receive_if(&b)
|
|
611
|
+
# -->
|
|
612
|
+
# same as Ractor.receive_if
|
|
613
|
+
#
|
|
614
|
+
def receive_if: () { (untyped) -> boolish } -> untyped
|
|
615
|
+
|
|
616
|
+
# <!--
|
|
617
|
+
# rdoc-file=ractor.rb
|
|
618
|
+
# - recv()
|
|
619
|
+
# -->
|
|
620
|
+
#
|
|
621
|
+
alias recv receive
|
|
622
|
+
|
|
623
|
+
# <!-- rdoc-file=ractor.c -->
|
|
624
|
+
# Raised when an attempt is made to send a message to a closed port, or to
|
|
625
|
+
# retrieve a message from a closed and empty port. Ports may be closed
|
|
626
|
+
# explicitly with Ractor::Port#close and are closed implicitly when a Ractor
|
|
627
|
+
# terminates.
|
|
628
|
+
#
|
|
629
|
+
# port = Ractor::Port.new
|
|
630
|
+
# port.close
|
|
631
|
+
# port << "test" # Ractor::ClosedError
|
|
632
|
+
# port.receive # Ractor::ClosedError
|
|
633
|
+
#
|
|
634
|
+
# ClosedError is a descendant of StopIteration, so the closing of a port will
|
|
635
|
+
# break out of loops without propagating the error.
|
|
636
|
+
#
|
|
637
|
+
class ClosedError < StopIteration
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
# <!-- rdoc-file=ractor.c -->
|
|
641
|
+
# The parent class of Ractor-related error classes.
|
|
642
|
+
#
|
|
643
|
+
class Error < RuntimeError
|
|
644
|
+
end
|
|
645
|
+
|
|
646
|
+
# <!-- rdoc-file=ractor.c -->
|
|
647
|
+
# Raised on attempt to make a Ractor-unshareable object Ractor-shareable.
|
|
648
|
+
#
|
|
649
|
+
class IsolationError < Ractor::Error
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
# <!-- rdoc-file=ractor.c -->
|
|
653
|
+
# Raised on an attempt to access an object which was moved in Ractor#send or
|
|
654
|
+
# Ractor::Port#send.
|
|
655
|
+
#
|
|
656
|
+
# r = Ractor.new { sleep }
|
|
657
|
+
#
|
|
658
|
+
# ary = [1, 2, 3]
|
|
659
|
+
# r.send(ary, move: true)
|
|
660
|
+
# ary.inspect
|
|
661
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
|
662
|
+
#
|
|
663
|
+
class MovedError < Ractor::Error
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
# <!-- rdoc-file=ractor.c -->
|
|
667
|
+
# A special object which replaces any value that was moved to another ractor in
|
|
668
|
+
# Ractor#send or Ractor::Port#send. Any attempt to access the object results in
|
|
669
|
+
# Ractor::MovedError.
|
|
670
|
+
#
|
|
671
|
+
# r = Ractor.new { receive }
|
|
672
|
+
#
|
|
673
|
+
# ary = [1, 2, 3]
|
|
674
|
+
# r.send(ary, move: true)
|
|
675
|
+
# p Ractor::MovedObject === ary
|
|
676
|
+
# # => true
|
|
677
|
+
# ary.inspect
|
|
678
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
|
679
|
+
#
|
|
680
|
+
class MovedObject < BasicObject
|
|
681
|
+
# <!--
|
|
682
|
+
# rdoc-file=ractor.c
|
|
683
|
+
# - !(*args)
|
|
684
|
+
# -->
|
|
685
|
+
#
|
|
686
|
+
def !: (*untyped) -> untyped
|
|
687
|
+
|
|
688
|
+
# <!--
|
|
689
|
+
# rdoc-file=ractor.c
|
|
690
|
+
# - !=(*args)
|
|
691
|
+
# -->
|
|
692
|
+
#
|
|
693
|
+
def !=: (*untyped) -> untyped
|
|
694
|
+
|
|
695
|
+
# <!--
|
|
696
|
+
# rdoc-file=ractor.c
|
|
697
|
+
# - ==(*args)
|
|
698
|
+
# -->
|
|
699
|
+
#
|
|
700
|
+
def ==: (*untyped) -> untyped
|
|
701
|
+
|
|
702
|
+
# <!--
|
|
703
|
+
# rdoc-file=ractor.c
|
|
704
|
+
# - __id__(*args)
|
|
705
|
+
# -->
|
|
706
|
+
#
|
|
707
|
+
def __id__: (*untyped) -> untyped
|
|
708
|
+
|
|
709
|
+
# <!--
|
|
710
|
+
# rdoc-file=ractor.c
|
|
711
|
+
# - __send__(*args)
|
|
712
|
+
# -->
|
|
713
|
+
#
|
|
714
|
+
def __send__: (*untyped) -> untyped
|
|
715
|
+
|
|
716
|
+
# <!--
|
|
717
|
+
# rdoc-file=ractor.c
|
|
718
|
+
# - equal?(*args)
|
|
719
|
+
# -->
|
|
720
|
+
#
|
|
721
|
+
def equal?: (*untyped) -> untyped
|
|
722
|
+
|
|
723
|
+
# <!--
|
|
724
|
+
# rdoc-file=ractor.c
|
|
725
|
+
# - instance_eval(*args)
|
|
726
|
+
# -->
|
|
727
|
+
#
|
|
728
|
+
def instance_eval: (*untyped) -> untyped
|
|
729
|
+
|
|
730
|
+
# <!--
|
|
731
|
+
# rdoc-file=ractor.c
|
|
732
|
+
# - instance_exec(*args)
|
|
733
|
+
# -->
|
|
734
|
+
#
|
|
735
|
+
def instance_exec: (*untyped) -> untyped
|
|
736
|
+
|
|
737
|
+
# <!--
|
|
738
|
+
# rdoc-file=ractor.c
|
|
739
|
+
# - method_missing(*args)
|
|
740
|
+
# -->
|
|
741
|
+
#
|
|
742
|
+
def method_missing: (*untyped) -> untyped
|
|
743
|
+
end
|
|
744
|
+
|
|
745
|
+
# <!-- rdoc-file=ractor.rb -->
|
|
746
|
+
# Port objects transmit messages between Ractors.
|
|
747
|
+
#
|
|
748
|
+
class Port[T = untyped]
|
|
749
|
+
# <!--
|
|
750
|
+
# rdoc-file=ractor.rb
|
|
751
|
+
# - <<(obj, move: false)
|
|
752
|
+
# -->
|
|
753
|
+
#
|
|
754
|
+
alias << send
|
|
755
|
+
|
|
756
|
+
# <!--
|
|
757
|
+
# rdoc-file=ractor.rb
|
|
758
|
+
# - port.close
|
|
759
|
+
# -->
|
|
760
|
+
# Closes the port. Sending to a closed port is prohibited. Receiving is also
|
|
761
|
+
# prohibited if there are no messages in its message queue.
|
|
762
|
+
#
|
|
763
|
+
# Only the Ractor which created the port is allowed to close it.
|
|
764
|
+
#
|
|
765
|
+
# port = Ractor::Port.new
|
|
766
|
+
# Ractor.new port do |port|
|
|
767
|
+
# port.close #=> closing port by other ractors is not allowed (Ractor::Error)
|
|
768
|
+
# end.join
|
|
769
|
+
#
|
|
770
|
+
def close: () -> void
|
|
771
|
+
|
|
772
|
+
# <!--
|
|
773
|
+
# rdoc-file=ractor.rb
|
|
774
|
+
# - port.closed? -> true/false
|
|
775
|
+
# -->
|
|
776
|
+
# Returns whether or not the port is closed.
|
|
777
|
+
#
|
|
778
|
+
def closed?: () -> bool
|
|
779
|
+
|
|
780
|
+
# <!--
|
|
781
|
+
# rdoc-file=ractor.rb
|
|
782
|
+
# - port.inspect -> string
|
|
783
|
+
# -->
|
|
784
|
+
#
|
|
785
|
+
def inspect: () -> String
|
|
786
|
+
|
|
787
|
+
# <!--
|
|
788
|
+
# rdoc-file=ractor.rb
|
|
789
|
+
# - port.receive -> msg
|
|
790
|
+
# -->
|
|
791
|
+
# Receives a message from the port (which was sent there by Port#send). Only the
|
|
792
|
+
# ractor that created the port can receive messages this way.
|
|
793
|
+
#
|
|
794
|
+
# port = Ractor::Port.new
|
|
795
|
+
# r = Ractor.new port do |port|
|
|
796
|
+
# port.send('message1')
|
|
797
|
+
# end
|
|
798
|
+
#
|
|
799
|
+
# v1 = port.receive
|
|
800
|
+
# puts "Received: #{v1}"
|
|
801
|
+
# r.join
|
|
802
|
+
# # This will print: "Received: message1"
|
|
803
|
+
#
|
|
804
|
+
# The method blocks the current Thread if the message queue is empty.
|
|
805
|
+
#
|
|
806
|
+
# port = Ractor::Port.new
|
|
807
|
+
# r = Ractor.new port do |port|
|
|
808
|
+
# wait
|
|
809
|
+
# puts "Still not received"
|
|
810
|
+
# port.send('message1')
|
|
811
|
+
# wait
|
|
812
|
+
# puts "Still received only one"
|
|
813
|
+
# port.send('message2')
|
|
814
|
+
# end
|
|
815
|
+
# puts "Before first receive"
|
|
816
|
+
# v1 = port.receive
|
|
817
|
+
# puts "Received: #{v1}"
|
|
818
|
+
# v2 = port.receive
|
|
819
|
+
# puts "Received: #{v2}"
|
|
820
|
+
# r.join
|
|
821
|
+
#
|
|
822
|
+
# Output:
|
|
823
|
+
#
|
|
824
|
+
# Before first receive
|
|
825
|
+
# Still not received
|
|
826
|
+
# Received: message1
|
|
827
|
+
# Still received only one
|
|
828
|
+
# Received: message2
|
|
829
|
+
#
|
|
830
|
+
# If the port is closed and there are no more messages in the message queue, the
|
|
831
|
+
# method raises Ractor::ClosedError.
|
|
832
|
+
#
|
|
833
|
+
# port = Ractor::Port.new
|
|
834
|
+
# port.close
|
|
835
|
+
# port.receive #=> raise Ractor::ClosedError
|
|
836
|
+
#
|
|
837
|
+
def receive: () -> T
|
|
838
|
+
|
|
839
|
+
# <!--
|
|
840
|
+
# rdoc-file=ractor.rb
|
|
841
|
+
# - port.send(msg, move: false) -> self
|
|
842
|
+
# -->
|
|
843
|
+
# Sends a message to the port to be accepted by port.receive.
|
|
844
|
+
#
|
|
845
|
+
# port = Ractor::Port.new
|
|
846
|
+
# r = Ractor.new(port) do |port|
|
|
847
|
+
# port.send 'message'
|
|
848
|
+
# end
|
|
849
|
+
# value = port.receive
|
|
850
|
+
# puts "Received #{value}"
|
|
851
|
+
# # Prints: "Received: message"
|
|
852
|
+
#
|
|
853
|
+
# The method is non-blocking (it will return immediately even if the ractor that
|
|
854
|
+
# created the port is not ready to receive anything):
|
|
855
|
+
#
|
|
856
|
+
# port = Ractor::Port.new
|
|
857
|
+
# r = Ractor.new(port) do |port|
|
|
858
|
+
# port.send 'test'
|
|
859
|
+
# puts "Sent successfully"
|
|
860
|
+
# # Prints: "Sent successfully" immediately
|
|
861
|
+
# end
|
|
862
|
+
#
|
|
863
|
+
# An attempt to send to a closed port will raise Ractor::ClosedError.
|
|
864
|
+
#
|
|
865
|
+
# r = Ractor.new {Ractor::Port.new}
|
|
866
|
+
# r.join
|
|
867
|
+
# p r
|
|
868
|
+
# # "#<Ractor:#6 (irb):23 terminated>"
|
|
869
|
+
# port = r.value
|
|
870
|
+
# port.send('test') # raise Ractor::ClosedError
|
|
871
|
+
#
|
|
872
|
+
# If the `obj` is unshareable, by default it will be copied into the receiving
|
|
873
|
+
# ractor by deep cloning.
|
|
874
|
+
#
|
|
875
|
+
# If the object is shareable, a reference to the object will be sent to the
|
|
876
|
+
# receiving ractor.
|
|
877
|
+
#
|
|
878
|
+
def send: (T obj, ?move: boolish) -> self
|
|
879
|
+
|
|
880
|
+
private
|
|
881
|
+
|
|
882
|
+
# <!--
|
|
883
|
+
# rdoc-file=ractor_sync.c
|
|
884
|
+
# - Ractor::Port.new -> new_port
|
|
885
|
+
# -->
|
|
886
|
+
# Returns a new Ractor::Port object.
|
|
887
|
+
#
|
|
888
|
+
def initialize: () -> void
|
|
889
|
+
|
|
890
|
+
def initialize_copy: (untyped) -> untyped
|
|
891
|
+
end
|
|
892
|
+
|
|
893
|
+
# <!-- rdoc-file=ractor.c -->
|
|
894
|
+
# Raised on Ractor#join or Ractor#value if there was an uncaught exception in
|
|
895
|
+
# the Ractor. Its `cause` will contain the original exception, and `ractor` is
|
|
896
|
+
# the original ractor it was raised in.
|
|
897
|
+
#
|
|
898
|
+
# r = Ractor.new { raise "Something weird happened" }
|
|
899
|
+
#
|
|
900
|
+
# begin
|
|
901
|
+
# r.value
|
|
902
|
+
# rescue => e
|
|
903
|
+
# p e # => #<Ractor::RemoteError: thrown by remote Ractor.>
|
|
904
|
+
# p e.ractor == r # => true
|
|
905
|
+
# p e.cause # => #<RuntimeError: Something weird happened>
|
|
906
|
+
# end
|
|
907
|
+
#
|
|
908
|
+
class RemoteError < Ractor::Error
|
|
909
|
+
# <!-- rdoc-file=ractor.rb -->
|
|
910
|
+
# The Ractor in which the uncaught exception was raised.
|
|
911
|
+
#
|
|
912
|
+
def ractor: () -> Ractor
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
# <!-- rdoc-file=ractor.c -->
|
|
916
|
+
# Raised when Ractor-unsafe C-methods is invoked by a non-main Ractor.
|
|
917
|
+
#
|
|
918
|
+
class UnsafeError < Ractor::Error
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
%a{annotate:rdoc:skip}
|
|
922
|
+
class Selector
|
|
923
|
+
end
|
|
924
|
+
end
|