rbs 2.8.4 → 3.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +12 -4
  3. data/.github/workflows/comments.yml +11 -11
  4. data/.github/workflows/dependabot.yml +30 -0
  5. data/.github/workflows/ruby.yml +40 -49
  6. data/.github/workflows/typecheck.yml +36 -0
  7. data/.github/workflows/windows.yml +28 -0
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +42 -2
  10. data/CHANGELOG.md +845 -1
  11. data/README.md +64 -4
  12. data/Rakefile +198 -18
  13. data/Steepfile +11 -11
  14. data/config.yml +311 -0
  15. data/core/array.rbs +2189 -1914
  16. data/core/basic_object.rbs +59 -84
  17. data/core/binding.rbs +7 -69
  18. data/core/builtin.rbs +210 -11
  19. data/core/class.rbs +37 -0
  20. data/core/comparable.rbs +23 -25
  21. data/core/complex.rbs +449 -227
  22. data/core/constants.rbs +29 -21
  23. data/core/data.rbs +415 -0
  24. data/core/dir.rbs +698 -415
  25. data/core/encoding.rbs +468 -843
  26. data/core/enumerable.rbs +495 -455
  27. data/core/enumerator/product.rbs +92 -0
  28. data/core/enumerator.rbs +106 -9
  29. data/core/env.rbs +1 -1
  30. data/core/errno.rbs +506 -605
  31. data/core/errors.rbs +15 -17
  32. data/core/exception.rbs +361 -145
  33. data/core/false_class.rbs +39 -26
  34. data/core/fiber.rbs +121 -14
  35. data/core/file.rbs +1262 -320
  36. data/core/file_test.rbs +62 -45
  37. data/core/float.rbs +187 -208
  38. data/core/gc.rbs +446 -196
  39. data/core/global_variables.rbs +29 -29
  40. data/core/hash.rbs +242 -349
  41. data/core/integer.rbs +246 -308
  42. data/core/io/buffer.rbs +373 -122
  43. data/core/io/wait.rbs +29 -17
  44. data/core/io.rbs +1881 -1518
  45. data/core/kernel.rbs +2116 -1538
  46. data/core/marshal.rbs +24 -14
  47. data/core/match_data.rbs +413 -166
  48. data/core/math.rbs +531 -291
  49. data/core/method.rbs +101 -32
  50. data/core/module.rbs +228 -64
  51. data/core/nil_class.rbs +106 -47
  52. data/core/numeric.rbs +206 -292
  53. data/core/object.rbs +73 -1168
  54. data/core/object_space/weak_key_map.rbs +166 -0
  55. data/core/object_space.rbs +5 -3
  56. data/core/proc.rbs +280 -39
  57. data/core/process.rbs +1318 -658
  58. data/core/ractor.rbs +200 -134
  59. data/core/random.rbs +21 -4
  60. data/core/range.rbs +309 -153
  61. data/core/rational.rbs +4 -12
  62. data/core/rb_config.rbs +64 -43
  63. data/core/rbs/unnamed/argf.rbs +411 -147
  64. data/core/rbs/unnamed/env_class.rbs +137 -253
  65. data/core/rbs/unnamed/random.rbs +49 -26
  66. data/core/refinement.rbs +16 -1
  67. data/core/regexp.rbs +1568 -862
  68. data/core/ruby_vm.rbs +719 -7
  69. data/core/rubygems/config_file.rbs +3 -0
  70. data/core/rubygems/errors.rbs +69 -6
  71. data/core/rubygems/rubygems.rbs +71 -17
  72. data/core/rubygems/version.rbs +11 -7
  73. data/{stdlib/set/0 → core}/set.rbs +80 -91
  74. data/core/signal.rbs +14 -8
  75. data/core/string.rbs +1732 -1607
  76. data/core/struct.rbs +467 -95
  77. data/core/symbol.rbs +215 -245
  78. data/core/thread.rbs +133 -89
  79. data/core/thread_group.rbs +9 -9
  80. data/core/time.rbs +1141 -841
  81. data/core/trace_point.rbs +181 -121
  82. data/core/true_class.rbs +58 -32
  83. data/core/unbound_method.rbs +103 -30
  84. data/core/warning.rbs +50 -5
  85. data/docs/CONTRIBUTING.md +1 -1
  86. data/docs/architecture.md +110 -0
  87. data/docs/collection.md +59 -5
  88. data/docs/data_and_struct.md +86 -0
  89. data/docs/gem.md +57 -0
  90. data/docs/rbs_by_example.md +16 -35
  91. data/docs/repo.md +1 -1
  92. data/docs/sigs.md +7 -7
  93. data/docs/stdlib.md +63 -5
  94. data/docs/syntax.md +255 -61
  95. data/docs/tools.md +1 -0
  96. data/ext/rbs_extension/extconf.rb +10 -0
  97. data/ext/rbs_extension/lexer.c +1741 -1548
  98. data/ext/rbs_extension/lexer.h +11 -1
  99. data/ext/rbs_extension/lexer.re +12 -6
  100. data/ext/rbs_extension/lexstate.c +26 -3
  101. data/ext/rbs_extension/location.c +119 -111
  102. data/ext/rbs_extension/location.h +32 -7
  103. data/ext/rbs_extension/main.c +3 -0
  104. data/ext/rbs_extension/parser.c +883 -481
  105. data/ext/rbs_extension/parserstate.c +65 -25
  106. data/ext/rbs_extension/parserstate.h +13 -3
  107. data/ext/rbs_extension/rbs_extension.h +1 -10
  108. data/ext/rbs_extension/unescape.c +7 -47
  109. data/goodcheck.yml +2 -2
  110. data/{ext/rbs_extension → include/rbs}/constants.h +26 -15
  111. data/include/rbs/ruby_objs.h +72 -0
  112. data/include/rbs.h +7 -0
  113. data/lib/rbs/annotate/annotations.rb +3 -3
  114. data/lib/rbs/annotate/formatter.rb +13 -3
  115. data/lib/rbs/annotate/rdoc_annotator.rb +1 -1
  116. data/lib/rbs/annotate/rdoc_source.rb +12 -3
  117. data/lib/rbs/ast/declarations.rb +85 -2
  118. data/lib/rbs/ast/directives.rb +39 -0
  119. data/lib/rbs/ast/members.rb +49 -15
  120. data/lib/rbs/ast/type_param.rb +104 -15
  121. data/lib/rbs/ast/visitor.rb +137 -0
  122. data/lib/rbs/buffer.rb +5 -0
  123. data/lib/rbs/cli/colored_io.rb +48 -0
  124. data/lib/rbs/cli/diff.rb +83 -0
  125. data/lib/rbs/cli/validate.rb +356 -0
  126. data/lib/rbs/cli.rb +253 -143
  127. data/lib/rbs/collection/cleaner.rb +8 -1
  128. data/lib/rbs/collection/config/lockfile.rb +92 -0
  129. data/lib/rbs/collection/config/lockfile_generator.rb +154 -65
  130. data/lib/rbs/collection/config.rb +19 -46
  131. data/lib/rbs/collection/installer.rb +12 -13
  132. data/lib/rbs/collection/sources/base.rb +2 -2
  133. data/lib/rbs/collection/sources/git.rb +146 -69
  134. data/lib/rbs/collection/sources/local.rb +81 -0
  135. data/lib/rbs/collection/sources/rubygems.rb +10 -12
  136. data/lib/rbs/collection/sources/stdlib.rb +14 -13
  137. data/lib/rbs/collection/sources.rb +15 -2
  138. data/lib/rbs/collection.rb +2 -1
  139. data/lib/rbs/definition.rb +13 -16
  140. data/lib/rbs/definition_builder/ancestor_builder.rb +100 -24
  141. data/lib/rbs/definition_builder/method_builder.rb +4 -4
  142. data/lib/rbs/definition_builder.rb +489 -584
  143. data/lib/rbs/diff.rb +125 -0
  144. data/lib/rbs/environment/use_map.rb +77 -0
  145. data/lib/rbs/environment.rb +406 -105
  146. data/lib/rbs/environment_loader.rb +48 -44
  147. data/lib/rbs/environment_walker.rb +1 -1
  148. data/lib/rbs/errors.rb +175 -56
  149. data/lib/rbs/file_finder.rb +28 -0
  150. data/lib/rbs/location_aux.rb +8 -7
  151. data/lib/rbs/locator.rb +37 -15
  152. data/lib/rbs/method_type.rb +23 -0
  153. data/lib/rbs/namespace.rb +1 -0
  154. data/lib/rbs/parser/lex_result.rb +15 -0
  155. data/lib/rbs/parser/token.rb +23 -0
  156. data/lib/rbs/parser_aux.rb +22 -13
  157. data/lib/rbs/prototype/helpers.rb +48 -22
  158. data/lib/rbs/prototype/node_usage.rb +99 -0
  159. data/lib/rbs/prototype/rb.rb +125 -31
  160. data/lib/rbs/prototype/rbi.rb +49 -36
  161. data/lib/rbs/prototype/runtime/helpers.rb +59 -0
  162. data/lib/rbs/prototype/runtime/reflection.rb +19 -0
  163. data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
  164. data/lib/rbs/prototype/runtime.rb +273 -159
  165. data/lib/rbs/resolver/constant_resolver.rb +24 -8
  166. data/lib/rbs/resolver/type_name_resolver.rb +41 -7
  167. data/lib/rbs/sorter.rb +153 -123
  168. data/lib/rbs/substitution.rb +19 -0
  169. data/lib/rbs/subtractor.rb +201 -0
  170. data/lib/rbs/test/errors.rb +24 -11
  171. data/lib/rbs/test/guaranteed.rb +30 -0
  172. data/lib/rbs/test/hook.rb +45 -40
  173. data/lib/rbs/test/setup.rb +1 -1
  174. data/lib/rbs/test/tester.rb +1 -1
  175. data/lib/rbs/test/type_check.rb +120 -23
  176. data/lib/rbs/test.rb +6 -3
  177. data/lib/rbs/type_alias_dependency.rb +13 -3
  178. data/lib/rbs/type_alias_regularity.rb +21 -14
  179. data/lib/rbs/type_name.rb +18 -13
  180. data/lib/rbs/types.rb +352 -18
  181. data/lib/rbs/unit_test/convertibles.rb +176 -0
  182. data/lib/rbs/unit_test/spy.rb +136 -0
  183. data/lib/rbs/unit_test/type_assertions.rb +341 -0
  184. data/lib/rbs/unit_test/with_aliases.rb +143 -0
  185. data/lib/rbs/unit_test.rb +6 -0
  186. data/lib/rbs/validator.rb +55 -30
  187. data/lib/rbs/variance_calculator.rb +26 -23
  188. data/lib/rbs/vendorer.rb +3 -3
  189. data/lib/rbs/version.rb +1 -1
  190. data/lib/rbs/writer.rb +69 -22
  191. data/lib/rbs.rb +7 -2
  192. data/lib/rdoc/discover.rb +1 -1
  193. data/lib/rdoc_plugin/parser.rb +5 -5
  194. data/rbs.gemspec +12 -2
  195. data/schema/decls.json +1 -1
  196. data/schema/members.json +15 -10
  197. data/sig/ancestor_builder.rbs +4 -0
  198. data/sig/ancestor_graph.rbs +22 -2
  199. data/sig/annotate/formatter.rbs +2 -2
  200. data/sig/annotate/rdoc_annotater.rbs +1 -1
  201. data/sig/cli/colored_io.rbs +15 -0
  202. data/sig/cli/diff.rbs +21 -0
  203. data/sig/cli/validate.rbs +43 -0
  204. data/sig/cli.rbs +4 -0
  205. data/sig/collection/config/lockfile.rbs +74 -0
  206. data/sig/collection/config/lockfile_generator.rbs +66 -0
  207. data/sig/collection/config.rbs +5 -48
  208. data/sig/collection/installer.rbs +1 -1
  209. data/sig/collection/sources.rbs +105 -33
  210. data/sig/constant.rbs +1 -1
  211. data/sig/declarations.rbs +42 -3
  212. data/sig/definition.rbs +26 -10
  213. data/sig/definition_builder.rbs +103 -81
  214. data/sig/diff.rbs +28 -0
  215. data/sig/directives.rbs +61 -0
  216. data/sig/environment.rbs +175 -29
  217. data/sig/environment_loader.rbs +20 -18
  218. data/sig/errors.rbs +123 -2
  219. data/sig/file_finder.rbs +28 -0
  220. data/sig/location.rbs +0 -3
  221. data/sig/locator.rbs +14 -2
  222. data/sig/manifest.yaml +0 -1
  223. data/sig/members.rbs +32 -9
  224. data/sig/method_types.rbs +10 -4
  225. data/sig/namespace.rbs +2 -3
  226. data/sig/parser.rbs +55 -16
  227. data/sig/prototype/helpers.rbs +4 -0
  228. data/sig/prototype/node_usage.rbs +20 -0
  229. data/sig/prototype/rb.rbs +10 -2
  230. data/sig/prototype/rbi.rbs +2 -0
  231. data/sig/prototype/runtime.rbs +182 -0
  232. data/sig/rbs.rbs +1 -1
  233. data/sig/rdoc/rbs.rbs +4 -0
  234. data/sig/repository.rbs +7 -5
  235. data/sig/resolver/constant_resolver.rbs +3 -4
  236. data/sig/resolver/context.rbs +1 -1
  237. data/sig/resolver/type_name_resolver.rbs +5 -1
  238. data/sig/shims/bundler.rbs +38 -0
  239. data/sig/shims/rubygems.rbs +19 -0
  240. data/sig/sorter.rbs +23 -5
  241. data/sig/substitution.rbs +6 -0
  242. data/sig/subtractor.rbs +37 -0
  243. data/sig/test/errors.rbs +52 -0
  244. data/sig/test/guranteed.rbs +9 -0
  245. data/sig/test/type_check.rbs +19 -0
  246. data/sig/test.rbs +82 -0
  247. data/sig/type_alias_dependency.rbs +31 -0
  248. data/sig/type_alias_regularity.rbs +12 -6
  249. data/sig/type_param.rbs +45 -9
  250. data/sig/typename.rbs +8 -5
  251. data/sig/types.rbs +119 -12
  252. data/sig/unit_test/convertibles.rbs +154 -0
  253. data/sig/unit_test/spy.rbs +28 -0
  254. data/sig/unit_test/type_assertions.rbs +194 -0
  255. data/sig/unit_test/with_aliases.rbs +136 -0
  256. data/sig/use_map.rbs +35 -0
  257. data/sig/validator.rbs +12 -5
  258. data/sig/variance_calculator.rbs +3 -1
  259. data/sig/vendorer.rbs +1 -1
  260. data/sig/visitor.rbs +47 -0
  261. data/sig/writer.rbs +6 -2
  262. data/src/constants.c +153 -0
  263. data/src/ruby_objs.c +793 -0
  264. data/stdlib/base64/0/base64.rbs +298 -45
  265. data/stdlib/benchmark/0/benchmark.rbs +12 -3
  266. data/stdlib/bigdecimal/0/big_decimal.rbs +62 -198
  267. data/stdlib/cgi/0/core.rbs +68 -15
  268. data/stdlib/cgi/0/manifest.yaml +1 -0
  269. data/stdlib/coverage/0/coverage.rbs +50 -11
  270. data/stdlib/csv/0/csv.rbs +90 -119
  271. data/stdlib/csv/0/manifest.yaml +1 -0
  272. data/stdlib/date/0/date.rbs +806 -735
  273. data/stdlib/date/0/date_time.rbs +70 -211
  274. data/stdlib/dbm/0/dbm.rbs +0 -2
  275. data/stdlib/delegate/0/delegator.rbs +184 -0
  276. data/stdlib/delegate/0/kernel.rbs +47 -0
  277. data/stdlib/delegate/0/simple_delegator.rbs +96 -0
  278. data/stdlib/did_you_mean/0/did_you_mean.rbs +3 -8
  279. data/stdlib/digest/0/digest.rbs +48 -35
  280. data/stdlib/erb/0/erb.rbs +15 -39
  281. data/stdlib/etc/0/etc.rbs +174 -54
  282. data/stdlib/fileutils/0/fileutils.rbs +1234 -385
  283. data/stdlib/forwardable/0/forwardable.rbs +4 -4
  284. data/stdlib/io-console/0/io-console.rbs +82 -17
  285. data/stdlib/ipaddr/0/ipaddr.rbs +11 -6
  286. data/stdlib/json/0/json.rbs +434 -151
  287. data/stdlib/kconv/0/kconv.rbs +166 -0
  288. data/stdlib/logger/0/formatter.rbs +0 -2
  289. data/stdlib/logger/0/log_device.rbs +1 -3
  290. data/stdlib/logger/0/logger.rbs +465 -328
  291. data/stdlib/minitest/0/kernel.rbs +2 -2
  292. data/stdlib/minitest/0/minitest/abstract_reporter.rbs +4 -1
  293. data/stdlib/minitest/0/minitest/assertion.rbs +1 -0
  294. data/stdlib/minitest/0/minitest/assertions.rbs +58 -13
  295. data/stdlib/minitest/0/minitest/backtrace_filter.rbs +7 -0
  296. data/stdlib/minitest/0/minitest/bench_spec.rbs +8 -8
  297. data/stdlib/minitest/0/minitest/benchmark.rbs +17 -16
  298. data/stdlib/minitest/0/minitest/compress.rbs +13 -0
  299. data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
  300. data/stdlib/minitest/0/minitest/mock.rbs +9 -5
  301. data/stdlib/minitest/0/minitest/parallel/executor.rbs +4 -0
  302. data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +0 -1
  303. data/stdlib/minitest/0/minitest/pride_io.rbs +8 -0
  304. data/stdlib/minitest/0/minitest/pride_lol.rbs +2 -0
  305. data/stdlib/minitest/0/minitest/progress_reporter.rbs +1 -1
  306. data/stdlib/minitest/0/minitest/reportable.rbs +2 -0
  307. data/stdlib/minitest/0/minitest/runnable.rbs +33 -1
  308. data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +1 -1
  309. data/stdlib/minitest/0/minitest/spec/dsl.rbs +10 -6
  310. data/stdlib/minitest/0/minitest/spec.rbs +1 -1
  311. data/stdlib/minitest/0/minitest/statistics_reporter.rbs +5 -0
  312. data/stdlib/minitest/0/minitest/summary_reporter.rbs +0 -7
  313. data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +7 -7
  314. data/stdlib/minitest/0/minitest/test.rbs +7 -14
  315. data/stdlib/minitest/0/minitest/unexpected_error.rbs +2 -0
  316. data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
  317. data/stdlib/minitest/0/minitest/unit.rbs +1 -2
  318. data/stdlib/minitest/0/minitest.rbs +41 -892
  319. data/stdlib/monitor/0/monitor.rbs +91 -10
  320. data/stdlib/mutex_m/0/mutex_m.rbs +0 -2
  321. data/stdlib/net-http/0/manifest.yaml +1 -1
  322. data/stdlib/net-http/0/net-http.rbs +3858 -964
  323. data/stdlib/net-protocol/0/manifest.yaml +2 -0
  324. data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
  325. data/stdlib/net-smtp/0/manifest.yaml +2 -0
  326. data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
  327. data/stdlib/nkf/0/nkf.rbs +35 -5
  328. data/stdlib/objspace/0/objspace.rbs +40 -18
  329. data/stdlib/observable/0/observable.rbs +217 -0
  330. data/stdlib/open-uri/0/manifest.yaml +4 -0
  331. data/stdlib/open-uri/0/open-uri.rbs +393 -0
  332. data/stdlib/open3/0/open3.rbs +147 -0
  333. data/stdlib/openssl/0/manifest.yaml +1 -0
  334. data/stdlib/openssl/0/openssl.rbs +681 -316
  335. data/stdlib/optparse/0/optparse.rbs +100 -65
  336. data/stdlib/pathname/0/pathname.rbs +24 -15
  337. data/stdlib/pp/0/manifest.yaml +2 -0
  338. data/stdlib/pp/0/pp.rbs +300 -0
  339. data/stdlib/prettyprint/0/prettyprint.rbs +2 -6
  340. data/stdlib/pstore/0/pstore.rbs +370 -156
  341. data/stdlib/psych/0/core_ext.rbs +12 -0
  342. data/stdlib/{yaml → psych}/0/dbm.rbs +3 -3
  343. data/stdlib/psych/0/manifest.yaml +3 -0
  344. data/stdlib/psych/0/psych.rbs +402 -0
  345. data/stdlib/{yaml → psych}/0/store.rbs +2 -2
  346. data/stdlib/pty/0/pty.rbs +63 -11
  347. data/stdlib/rdoc/0/code_object.rbs +51 -0
  348. data/stdlib/rdoc/0/comment.rbs +59 -0
  349. data/stdlib/rdoc/0/context.rbs +153 -0
  350. data/stdlib/rdoc/0/markup.rbs +117 -0
  351. data/stdlib/rdoc/0/parser.rbs +56 -0
  352. data/stdlib/rdoc/0/rdoc.rbs +13 -380
  353. data/stdlib/rdoc/0/ri.rbs +17 -0
  354. data/stdlib/rdoc/0/store.rbs +48 -0
  355. data/stdlib/rdoc/0/top_level.rbs +97 -0
  356. data/stdlib/resolv/0/resolv.rbs +16 -79
  357. data/stdlib/ripper/0/ripper.rbs +1648 -0
  358. data/stdlib/securerandom/0/securerandom.rbs +7 -2
  359. data/stdlib/shellwords/0/shellwords.rbs +11 -12
  360. data/stdlib/singleton/0/singleton.rbs +0 -3
  361. data/stdlib/socket/0/addrinfo.rbs +13 -18
  362. data/stdlib/socket/0/basic_socket.rbs +5 -10
  363. data/stdlib/socket/0/ip_socket.rbs +0 -2
  364. data/stdlib/socket/0/socket.rbs +77 -46
  365. data/stdlib/socket/0/tcp_server.rbs +0 -5
  366. data/stdlib/socket/0/tcp_socket.rbs +36 -3
  367. data/stdlib/socket/0/udp_socket.rbs +4 -5
  368. data/stdlib/socket/0/unix_server.rbs +0 -5
  369. data/stdlib/socket/0/unix_socket.rbs +2 -4
  370. data/{core/string_io.rbs → stdlib/stringio/0/stringio.rbs} +188 -107
  371. data/stdlib/strscan/0/string_scanner.rbs +1269 -425
  372. data/stdlib/tempfile/0/tempfile.rbs +224 -61
  373. data/stdlib/time/0/time.rbs +48 -35
  374. data/stdlib/timeout/0/timeout.rbs +17 -8
  375. data/stdlib/tmpdir/0/tmpdir.rbs +10 -3
  376. data/stdlib/tsort/0/tsort.rbs +0 -4
  377. data/stdlib/uri/0/common.rbs +271 -144
  378. data/stdlib/uri/0/file.rbs +5 -0
  379. data/stdlib/uri/0/ftp.rbs +1 -1
  380. data/stdlib/uri/0/generic.rbs +26 -22
  381. data/stdlib/uri/0/http.rbs +4 -4
  382. data/stdlib/uri/0/ldap.rbs +1 -1
  383. data/stdlib/uri/0/mailto.rbs +84 -0
  384. data/stdlib/uri/0/rfc2396_parser.rbs +3 -0
  385. data/stdlib/yaml/0/manifest.yaml +1 -2
  386. data/stdlib/yaml/0/yaml.rbs +1 -199
  387. data/stdlib/zlib/0/buf_error.rbs +10 -0
  388. data/stdlib/zlib/0/data_error.rbs +10 -0
  389. data/stdlib/zlib/0/deflate.rbs +210 -0
  390. data/stdlib/zlib/0/error.rbs +20 -0
  391. data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
  392. data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
  393. data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
  394. data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
  395. data/stdlib/zlib/0/gzip_file.rbs +156 -0
  396. data/stdlib/zlib/0/gzip_reader.rbs +293 -0
  397. data/stdlib/zlib/0/gzip_writer.rbs +166 -0
  398. data/stdlib/zlib/0/inflate.rbs +180 -0
  399. data/stdlib/zlib/0/mem_error.rbs +10 -0
  400. data/stdlib/zlib/0/need_dict.rbs +13 -0
  401. data/stdlib/zlib/0/stream_end.rbs +11 -0
  402. data/stdlib/zlib/0/stream_error.rbs +11 -0
  403. data/stdlib/zlib/0/version_error.rbs +11 -0
  404. data/stdlib/zlib/0/zlib.rbs +1 -3
  405. data/stdlib/zlib/0/zstream.rbs +200 -0
  406. data/templates/include/rbs/constants.h.erb +20 -0
  407. data/templates/include/rbs/ruby_objs.h.erb +10 -0
  408. data/templates/src/constants.c.erb +36 -0
  409. data/templates/src/ruby_objs.c.erb +27 -0
  410. data/templates/template.rb +122 -0
  411. metadata +136 -36
  412. data/Gemfile +0 -33
  413. data/Gemfile.lock +0 -118
  414. data/core/deprecated.rbs +0 -9
  415. data/ext/rbs_extension/constants.c +0 -135
  416. data/ext/rbs_extension/ruby_objs.c +0 -525
  417. data/ext/rbs_extension/ruby_objs.h +0 -43
  418. data/lib/rbs/constant_table.rb +0 -167
  419. data/lib/rbs/parser_compat/lexer_error.rb +0 -6
  420. data/lib/rbs/parser_compat/located_value.rb +0 -7
  421. data/lib/rbs/parser_compat/semantics_error.rb +0 -6
  422. data/lib/rbs/parser_compat/syntax_error.rb +0 -6
  423. data/lib/rbs/test/spy.rb +0 -6
  424. data/lib/rbs/type_name_resolver.rb +0 -67
  425. data/sig/constant_table.rbs +0 -30
  426. data/sig/shims/abstract_syntax_tree.rbs +0 -25
  427. data/sig/shims/pp.rbs +0 -3
  428. data/sig/shims/ripper.rbs +0 -8
  429. data/sig/shims.rbs +0 -69
  430. data/sig/type_name_resolver.rbs +0 -26
  431. data/stdlib/minitest/0/manifest.yaml +0 -2
  432. data/stdlib/prime/0/integer-extension.rbs +0 -41
  433. data/stdlib/prime/0/manifest.yaml +0 -2
  434. 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 low-level efficient buffer for input/output. There are three
