rbs 2.8.4 → 3.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +12 -4
- data/.github/workflows/comments.yml +11 -11
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/ruby.yml +40 -49
- data/.github/workflows/typecheck.yml +36 -0
- data/.github/workflows/windows.yml +28 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +42 -2
- data/CHANGELOG.md +845 -1
- data/README.md +64 -4
- data/Rakefile +198 -18
- data/Steepfile +11 -11
- data/config.yml +311 -0
- data/core/array.rbs +2189 -1914
- data/core/basic_object.rbs +59 -84
- data/core/binding.rbs +7 -69
- data/core/builtin.rbs +210 -11
- data/core/class.rbs +37 -0
- data/core/comparable.rbs +23 -25
- data/core/complex.rbs +449 -227
- data/core/constants.rbs +29 -21
- data/core/data.rbs +415 -0
- data/core/dir.rbs +698 -415
- data/core/encoding.rbs +468 -843
- data/core/enumerable.rbs +495 -455
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +106 -9
- data/core/env.rbs +1 -1
- data/core/errno.rbs +506 -605
- data/core/errors.rbs +15 -17
- data/core/exception.rbs +361 -145
- data/core/false_class.rbs +39 -26
- data/core/fiber.rbs +121 -14
- data/core/file.rbs +1262 -320
- data/core/file_test.rbs +62 -45
- data/core/float.rbs +187 -208
- data/core/gc.rbs +446 -196
- data/core/global_variables.rbs +29 -29
- data/core/hash.rbs +242 -349
- data/core/integer.rbs +246 -308
- data/core/io/buffer.rbs +373 -122
- data/core/io/wait.rbs +29 -17
- data/core/io.rbs +1881 -1518
- data/core/kernel.rbs +2116 -1538
- data/core/marshal.rbs +24 -14
- data/core/match_data.rbs +413 -166
- data/core/math.rbs +531 -291
- data/core/method.rbs +101 -32
- data/core/module.rbs +228 -64
- data/core/nil_class.rbs +106 -47
- data/core/numeric.rbs +206 -292
- data/core/object.rbs +73 -1168
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +5 -3
- data/core/proc.rbs +280 -39
- data/core/process.rbs +1318 -658
- data/core/ractor.rbs +200 -134
- data/core/random.rbs +21 -4
- data/core/range.rbs +309 -153
- data/core/rational.rbs +4 -12
- data/core/rb_config.rbs +64 -43
- data/core/rbs/unnamed/argf.rbs +411 -147
- data/core/rbs/unnamed/env_class.rbs +137 -253
- data/core/rbs/unnamed/random.rbs +49 -26
- data/core/refinement.rbs +16 -1
- data/core/regexp.rbs +1568 -862
- data/core/ruby_vm.rbs +719 -7
- data/core/rubygems/config_file.rbs +3 -0
- data/core/rubygems/errors.rbs +69 -6
- data/core/rubygems/rubygems.rbs +71 -17
- data/core/rubygems/version.rbs +11 -7
- data/{stdlib/set/0 → core}/set.rbs +80 -91
- data/core/signal.rbs +14 -8
- data/core/string.rbs +1732 -1607
- data/core/struct.rbs +467 -95
- data/core/symbol.rbs +215 -245
- data/core/thread.rbs +133 -89
- data/core/thread_group.rbs +9 -9
- data/core/time.rbs +1141 -841
- data/core/trace_point.rbs +181 -121
- data/core/true_class.rbs +58 -32
- data/core/unbound_method.rbs +103 -30
- data/core/warning.rbs +50 -5
- data/docs/CONTRIBUTING.md +1 -1
- data/docs/architecture.md +110 -0
- data/docs/collection.md +59 -5
- data/docs/data_and_struct.md +86 -0
- data/docs/gem.md +57 -0
- data/docs/rbs_by_example.md +16 -35
- data/docs/repo.md +1 -1
- data/docs/sigs.md +7 -7
- data/docs/stdlib.md +63 -5
- data/docs/syntax.md +255 -61
- data/docs/tools.md +1 -0
- data/ext/rbs_extension/extconf.rb +10 -0
- data/ext/rbs_extension/lexer.c +1741 -1548
- data/ext/rbs_extension/lexer.h +11 -1
- data/ext/rbs_extension/lexer.re +12 -6
- data/ext/rbs_extension/lexstate.c +26 -3
- data/ext/rbs_extension/location.c +119 -111
- data/ext/rbs_extension/location.h +32 -7
- data/ext/rbs_extension/main.c +3 -0
- data/ext/rbs_extension/parser.c +883 -481
- data/ext/rbs_extension/parserstate.c +65 -25
- data/ext/rbs_extension/parserstate.h +13 -3
- data/ext/rbs_extension/rbs_extension.h +1 -10
- data/ext/rbs_extension/unescape.c +7 -47
- data/goodcheck.yml +2 -2
- data/{ext/rbs_extension → include/rbs}/constants.h +26 -15
- data/include/rbs/ruby_objs.h +72 -0
- data/include/rbs.h +7 -0
- data/lib/rbs/annotate/annotations.rb +3 -3
- data/lib/rbs/annotate/formatter.rb +13 -3
- data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
- data/lib/rbs/annotate/rdoc_source.rb +12 -3
- data/lib/rbs/ast/declarations.rb +85 -2
- data/lib/rbs/ast/directives.rb +39 -0
- data/lib/rbs/ast/members.rb +49 -15
- data/lib/rbs/ast/type_param.rb +104 -15
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +5 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +83 -0
- data/lib/rbs/cli/validate.rb +356 -0
- data/lib/rbs/cli.rb +253 -143
- data/lib/rbs/collection/cleaner.rb +8 -1
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +154 -65
- data/lib/rbs/collection/config.rb +19 -46
- data/lib/rbs/collection/installer.rb +12 -13
- data/lib/rbs/collection/sources/base.rb +2 -2
- data/lib/rbs/collection/sources/git.rb +146 -69
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +10 -12
- data/lib/rbs/collection/sources/stdlib.rb +14 -13
- data/lib/rbs/collection/sources.rb +15 -2
- data/lib/rbs/collection.rb +2 -1
- data/lib/rbs/definition.rb +13 -16
- data/lib/rbs/definition_builder/ancestor_builder.rb +100 -24
- data/lib/rbs/definition_builder/method_builder.rb +4 -4
- data/lib/rbs/definition_builder.rb +489 -584
- data/lib/rbs/diff.rb +125 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +406 -105
- data/lib/rbs/environment_loader.rb +48 -44
- data/lib/rbs/environment_walker.rb +1 -1
- data/lib/rbs/errors.rb +175 -56
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/location_aux.rb +8 -7
- data/lib/rbs/locator.rb +37 -15
- data/lib/rbs/method_type.rb +23 -0
- data/lib/rbs/namespace.rb +1 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +22 -13
- data/lib/rbs/prototype/helpers.rb +48 -22
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +125 -31
- data/lib/rbs/prototype/rbi.rb +49 -36
- 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 +273 -159
- data/lib/rbs/resolver/constant_resolver.rb +24 -8
- data/lib/rbs/resolver/type_name_resolver.rb +41 -7
- data/lib/rbs/sorter.rb +153 -123
- data/lib/rbs/substitution.rb +19 -0
- data/lib/rbs/subtractor.rb +201 -0
- data/lib/rbs/test/errors.rb +24 -11
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +45 -40
- data/lib/rbs/test/setup.rb +1 -1
- data/lib/rbs/test/tester.rb +1 -1
- data/lib/rbs/test/type_check.rb +120 -23
- data/lib/rbs/test.rb +6 -3
- data/lib/rbs/type_alias_dependency.rb +13 -3
- data/lib/rbs/type_alias_regularity.rb +21 -14
- data/lib/rbs/type_name.rb +18 -13
- data/lib/rbs/types.rb +352 -18
- data/lib/rbs/unit_test/convertibles.rb +176 -0
- data/lib/rbs/unit_test/spy.rb +136 -0
- data/lib/rbs/unit_test/type_assertions.rb +341 -0
- data/lib/rbs/unit_test/with_aliases.rb +143 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +55 -30
- data/lib/rbs/variance_calculator.rb +26 -23
- data/lib/rbs/vendorer.rb +3 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +69 -22
- data/lib/rbs.rb +7 -2
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +5 -5
- data/rbs.gemspec +12 -2
- data/schema/decls.json +1 -1
- data/schema/members.json +15 -10
- data/sig/ancestor_builder.rbs +4 -0
- data/sig/ancestor_graph.rbs +22 -2
- data/sig/annotate/formatter.rbs +2 -2
- data/sig/annotate/rdoc_annotater.rbs +1 -1
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +21 -0
- data/sig/cli/validate.rbs +43 -0
- data/sig/cli.rbs +4 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +66 -0
- data/sig/collection/config.rbs +5 -48
- data/sig/collection/installer.rbs +1 -1
- data/sig/collection/sources.rbs +105 -33
- data/sig/constant.rbs +1 -1
- data/sig/declarations.rbs +42 -3
- data/sig/definition.rbs +26 -10
- data/sig/definition_builder.rbs +103 -81
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +61 -0
- data/sig/environment.rbs +175 -29
- data/sig/environment_loader.rbs +20 -18
- data/sig/errors.rbs +123 -2
- data/sig/file_finder.rbs +28 -0
- data/sig/location.rbs +0 -3
- data/sig/locator.rbs +14 -2
- data/sig/manifest.yaml +0 -1
- data/sig/members.rbs +32 -9
- data/sig/method_types.rbs +10 -4
- data/sig/namespace.rbs +2 -3
- data/sig/parser.rbs +55 -16
- data/sig/prototype/helpers.rbs +4 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +10 -2
- data/sig/prototype/rbi.rbs +2 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +1 -1
- data/sig/rdoc/rbs.rbs +4 -0
- data/sig/repository.rbs +7 -5
- data/sig/resolver/constant_resolver.rbs +3 -4
- data/sig/resolver/context.rbs +1 -1
- data/sig/resolver/type_name_resolver.rbs +5 -1
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +23 -5
- data/sig/substitution.rbs +6 -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 +31 -0
- data/sig/type_alias_regularity.rbs +12 -6
- data/sig/type_param.rbs +45 -9
- data/sig/typename.rbs +8 -5
- data/sig/types.rbs +119 -12
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +28 -0
- data/sig/unit_test/type_assertions.rbs +194 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/validator.rbs +12 -5
- data/sig/variance_calculator.rbs +3 -1
- data/sig/vendorer.rbs +1 -1
- data/sig/visitor.rbs +47 -0
- data/sig/writer.rbs +6 -2
- data/src/constants.c +153 -0
- data/src/ruby_objs.c +793 -0
- data/stdlib/base64/0/base64.rbs +298 -45
- data/stdlib/benchmark/0/benchmark.rbs +12 -3
- data/stdlib/bigdecimal/0/big_decimal.rbs +62 -198
- data/stdlib/cgi/0/core.rbs +68 -15
- data/stdlib/cgi/0/manifest.yaml +1 -0
- data/stdlib/coverage/0/coverage.rbs +50 -11
- data/stdlib/csv/0/csv.rbs +90 -119
- data/stdlib/csv/0/manifest.yaml +1 -0
- data/stdlib/date/0/date.rbs +806 -735
- data/stdlib/date/0/date_time.rbs +70 -211
- data/stdlib/dbm/0/dbm.rbs +0 -2
- data/stdlib/delegate/0/delegator.rbs +184 -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 +3 -8
- data/stdlib/digest/0/digest.rbs +48 -35
- data/stdlib/erb/0/erb.rbs +15 -39
- data/stdlib/etc/0/etc.rbs +174 -54
- data/stdlib/fileutils/0/fileutils.rbs +1234 -385
- data/stdlib/forwardable/0/forwardable.rbs +4 -4
- data/stdlib/io-console/0/io-console.rbs +82 -17
- data/stdlib/ipaddr/0/ipaddr.rbs +11 -6
- data/stdlib/json/0/json.rbs +434 -151
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +0 -2
- data/stdlib/logger/0/log_device.rbs +1 -3
- data/stdlib/logger/0/logger.rbs +465 -328
- data/stdlib/minitest/0/kernel.rbs +2 -2
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
- data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
- data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
- 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/mock.rbs +9 -5
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
- data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
- data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
- data/stdlib/minitest/0/minitest/spec.rbs +1 -1
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +7 -7
- data/stdlib/minitest/0/minitest/test.rbs +7 -14
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit.rbs +1 -2
- data/stdlib/minitest/0/minitest.rbs +41 -892
- data/stdlib/monitor/0/monitor.rbs +91 -10
- data/stdlib/mutex_m/0/mutex_m.rbs +0 -2
- data/stdlib/net-http/0/manifest.yaml +1 -1
- data/stdlib/net-http/0/net-http.rbs +3858 -964
- 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 +35 -5
- data/stdlib/objspace/0/objspace.rbs +40 -18
- 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 +393 -0
- data/stdlib/open3/0/open3.rbs +147 -0
- data/stdlib/openssl/0/manifest.yaml +1 -0
- data/stdlib/openssl/0/openssl.rbs +681 -316
- data/stdlib/optparse/0/optparse.rbs +100 -65
- data/stdlib/pathname/0/pathname.rbs +24 -15
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +300 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +2 -6
- data/stdlib/pstore/0/pstore.rbs +370 -156
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/{yaml → psych}/0/dbm.rbs +3 -3
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +402 -0
- data/stdlib/{yaml → psych}/0/store.rbs +2 -2
- data/stdlib/pty/0/pty.rbs +63 -11
- data/stdlib/rdoc/0/code_object.rbs +51 -0
- data/stdlib/rdoc/0/comment.rbs +59 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +13 -380
- 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/resolv.rbs +16 -79
- data/stdlib/ripper/0/ripper.rbs +1648 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -2
- data/stdlib/shellwords/0/shellwords.rbs +11 -12
- data/stdlib/singleton/0/singleton.rbs +0 -3
- data/stdlib/socket/0/addrinfo.rbs +13 -18
- data/stdlib/socket/0/basic_socket.rbs +5 -10
- data/stdlib/socket/0/ip_socket.rbs +0 -2
- data/stdlib/socket/0/socket.rbs +77 -46
- data/stdlib/socket/0/tcp_server.rbs +0 -5
- data/stdlib/socket/0/tcp_socket.rbs +36 -3
- data/stdlib/socket/0/udp_socket.rbs +4 -5
- data/stdlib/socket/0/unix_server.rbs +0 -5
- data/stdlib/socket/0/unix_socket.rbs +2 -4
- data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +188 -107
- data/stdlib/strscan/0/string_scanner.rbs +1269 -425
- data/stdlib/tempfile/0/tempfile.rbs +224 -61
- data/stdlib/time/0/time.rbs +48 -35
- data/stdlib/timeout/0/timeout.rbs +17 -8
- data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
- data/stdlib/tsort/0/tsort.rbs +0 -4
- data/stdlib/uri/0/common.rbs +271 -144
- data/stdlib/uri/0/file.rbs +5 -0
- data/stdlib/uri/0/ftp.rbs +1 -1
- data/stdlib/uri/0/generic.rbs +26 -22
- data/stdlib/uri/0/http.rbs +4 -4
- data/stdlib/uri/0/ldap.rbs +1 -1
- data/stdlib/uri/0/mailto.rbs +84 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
- data/stdlib/yaml/0/manifest.yaml +1 -2
- data/stdlib/yaml/0/yaml.rbs +1 -199
- data/stdlib/zlib/0/buf_error.rbs +10 -0
- data/stdlib/zlib/0/data_error.rbs +10 -0
- data/stdlib/zlib/0/deflate.rbs +210 -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 +166 -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 +1 -3
- data/stdlib/zlib/0/zstream.rbs +200 -0
- data/templates/include/rbs/constants.h.erb +20 -0
- data/templates/include/rbs/ruby_objs.h.erb +10 -0
- data/templates/src/constants.c.erb +36 -0
- data/templates/src/ruby_objs.c.erb +27 -0
- data/templates/template.rb +122 -0
- metadata +136 -36
- data/Gemfile +0 -33
- data/Gemfile.lock +0 -118
- data/core/deprecated.rbs +0 -9
- data/ext/rbs_extension/constants.c +0 -135
- data/ext/rbs_extension/ruby_objs.c +0 -525
- data/ext/rbs_extension/ruby_objs.h +0 -43
- data/lib/rbs/constant_table.rb +0 -167
- data/lib/rbs/parser_compat/lexer_error.rb +0 -6
- data/lib/rbs/parser_compat/located_value.rb +0 -7
- data/lib/rbs/parser_compat/semantics_error.rb +0 -6
- data/lib/rbs/parser_compat/syntax_error.rb +0 -6
- data/lib/rbs/test/spy.rb +0 -6
- data/lib/rbs/type_name_resolver.rb +0 -67
- data/sig/constant_table.rbs +0 -30
- data/sig/shims/abstract_syntax_tree.rbs +0 -25
- data/sig/shims/pp.rbs +0 -3
- data/sig/shims/ripper.rbs +0 -8
- data/sig/shims.rbs +0 -69
- data/sig/type_name_resolver.rbs +0 -26
- data/stdlib/minitest/0/manifest.yaml +0 -2
- data/stdlib/prime/0/integer-extension.rbs +0 -41
- data/stdlib/prime/0/manifest.yaml +0 -2
- data/stdlib/prime/0/prime.rbs +0 -372
data/core/io/buffer.rbs
CHANGED
@@ -1,35 +1,37 @@
|
|
1
1
|
%a{annotate:rdoc:skip}
|
2
2
|
class IO
|
3
3
|
# <!-- rdoc-file=io_buffer.c -->
|
4
|
-
# IO::Buffer is a
|
5
|
-
#
|
4
|
+
# IO::Buffer is a efficient zero-copy buffer for input/output. There are typical
|
5
|
+
# use cases:
|
6
6
|
#
|
7
|
-
# * Create an empty buffer with ::new, fill it with
|
8
|
-
# #set_value, #set_string, get
|
7
|
+
# * Create an empty buffer with ::new, fill it with buffer using #copy or
|
8
|
+
# #set_value, #set_string, get buffer with #get_string or write it directly
|
9
|
+
# to some file with #write.
|
9
10
|
# * Create a buffer mapped to some string with ::for, then it could be used
|
10
11
|
# both for reading with #get_string or #get_value, and writing (writing will
|
11
|
-
# change the source string, too)
|
12
|
+
# change the source string, too).
|
12
13
|
# * Create a buffer mapped to some file with ::map, then it could be used for
|
13
14
|
# reading and writing the underlying file.
|
14
|
-
#
|
15
|
+
# * Create a string of a fixed size with ::string, then #read into it, or
|
16
|
+
# modify it using #set_value.
|
15
17
|
#
|
16
18
|
# Interaction with string and file memory is performed by efficient low-level C
|
17
19
|
# mechanisms like `memcpy`.
|
18
20
|
#
|
19
21
|
# The class is meant to be an utility for implementing more high-level
|
20
|
-
# mechanisms like Fiber::
|
21
|
-
#
|
22
|
+
# mechanisms like Fiber::Scheduler#io_read and Fiber::Scheduler#io_write and
|
23
|
+
# parsing binary protocols.
|
22
24
|
#
|
23
|
-
#
|
25
|
+
# ## Examples of Usage
|
24
26
|
#
|
25
27
|
# Empty buffer:
|
26
28
|
#
|
27
29
|
# buffer = IO::Buffer.new(8) # create empty 8-byte buffer
|
28
|
-
# #
|
30
|
+
# # =>
|
29
31
|
# # #<IO::Buffer 0x0000555f5d1a5c50+8 INTERNAL>
|
30
32
|
# # ...
|
31
33
|
# buffer
|
32
|
-
# #
|
34
|
+
# # =>
|
33
35
|
# # <IO::Buffer 0x0000555f5d156ab0+8 INTERNAL>
|
34
36
|
# # 0x00000000 00 00 00 00 00 00 00 00
|
35
37
|
# buffer.set_string('test', 2) # put there bytes of the "test" string, starting from offset 2
|
@@ -40,32 +42,30 @@ class IO
|
|
40
42
|
# Buffer from string:
|
41
43
|
#
|
42
44
|
# string = 'data'
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
# # =>
|
49
|
-
# # #<IO::Buffer 0x00007f3f02be9b18+4 SLICE>
|
50
|
-
# # 0x00000000 64 61 74 61 data
|
45
|
+
# IO::Buffer.for(string) do |buffer|
|
46
|
+
# buffer
|
47
|
+
# # =>
|
48
|
+
# # #<IO::Buffer 0x00007f3f02be9b18+4 SLICE>
|
49
|
+
# # 0x00000000 64 61 74 61 data
|
51
50
|
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
51
|
+
# buffer.get_string(2) # read content starting from offset 2
|
52
|
+
# # => "ta"
|
53
|
+
# buffer.set_string('---', 1) # write content, starting from offset 1
|
54
|
+
# # => 3
|
55
|
+
# buffer
|
56
|
+
# # =>
|
57
|
+
# # #<IO::Buffer 0x00007f3f02be9b18+4 SLICE>
|
58
|
+
# # 0x00000000 64 2d 2d 2d d---
|
59
|
+
# string # original string changed, too
|
60
|
+
# # => "d---"
|
61
|
+
# end
|
62
62
|
#
|
63
63
|
# Buffer from file:
|
64
64
|
#
|
65
65
|
# File.write('test.txt', 'test data')
|
66
66
|
# # => 9
|
67
67
|
# buffer = IO::Buffer.map(File.open('test.txt'))
|
68
|
-
# #
|
68
|
+
# # =>
|
69
69
|
# # #<IO::Buffer 0x00007f3f0768c000+9 MAPPED IMMUTABLE>
|
70
70
|
# # ...
|
71
71
|
# buffer.get_string(5, 2) # read 2 bytes, starting from offset 5
|
@@ -81,7 +81,9 @@ class IO
|
|
81
81
|
# File.read('test.txt')
|
82
82
|
# # => "t--- data"
|
83
83
|
#
|
84
|
-
# **The class is experimental and the interface is subject to change
|
84
|
+
# **The class is experimental and the interface is subject to change, this is
|
85
|
+
# especially true of file mappings which may be removed entirely in the
|
86
|
+
# future.**
|
85
87
|
#
|
86
88
|
class Buffer
|
87
89
|
include Comparable
|
@@ -91,16 +93,18 @@ class IO
|
|
91
93
|
# - IO::Buffer.for(string) -> readonly io_buffer
|
92
94
|
# - IO::Buffer.for(string) {|io_buffer| ... read/write io_buffer ...}
|
93
95
|
# -->
|
94
|
-
# Creates a IO::Buffer from the given string's memory. Without a block
|
95
|
-
# internal copy of the string is created efficiently and used as the
|
96
|
-
# source. When a block is provided, the buffer is associated directly
|
97
|
-
# string's internal
|
96
|
+
# Creates a zero-copy IO::Buffer from the given string's memory. Without a block
|
97
|
+
# a frozen internal copy of the string is created efficiently and used as the
|
98
|
+
# buffer source. When a block is provided, the buffer is associated directly
|
99
|
+
# with the string's internal buffer and updating the buffer will update the
|
100
|
+
# string.
|
98
101
|
#
|
99
102
|
# Until #free is invoked on the buffer, either explicitly or via the garbage
|
100
103
|
# collector, the source string will be locked and cannot be modified.
|
101
104
|
#
|
102
105
|
# If the string is frozen, it will create a read-only buffer which cannot be
|
103
|
-
# modified.
|
106
|
+
# modified. If the string is shared, it may trigger a copy-on-write when using
|
107
|
+
# the block form.
|
104
108
|
#
|
105
109
|
# string = 'test'
|
106
110
|
# buffer = IO::Buffer.for(string)
|
@@ -162,7 +166,20 @@ class IO
|
|
162
166
|
#
|
163
167
|
def self.map: (File file, ?Integer? size, ?Integer offset, ?Integer flags) -> Buffer
|
164
168
|
|
165
|
-
|
169
|
+
# <!--
|
170
|
+
# rdoc-file=io_buffer.c
|
171
|
+
# - IO::Buffer.string(length) {|io_buffer| ... read/write io_buffer ...} -> string
|
172
|
+
# -->
|
173
|
+
# Creates a new string of the given length and yields a zero-copy IO::Buffer
|
174
|
+
# instance to the block which uses the string as a source. The block is expected
|
175
|
+
# to write to the buffer and the string will be returned.
|
176
|
+
#
|
177
|
+
# IO::Buffer.string(4) do |buffer|
|
178
|
+
# buffer.set_string("Ruby")
|
179
|
+
# end
|
180
|
+
# # => "Ruby"
|
181
|
+
#
|
182
|
+
def self.string: (int) { (Buffer) -> void } -> String
|
166
183
|
|
167
184
|
# <!--
|
168
185
|
# rdoc-file=io_buffer.c
|
@@ -179,29 +196,29 @@ class IO
|
|
179
196
|
# -->
|
180
197
|
# Fill buffer with `value`, starting with `offset` and going for `length` bytes.
|
181
198
|
#
|
182
|
-
# buffer = IO::Buffer.for('test')
|
199
|
+
# buffer = IO::Buffer.for('test').dup
|
183
200
|
# # =>
|
184
|
-
# # <IO::Buffer 0x00007fca40087c38+4
|
201
|
+
# # <IO::Buffer 0x00007fca40087c38+4 INTERNAL>
|
185
202
|
# # 0x00000000 74 65 73 74 test
|
186
203
|
#
|
187
204
|
# buffer.clear
|
188
205
|
# # =>
|
189
|
-
# # <IO::Buffer 0x00007fca40087c38+4
|
206
|
+
# # <IO::Buffer 0x00007fca40087c38+4 INTERNAL>
|
190
207
|
# # 0x00000000 00 00 00 00 ....
|
191
208
|
#
|
192
209
|
# buf.clear(1) # fill with 1
|
193
210
|
# # =>
|
194
|
-
# # <IO::Buffer 0x00007fca40087c38+4
|
211
|
+
# # <IO::Buffer 0x00007fca40087c38+4 INTERNAL>
|
195
212
|
# # 0x00000000 01 01 01 01 ....
|
196
213
|
#
|
197
214
|
# buffer.clear(2, 1, 2) # fill with 2, starting from offset 1, for 2 bytes
|
198
215
|
# # =>
|
199
|
-
# # <IO::Buffer 0x00007fca40087c38+4
|
216
|
+
# # <IO::Buffer 0x00007fca40087c38+4 INTERNAL>
|
200
217
|
# # 0x00000000 01 02 02 01 ....
|
201
218
|
#
|
202
219
|
# buffer.clear(2, 1) # fill with 2, starting from offset 1
|
203
220
|
# # =>
|
204
|
-
# # <IO::Buffer 0x00007fca40087c38+4
|
221
|
+
# # <IO::Buffer 0x00007fca40087c38+4 INTERNAL>
|
205
222
|
# # 0x00000000 01 02 02 02 ....
|
206
223
|
#
|
207
224
|
def clear: (?Integer value, ?Integer offset, ?Integer length) -> self
|
@@ -210,29 +227,30 @@ class IO
|
|
210
227
|
# rdoc-file=io_buffer.c
|
211
228
|
# - copy(source, [offset, [length, [source_offset]]]) -> size
|
212
229
|
# -->
|
213
|
-
# Efficiently copy
|
214
|
-
#
|
230
|
+
# Efficiently copy from a source IO::Buffer into the buffer, at `offset` using
|
231
|
+
# `memmove`. For copying String instances, see #set_string.
|
215
232
|
#
|
216
233
|
# buffer = IO::Buffer.new(32)
|
217
|
-
# #
|
234
|
+
# # =>
|
218
235
|
# # #<IO::Buffer 0x0000555f5ca22520+32 INTERNAL>
|
219
236
|
# # 0x00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
220
237
|
# # 0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ *
|
221
238
|
#
|
222
239
|
# buffer.copy(IO::Buffer.for("test"), 8)
|
223
|
-
# # => 4 -- size of
|
240
|
+
# # => 4 -- size of buffer copied
|
224
241
|
# buffer
|
225
|
-
# #
|
242
|
+
# # =>
|
226
243
|
# # #<IO::Buffer 0x0000555f5cf8fe40+32 INTERNAL>
|
227
244
|
# # 0x00000000 00 00 00 00 00 00 00 00 74 65 73 74 00 00 00 00 ........test....
|
228
245
|
# # 0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ *
|
229
246
|
#
|
230
|
-
# #copy can be used to put
|
247
|
+
# #copy can be used to put buffer into strings associated with buffer:
|
231
248
|
#
|
232
|
-
# string= "data: "
|
249
|
+
# string = "data: "
|
233
250
|
# # => "data: "
|
234
|
-
# buffer = IO::Buffer.for(
|
235
|
-
#
|
251
|
+
# buffer = IO::Buffer.for(string) do |buffer|
|
252
|
+
# buffer.copy(IO::Buffer.for("test"), 5)
|
253
|
+
# end
|
236
254
|
# # => 4
|
237
255
|
# string
|
238
256
|
# # => "data:test"
|
@@ -247,38 +265,54 @@ class IO
|
|
247
265
|
# See ::map for details of creation of mutable file mappings, this will work:
|
248
266
|
#
|
249
267
|
# buffer = IO::Buffer.map(File.open('test.txt', 'r+'))
|
250
|
-
# buffer.copy("boom", 0)
|
268
|
+
# buffer.copy(IO::Buffer.for("boom"), 0)
|
251
269
|
# # => 4
|
252
270
|
# File.read('test.txt')
|
253
271
|
# # => "boom"
|
254
272
|
#
|
255
|
-
# Attempt to copy the
|
256
|
-
# fail:
|
273
|
+
# Attempt to copy the buffer which will need place outside of buffer's bounds
|
274
|
+
# will fail:
|
257
275
|
#
|
258
276
|
# buffer = IO::Buffer.new(2)
|
259
|
-
# buffer.copy('test', 0)
|
260
|
-
# # in `copy': Specified offset+length
|
277
|
+
# buffer.copy(IO::Buffer.for('test'), 0)
|
278
|
+
# # in `copy': Specified offset+length is bigger than the buffer size! (ArgumentError)
|
279
|
+
#
|
280
|
+
# It is safe to copy between memory regions that overlaps each other. In such
|
281
|
+
# case, the data is copied as if the data was first copied from the source
|
282
|
+
# buffer to a temporary buffer, and then copied from the temporary buffer to the
|
283
|
+
# destination buffer.
|
284
|
+
#
|
285
|
+
# buffer = IO::Buffer.new(10)
|
286
|
+
# buffer.set_string("0123456789")
|
287
|
+
# buffer.copy(buffer, 3, 7)
|
288
|
+
# # => 7
|
289
|
+
# buffer
|
290
|
+
# # =>
|
291
|
+
# # #<IO::Buffer 0x000056494f8ce440+10 INTERNAL>
|
292
|
+
# # 0x00000000 30 31 32 30 31 32 33 34 35 36 0120123456
|
261
293
|
#
|
262
294
|
def copy: (Buffer source, ?Integer offset, ?Integer length, ?Integer source_offset) -> Integer
|
263
295
|
|
264
296
|
# <!--
|
265
297
|
# rdoc-file=io_buffer.c
|
266
|
-
# -
|
298
|
+
# - empty? -> true or false
|
267
299
|
# -->
|
268
|
-
# If the buffer
|
269
|
-
#
|
270
|
-
#
|
271
|
-
# A buffer created using ::for has an external reference to the string's
|
272
|
-
# memory.
|
273
|
-
#
|
274
|
-
# External buffer can't be resized.
|
300
|
+
# If the buffer has 0 size: it is created by ::new with size 0, or with ::for
|
301
|
+
# from an empty string. (Note that empty files can't be mapped, so the buffer
|
302
|
+
# created with ::map will never be empty.)
|
275
303
|
#
|
276
304
|
def empty?: () -> bool
|
277
305
|
|
278
306
|
# <!--
|
279
307
|
# rdoc-file=io_buffer.c
|
280
|
-
# - external?
|
308
|
+
# - external? -> true or false
|
281
309
|
# -->
|
310
|
+
# The buffer is *external* if it references the memory which is not allocated or
|
311
|
+
# mapped by the buffer itself.
|
312
|
+
#
|
313
|
+
# A buffer created using ::for has an external reference to the string's memory.
|
314
|
+
#
|
315
|
+
# External buffer can't be resized.
|
282
316
|
#
|
283
317
|
def external?: () -> bool
|
284
318
|
|
@@ -291,9 +325,10 @@ class IO
|
|
291
325
|
# * for a buffer created from scratch: free memory.
|
292
326
|
# * for a buffer created from string: undo the association.
|
293
327
|
#
|
294
|
-
#
|
295
328
|
# After the buffer is freed, no further operations can't be performed on it.
|
296
329
|
#
|
330
|
+
# You can resize a freed buffer to re-allocate it.
|
331
|
+
#
|
297
332
|
# buffer = IO::Buffer.for('test')
|
298
333
|
# buffer.free
|
299
334
|
# # => #<IO::Buffer 0x0000000000000000+0 NULL>
|
@@ -307,8 +342,6 @@ class IO
|
|
307
342
|
# buffer.null?
|
308
343
|
# # => true
|
309
344
|
#
|
310
|
-
# You can resize a freed buffer to re-allocate it.
|
311
|
-
#
|
312
345
|
def free: () -> self
|
313
346
|
|
314
347
|
# <!--
|
@@ -330,9 +363,9 @@ class IO
|
|
330
363
|
|
331
364
|
# <!--
|
332
365
|
# rdoc-file=io_buffer.c
|
333
|
-
# - get_value(
|
366
|
+
# - get_value(buffer_type, offset) -> numeric
|
334
367
|
# -->
|
335
|
-
# Read from buffer a value of `type` at `offset`. `
|
368
|
+
# Read from buffer a value of `type` at `offset`. `buffer_type` should be one of
|
336
369
|
# symbols:
|
337
370
|
#
|
338
371
|
# * `:U8`: unsigned integer, 1 byte
|
@@ -354,8 +387,9 @@ class IO
|
|
354
387
|
# * `:f64`: double, 8 bytes, little-endian
|
355
388
|
# * `:F64`: double, 8 bytes, big-endian
|
356
389
|
#
|
357
|
-
#
|
358
|
-
#
|
390
|
+
# A buffer type refers specifically to the type of binary buffer that is stored
|
391
|
+
# in the buffer. For example, a `:u32` buffer type is a 32-bit unsigned integer
|
392
|
+
# in little-endian format.
|
359
393
|
#
|
360
394
|
# string = [1.5].pack('f')
|
361
395
|
# # => "\x00\x00\xC0?"
|
@@ -374,15 +408,35 @@ class IO
|
|
374
408
|
|
375
409
|
# <!--
|
376
410
|
# rdoc-file=io_buffer.c
|
377
|
-
# - hexdump()
|
411
|
+
# - hexdump([offset, [length, [width]]]) -> string
|
378
412
|
# -->
|
413
|
+
# Returns a human-readable string representation of the buffer. The exact format
|
414
|
+
# is subject to change.
|
415
|
+
#
|
416
|
+
# buffer = IO::Buffer.for("Hello World")
|
417
|
+
# puts buffer.hexdump
|
418
|
+
# # 0x00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 Hello World
|
419
|
+
#
|
420
|
+
# As buffers are usually fairly big, you may want to limit the output by
|
421
|
+
# specifying the offset and length:
|
422
|
+
#
|
423
|
+
# puts buffer.hexdump(6, 5)
|
424
|
+
# # 0x00000006 57 6f 72 6c 64 World
|
379
425
|
#
|
380
426
|
def hexdump: () -> String
|
381
427
|
|
382
428
|
# <!--
|
383
429
|
# rdoc-file=io_buffer.c
|
384
|
-
# - inspect
|
430
|
+
# - inspect -> string
|
385
431
|
# -->
|
432
|
+
# Inspect the buffer and report useful information about it's internal state.
|
433
|
+
# Only a limited portion of the buffer will be displayed in a hexdump style
|
434
|
+
# format.
|
435
|
+
#
|
436
|
+
# buffer = IO::Buffer.for("Hello World")
|
437
|
+
# puts buffer.inspect
|
438
|
+
# # #<IO::Buffer 0x000000010198ccd8+11 EXTERNAL READONLY SLICE>
|
439
|
+
# # 0x00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 Hello World
|
386
440
|
#
|
387
441
|
def inspect: () -> String
|
388
442
|
|
@@ -413,6 +467,12 @@ class IO
|
|
413
467
|
# block is performed, the buffer is considered locked, and no other code can
|
414
468
|
# enter the lock. Also, locked buffer can't be changed with #resize or #free.
|
415
469
|
#
|
470
|
+
# The following operations acquire a lock: #resize, #free.
|
471
|
+
#
|
472
|
+
# Locking is not thread safe. It is designed as a safety net around non-blocking
|
473
|
+
# system calls. You can only share a buffer between threads with appropriate
|
474
|
+
# synchronisation techniques.
|
475
|
+
#
|
416
476
|
# buffer = IO::Buffer.new(4)
|
417
477
|
# buffer.locked? #=> false
|
418
478
|
#
|
@@ -425,16 +485,10 @@ class IO
|
|
425
485
|
# Fiber.schedule do
|
426
486
|
# # in `locked': Buffer already locked! (IO::Buffer::LockedError)
|
427
487
|
# buffer.locked do
|
428
|
-
# buffer.set_string(
|
488
|
+
# buffer.set_string("test", 0)
|
429
489
|
# end
|
430
490
|
# end
|
431
491
|
#
|
432
|
-
# The following operations acquire a lock: #resize, #free.
|
433
|
-
#
|
434
|
-
# Locking is not thread safe. It is designed as a safety net around non-blocking
|
435
|
-
# system calls. You can only share a buffer between threads with appropriate
|
436
|
-
# synchronisation techniques.
|
437
|
-
#
|
438
492
|
def locked: [A] () { (IO::Buffer) -> A } -> A
|
439
493
|
|
440
494
|
# <!--
|
@@ -473,35 +527,116 @@ class IO
|
|
473
527
|
# rdoc-file=io_buffer.c
|
474
528
|
# - null? -> true or false
|
475
529
|
# -->
|
476
|
-
# If the buffer was freed with #free or was never
|
530
|
+
# If the buffer was freed with #free, transferred with #transfer, or was never
|
531
|
+
# allocated in the first place.
|
532
|
+
#
|
533
|
+
# buffer = IO::Buffer.new(0)
|
534
|
+
# buffer.null? #=> true
|
535
|
+
#
|
536
|
+
# buffer = IO::Buffer.new(4)
|
537
|
+
# buffer.null? #=> false
|
538
|
+
# buffer.free
|
539
|
+
# buffer.null? #=> true
|
477
540
|
#
|
478
541
|
def null?: () -> bool
|
479
542
|
|
480
543
|
# <!--
|
481
544
|
# rdoc-file=io_buffer.c
|
482
|
-
# - pread(
|
545
|
+
# - pread(io, from, [length, [offset]]) -> read length or -errno
|
483
546
|
# -->
|
547
|
+
# Read at least `length` bytes from the `io` starting at the specified `from`
|
548
|
+
# position, into the buffer starting at `offset`. If an error occurs, return
|
549
|
+
# `-errno`.
|
550
|
+
#
|
551
|
+
# If `length` is not given or `nil`, it defaults to the size of the buffer minus
|
552
|
+
# the offset, i.e. the entire buffer.
|
553
|
+
#
|
554
|
+
# If `length` is zero, exactly one `pread` operation will occur.
|
555
|
+
#
|
556
|
+
# If `offset` is not given, it defaults to zero, i.e. the beginning of the
|
557
|
+
# buffer.
|
558
|
+
#
|
559
|
+
# IO::Buffer.for('test') do |buffer|
|
560
|
+
# p buffer
|
561
|
+
# # =>
|
562
|
+
# # <IO::Buffer 0x00007fca40087c38+4 SLICE>
|
563
|
+
# # 0x00000000 74 65 73 74 test
|
564
|
+
#
|
565
|
+
# # take 2 bytes from the beginning of urandom,
|
566
|
+
# # put them in buffer starting from position 2
|
567
|
+
# buffer.pread(File.open('/dev/urandom', 'rb'), 0, 2, 2)
|
568
|
+
# p buffer
|
569
|
+
# # =>
|
570
|
+
# # <IO::Buffer 0x00007f3bc65f2a58+4 EXTERNAL SLICE>
|
571
|
+
# # 0x00000000 05 35 73 74 te.5
|
572
|
+
# end
|
484
573
|
#
|
485
574
|
def pread: (untyped, untyped, untyped) -> untyped
|
486
575
|
|
487
576
|
# <!--
|
488
577
|
# rdoc-file=io_buffer.c
|
489
|
-
# - pwrite(
|
578
|
+
# - pwrite(io, from, [length, [offset]]) -> written length or -errno
|
490
579
|
# -->
|
580
|
+
# Write at least `length` bytes from the buffer starting at `offset`, into the
|
581
|
+
# `io` starting at the specified `from` position. If an error occurs, return
|
582
|
+
# `-errno`.
|
583
|
+
#
|
584
|
+
# If `length` is not given or `nil`, it defaults to the size of the buffer minus
|
585
|
+
# the offset, i.e. the entire buffer.
|
586
|
+
#
|
587
|
+
# If `length` is zero, exactly one `pwrite` operation will occur.
|
588
|
+
#
|
589
|
+
# If `offset` is not given, it defaults to zero, i.e. the beginning of the
|
590
|
+
# buffer.
|
591
|
+
#
|
592
|
+
# If the `from` position is beyond the end of the file, the gap will be filled
|
593
|
+
# with null (0 value) bytes.
|
594
|
+
#
|
595
|
+
# out = File.open('output.txt', File::RDWR) # open for read/write, no truncation
|
596
|
+
# IO::Buffer.for('1234567').pwrite(out, 2, 3, 1)
|
597
|
+
#
|
598
|
+
# This leads to `234` (3 bytes, starting from position 1) being written into
|
599
|
+
# `output.txt`, starting from file position 2.
|
491
600
|
#
|
492
601
|
def pwrite: (untyped, untyped, untyped) -> untyped
|
493
602
|
|
494
603
|
# <!--
|
495
604
|
# rdoc-file=io_buffer.c
|
496
|
-
# - read(
|
605
|
+
# - read(io, [length, [offset]]) -> read length or -errno
|
497
606
|
# -->
|
607
|
+
# Read at least `length` bytes from the `io`, into the buffer starting at
|
608
|
+
# `offset`. If an error occurs, return `-errno`.
|
609
|
+
#
|
610
|
+
# If `length` is not given or `nil`, it defaults to the size of the buffer minus
|
611
|
+
# the offset, i.e. the entire buffer.
|
612
|
+
#
|
613
|
+
# If `length` is zero, exactly one `read` operation will occur.
|
614
|
+
#
|
615
|
+
# If `offset` is not given, it defaults to zero, i.e. the beginning of the
|
616
|
+
# buffer.
|
617
|
+
#
|
618
|
+
# IO::Buffer.for('test') do |buffer|
|
619
|
+
# p buffer
|
620
|
+
# # =>
|
621
|
+
# # <IO::Buffer 0x00007fca40087c38+4 SLICE>
|
622
|
+
# # 0x00000000 74 65 73 74 test
|
623
|
+
# buffer.read(File.open('/dev/urandom', 'rb'), 2)
|
624
|
+
# p buffer
|
625
|
+
# # =>
|
626
|
+
# # <IO::Buffer 0x00007f3bc65f2a58+4 EXTERNAL SLICE>
|
627
|
+
# # 0x00000000 05 35 73 74 .5st
|
628
|
+
# end
|
498
629
|
#
|
499
630
|
def read: (untyped, untyped) -> untyped
|
500
631
|
|
501
632
|
# <!--
|
502
633
|
# rdoc-file=io_buffer.c
|
503
|
-
# - readonly?
|
634
|
+
# - readonly? -> true or false
|
504
635
|
# -->
|
636
|
+
# If the buffer is *read only*, meaning the buffer cannot be modified using
|
637
|
+
# #set_value, #set_string or #copy and similar.
|
638
|
+
#
|
639
|
+
# Frozen strings and read-only files create read-only buffers.
|
505
640
|
#
|
506
641
|
def readonly?: () -> bool
|
507
642
|
|
@@ -516,7 +651,7 @@ class IO
|
|
516
651
|
# buffer = IO::Buffer.new(4)
|
517
652
|
# buffer.set_string("test", 0)
|
518
653
|
# buffer.resize(8) # resize to 8 bytes
|
519
|
-
# #
|
654
|
+
# # =>
|
520
655
|
# # #<IO::Buffer 0x0000555f5d1a1630+8 INTERNAL>
|
521
656
|
# # 0x00000000 74 65 73 74 00 00 00 00 test....
|
522
657
|
#
|
@@ -526,8 +661,27 @@ class IO
|
|
526
661
|
|
527
662
|
# <!--
|
528
663
|
# rdoc-file=io_buffer.c
|
529
|
-
# - set_string(
|
664
|
+
# - set_string(string, [offset, [length, [source_offset]]]) -> size
|
530
665
|
# -->
|
666
|
+
# Efficiently copy from a source String into the buffer, at `offset` using
|
667
|
+
# `memmove`.
|
668
|
+
#
|
669
|
+
# buf = IO::Buffer.new(8)
|
670
|
+
# # =>
|
671
|
+
# # #<IO::Buffer 0x0000557412714a20+8 INTERNAL>
|
672
|
+
# # 0x00000000 00 00 00 00 00 00 00 00 ........
|
673
|
+
#
|
674
|
+
# # set buffer starting from offset 1, take 2 bytes starting from string's
|
675
|
+
# # second
|
676
|
+
# buf.set_string('test', 1, 2, 1)
|
677
|
+
# # => 2
|
678
|
+
# buf
|
679
|
+
# # =>
|
680
|
+
# # #<IO::Buffer 0x0000557412714a20+8 INTERNAL>
|
681
|
+
# # 0x00000000 00 65 73 00 00 00 00 00 .es.....
|
682
|
+
#
|
683
|
+
# See also #copy for examples of how buffer writing might be used for changing
|
684
|
+
# associated strings and files.
|
531
685
|
#
|
532
686
|
def set_string: (*untyped) -> untyped
|
533
687
|
|
@@ -539,13 +693,15 @@ class IO
|
|
539
693
|
# symbols described in #get_value.
|
540
694
|
#
|
541
695
|
# buffer = IO::Buffer.new(8)
|
542
|
-
# #
|
696
|
+
# # =>
|
543
697
|
# # #<IO::Buffer 0x0000555f5c9a2d50+8 INTERNAL>
|
544
698
|
# # 0x00000000 00 00 00 00 00 00 00 00
|
699
|
+
#
|
545
700
|
# buffer.set_value(:U8, 1, 111)
|
546
701
|
# # => 1
|
702
|
+
#
|
547
703
|
# buffer
|
548
|
-
# #
|
704
|
+
# # =>
|
549
705
|
# # #<IO::Buffer 0x0000555f5c9a2d50+8 INTERNAL>
|
550
706
|
# # 0x00000000 00 6f 00 00 00 00 00 00 .o......
|
551
707
|
#
|
@@ -554,11 +710,12 @@ class IO
|
|
554
710
|
#
|
555
711
|
# buffer = IO::Buffer.new(8)
|
556
712
|
# buffer.set_value(:U32, 0, 2.5)
|
713
|
+
#
|
557
714
|
# buffer
|
558
|
-
# #
|
559
|
-
# #
|
560
|
-
# #
|
561
|
-
# #
|
715
|
+
# # =>
|
716
|
+
# # #<IO::Buffer 0x0000555f5c9a2d50+8 INTERNAL>
|
717
|
+
# # 0x00000000 00 00 00 02 00 00 00 00
|
718
|
+
# # ^^ the same as if we'd pass just integer 2
|
562
719
|
#
|
563
720
|
def set_value: (int_get_type | float_get_type, Integer offset, Float | Integer value) -> Integer
|
564
721
|
|
@@ -573,7 +730,7 @@ class IO
|
|
573
730
|
|
574
731
|
# <!--
|
575
732
|
# rdoc-file=io_buffer.c
|
576
|
-
# - slice(offset, length) -> io_buffer
|
733
|
+
# - slice([offset, [length]]) -> io_buffer
|
577
734
|
# -->
|
578
735
|
# Produce another IO::Buffer which is a slice (or view into) the current one
|
579
736
|
# starting at `offset` bytes and going for `length` bytes.
|
@@ -581,33 +738,46 @@ class IO
|
|
581
738
|
# The slicing happens without copying of memory, and the slice keeps being
|
582
739
|
# associated with the original buffer's source (string, or file), if any.
|
583
740
|
#
|
584
|
-
#
|
585
|
-
#
|
741
|
+
# If the offset is not given, it will be zero. If the offset is negative, it
|
742
|
+
# will raise an ArgumentError.
|
743
|
+
#
|
744
|
+
# If the length is not given, the slice will be as long as the original buffer
|
745
|
+
# minus the specified offset. If the length is negative, it will raise an
|
746
|
+
# ArgumentError.
|
747
|
+
#
|
748
|
+
# Raises RuntimeError if the `offset+length` is out of the current buffer's
|
749
|
+
# bounds.
|
586
750
|
#
|
587
751
|
# string = 'test'
|
588
|
-
# buffer = IO::Buffer.for(string)
|
752
|
+
# buffer = IO::Buffer.for(string).dup
|
753
|
+
#
|
754
|
+
# slice = buffer.slice
|
755
|
+
# # =>
|
756
|
+
# # #<IO::Buffer 0x0000000108338e68+4 SLICE>
|
757
|
+
# # 0x00000000 74 65 73 74 test
|
758
|
+
#
|
759
|
+
# buffer.slice(2)
|
760
|
+
# # =>
|
761
|
+
# # #<IO::Buffer 0x0000000108338e6a+2 SLICE>
|
762
|
+
# # 0x00000000 73 74 st
|
589
763
|
#
|
590
764
|
# slice = buffer.slice(1, 2)
|
591
765
|
# # =>
|
592
|
-
# #
|
593
|
-
# #
|
766
|
+
# # #<IO::Buffer 0x00007fc3d34ebc49+2 SLICE>
|
767
|
+
# # 0x00000000 65 73 es
|
594
768
|
#
|
595
769
|
# # Put "o" into 0s position of the slice
|
596
770
|
# slice.set_string('o', 0)
|
597
771
|
# slice
|
598
772
|
# # =>
|
599
|
-
# #
|
600
|
-
# #
|
773
|
+
# # #<IO::Buffer 0x00007fc3d34ebc49+2 SLICE>
|
774
|
+
# # 0x00000000 6f 73 os
|
601
775
|
#
|
602
776
|
# # it is also visible at position 1 of the original buffer
|
603
777
|
# buffer
|
604
778
|
# # =>
|
605
|
-
# #
|
606
|
-
# #
|
607
|
-
#
|
608
|
-
# # ...and original string
|
609
|
-
# string
|
610
|
-
# # => tost
|
779
|
+
# # #<IO::Buffer 0x00007fc3d31e2d80+4 INTERNAL>
|
780
|
+
# # 0x00000000 74 6f 73 74 tost
|
611
781
|
#
|
612
782
|
def slice: (Integer offset, Integer length) -> Buffer
|
613
783
|
|
@@ -627,16 +797,17 @@ class IO
|
|
627
797
|
# rdoc-file=io_buffer.c
|
628
798
|
# - transfer -> new_io_buffer
|
629
799
|
# -->
|
630
|
-
# Transfers ownership to a new buffer,
|
800
|
+
# Transfers ownership of the underlying memory to a new buffer, causing the
|
801
|
+
# current buffer to become uninitialized.
|
631
802
|
#
|
632
803
|
# buffer = IO::Buffer.new('test')
|
633
804
|
# other = buffer.transfer
|
634
805
|
# other
|
635
|
-
# #
|
806
|
+
# # =>
|
636
807
|
# # #<IO::Buffer 0x00007f136a15f7b0+4 SLICE>
|
637
808
|
# # 0x00000000 74 65 73 74 test
|
638
809
|
# buffer
|
639
|
-
# #
|
810
|
+
# # =>
|
640
811
|
# # #<IO::Buffer 0x0000000000000000+0 NULL>
|
641
812
|
# buffer.null?
|
642
813
|
# # => true
|
@@ -647,17 +818,32 @@ class IO
|
|
647
818
|
# rdoc-file=io_buffer.c
|
648
819
|
# - valid? -> true or false
|
649
820
|
# -->
|
650
|
-
# Returns whether the buffer
|
821
|
+
# Returns whether the buffer buffer is accessible.
|
651
822
|
#
|
652
|
-
# A buffer becomes invalid if it is a slice of another buffer
|
653
|
-
# freed.
|
823
|
+
# A buffer becomes invalid if it is a slice of another buffer (or string) which
|
824
|
+
# has been freed or re-allocated at a different address.
|
654
825
|
#
|
655
826
|
def valid?: () -> bool
|
656
827
|
|
657
828
|
# <!--
|
658
829
|
# rdoc-file=io_buffer.c
|
659
|
-
# - write(
|
830
|
+
# - write(io, [length, [offset]]) -> written length or -errno
|
660
831
|
# -->
|
832
|
+
# Write at least `length` bytes from the buffer starting at `offset`, into the
|
833
|
+
# `io`. If an error occurs, return `-errno`.
|
834
|
+
#
|
835
|
+
# If `length` is not given or `nil`, it defaults to the size of the buffer minus
|
836
|
+
# the offset, i.e. the entire buffer.
|
837
|
+
#
|
838
|
+
# If `length` is zero, exactly one `write` operation will occur.
|
839
|
+
#
|
840
|
+
# If `offset` is not given, it defaults to zero, i.e. the beginning of the
|
841
|
+
# buffer.
|
842
|
+
#
|
843
|
+
# out = File.open('output.txt', 'wb')
|
844
|
+
# IO::Buffer.for('1234567').write(out, 3)
|
845
|
+
#
|
846
|
+
# This leads to `123` being written into `output.txt`
|
661
847
|
#
|
662
848
|
def write: (untyped, untyped) -> untyped
|
663
849
|
|
@@ -669,64 +855,129 @@ class IO
|
|
669
855
|
# -->
|
670
856
|
# Create a new zero-filled IO::Buffer of `size` bytes. By default, the buffer
|
671
857
|
# will be *internal*: directly allocated chunk of the memory. But if the
|
672
|
-
# requested `size` is more than OS-specific IO::
|
858
|
+
# requested `size` is more than OS-specific IO::Buffer::PAGE_SIZE, the buffer
|
673
859
|
# would be allocated using the virtual memory mechanism (anonymous `mmap` on
|
674
860
|
# Unix, `VirtualAlloc` on Windows). The behavior can be forced by passing
|
675
861
|
# IO::Buffer::MAPPED as a second parameter.
|
676
862
|
#
|
677
|
-
# Examples
|
678
|
-
#
|
679
863
|
# buffer = IO::Buffer.new(4)
|
680
864
|
# # =>
|
681
|
-
# #
|
682
|
-
# #
|
865
|
+
# # #<IO::Buffer 0x000055b34497ea10+4 INTERNAL>
|
866
|
+
# # 0x00000000 00 00 00 00 ....
|
683
867
|
#
|
684
868
|
# buffer.get_string(0, 1) # => "\x00"
|
685
869
|
#
|
686
870
|
# buffer.set_string("test")
|
687
871
|
# buffer
|
688
|
-
# #
|
872
|
+
# # =>
|
689
873
|
# # #<IO::Buffer 0x000055b34497ea10+4 INTERNAL>
|
690
874
|
# # 0x00000000 74 65 73 74 test
|
691
875
|
#
|
692
876
|
def initialize: (?Integer size, ?Integer flags) -> void
|
693
877
|
|
878
|
+
# <!-- rdoc-file=io_buffer.c -->
|
879
|
+
# Refers to big endian byte order, where the most significant byte is stored
|
880
|
+
# first. See #get_value for more details.
|
881
|
+
#
|
694
882
|
BIG_ENDIAN: Integer
|
695
883
|
|
884
|
+
# <!-- rdoc-file=io_buffer.c -->
|
885
|
+
# The default buffer size, typically a (small) multiple of the PAGE_SIZE. Can be
|
886
|
+
# explicitly specified by setting the RUBY_IO_BUFFER_DEFAULT_SIZE environment
|
887
|
+
# variable.
|
888
|
+
#
|
696
889
|
DEFAULT_SIZE: Integer
|
697
890
|
|
891
|
+
# <!-- rdoc-file=io_buffer.c -->
|
892
|
+
# Indicates that the memory in the buffer is owned by someone else. See
|
893
|
+
# #external? for more details.
|
894
|
+
#
|
698
895
|
EXTERNAL: Integer
|
699
896
|
|
897
|
+
# <!-- rdoc-file=io_buffer.c -->
|
898
|
+
# Refers to the byte order of the host machine. See #get_value for more details.
|
899
|
+
#
|
700
900
|
HOST_ENDIAN: Integer
|
701
901
|
|
902
|
+
# <!-- rdoc-file=io_buffer.c -->
|
903
|
+
# Indicates that the memory in the buffer is owned by the buffer. See #internal?
|
904
|
+
# for more details.
|
905
|
+
#
|
702
906
|
INTERNAL: Integer
|
703
907
|
|
908
|
+
# <!-- rdoc-file=io_buffer.c -->
|
909
|
+
# Refers to little endian byte order, where the least significant byte is stored
|
910
|
+
# first. See #get_value for more details.
|
911
|
+
#
|
704
912
|
LITTLE_ENDIAN: Integer
|
705
913
|
|
914
|
+
# <!-- rdoc-file=io_buffer.c -->
|
915
|
+
# Indicates that the memory in the buffer is locked and cannot be resized or
|
916
|
+
# freed. See #locked? and #locked for more details.
|
917
|
+
#
|
706
918
|
LOCKED: Integer
|
707
919
|
|
920
|
+
# <!-- rdoc-file=io_buffer.c -->
|
921
|
+
# Indicates that the memory in the buffer is mapped by the operating system. See
|
922
|
+
# #mapped? for more details.
|
923
|
+
#
|
708
924
|
MAPPED: Integer
|
709
925
|
|
926
|
+
# <!-- rdoc-file=io_buffer.c -->
|
927
|
+
# Refers to network byte order, which is the same as big endian. See #get_value
|
928
|
+
# for more details.
|
929
|
+
#
|
710
930
|
NETWORK_ENDIAN: Integer
|
711
931
|
|
932
|
+
# <!-- rdoc-file=io_buffer.c -->
|
933
|
+
# The operating system page size. Used for efficient page-aligned memory
|
934
|
+
# allocations.
|
935
|
+
#
|
712
936
|
PAGE_SIZE: Integer
|
713
937
|
|
938
|
+
# <!-- rdoc-file=io_buffer.c -->
|
939
|
+
# Indicates that the memory in the buffer is mapped privately and changes won't
|
940
|
+
# be replicated to the underlying file. See #private? for more details.
|
941
|
+
#
|
714
942
|
PRIVATE: Integer
|
715
943
|
|
944
|
+
# <!-- rdoc-file=io_buffer.c -->
|
945
|
+
# Indicates that the memory in the buffer is read only, and attempts to modify
|
946
|
+
# it will fail. See #readonly? for more details.
|
947
|
+
#
|
716
948
|
READONLY: Integer
|
717
949
|
|
950
|
+
# <!-- rdoc-file=io_buffer.c -->
|
951
|
+
# Raised when an operation would resize or re-allocate a locked buffer.
|
952
|
+
#
|
718
953
|
class LockedError < RuntimeError
|
719
954
|
end
|
720
955
|
|
956
|
+
# <!-- rdoc-file=io_buffer.c -->
|
957
|
+
# Raised when the buffer cannot be allocated for some reason, or you try to use
|
958
|
+
# a buffer that's not allocated.
|
959
|
+
#
|
721
960
|
class AllocationError < RuntimeError
|
722
961
|
end
|
723
962
|
|
963
|
+
# <!-- rdoc-file=io_buffer.c -->
|
964
|
+
# Raised when you try to write to a read-only buffer, or resize an external
|
965
|
+
# buffer.
|
966
|
+
#
|
724
967
|
class AccessError < RuntimeError
|
725
968
|
end
|
726
969
|
|
970
|
+
# <!-- rdoc-file=io_buffer.c -->
|
971
|
+
# Raised if you try to access a buffer slice which no longer references a valid
|
972
|
+
# memory range of the underlying source.
|
973
|
+
#
|
727
974
|
class InvalidatedError < RuntimeError
|
728
975
|
end
|
729
976
|
|
977
|
+
# <!-- rdoc-file=io_buffer.c -->
|
978
|
+
# Raised if the mask given to a binary operation is invalid, e.g. zero length or
|
979
|
+
# overlaps the target buffer.
|
980
|
+
#
|
730
981
|
class MaskError < ArgumentError
|
731
982
|
end
|
732
983
|
end
|