rbs 4.1.0.pre.2-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.clang-format +75 -0
- data/.clangd +2 -0
- data/.github/dependabot.yml +24 -0
- data/.github/workflows/bundle-update.yml +63 -0
- data/.github/workflows/c-check.yml +61 -0
- data/.github/workflows/comments.yml +37 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/jruby.yml +67 -0
- data/.github/workflows/milestone.yml +83 -0
- data/.github/workflows/ruby.yml +158 -0
- data/.github/workflows/rust.yml +184 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +39 -0
- data/.github/workflows/wasm.yml +53 -0
- data/.github/workflows/windows.yml +49 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +72 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +2292 -0
- data/COPYING +56 -0
- data/README.md +240 -0
- data/Rakefile +869 -0
- data/Steepfile +53 -0
- data/config.yml +913 -0
- data/core/array.rbs +4142 -0
- data/core/basic_object.rbs +376 -0
- data/core/binding.rbs +148 -0
- data/core/builtin.rbs +278 -0
- data/core/class.rbs +223 -0
- data/core/comparable.rbs +192 -0
- data/core/complex.rbs +812 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +993 -0
- data/core/encoding.rbs +1368 -0
- data/core/enumerable.rbs +2506 -0
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +705 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +682 -0
- data/core/errors.rbs +789 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +570 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2045 -0
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1316 -0
- data/core/gc.rbs +788 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +2183 -0
- data/core/integer.rbs +1374 -0
- data/core/io/buffer.rbs +995 -0
- data/core/io/wait.rbs +48 -0
- data/core/io.rbs +3472 -0
- data/core/kernel.rbs +3172 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +637 -0
- data/core/math.rbs +770 -0
- data/core/method.rbs +422 -0
- data/core/module.rbs +1856 -0
- data/core/nil_class.rbs +210 -0
- data/core/numeric.rbs +832 -0
- data/core/object.rbs +108 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +197 -0
- data/core/pathname.rbs +1322 -0
- data/core/proc.rbs +905 -0
- data/core/process.rbs +2316 -0
- data/core/ractor.rbs +924 -0
- data/core/random.rbs +255 -0
- data/core/range.rbs +1209 -0
- data/core/rational.rbs +502 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +1236 -0
- data/core/rbs/unnamed/env_class.rbs +1214 -0
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +186 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1974 -0
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +809 -0
- data/core/rubygems/basic_specification.rbs +6 -0
- data/core/rubygems/config_file.rbs +38 -0
- data/core/rubygems/dependency_installer.rbs +6 -0
- data/core/rubygems/errors.rbs +109 -0
- data/core/rubygems/installer.rbs +15 -0
- data/core/rubygems/path_support.rbs +6 -0
- data/core/rubygems/platform.rbs +7 -0
- data/core/rubygems/request_set.rbs +49 -0
- data/core/rubygems/requirement.rbs +148 -0
- data/core/rubygems/rubygems.rbs +1105 -0
- data/core/rubygems/source_list.rbs +15 -0
- data/core/rubygems/specification.rbs +23 -0
- data/core/rubygems/stream_ui.rbs +5 -0
- data/core/rubygems/uninstaller.rbs +10 -0
- data/core/rubygems/version.rbs +293 -0
- data/core/set.rbs +751 -0
- data/core/signal.rbs +110 -0
- data/core/string.rbs +5532 -0
- data/core/struct.rbs +668 -0
- data/core/symbol.rbs +482 -0
- data/core/thread.rbs +1826 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1793 -0
- data/core/trace_point.rbs +483 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +337 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +107 -0
- data/docs/aliases.md +79 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/config.md +171 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/encoding.md +56 -0
- data/docs/gem.md +56 -0
- data/docs/inline.md +634 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/rust.md +96 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +940 -0
- data/docs/tools.md +17 -0
- data/docs/type_fingerprint.md +21 -0
- data/docs/wasm_serialization.md +80 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/ast_translation.c +1855 -0
- data/ext/rbs_extension/ast_translation.h +41 -0
- data/ext/rbs_extension/class_constants.c +187 -0
- data/ext/rbs_extension/class_constants.h +104 -0
- data/ext/rbs_extension/compat.h +10 -0
- data/ext/rbs_extension/extconf.rb +40 -0
- data/ext/rbs_extension/legacy_location.c +294 -0
- data/ext/rbs_extension/legacy_location.h +82 -0
- data/ext/rbs_extension/main.c +613 -0
- data/ext/rbs_extension/rbs_extension.h +16 -0
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/ast.h +1047 -0
- data/include/rbs/defines.h +99 -0
- data/include/rbs/lexer.h +207 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +153 -0
- data/include/rbs/serialize.h +39 -0
- data/include/rbs/string.h +47 -0
- data/include/rbs/util/rbs_allocator.h +59 -0
- data/include/rbs/util/rbs_assert.h +20 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +155 -0
- data/include/rbs/util/rbs_encoding.h +282 -0
- data/include/rbs/util/rbs_unescape.h +24 -0
- data/include/rbs.h +14 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +82 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/lib/rbs/annotate.rb +8 -0
- data/lib/rbs/ast/annotation.rb +29 -0
- data/lib/rbs/ast/comment.rb +29 -0
- data/lib/rbs/ast/declarations.rb +472 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/lib/rbs/ast/ruby/declarations.rb +291 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +762 -0
- data/lib/rbs/ast/type_param.rb +235 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +189 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +84 -0
- data/lib/rbs/cli/validate.rb +294 -0
- data/lib/rbs/cli.rb +1253 -0
- data/lib/rbs/collection/cleaner.rb +38 -0
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/lib/rbs/collection/config.rb +81 -0
- data/lib/rbs/collection/installer.rb +32 -0
- data/lib/rbs/collection/sources/base.rb +14 -0
- data/lib/rbs/collection/sources/git.rb +265 -0
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/lib/rbs/collection/sources.rb +38 -0
- data/lib/rbs/collection.rb +16 -0
- data/lib/rbs/constant.rb +28 -0
- data/lib/rbs/definition.rb +415 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +678 -0
- data/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/lib/rbs/definition_builder.rb +1054 -0
- data/lib/rbs/diff.rb +131 -0
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +1028 -0
- data/lib/rbs/environment_loader.rb +167 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +634 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +568 -0
- data/lib/rbs/location_aux.rb +170 -0
- data/lib/rbs/locator.rb +247 -0
- data/lib/rbs/method_type.rb +145 -0
- data/lib/rbs/namespace.rb +154 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +142 -0
- data/lib/rbs/prototype/helpers.rb +197 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +816 -0
- data/lib/rbs/prototype/rbi.rb +625 -0
- data/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
- data/lib/rbs/prototype/runtime.rb +680 -0
- data/lib/rbs/repository.rb +127 -0
- data/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +204 -0
- data/lib/rbs/test/errors.rb +80 -0
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +212 -0
- data/lib/rbs/test/observer.rb +19 -0
- data/lib/rbs/test/setup.rb +84 -0
- data/lib/rbs/test/setup_helper.rb +50 -0
- data/lib/rbs/test/tester.rb +167 -0
- data/lib/rbs/test/type_check.rb +457 -0
- data/lib/rbs/test.rb +112 -0
- data/lib/rbs/type_alias_dependency.rb +100 -0
- data/lib/rbs/type_alias_regularity.rb +126 -0
- data/lib/rbs/type_name.rb +122 -0
- data/lib/rbs/types.rb +1604 -0
- data/lib/rbs/unit_test/convertibles.rb +177 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +186 -0
- data/lib/rbs/variance_calculator.rb +189 -0
- data/lib/rbs/vendorer.rb +71 -0
- data/lib/rbs/version.rb +5 -0
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/jars/asm-analysis.jar +0 -0
- data/lib/rbs/wasm/jars/asm-commons.jar +0 -0
- data/lib/rbs/wasm/jars/asm-tree.jar +0 -0
- data/lib/rbs/wasm/jars/asm-util.jar +0 -0
- data/lib/rbs/wasm/jars/asm.jar +0 -0
- data/lib/rbs/wasm/jars/compiler.jar +0 -0
- data/lib/rbs/wasm/jars/log.jar +0 -0
- data/lib/rbs/wasm/jars/runtime.jar +0 -0
- data/lib/rbs/wasm/jars/wasi.jar +0 -0
- data/lib/rbs/wasm/jars/wasm.jar +0 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/rbs_parser.wasm +0 -0
- data/lib/rbs/wasm/runtime.rb +217 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs/writer.rb +424 -0
- data/lib/rbs.rb +117 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs.gemspec +68 -0
- data/schema/annotation.json +14 -0
- data/schema/comment.json +26 -0
- data/schema/decls.json +326 -0
- data/schema/function.json +87 -0
- data/schema/location.json +56 -0
- data/schema/members.json +266 -0
- data/schema/methodType.json +50 -0
- data/schema/typeParam.json +52 -0
- data/schema/types.json +317 -0
- data/sig/ancestor_builder.rbs +163 -0
- data/sig/ancestor_graph.rbs +60 -0
- data/sig/annotate/annotations.rbs +102 -0
- data/sig/annotate/formatter.rbs +24 -0
- data/sig/annotate/rdoc_annotater.rbs +85 -0
- data/sig/annotate/rdoc_source.rbs +32 -0
- data/sig/annotation.rbs +27 -0
- data/sig/ast/ruby/annotations.rbs +470 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +198 -0
- data/sig/buffer.rbs +108 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +15 -0
- data/sig/cli/validate.rbs +47 -0
- data/sig/cli.rbs +89 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +68 -0
- data/sig/collection/config.rbs +46 -0
- data/sig/collection/installer.rbs +17 -0
- data/sig/collection/sources.rbs +214 -0
- data/sig/collection.rbs +4 -0
- data/sig/comment.rbs +26 -0
- data/sig/constant.rbs +21 -0
- data/sig/declarations.rbs +274 -0
- data/sig/definition.rbs +232 -0
- data/sig/definition_builder.rbs +181 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +286 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +408 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +126 -0
- data/sig/location.rbs +135 -0
- data/sig/locator.rbs +56 -0
- data/sig/manifest.yaml +5 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +89 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +161 -0
- data/sig/parser.rbs +164 -0
- data/sig/prototype/helpers.rbs +29 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +96 -0
- data/sig/prototype/rbi.rbs +75 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +21 -0
- data/sig/rdoc/rbs.rbs +67 -0
- data/sig/repository.rbs +85 -0
- data/sig/resolver/constant_resolver.rbs +92 -0
- data/sig/resolver/context.rbs +34 -0
- data/sig/resolver/type_name_resolver.rbs +61 -0
- data/sig/rewriter.rbs +45 -0
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/enumerable.rbs +5 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +41 -0
- data/sig/source.rbs +48 -0
- data/sig/substitution.rbs +48 -0
- data/sig/subtractor.rbs +37 -0
- data/sig/test/errors.rbs +52 -0
- data/sig/test/guranteed.rbs +9 -0
- data/sig/test/type_check.rbs +19 -0
- data/sig/test.rbs +82 -0
- data/sig/type_alias_dependency.rbs +53 -0
- data/sig/type_alias_regularity.rbs +98 -0
- data/sig/type_param.rbs +115 -0
- data/sig/typename.rbs +89 -0
- data/sig/types.rbs +578 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +22 -0
- data/sig/unit_test/type_assertions.rbs +211 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/util.rbs +9 -0
- data/sig/validator.rbs +63 -0
- data/sig/variance_calculator.rbs +87 -0
- data/sig/vendorer.rbs +51 -0
- data/sig/version.rbs +3 -0
- data/sig/visitor.rbs +47 -0
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/sig/writer.rbs +127 -0
- data/src/ast.c +1628 -0
- data/src/lexer.c +3217 -0
- data/src/lexer.re +155 -0
- data/src/lexstate.c +217 -0
- data/src/location.c +31 -0
- data/src/parser.c +4255 -0
- data/src/serialize.c +958 -0
- data/src/string.c +41 -0
- data/src/util/rbs_allocator.c +162 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +268 -0
- data/src/util/rbs_encoding.c +21308 -0
- data/src/util/rbs_unescape.c +167 -0
- data/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/stdlib/abbrev/0/array.rbs +26 -0
- data/stdlib/base64/0/base64.rbs +355 -0
- data/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +911 -0
- data/stdlib/cgi/0/manifest.yaml +4 -0
- data/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/stdlib/coverage/0/coverage.rbs +266 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1598 -0
- data/stdlib/date/0/date_time.rbs +617 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +187 -0
- data/stdlib/delegate/0/kernel.rbs +47 -0
- data/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/stdlib/digest/0/digest.rbs +687 -0
- data/stdlib/erb/0/erb.rbs +933 -0
- data/stdlib/etc/0/etc.rbs +884 -0
- data/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +436 -0
- data/stdlib/json/0/json.rbs +1963 -0
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +45 -0
- data/stdlib/logger/0/log_device.rbs +100 -0
- data/stdlib/logger/0/logger.rbs +796 -0
- data/stdlib/logger/0/manifest.yaml +2 -0
- data/stdlib/logger/0/period.rbs +17 -0
- data/stdlib/logger/0/severity.rbs +34 -0
- data/stdlib/minitest/0/kernel.rbs +42 -0
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/stdlib/minitest/0/minitest.rbs +115 -0
- data/stdlib/monitor/0/monitor.rbs +363 -0
- data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/stdlib/net-http/0/manifest.yaml +3 -0
- data/stdlib/net-http/0/net-http.rbs +5580 -0
- data/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/stdlib/nkf/0/nkf.rbs +402 -0
- data/stdlib/objspace/0/objspace.rbs +470 -0
- data/stdlib/observable/0/observable.rbs +217 -0
- data/stdlib/open-uri/0/manifest.yaml +4 -0
- data/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/stdlib/open3/0/open3.rbs +606 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12231 -0
- data/stdlib/optparse/0/optparse.rbs +1734 -0
- data/stdlib/pathname/0/pathname.rbs +36 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +301 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +608 -0
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/psych/0/dbm.rbs +237 -0
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +455 -0
- data/stdlib/psych/0/store.rbs +57 -0
- data/stdlib/pty/0/pty.rbs +240 -0
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +52 -0
- data/stdlib/rdoc/0/comment.rbs +61 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/stdlib/rdoc/0/ri.rbs +17 -0
- data/stdlib/rdoc/0/store.rbs +48 -0
- data/stdlib/rdoc/0/top_level.rbs +97 -0
- data/stdlib/resolv/0/manifest.yaml +3 -0
- data/stdlib/resolv/0/resolv.rbs +1787 -0
- data/stdlib/ripper/0/ripper.rbs +1654 -0
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +134 -0
- data/stdlib/socket/0/addrinfo.rbs +666 -0
- data/stdlib/socket/0/basic_socket.rbs +590 -0
- data/stdlib/socket/0/constants.rbs +2295 -0
- data/stdlib/socket/0/ip_socket.rbs +94 -0
- data/stdlib/socket/0/socket.rbs +4170 -0
- data/stdlib/socket/0/socket_error.rbs +5 -0
- data/stdlib/socket/0/tcp_server.rbs +192 -0
- data/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/stdlib/socket/0/udp_socket.rbs +133 -0
- data/stdlib/socket/0/unix_server.rbs +169 -0
- data/stdlib/socket/0/unix_socket.rbs +172 -0
- data/stdlib/stringio/0/stringio.rbs +1681 -0
- data/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/stdlib/time/0/time.rbs +434 -0
- data/stdlib/timeout/0/timeout.rbs +137 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +8 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +410 -0
- data/stdlib/uri/0/common.rbs +621 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1116 -0
- data/stdlib/uri/0/http.rbs +104 -0
- data/stdlib/uri/0/https.rbs +14 -0
- data/stdlib/uri/0/ldap.rbs +230 -0
- data/stdlib/uri/0/ldaps.rbs +14 -0
- data/stdlib/uri/0/mailto.rbs +92 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/stdlib/uri/0/ws.rbs +13 -0
- data/stdlib/uri/0/wss.rbs +9 -0
- data/stdlib/yaml/0/manifest.yaml +2 -0
- data/stdlib/yaml/0/yaml.rbs +1 -0
- data/stdlib/zlib/0/buf_error.rbs +10 -0
- data/stdlib/zlib/0/data_error.rbs +10 -0
- data/stdlib/zlib/0/deflate.rbs +211 -0
- data/stdlib/zlib/0/error.rbs +20 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/stdlib/zlib/0/gzip_writer.rbs +168 -0
- data/stdlib/zlib/0/inflate.rbs +180 -0
- data/stdlib/zlib/0/mem_error.rbs +10 -0
- data/stdlib/zlib/0/need_dict.rbs +13 -0
- data/stdlib/zlib/0/stream_end.rbs +11 -0
- data/stdlib/zlib/0/stream_error.rbs +11 -0
- data/stdlib/zlib/0/version_error.rbs +11 -0
- data/stdlib/zlib/0/zlib.rbs +449 -0
- data/stdlib/zlib/0/zstream.rbs +201 -0
- data/wasm/README.md +59 -0
- data/wasm/rbs_wasm.c +411 -0
- metadata +660 -0
data/src/string.c
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#include "rbs/string.h"
|
|
2
|
+
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
#include <ctype.h>
|
|
7
|
+
|
|
8
|
+
rbs_string_t rbs_string_new(const char *start, const char *end) {
|
|
9
|
+
return (rbs_string_t) {
|
|
10
|
+
.start = start,
|
|
11
|
+
.end = end,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
rbs_string_t rbs_string_strip_whitespace(rbs_string_t *self) {
|
|
16
|
+
const char *new_start = self->start;
|
|
17
|
+
while (isspace(*new_start) && new_start < self->end) {
|
|
18
|
+
new_start++;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (new_start == self->end) { // Handle empty string case
|
|
22
|
+
return rbs_string_new(new_start, new_start);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const char *new_end = self->end - 1;
|
|
26
|
+
while (isspace(*new_end) && new_start < new_end) {
|
|
27
|
+
new_end--;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return rbs_string_new(new_start, new_end + 1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
size_t rbs_string_len(const rbs_string_t self) {
|
|
34
|
+
return self.end - self.start;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
bool rbs_string_equal(const rbs_string_t lhs, const rbs_string_t rhs) {
|
|
38
|
+
if (lhs.start == rhs.start && lhs.end == rhs.end) return true;
|
|
39
|
+
if (rbs_string_len(lhs) != rbs_string_len(rhs)) return false;
|
|
40
|
+
return strncmp(lhs.start, rhs.start, rbs_string_len(lhs)) == 0;
|
|
41
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file rbs_allocator.c
|
|
3
|
+
*
|
|
4
|
+
* A simple arena allocator that can be freed all at once.
|
|
5
|
+
*
|
|
6
|
+
* This allocator maintains a linked list of pages, which come in two flavours:
|
|
7
|
+
* 1. Small allocation pages, which are the same size as the system page size.
|
|
8
|
+
* 2. Large allocation pages, which are the exact size requested, for sizes greater than the small page size.
|
|
9
|
+
*
|
|
10
|
+
* Small allocations always fit into the unused space at the end of the "head" page. If there isn't enough room, a new
|
|
11
|
+
* page is allocated, and the small allocation is placed at its start. This approach wastes that unused slack at the
|
|
12
|
+
* end of the previous page, but it means that allocations are instant and never scan the linked list to find a gap.
|
|
13
|
+
*
|
|
14
|
+
* This allocator doesn't support freeing individual allocations. Only the whole arena can be freed at once at the end.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include "rbs/util/rbs_allocator.h"
|
|
18
|
+
#include "rbs/util/rbs_assert.h"
|
|
19
|
+
|
|
20
|
+
#include <stdlib.h>
|
|
21
|
+
#include <string.h> // for memset()
|
|
22
|
+
#include <stdint.h>
|
|
23
|
+
#include <inttypes.h>
|
|
24
|
+
|
|
25
|
+
#ifdef _WIN32
|
|
26
|
+
#include <windows.h>
|
|
27
|
+
#else
|
|
28
|
+
#include <unistd.h> // for sysconf()
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
typedef struct rbs_allocator_page {
|
|
32
|
+
// The previously allocated page, or NULL if this is the first page.
|
|
33
|
+
struct rbs_allocator_page *next;
|
|
34
|
+
|
|
35
|
+
// The size of the payload in bytes.
|
|
36
|
+
size_t size;
|
|
37
|
+
|
|
38
|
+
// The offset of the next available byte.
|
|
39
|
+
size_t used;
|
|
40
|
+
} rbs_allocator_page_t;
|
|
41
|
+
|
|
42
|
+
static size_t get_system_page_size(void) {
|
|
43
|
+
#ifdef _WIN32
|
|
44
|
+
SYSTEM_INFO si;
|
|
45
|
+
GetSystemInfo(&si);
|
|
46
|
+
return si.dwPageSize;
|
|
47
|
+
#else
|
|
48
|
+
long sz = sysconf(_SC_PAGESIZE);
|
|
49
|
+
if (sz == -1) return 4096; // Fallback to the common 4KB page size
|
|
50
|
+
return (size_t) sz;
|
|
51
|
+
#endif
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static inline uintptr_t rbs_align_up_uintptr(uintptr_t value, size_t alignment) {
|
|
55
|
+
// alignment must be a non-zero power of two
|
|
56
|
+
RBS_ASSERT(alignment != 0 && (alignment & (alignment - 1)) == 0, "alignment must be a non-zero power of two. alignment: %zu", alignment);
|
|
57
|
+
return (value + (alignment - 1)) & ~(uintptr_t) (alignment - 1);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static rbs_allocator_page_t *rbs_allocator_page_new(size_t payload_size) {
|
|
61
|
+
const size_t page_header_size = sizeof(rbs_allocator_page_t);
|
|
62
|
+
|
|
63
|
+
rbs_allocator_page_t *page = (rbs_allocator_page_t *) malloc(page_header_size + payload_size);
|
|
64
|
+
page->size = payload_size;
|
|
65
|
+
page->used = 0;
|
|
66
|
+
|
|
67
|
+
return page;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
rbs_allocator_t *rbs_allocator_init(void) {
|
|
71
|
+
rbs_allocator_t *allocator = (rbs_allocator_t *) malloc(sizeof(rbs_allocator_t));
|
|
72
|
+
|
|
73
|
+
const size_t system_page_size = get_system_page_size();
|
|
74
|
+
|
|
75
|
+
allocator->default_page_payload_size = system_page_size - sizeof(rbs_allocator_page_t);
|
|
76
|
+
|
|
77
|
+
allocator->page = rbs_allocator_page_new(allocator->default_page_payload_size);
|
|
78
|
+
allocator->page->next = NULL;
|
|
79
|
+
|
|
80
|
+
return allocator;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void rbs_allocator_free(rbs_allocator_t *allocator) {
|
|
84
|
+
rbs_allocator_page_t *page = allocator->page;
|
|
85
|
+
while (page) {
|
|
86
|
+
rbs_allocator_page_t *next = page->next;
|
|
87
|
+
free(page);
|
|
88
|
+
page = next;
|
|
89
|
+
}
|
|
90
|
+
free(allocator);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Allocates `new_size` bytes from `allocator`, aligned to an `alignment`-byte boundary.
|
|
94
|
+
// Copies `old_size` bytes from `ptr` to the new allocation.
|
|
95
|
+
// It always reallocates the memory in new space and thus wastes the old space.
|
|
96
|
+
void *rbs_allocator_realloc_impl(rbs_allocator_t *allocator, void *ptr, size_t old_size, size_t new_size, size_t alignment) {
|
|
97
|
+
void *p = rbs_allocator_malloc_impl(allocator, new_size, alignment);
|
|
98
|
+
memcpy(p, ptr, old_size);
|
|
99
|
+
return p;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Allocates `size` bytes from `allocator`, aligned to an `alignment`-byte boundary.
|
|
103
|
+
void *rbs_allocator_malloc_impl(rbs_allocator_t *allocator, size_t size, size_t alignment) {
|
|
104
|
+
if (allocator->default_page_payload_size < size) { // Big allocation, give it its own page.
|
|
105
|
+
// Add padding to ensure we can align the start pointer within this page
|
|
106
|
+
rbs_allocator_page_t *new_page = rbs_allocator_page_new(size + (alignment - 1));
|
|
107
|
+
|
|
108
|
+
// This simple allocator can only put small allocations into the head page.
|
|
109
|
+
// Naively prepending this large allocation page to the head of the allocator before the previous head page
|
|
110
|
+
// would waste the remaining space in the head page.
|
|
111
|
+
// So instead, we'll splice in the large page *after* the head page.
|
|
112
|
+
//
|
|
113
|
+
// +-------+ +-----------+ +-----------+
|
|
114
|
+
// | arena | | head page | | new_page |
|
|
115
|
+
// |-------| |-----------+ |-----------+
|
|
116
|
+
// | *page |--->| size | +--->| size | +---> ... previous tail
|
|
117
|
+
// +-------+ | offset | | | offset | |
|
|
118
|
+
// | *next ----+---+ | *next ----+---+
|
|
119
|
+
// | ... | | ... |
|
|
120
|
+
// +-----------+ +-----------+
|
|
121
|
+
//
|
|
122
|
+
new_page->next = allocator->page->next;
|
|
123
|
+
allocator->page->next = new_page;
|
|
124
|
+
|
|
125
|
+
uintptr_t base = (uintptr_t) new_page + sizeof(rbs_allocator_page_t);
|
|
126
|
+
uintptr_t aligned_ptr = rbs_align_up_uintptr(base, alignment);
|
|
127
|
+
return (void *) aligned_ptr;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
rbs_allocator_page_t *page = allocator->page;
|
|
131
|
+
uintptr_t base = (uintptr_t) page + sizeof(rbs_allocator_page_t);
|
|
132
|
+
|
|
133
|
+
// Compute aligned offset within the payload
|
|
134
|
+
size_t used_aligned = (size_t) (rbs_align_up_uintptr(base + page->used, alignment) - base);
|
|
135
|
+
|
|
136
|
+
if (used_aligned + size > page->size) {
|
|
137
|
+
// Not enough space. Allocate a new small page and prepend it to the allocator's linked list.
|
|
138
|
+
rbs_allocator_page_t *new_page = rbs_allocator_page_new(allocator->default_page_payload_size);
|
|
139
|
+
new_page->next = allocator->page;
|
|
140
|
+
allocator->page = new_page;
|
|
141
|
+
page = new_page;
|
|
142
|
+
base = (uintptr_t) page + sizeof(rbs_allocator_page_t);
|
|
143
|
+
used_aligned = (size_t) (rbs_align_up_uintptr(base, alignment) - base); // start of fresh page (usually 0 if header is aligned)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
uintptr_t pointer = base + used_aligned;
|
|
147
|
+
page->used = used_aligned + size;
|
|
148
|
+
return (void *) pointer;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Note: This will eagerly fill with zeroes, unlike `calloc()` which can map a page in a page to be zeroed lazily.
|
|
152
|
+
// It's assumed that callers to this function will immediately write to the allocated memory, anyway.
|
|
153
|
+
void *rbs_allocator_calloc_impl(rbs_allocator_t *allocator, size_t count, size_t size, size_t alignment) {
|
|
154
|
+
void *p = rbs_allocator_malloc_many_impl(allocator, count, size, alignment);
|
|
155
|
+
memset(p, 0, count * size);
|
|
156
|
+
return p;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Similar to `rbs_allocator_malloc_impl()`, but allocates `count` instances of `size` bytes, aligned to an `alignment`-byte boundary.
|
|
160
|
+
void *rbs_allocator_malloc_many_impl(rbs_allocator_t *allocator, size_t count, size_t size, size_t alignment) {
|
|
161
|
+
return rbs_allocator_malloc_impl(allocator, count * size, alignment);
|
|
162
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#include "rbs/util/rbs_assert.h"
|
|
2
|
+
|
|
3
|
+
#include <stdarg.h>
|
|
4
|
+
#include <stdio.h>
|
|
5
|
+
#include <stdlib.h>
|
|
6
|
+
#include <stdbool.h>
|
|
7
|
+
|
|
8
|
+
void rbs_assert_impl(bool condition, const char *fmt, ...) {
|
|
9
|
+
if (condition) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
va_list args;
|
|
14
|
+
va_start(args, fmt);
|
|
15
|
+
vfprintf(stderr, fmt, args);
|
|
16
|
+
va_end(args);
|
|
17
|
+
fprintf(stderr, "\n");
|
|
18
|
+
exit(EXIT_FAILURE);
|
|
19
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#include "rbs/util/rbs_buffer.h"
|
|
2
|
+
#include "rbs/util/rbs_assert.h"
|
|
3
|
+
|
|
4
|
+
bool rbs_buffer_init(rbs_allocator_t *allocator, rbs_buffer_t *buffer) {
|
|
5
|
+
size_t capacity = RBS_BUFFER_DEFAULT_CAPACITY;
|
|
6
|
+
|
|
7
|
+
buffer->length = 0;
|
|
8
|
+
buffer->capacity = capacity;
|
|
9
|
+
|
|
10
|
+
buffer->value = rbs_allocator_calloc(allocator, capacity, char);
|
|
11
|
+
return buffer->value != NULL;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
char *rbs_buffer_value(const rbs_buffer_t *buffer) {
|
|
15
|
+
return buffer->value;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
size_t rbs_buffer_length(const rbs_buffer_t *buffer) {
|
|
19
|
+
return buffer->length;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
void rbs_buffer_append_string(rbs_allocator_t *allocator, rbs_buffer_t *buffer, const char *source, size_t length) {
|
|
23
|
+
size_t next_length = buffer->length + length;
|
|
24
|
+
|
|
25
|
+
if (next_length > buffer->capacity) {
|
|
26
|
+
size_t old_capacity = buffer->capacity;
|
|
27
|
+
|
|
28
|
+
RBS_ASSERT(old_capacity != 0, "Precondition: capacity must be at least 1. Got %zu", old_capacity);
|
|
29
|
+
|
|
30
|
+
size_t new_capacity = buffer->capacity * 2;
|
|
31
|
+
|
|
32
|
+
while (next_length > new_capacity) {
|
|
33
|
+
new_capacity *= 2;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
char *new_value = rbs_allocator_realloc(allocator, buffer->value, old_capacity, new_capacity, char);
|
|
37
|
+
RBS_ASSERT(new_value != NULL, "Failed to append to buffer. Old capacity: %zu, new capacity: %zu", old_capacity, new_capacity);
|
|
38
|
+
|
|
39
|
+
buffer->value = new_value;
|
|
40
|
+
buffer->capacity = new_capacity;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
size_t cursor = buffer->length;
|
|
44
|
+
buffer->length = next_length;
|
|
45
|
+
memcpy(buffer->value + cursor, source, length);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void rbs_buffer_append_cstr(rbs_allocator_t *allocator, rbs_buffer_t *buffer, const char *value) {
|
|
49
|
+
rbs_buffer_append_string(allocator, buffer, value, strlen(value));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
rbs_string_t rbs_buffer_to_string(rbs_buffer_t *buffer) {
|
|
53
|
+
return rbs_string_new(buffer->value, buffer->value + buffer->length);
|
|
54
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
#include "rbs/util/rbs_constant_pool.h"
|
|
2
|
+
#include "rbs/util/rbs_assert.h"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A relatively simple hash function (djb2) that is used to hash strings. We are
|
|
6
|
+
* optimizing here for simplicity and speed.
|
|
7
|
+
*/
|
|
8
|
+
static inline uint32_t
|
|
9
|
+
rbs_constant_pool_hash(const uint8_t *start, size_t length) {
|
|
10
|
+
// This is a prime number used as the initial value for the hash function.
|
|
11
|
+
uint32_t value = 5381;
|
|
12
|
+
|
|
13
|
+
for (size_t index = 0; index < length; index++) {
|
|
14
|
+
value = ((value << 5) + value) + start[index];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
|
|
22
|
+
*/
|
|
23
|
+
static uint32_t
|
|
24
|
+
next_power_of_two(uint32_t v) {
|
|
25
|
+
// Avoid underflow in subtraction on next line.
|
|
26
|
+
if (v == 0) {
|
|
27
|
+
// 1 is the nearest power of 2 to 0 (2^0)
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
v--;
|
|
31
|
+
v |= v >> 1;
|
|
32
|
+
v |= v >> 2;
|
|
33
|
+
v |= v >> 4;
|
|
34
|
+
v |= v >> 8;
|
|
35
|
+
v |= v >> 16;
|
|
36
|
+
v++;
|
|
37
|
+
return v;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
RBS_ATTRIBUTE_UNUSED static bool is_power_of_two(uint32_t size) {
|
|
41
|
+
return (size & (size - 1)) == 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resize a constant pool to a given capacity.
|
|
46
|
+
*/
|
|
47
|
+
static inline bool
|
|
48
|
+
rbs_constant_pool_resize(rbs_constant_pool_t *pool) {
|
|
49
|
+
RBS_ASSERT(is_power_of_two(pool->capacity), "pool->capacity is not a power of two. Got %i", pool->capacity);
|
|
50
|
+
|
|
51
|
+
uint32_t next_capacity = pool->capacity * 2;
|
|
52
|
+
if (next_capacity < pool->capacity) return false;
|
|
53
|
+
|
|
54
|
+
const uint32_t mask = next_capacity - 1;
|
|
55
|
+
const size_t element_size = sizeof(rbs_constant_pool_bucket_t) + sizeof(rbs_constant_t);
|
|
56
|
+
|
|
57
|
+
void *next = calloc(next_capacity, element_size);
|
|
58
|
+
if (next == NULL) return false;
|
|
59
|
+
|
|
60
|
+
rbs_constant_pool_bucket_t *next_buckets = (rbs_constant_pool_bucket_t *) next;
|
|
61
|
+
rbs_constant_t *next_constants = (rbs_constant_t *) (((char *) next) + next_capacity * sizeof(rbs_constant_pool_bucket_t));
|
|
62
|
+
|
|
63
|
+
// For each bucket in the current constant pool, find the index in the
|
|
64
|
+
// next constant pool, and insert it.
|
|
65
|
+
for (uint32_t index = 0; index < pool->capacity; index++) {
|
|
66
|
+
rbs_constant_pool_bucket_t *bucket = &pool->buckets[index];
|
|
67
|
+
|
|
68
|
+
// If an id is set on this constant, then we know we have content here.
|
|
69
|
+
// In this case we need to insert it into the next constant pool.
|
|
70
|
+
if (bucket->id != RBS_CONSTANT_ID_UNSET) {
|
|
71
|
+
uint32_t next_index = bucket->hash & mask;
|
|
72
|
+
|
|
73
|
+
// This implements linear scanning to find the next available slot
|
|
74
|
+
// in case this index is already taken. We don't need to bother
|
|
75
|
+
// comparing the values since we know that the hash is unique.
|
|
76
|
+
while (next_buckets[next_index].id != RBS_CONSTANT_ID_UNSET) {
|
|
77
|
+
next_index = (next_index + 1) & mask;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Here we copy over the entire bucket, which includes the id so
|
|
81
|
+
// that they are consistent between resizes.
|
|
82
|
+
next_buckets[next_index] = *bucket;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The constants are stable with respect to hash table resizes.
|
|
87
|
+
memcpy(next_constants, pool->constants, pool->size * sizeof(rbs_constant_t));
|
|
88
|
+
|
|
89
|
+
// pool->constants and pool->buckets are allocated out of the same chunk
|
|
90
|
+
// of memory, with the buckets coming first.
|
|
91
|
+
free(pool->buckets);
|
|
92
|
+
pool->constants = next_constants;
|
|
93
|
+
pool->buckets = next_buckets;
|
|
94
|
+
pool->capacity = next_capacity;
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Initialize a new constant pool with a given capacity.
|
|
100
|
+
*/
|
|
101
|
+
bool rbs_constant_pool_init(rbs_constant_pool_t *pool, uint32_t capacity) {
|
|
102
|
+
const uint32_t maximum = (~((uint32_t) 0));
|
|
103
|
+
if (capacity >= ((maximum / 2) + 1)) return false;
|
|
104
|
+
|
|
105
|
+
capacity = next_power_of_two(capacity);
|
|
106
|
+
const size_t element_size = sizeof(rbs_constant_pool_bucket_t) + sizeof(rbs_constant_t);
|
|
107
|
+
void *memory = calloc(capacity, element_size);
|
|
108
|
+
if (memory == NULL) return false;
|
|
109
|
+
|
|
110
|
+
pool->buckets = (rbs_constant_pool_bucket_t *) memory;
|
|
111
|
+
pool->constants = (rbs_constant_t *) (((char *) memory) + capacity * sizeof(rbs_constant_pool_bucket_t));
|
|
112
|
+
pool->size = 0;
|
|
113
|
+
pool->capacity = capacity;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Return a pointer to the constant indicated by the given constant id.
|
|
119
|
+
*/
|
|
120
|
+
rbs_constant_t *
|
|
121
|
+
rbs_constant_pool_id_to_constant(const rbs_constant_pool_t *pool, rbs_constant_id_t constant_id) {
|
|
122
|
+
RBS_ASSERT(constant_id != RBS_CONSTANT_ID_UNSET && constant_id <= pool->size, "constant_id is not valid. Got %i, pool->size: %i", constant_id, pool->size);
|
|
123
|
+
return &pool->constants[constant_id - 1];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Find a constant in a constant pool. Returns the id of the constant, or 0 if
|
|
128
|
+
* the constant is not found.
|
|
129
|
+
*/
|
|
130
|
+
rbs_constant_id_t
|
|
131
|
+
rbs_constant_pool_find(const rbs_constant_pool_t *pool, const uint8_t *start, size_t length) {
|
|
132
|
+
RBS_ASSERT(is_power_of_two(pool->capacity), "pool->capacity is not a power of two. Got %i", pool->capacity);
|
|
133
|
+
const uint32_t mask = pool->capacity - 1;
|
|
134
|
+
|
|
135
|
+
uint32_t hash = rbs_constant_pool_hash(start, length);
|
|
136
|
+
uint32_t index = hash & mask;
|
|
137
|
+
rbs_constant_pool_bucket_t *bucket;
|
|
138
|
+
|
|
139
|
+
while (bucket = &pool->buckets[index], bucket->id != RBS_CONSTANT_ID_UNSET) {
|
|
140
|
+
rbs_constant_t *constant = &pool->constants[bucket->id - 1];
|
|
141
|
+
if ((constant->length == length) && memcmp(constant->start, start, length) == 0) {
|
|
142
|
+
return bucket->id;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
index = (index + 1) & mask;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return RBS_CONSTANT_ID_UNSET;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Insert a constant into a constant pool and return its index in the pool.
|
|
153
|
+
*/
|
|
154
|
+
static inline rbs_constant_id_t
|
|
155
|
+
rbs_constant_pool_insert(rbs_constant_pool_t *pool, const uint8_t *start, size_t length, rbs_constant_pool_bucket_type_t type) {
|
|
156
|
+
if (pool->size >= (pool->capacity / 4 * 3)) {
|
|
157
|
+
if (!rbs_constant_pool_resize(pool)) return RBS_CONSTANT_ID_UNSET;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
RBS_ASSERT(is_power_of_two(pool->capacity), "pool->capacity is not a power of two. Got %i", pool->capacity);
|
|
161
|
+
const uint32_t mask = pool->capacity - 1;
|
|
162
|
+
|
|
163
|
+
uint32_t hash = rbs_constant_pool_hash(start, length);
|
|
164
|
+
uint32_t index = hash & mask;
|
|
165
|
+
rbs_constant_pool_bucket_t *bucket;
|
|
166
|
+
|
|
167
|
+
while (bucket = &pool->buckets[index], bucket->id != RBS_CONSTANT_ID_UNSET) {
|
|
168
|
+
// If there is a collision, then we need to check if the content is the
|
|
169
|
+
// same as the content we are trying to insert. If it is, then we can
|
|
170
|
+
// return the id of the existing constant.
|
|
171
|
+
rbs_constant_t *constant = &pool->constants[bucket->id - 1];
|
|
172
|
+
|
|
173
|
+
if ((constant->length == length) && memcmp(constant->start, start, length) == 0) {
|
|
174
|
+
// Since we have found a match, we need to check if this is
|
|
175
|
+
// attempting to insert a shared or an owned constant. We want to
|
|
176
|
+
// prefer shared constants since they don't require allocations.
|
|
177
|
+
if (type == RBS_CONSTANT_POOL_BUCKET_OWNED) {
|
|
178
|
+
// If we're attempting to insert an owned constant and we have
|
|
179
|
+
// an existing constant, then either way we don't want the given
|
|
180
|
+
// memory. Either it's duplicated with the existing constant or
|
|
181
|
+
// it's not necessary because we have a shared version.
|
|
182
|
+
free((void *) start);
|
|
183
|
+
} else if (bucket->type == RBS_CONSTANT_POOL_BUCKET_OWNED) {
|
|
184
|
+
// If we're attempting to insert a shared constant and the
|
|
185
|
+
// existing constant is owned, then we can free the owned
|
|
186
|
+
// constant and replace it with the shared constant.
|
|
187
|
+
free((void *) constant->start);
|
|
188
|
+
constant->start = start;
|
|
189
|
+
bucket->type = (unsigned int) (RBS_CONSTANT_POOL_BUCKET_DEFAULT & 0x3);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return bucket->id;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
index = (index + 1) & mask;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// IDs are allocated starting at 1, since the value 0 denotes a non-existent
|
|
199
|
+
// constant.
|
|
200
|
+
uint32_t id = ++pool->size;
|
|
201
|
+
RBS_ASSERT(pool->size < ((uint32_t) (1 << 30)), "pool->size is too large. Got %i", pool->size);
|
|
202
|
+
|
|
203
|
+
*bucket = (rbs_constant_pool_bucket_t) {
|
|
204
|
+
.id = (unsigned int) (id & 0x3fffffff),
|
|
205
|
+
.type = (unsigned int) (type & 0x3),
|
|
206
|
+
.hash = hash
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
pool->constants[id - 1] = (rbs_constant_t) {
|
|
210
|
+
.start = start,
|
|
211
|
+
.length = length,
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
return id;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Insert a constant into a constant pool. Returns the id of the constant, or
|
|
219
|
+
* RBS_CONSTANT_ID_UNSET if any potential calls to resize fail.
|
|
220
|
+
*/
|
|
221
|
+
rbs_constant_id_t
|
|
222
|
+
rbs_constant_pool_insert_shared(rbs_constant_pool_t *pool, const uint8_t *start, size_t length) {
|
|
223
|
+
return rbs_constant_pool_insert(pool, start, length, RBS_CONSTANT_POOL_BUCKET_DEFAULT);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
rbs_constant_id_t
|
|
227
|
+
rbs_constant_pool_insert_shared_with_encoding(rbs_constant_pool_t *pool, const uint8_t *start, size_t length, const rbs_encoding_t *encoding) {
|
|
228
|
+
return rbs_constant_pool_insert_shared(pool, start, length);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Insert a constant into a constant pool from memory that is now owned by the
|
|
233
|
+
* constant pool. Returns the id of the constant, or RBS_CONSTANT_ID_UNSET if any
|
|
234
|
+
* potential calls to resize fail.
|
|
235
|
+
*/
|
|
236
|
+
rbs_constant_id_t
|
|
237
|
+
rbs_constant_pool_insert_owned(rbs_constant_pool_t *pool, uint8_t *start, size_t length) {
|
|
238
|
+
return rbs_constant_pool_insert(pool, start, length, RBS_CONSTANT_POOL_BUCKET_OWNED);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Insert a constant into a constant pool from memory that is constant. Returns
|
|
243
|
+
* the id of the constant, or RBS_CONSTANT_ID_UNSET if any potential calls to
|
|
244
|
+
* resize fail.
|
|
245
|
+
*/
|
|
246
|
+
rbs_constant_id_t
|
|
247
|
+
rbs_constant_pool_insert_constant(rbs_constant_pool_t *pool, const uint8_t *start, size_t length) {
|
|
248
|
+
return rbs_constant_pool_insert(pool, start, length, RBS_CONSTANT_POOL_BUCKET_CONSTANT);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Free the memory associated with a constant pool.
|
|
253
|
+
*/
|
|
254
|
+
void rbs_constant_pool_free(rbs_constant_pool_t *pool) {
|
|
255
|
+
// For each constant in the current constant pool, free the contents if the
|
|
256
|
+
// contents are owned.
|
|
257
|
+
for (uint32_t index = 0; index < pool->capacity; index++) {
|
|
258
|
+
rbs_constant_pool_bucket_t *bucket = &pool->buckets[index];
|
|
259
|
+
|
|
260
|
+
// If an id is set on this constant, then we know we have content here.
|
|
261
|
+
if (bucket->id != RBS_CONSTANT_ID_UNSET && bucket->type == RBS_CONSTANT_POOL_BUCKET_OWNED) {
|
|
262
|
+
rbs_constant_t *constant = &pool->constants[bucket->id - 1];
|
|
263
|
+
free((void *) constant->start);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
free(pool->buckets);
|
|
268
|
+
}
|