5
- # ways of using buffer:
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 data using #copy or
8
- # #set_value, #set_string, get data with #get_string;
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::SchedulerInterface#io_read and
21
- # Fiber::SchedulerInterface#io_write.
22
+ # mechanisms like Fiber::Scheduler#io_read and Fiber::Scheduler#io_write and
23
+ # parsing binary protocols.
22
24
  #
23
- # **Examples of usage:**
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
- # buffer = IO::Buffer.for(str)
44
- # # =>
45
- # # #<IO::Buffer 0x00007f3f02be9b18+4 SLICE>
46
- # # ...
47
- # buffer
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
- # buffer.get_string(2) # read content starting from offset 2
53
- # # => "ta"
54
- # buffer.set_string('---', 1) # write content, starting from offset 1
55
- # # => 3
56
- # buffer
57
- # # =>
58
- # # #<IO::Buffer 0x00007f3f02be9b18+4 SLICE>
59
- # # 0x00000000 64 2d 2d 2d d---
60
- # string # original string changed, too
61
- # # => "d---"
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 a frozen
95
- # internal copy of the string is created efficiently and used as the buffer
96
- # source. When a block is provided, the buffer is associated directly with the
97
- # string's internal data and updating the buffer will update the string.
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
- public
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 SLICE>
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 SLICE>
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 SLICE>
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 SLICE>
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 SLICE>
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 data from a source IO::Buffer into the buffer, at `offset`
214
- # using `memcpy`. For copying String instances, see #set_string.
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 data copied
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 data into strings associated with buffer:
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(str)
235
- # buffer.copy(IO::Buffer.for("test"), 5)
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 data which will need place outside of buffer's bounds will
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 exceeds source size! (ArgumentError)
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
- # - external? -> true or false
298
+ # - empty? -> true or false
267
299
  # -->
