diff --git a/.github/workflows/check_sast.yml b/.github/workflows/check_sast.yml index 091f98ef342d10..6fd1be6542cf28 100644 --- a/.github/workflows/check_sast.yml +++ b/.github/workflows/check_sast.yml @@ -92,7 +92,7 @@ jobs: output: sarif-results - name: filter-sarif - uses: advanced-security/filter-sarif@2da736ff05ef065cb2894ac6892e47b5eac2c3c0 # v1.1.0.1.1 + uses: advanced-security/filter-sarif@2da736ff05ef065cb2894ac6892e47b5eac2c3c0 # v1.1 with: patterns: | +**/*.rb @@ -100,6 +100,7 @@ jobs: -lib/uri/rfc3986_parser.rb:rb/overly-large-range -lib/bundler/vendor/uri/lib/uri/mailto.rb:rb/overly-large-range -lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb:rb/overly-large-range + -spec/ruby/core/regexp/timeout_spec.rb:rb/redos -test/ruby/test_io.rb:rb/non-constant-kernel-open -test/open-uri/test_open-uri.rb:rb/non-constant-kernel-open -test/open-uri/test_ssl.rb:rb/non-constant-kernel-open @@ -115,7 +116,7 @@ jobs: continue-on-error: true - name: filter-sarif - uses: advanced-security/filter-sarif@2da736ff05ef065cb2894ac6892e47b5eac2c3c0 # v1.1.0.1.1 + uses: advanced-security/filter-sarif@2da736ff05ef065cb2894ac6892e47b5eac2c3c0 # v1.1 with: patterns: | +**/*.c diff --git a/.github/workflows/tarball-macos.yml b/.github/workflows/tarball-macos.yml index 961f6fdc42aa4b..9bec94d52804bf 100644 --- a/.github/workflows/tarball-macos.yml +++ b/.github/workflows/tarball-macos.yml @@ -12,6 +12,14 @@ on: required: false type: boolean default: false + secrets: + SIMPLER_ALERTS_URL: + required: false + SNAPSHOT_SLACK_WEBHOOK_URL: + required: false + +permissions: + contents: read jobs: macos: diff --git a/.github/workflows/tarball-non-development.yml b/.github/workflows/tarball-non-development.yml index 154d204a2cf2c9..db6230b301dd9c 100644 --- a/.github/workflows/tarball-non-development.yml +++ b/.github/workflows/tarball-non-development.yml @@ -3,6 +3,9 @@ name: tarball-non-development (reusable) on: workflow_call: {} +permissions: + contents: read + jobs: non_development: strategy: diff --git a/.github/workflows/tarball-test.yml b/.github/workflows/tarball-test.yml index e99c4515c8ad52..52c4d31fc81f2b 100644 --- a/.github/workflows/tarball-test.yml +++ b/.github/workflows/tarball-test.yml @@ -50,6 +50,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 1 # actions/checkout fetches all heads/tags unless > 0 + persist-credentials: false # tool/make-snapshot derives the branch name from HEAD and looks up # the upstream during ChangeLog generation. Detached checkouts # (pull_request, merge_group) lack a local branch with tracking, so @@ -73,7 +74,9 @@ jobs: with: archname: snapshot-${{ needs.tarball.outputs.branch }} notify-release-channel: ${{ github.event_name == 'workflow_dispatch' && inputs.notify-release-channel || false }} - secrets: inherit + secrets: + SIMPLER_ALERTS_URL: ${{ secrets.SIMPLER_ALERTS_URL }} + SNAPSHOT_SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }} macos: needs: tarball @@ -82,7 +85,9 @@ jobs: with: archname: snapshot-${{ needs.tarball.outputs.branch }} notify-release-channel: ${{ github.event_name == 'workflow_dispatch' && inputs.notify-release-channel || false }} - secrets: inherit + secrets: + SIMPLER_ALERTS_URL: ${{ secrets.SIMPLER_ALERTS_URL }} + SNAPSHOT_SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }} windows: needs: tarball @@ -91,9 +96,10 @@ jobs: with: archname: snapshot-${{ needs.tarball.outputs.branch }} notify-release-channel: ${{ github.event_name == 'workflow_dispatch' && inputs.notify-release-channel || false }} - secrets: inherit + secrets: + SIMPLER_ALERTS_URL: ${{ secrets.SIMPLER_ALERTS_URL }} + SNAPSHOT_SLACK_WEBHOOK_URL: ${{ secrets.SNAPSHOT_SLACK_WEBHOOK_URL }} non_development: needs: tarball uses: ./.github/workflows/tarball-non-development.yml - secrets: inherit diff --git a/.github/workflows/tarball-ubuntu.yml b/.github/workflows/tarball-ubuntu.yml index f0e773b5269a60..03f2f946b5a630 100644 --- a/.github/workflows/tarball-ubuntu.yml +++ b/.github/workflows/tarball-ubuntu.yml @@ -12,6 +12,14 @@ on: required: false type: boolean default: false + secrets: + SIMPLER_ALERTS_URL: + required: false + SNAPSHOT_SLACK_WEBHOOK_URL: + required: false + +permissions: + contents: read jobs: ubuntu: diff --git a/.github/workflows/tarball-windows.yml b/.github/workflows/tarball-windows.yml index 1cd4ef454d3830..1ce95de6fcbb87 100644 --- a/.github/workflows/tarball-windows.yml +++ b/.github/workflows/tarball-windows.yml @@ -12,6 +12,14 @@ on: required: false type: boolean default: false + secrets: + SIMPLER_ALERTS_URL: + required: false + SNAPSHOT_SLACK_WEBHOOK_URL: + required: false + +permissions: + contents: read jobs: windows: diff --git a/.github/zizmor.yml b/.github/zizmor.yml index 53112a28156bba..65b67fb6c8eb04 100644 --- a/.github/zizmor.yml +++ b/.github/zizmor.yml @@ -13,6 +13,7 @@ rules: misfeature: ignore: - mingw.yml + - tarball-windows.yml - windows.yml unpinned-images: ignore: diff --git a/ext/date/date_core.c b/ext/date/date_core.c index 6295264a3d7f52..72d697c8ea233e 100644 --- a/ext/date/date_core.c +++ b/ext/date/date_core.c @@ -27,7 +27,7 @@ static VALUE eDateError; static VALUE half_days_in_day, day_in_nanoseconds; static double positive_inf, negative_inf; -// used by deconstruct_keys +/* used by deconstruct_keys */ static VALUE sym_year, sym_month, sym_day, sym_yday, sym_wday; static VALUE sym_hour, sym_min, sym_sec, sym_sec_fraction, sym_zone; @@ -4528,6 +4528,7 @@ date_s__strptime_internal(int argc, VALUE *argv, VALUE klass, rb_scan_args(argc, argv, "11", &vstr, &vfmt); StringValue(vstr); + if (argc > 1) StringValue(vfmt); if (!rb_enc_str_asciicompat_p(vstr)) rb_raise(rb_eArgError, "string should have ASCII compatible encoding"); @@ -4538,7 +4539,6 @@ date_s__strptime_internal(int argc, VALUE *argv, VALUE klass, flen = strlen(default_fmt); } else { - StringValue(vfmt); if (!rb_enc_str_asciicompat_p(vfmt)) rb_raise(rb_eArgError, "format should have ASCII compatible encoding"); diff --git a/ext/date/date_strptime.c b/ext/date/date_strptime.c index f1c8201de8803c..1dde5fa3ec93b5 100644 --- a/ext/date/date_strptime.c +++ b/ext/date/date_strptime.c @@ -661,6 +661,9 @@ date__strptime(const char *str, size_t slen, si = date__strptime_internal(str, slen, fmt, flen, hash); + if (fail_p()) + return Qnil; + if (slen > si) { VALUE s; @@ -668,9 +671,6 @@ date__strptime(const char *str, size_t slen, set_hash("leftover", s); } - if (fail_p()) - return Qnil; - cent = del_hash("_cent"); if (!NIL_P(cent)) { VALUE year; diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 9260712c9a481b..110b5f6b323864 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -1581,7 +1581,7 @@ static VALUE cState_max_nesting(VALUE self) static long long_config(VALUE num) { - return RTEST(num) ? FIX2LONG(num) : 0; + return RTEST(num) ? NUM2LONG(num) : 0; } // depth must never be negative; reject early with a clear error. diff --git a/file.c b/file.c index 17a38637c6f663..c4a531d783ad57 100644 --- a/file.c +++ b/file.c @@ -4479,31 +4479,43 @@ rb_file_s_expand_path(int argc, const VALUE *argv) } /* + * :markup: markdown + * * call-seq: - * File.expand_path(file_name [, dir_string] ) -> abs_file_name + * File.expand_path(path, dirpath = '.') -> absolute_path * - * Converts a pathname to an absolute pathname. Relative paths are - * referenced from the current working directory of the process unless - * +dir_string+ is given, in which case it will be used as the - * starting point. The given pathname may start with a - * ``~'', which expands to the process owner's home - * directory (the environment variable +HOME+ must be set - * correctly). ``~user'' expands to the named - * user's home directory. + * Returns the string absolute path for the given `path`. * - * File.expand_path("~oracle/bin") #=> "/home/oracle/bin" + * Evaluates a relative path with respect to the directory given by `dirpath`: * - * A simple example of using +dir_string+ is as follows. - * File.expand_path("ruby", "/usr/bin") #=> "/usr/bin/ruby" + * ```ruby + * Dir.chdir('/snap') + * # Default dirpath. + * File.expand_path('README') # => "/snap/README" + * File.expand_path('bin') # => "/snap/bin" + * File.expand_path('bin/../var') # => "/snap/var" # Cleaned. + * # Other dirpath. + * File.expand_path('../zip', '/usr/bin/ruby') # => "/usr/bin/zip" + * Dir.chdir('/usr/bin') + * File.expand_path('../../snap', __FILE__) # => "/usr/snap" + * ``` * - * A more complex example which also resolves parent directory is as follows. - * Suppose we are in bin/mygem and want the absolute path of lib/mygem.rb. + * Evaluates an absolute path without respect to `dirpath`: * - * File.expand_path("../../lib/mygem.rb", __FILE__) - * #=> ".../path/to/project/lib/mygem.rb" + * ```ruby + * File.expand_path('/snap') # => "/snap" + * File.expand_path('/snap', 'nosuch') # => "/snap" + * File.expand_path('/snap/../snap') # => "/snap" # Cleaned. + * ``` + * + * More examples: + * + * ``` + * Dir.chdir('/usr/bin') + * File.expand_path('../../snap', __FILE__) # => "/usr/snap" + * File.expand_path('../../snap') # => "/snap" + * ``` * - * So first it resolves the parent of __FILE__, that is bin/, then go to the - * parent, the root of the project and appends +lib/mygem.rb+. */ static VALUE @@ -5318,28 +5330,42 @@ ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc) } /* + * :markup: markdown + * * call-seq: - * File.extname(path) -> string + * File.extname(path) -> extension + * + * Returns the filename extension -- + * usually the portion of the string `path` + * beginning from the last period: + * + * ```ruby + * File.extname('t.rb') # => ".rb" + * File.extname('foo.bar.t.rb') # => ".rb" + * File.extname('foo/bar/t.rb') # => ".rb" + * File.extname('nosuch.txt') # => ".txt" # Path need not exist. + * ``` + * + * Returns the entire string when there is no period: * - * Returns the extension (the portion of file name in +path+ - * starting from the last period). + * ```ruby + * Pathname('foo').extname # => "" + * ``` * - * If +path+ is a dotfile, or starts with a period, then the starting - * dot is not dealt with the start of the extension. + * Returns an empty string when the only period is the first character: * - * An empty string will also be returned when the period is the last character - * in +path+. + * ```ruby + * File.extname('.irbrc') # => "" + * ``` * - * On Windows, trailing dots are truncated. + * Returns an empty string or `'.'` when `path` ends with a period: * - * File.extname("test.rb") #=> ".rb" - * File.extname("a/b/d/test.rb") #=> ".rb" - * File.extname(".a/b/d/test.rb") #=> ".rb" - * File.extname("foo.") #=> "" on Windows - * File.extname("foo.") #=> "." on non-Windows - * File.extname("test") #=> "" - * File.extname(".profile") #=> "" - * File.extname(".profile.sh") #=> ".sh" + * ``` + * File.extname('foo.') # => "" # On Windows. + * File.extname('foo.') # => "." # Elsewhere. + * File.extname('foo....') # => "" # On Windows. + * File.extname('foo....') # => "." # Elsewhere. + * ``` * */ diff --git a/include/ruby/internal/fl_type.h b/include/ruby/internal/fl_type.h index e3878d9ed7d567..f7ec7424220fdd 100644 --- a/include/ruby/internal/fl_type.h +++ b/include/ruby/internal/fl_type.h @@ -205,11 +205,11 @@ ruby_fl_type { RUBY_FL_PROMOTED = (1<<5), /** - * This flag meaning is type dependent, currently only used by T_DATA. + * This flag is no longer in use * * @internal */ - RUBY_FL_USERPRIV0 = (1<<6), + RUBY_FL_UNUSED6 = (1<<6), /** * This flag has something to do with finalisers. A ruby object can have diff --git a/pathname_builtin.rb b/pathname_builtin.rb index ac436d49469273..11ade220f0958f 100644 --- a/pathname_builtin.rb +++ b/pathname_builtin.rb @@ -557,19 +557,28 @@ def relative? !absolute? end + # :markup: markdown + # + # call-seq: + # each_filename {|component| ... } -> nil + # each_filename -> new_enumerator # - # Iterates over each component of the path. + # With a block given, yields each component of the string path: # - # Pathname.new("/usr/bin/ruby").each_filename {|filename| ... } - # # yields "usr", "bin", and "ruby". + # ```ruby + # Pathname('/foo/bar/baz').each_filename {|filename| p filename } + # => nil + # ``` # - # Returns an Enumerator if no block was given. + # Output: # - # enum = Pathname.new("/usr/bin/ruby").each_filename - # # ... do stuff ... - # enum.each { |e| ... } - # # yields "usr", "bin", and "ruby". + # ```text + # "foo" + # "bar" + # "baz" + # ``` # + # With no block given, returns a new Enumerator. def each_filename # :yield: filename return to_enum(__method__) unless block_given? _, names = split_names(@path) @@ -901,12 +910,34 @@ def relative_path_from(base_directory) end class Pathname # * File * + + # :markup: markdown + # + # call-seq: + # each_line(sep = $/, **opts) {|line| ... } → nil + # each_line(limit, **opts) {|line| ... } → nil + # each_line(sep, limit, **opts) {|line| ... } → nil + # each_line(...) → new_enumerator + # + # With a block given, calls the block with each line + # from the file represented by `self`; + # returns `nil`: # - # #each_line iterates over the line in the file. It yields a String object - # for each line. + # ```ruby + # lines = [] + # Pathname('COPYING').each_line {|line| lines << line } + # lines.take(3) + # # => + # # ["{日本語}[rdoc-ref:COPYING.ja]\n", + # # "\n", + # # "Ruby is copyrighted free software by Yukihiro Matsumoto .\n"] + # ``` # - # This method has existed since 1.8.1. + # The lines are read using IO.foreach, + # all arguments and options are passed to that method; + # see details at IO.foreach. # + # With no block given, returns a new Enumerator. def each_line(...) # :yield: line File.foreach(@path, ...) end @@ -1391,10 +1422,81 @@ def basename(...) self.class.new(File.basename(@path, ...)) end # See File.dirname. Returns all but the last component of the path. def dirname() self.class.new(File.dirname(@path)) end - # See File.extname. Returns the file's extension. + # :markup: markdown + # + # call-seq: + # extname -> extension + # + # Returns the filename extension of `self` -- + # usually the portion of the string path beginning from the last period: + # + # ```ruby + # Pathname('t.rb').extname # => ".rb" + # Pathname('foo.bar.t.rb').extname # => ".rb" + # Pathname('foo/bar/t.rb').extname # => ".rb" + # Pathname('nosuch.txt').extname # => ".txt" # Path need not exist. + # ``` + # + # Returns the entire string when there is no period: + # + # ```ruby + # Pathname('foo').extname # => "" + # ``` + # + # Returns an empty string when the only period is the first character: + # + # ```ruby + # Pathname('.irbrc').extname # => "" + # ``` + # + # Returns an empty string or `'.'` when `path` ends with a period: + # + # ```ruby + # Pathname('foo.').extname # => "" # On Windows. + # Pathname('foo.').extname # => "." # Elsewhere. + # Pathname('foo....').extname # => "" # On Windows. + # Pathname('foo....').extname # => "." # Elsewhere. + # ``` + # def extname() File.extname(@path) end - # See File.expand_path. + # :markup: markdown + # + # call-seq: + # expand_path(dirpath = '.') -> new_pathname + # + # Returns a new pathname containing the absolute path for `self`. + # + # Evaluates a relative path with respect to the directory given by `dirpath`: + # + # ```ruby + # Dir.chdir('/snap') + # # Default dirpath. + # Pathname('README').expand_path # => # + # Pathname('bin').expand_path # => # + # Pathname('bin/../var').expand_path # => # # Cleaned. + # # Other dirpath. + # Pathname('../zip').expand_path('/usr/bin/ruby') # => # + # Dir.chdir('/usr/bin') + # Pathname('../../snap').expand_path(__FILE__) # => # + # ``` + # + # Evaluates an absolute path without respect to `dirpath`: + # + # ```ruby + # Pathname('/snap').expand_path # => # + # Pathname('/snap').expand_path.expand_path('nosuch') # => # + # Pathname('/snap/../snap').expand_path # => # # Cleaned. + # ``` + # + # More examples: + # + # ``` + # Dir.chdir('/usr/bin') + # Pathname('../../snap').expand_path(__FILE__) # => # + # Pathname('../../snap').expand_path # => # + # ``` + # def expand_path(...) self.class.new(File.expand_path(@path, ...)) end # See File.split. Returns the #dirname and the #basename in an @@ -1694,8 +1796,24 @@ class << self alias pwd getwd end - # Return the entries (files and subdirectories) in the directory, each as a - # Pathname object. + # :markup: markdown + # + # call-seq: + # entries -> array_of_pathnames + # + # Returns an array of pathnames, + # one for each entry in the directory represented by `self`: + # + # ```ruby + # Pathname('.').entries.take(5) + # # => + # # [#, + # # #, + # # #, + # # #, + # # #] + # ``` + # def entries() Dir.entries(@path).map {|f| self.class.new(f) } end # :markup: markdown diff --git a/spec/bundler/support/artifice/helpers/compact_index.rb b/spec/bundler/support/artifice/helpers/compact_index.rb index e61fe921ec3b05..e684aa8628794a 100644 --- a/spec/bundler/support/artifice/helpers/compact_index.rb +++ b/spec/bundler/support/artifice/helpers/compact_index.rb @@ -2,7 +2,7 @@ require_relative "endpoint" -$LOAD_PATH.unshift Dir[Spec::Path.scoped_base_system_gem_path.join("gems/compact_index*/lib")].first.to_s +$LOAD_PATH.unshift Spec::Path.tmp_root.join("compact_index/lib").to_s require "compact_index" require "digest" @@ -90,13 +90,17 @@ def gems(gem_repo = default_gem_repo) rescue StandardError checksum = nil end - CompactIndex::GemVersion.new(spec.version.version, spec.platform.to_s, checksum, nil, - deps, spec.required_ruby_version.to_s, spec.required_rubygems_version.to_s) + build_gem_version(spec, deps, checksum) end CompactIndex::Gem.new(name, gem_versions) end end end + + def build_gem_version(spec, deps, checksum) + CompactIndex::GemVersion.new(spec.version.version, spec.platform.to_s, checksum, nil, + deps, spec.required_ruby_version.to_s, spec.required_rubygems_version.to_s) + end end get "/names" do diff --git a/test/date/test_date_strptime.rb b/test/date/test_date_strptime.rb index 4efe1a47d0a38b..6aa7db292de424 100644 --- a/test/date/test_date_strptime.rb +++ b/test/date/test_date_strptime.rb @@ -517,7 +517,20 @@ def test_sz d = DateTime.strptime('9000 +0200', '%Q %z') assert_equal([1970, 1, 1, 2, 0, 9], [d.year, d.mon, d.mday, d.hour, d.min, d.sec]) assert_equal(Rational(2, 24), d.offset) - end + def test_format_modified + str = " " * 100 + fmt = Struct.new(:str) { + def to_str + str << "2026-06-01" << " "*100 + " %F " + end + }.new(str) + d = Date._strptime(str, fmt) + assert_not_nil(d) + assert_equal(2026, d[:year]) + assert_equal(6, d[:mon]) + assert_equal(1, d[:mday]) + end end diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index 87d9cd7f7deeb5..753ee0fbdf199f 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -601,6 +601,8 @@ def test_nesting assert_equal too_deep, ok ok = generate too_deep_ary, :max_nesting => 0 assert_equal too_deep, ok + + assert_raise(TypeError) { generate too_deep_ary, max_nesting: "garbage" } end def test_backslash diff --git a/tool/bundler/test_gems.rb b/tool/bundler/test_gems.rb index 384ff85d1f2d00..71230c32b7c9f9 100644 --- a/tool/bundler/test_gems.rb +++ b/tool/bundler/test_gems.rb @@ -4,7 +4,6 @@ gem "rack", "~> 3.1" gem "rack-test", "~> 2.1" -gem "compact_index", "~> 0.15.0" gem "sinatra", "~> 4.1" gem "rake", "~> 13.1" gem "builder", "~> 3.2" diff --git a/tool/bundler/test_gems.rb.lock b/tool/bundler/test_gems.rb.lock index a8352f30700aa8..0b9ac341625e3b 100644 --- a/tool/bundler/test_gems.rb.lock +++ b/tool/bundler/test_gems.rb.lock @@ -57,7 +57,6 @@ PLATFORMS DEPENDENCIES builder (~> 3.2) - compact_index (~> 0.15.0) concurrent-ruby etc fiddle diff --git a/win32/win32.c b/win32/win32.c index f25139ca8bfb4d..e3a3df71f6ce34 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -6603,7 +6603,7 @@ rb_w32_pipe(int fds[2]) memcpy(name, prefix, width_of_prefix); snprintf(name + width_of_prefix, width_of_ids, "%.*"PRI_PIDT_PREFIX"x-%.*lx", - width_of_pid, rb_w32_getpid(), width_of_serial, InterlockedIncrement(&serial)-1); + width_of_pid, rb_w32_getpid(), width_of_serial, (unsigned long)(InterlockedIncrement(&serial)-1)); sec.nLength = sizeof(sec); sec.lpSecurityDescriptor = NULL; diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index ae372711d71e66..272c10fde9eb83 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -223,7 +223,7 @@ pub const RUBY_FL_USHIFT: ruby_fl_ushift = 12; pub type ruby_fl_ushift = u32; pub const RUBY_FL_WB_PROTECTED: ruby_fl_type = 32; pub const RUBY_FL_PROMOTED: ruby_fl_type = 32; -pub const RUBY_FL_USERPRIV0: ruby_fl_type = 64; +pub const RUBY_FL_UNUSED6: ruby_fl_type = 64; pub const RUBY_FL_FINALIZE: ruby_fl_type = 128; pub const RUBY_FL_EXIVAR: ruby_fl_type = 0; pub const RUBY_FL_SHAREABLE: ruby_fl_type = 256; diff --git a/zjit/src/cruby_bindings.inc.rs b/zjit/src/cruby_bindings.inc.rs index f6f43fd5e27975..bd832acc9604cd 100644 --- a/zjit/src/cruby_bindings.inc.rs +++ b/zjit/src/cruby_bindings.inc.rs @@ -286,7 +286,7 @@ pub const RUBY_FL_USHIFT: ruby_fl_ushift = 12; pub type ruby_fl_ushift = u32; pub const RUBY_FL_WB_PROTECTED: ruby_fl_type = 32; pub const RUBY_FL_PROMOTED: ruby_fl_type = 32; -pub const RUBY_FL_USERPRIV0: ruby_fl_type = 64; +pub const RUBY_FL_UNUSED6: ruby_fl_type = 64; pub const RUBY_FL_FINALIZE: ruby_fl_type = 128; pub const RUBY_FL_EXIVAR: ruby_fl_type = 0; pub const RUBY_FL_SHAREABLE: ruby_fl_type = 256;