268
- # If the buffer is _external_, meaning it references from memory which is not
269
- # allocated or mapped by the buffer itself.
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(type, offset) -> numeric
366
+ # - get_value(buffer_type, offset) -> numeric
334
367
  # -->
335
- # Read from buffer a value of `type` at `offset`. `type` should be one of
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
- # Example:
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 allocated in the first place.
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(p1, p2, p3)
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(p1, p2, p3)
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(p1, p2)
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(*args)
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
- # # #<IO::Buffer 0x0000555f5c9a2d50+8 INTERNAL>
560
- # # 0x00000000 00 00 00 02 00 00 00 00
561
- # # ^^ the same as if we'd pass just integer 2
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
- # Raises RuntimeError if the <tt>offset+length<tt> is out of the current
585
- # buffer's bounds.
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
- # # #<IO::Buffer 0x00007fc3d34ebc49+2 SLICE>
593
- # # 0x00000000 65 73 es
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
- # # #<IO::Buffer 0x00007fc3d34ebc49+2 SLICE>
600
- # # 0x00000000 6f 73 os
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
- # # #<IO::Buffer 0x00007fc3d31e2d80+4 SLICE>
606
- # # 0x00000000 74 6f 73 74 tost
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, deallocating the current one.
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 data is accessible.
821
+ # Returns whether the buffer buffer is accessible.
651
822
  #
652
- # A buffer becomes invalid if it is a slice of another buffer which has been
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(p1, p2)
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::Bufer::PAGE_SIZE, the buffer
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
- # # #<IO::Buffer 0x000055b34497ea10+4 INTERNAL>
682
- # # 0x00000000 00 00 00 00 ....
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