96816 Commits

Author SHA1 Message Date
Peter Zhu
491e38902c [DOC] Fix links to What's Here
The RDoc link format has changed so these are all broken links.
2026-01-26 17:18:19 -05:00
Max Bernstein
6b0dda496e
ZJIT: Add temporary local definite assignment validator (#15973)
Until we get our global register allocator, we need our HIR to be in
100% block-local SSA. Add a validator to enforce that.
2026-01-26 22:11:06 +00:00
BurdetteLamar
b7102933ee [DOC] Doc for Module.nesting 2026-01-26 17:07:53 -05:00
BurdetteLamar
21f8472e77 [DOC] Fix links in Array 2026-01-26 17:05:18 -05:00
BurdetteLamar
ed0a5c6f0f [DOC] Fix links in Complex 2026-01-26 17:04:58 -05:00
Aaron Patterson
2605d4e5fc ZJIT: Extract VRegId from a usize
We would like to do type matching on the VRegId.  Extracting the VRegID
from a usize makes the code a bit easier to understand and refactor.
MemBase uses a VReg, and there is also a VReg in Opnd.  We should be
sharing types between these two, so this is a step in the direction of
sharing a type
2026-01-26 12:47:56 -08:00
Luke Gruber
994257ab06
Prevent starvation when acquiring mutex over and over (#15877)
Continually locking a mutex m can lead to starvation if all other threads are on the waitq of m.

See https://bugs.ruby-lang.org/issues/21840 for more details.

Solution:

When a thread `T1` wakes up `T2` during mutex unlock but `T1` or any other thread successfully acquires it
before `T2`, then we record the `running_time` of the thread during mutex acquisition. Then during unlock, if
that thread's running_time is less than the saved running time, we set it back to the saved time.

Fixes [Bug #21840]
2026-01-26 14:34:37 -05:00
Matt Valentine-House
3c634893e2 Remove the unnecesary integer comparison
Most compilers will optimise this anyway
2026-01-26 18:01:09 +00:00
Matt Valentine-House
d15117e293 BIGNUM can't have fields other than object_id 2026-01-26 18:01:09 +00:00
Matt Valentine-House
7444f415db rename rb_gc_obj_free_on_sweep -> rb_gc_obj_needs_cleanup_p 2026-01-26 18:01:09 +00:00
Matt Valentine-House
8e73aa7ffe We don't need this wrapper function anymore 2026-01-26 18:01:09 +00:00
Matt Valentine-House
efde37b712 Move the gc fast path out of the default GC impl
It relies too much on VM level concerns, such that it can't be built
with modular GC enabled.

We'll move it into the VM, and then expose it to the GC
implementations so they can use it.
2026-01-26 18:01:09 +00:00
Matt Valentine-House
211714f1bf Clarify the use of some FLAGS 2026-01-26 18:01:09 +00:00
Matt Valentine-House
c21f3490d1 Implement a fast path for sweeping (gc_sweep_fast_path_p).
[Feature #21846]

There is a single path through our GC Sweeping code, and we always call
rb_gc_obj_free_vm_weak_references and rb_gc_obj_free before adding the
object back to the freelist.

We do this even when the object has no external resources that require
being free'd and has no weak references pointing to it.

This commit introduces a conservative fast path through gc_sweep_plane
that uses the object flags to identify certain cases where these calls
can be skipped - for these objects we just add them straight back on the
freelist. Any object for which gc_sweep_fast_path_p returns false will
use the current full sweep code (referred to here as the slow path).

Currently there are 2 checks that
will _always_ require an object to go down the slow path:

1. Has it's object_id been observed and stored in the id2ref_table
2. Has it got generic ivars in the gen_fields table

If neither of these are true, then we run some flag checks on the object
and send the following cases down the fast path:

- Objects that are not heap allocated
- Embedded strings that aren't in the fstring table
- Embedded Arrays
- Embedded Hashes
- Embedded Bignums
- Embedded Strings
- Floats, Rationals and Complex
- Various IMEMO subtypes that do no allocation

We've benchmarked this code using ruby-bench as well as the gcbench
benchmarks inside Ruby (benchmarks/gc) and this patch results in a
modest speed improvement on almost all of the headline benchmarks (2% in
railsbench with YJIT enabled), and an observable 30% improvement in time
spent sweeping during the GC benchmarks:

```
master: ruby 4.1.0dev (2026-01-19T12:03:33Z master 859920dfd2) +YJIT +PRISM [x86_64-linux]
experiment: ruby 4.1.0dev (2026-01-16T21:36:46Z mvh-sweep-fast-pat.. c3ffe377a1) +YJIT +PRISM [x86_64-linux]

--------------  -----------  ----------  ---------------  ----------  ------------------  -----------------
bench           master (ms)  stddev (%)  experiment (ms)  stddev (%)  experiment 1st itr  master/experiment
lobsters        N/A          N/A         N/A              N/A         N/A                 N/A
activerecord    132.5        0.9         132.5            1.0         1.056               1.001
chunky-png      577.2        0.4         580.1            0.4         0.994               0.995
erubi-rails     902.9        0.2         894.3            0.2         1.040               1.010
hexapdf         1763.9       3.3         1760.6           3.7         1.027               1.002
liquid-c        56.9         0.6         56.7             1.4         1.004               1.003
liquid-compile  46.3         2.1         46.1             2.1         1.005               1.004
liquid-render   77.8         0.8         75.1             0.9         1.023               1.036
mail            114.7        0.4         113.0            1.4         1.054               1.015
psych-load      1635.4       1.4         1625.9           0.5         0.988               1.006
railsbench      1685.4       2.4         1650.1           2.0         0.989               1.021
rubocop         133.5        8.1         130.3            7.8         1.002               1.024
ruby-lsp        140.3        1.9         137.5            1.8         1.007               1.020
sequel          64.6         0.7         63.9             0.7         1.003               1.011
shipit          1196.2       4.3         1181.5           4.2         1.003               1.012
--------------  -----------  ----------  ---------------  ----------  ------------------  -----------------

Legend:
- experiment 1st itr: ratio of master/experiment time for the first benchmarking iteration.
- master/experiment: ratio of master/experiment time. Higher is better for experiment. Above 1 represents a speedup.
```

```
Benchmark      │    Wall(B)   Sweep(B)  Mark(B) │    Wall(E)   Sweep(E)  Mark(E) │   Wall Δ  Sweep Δ
───────────────┼─────────────────────────────────┼─────────────────────────────────┼──────────────────
null           │     0.000s        1ms      4ms │     0.000s        1ms      4ms │       0%       0%
hash1          │     4.330s      875ms     46ms │     3.960s      531ms     44ms │ +8.6% +39.3%
hash2          │     6.356s      243ms    988ms │     6.298s      176ms    1.03s │ +0.9% +27.6%
rdoc           │    37.337s      2.42s    1.09s │    36.678s      2.11s    1.20s │ +1.8% +13.1%
binary_trees   │     3.366s      426ms    252ms │     3.082s      275ms    239ms │ +8.4% +35.4%
ring           │     5.252s       14ms    2.47s │     5.327s       12ms    2.43s │ -1.4% +14.3%
redblack       │     2.966s       28ms     41ms │     2.940s       21ms     38ms │ +0.9% +25.0%
───────────────┼─────────────────────────────────┼─────────────────────────────────┼──────────────────

Legend: (B) = Baseline, (E) = Experiment, Δ = improvement (positive = faster)
        Wall = total wallclock, Sweep = GC sweeping time, Mark = GC marking time
        Times are median of 3 runs
```

These results are also borne out when YJIT is disabled:

```
master: ruby 4.1.0dev (2026-01-19T12:03:33Z master 859920dfd2) +PRISM [x86_64-linux]
experiment: ruby 4.1.0dev (2026-01-16T21:36:46Z mvh-sweep-fast-pat.. c3ffe377a1) +PRISM [x86_64-linux]

--------------  -----------  ----------  ---------------  ----------  ------------------  -----------------
bench           master (ms)  stddev (%)  experiment (ms)  stddev (%)  experiment 1st itr  master/experiment
lobsters        N/A          N/A         N/A              N/A         N/A                 N/A
activerecord    389.6        0.3         377.5            0.3         1.032               1.032
chunky-png      1123.4       0.2         1109.2           0.2         1.013               1.013
erubi-rails     1754.3       0.1         1725.7           0.1         1.035               1.017
hexapdf         3346.5       0.9         3326.9           0.7         1.003               1.006
liquid-c        84.0         0.5         83.5             0.5         0.992               1.006
liquid-compile  74.0         1.5         73.5             1.4         1.011               1.008
liquid-render   199.9        0.4         199.6            0.4         1.000               1.002
mail            177.8        0.4         176.4            0.4         1.069               1.008
psych-load      2749.6       0.7         2777.0           0.0         0.980               0.990
railsbench      2983.0       1.0         2965.5           0.8         1.041               1.006
rubocop         228.8        1.0         227.5            1.2         1.015               1.005
ruby-lsp        221.8        0.9         216.1            0.8         1.011               1.026
sequel          89.1         0.5         89.1             1.8         1.005               1.000
shipit          2385.6       1.6         2371.8           1.0         1.002               1.006
--------------  -----------  ----------  ---------------  ----------  ------------------  -----------------

Legend:
- experiment 1st itr: ratio of master/experiment time for the first benchmarking iteration.
- master/experiment: ratio of master/experiment time. Higher is better for experiment. Above 1 represents a speedup.
```

```
Benchmark      │    Wall(B)   Sweep(B)  Mark(B) │    Wall(E)   Sweep(E)  Mark(E) │   Wall Δ  Sweep Δ
───────────────┼─────────────────────────────────┼─────────────────────────────────┼──────────────────
null           │     0.000s        1ms      4ms │     0.000s        1ms      3ms │       0%       0%
hash1          │     4.349s      877ms     45ms │     4.045s      532ms     44ms │ +7.0% +39.3%
hash2          │     6.575s      235ms    967ms │     6.540s      181ms    1.04s │ +0.5% +23.0%
rdoc           │    45.782s      2.23s    1.14s │    44.925s      1.90s    1.01s │ +1.9% +15.0%
binary_trees   │     6.433s      426ms    252ms │     6.268s      278ms    240ms │ +2.6% +34.7%
ring           │     6.584s       17ms    2.33s │     6.738s       13ms    2.33s │ -2.3% +30.8%
redblack       │    13.334s       31ms     42ms │    13.296s       24ms    107ms │ +0.3% +22.6%
───────────────┼─────────────────────────────────┼─────────────────────────────────┼──────────────────

Legend: (B) = Baseline, (E) = Experiment, Δ = improvement (positive = faster)
        Wall = total wallclock, Sweep = GC sweeping time, Mark = GC marking time
        Times are median of 3 runs
```
2026-01-26 18:01:09 +00:00
Chris Hasiński
5add7c3ea9
Fix RUBY_MN_THREADS sleep returning prematurely (#15868)
timer_thread_check_exceed() was returning true when the remaining time
was less than 1ms, treating it as "too short time". This caused
sub-millisecond sleeps (like sleep(0.0001)) to return immediately
instead of actually sleeping.

The fix removes this optimization that was incorrectly short-circuiting
short sleep durations. Now the timeout is only considered exceeded when
the actual deadline has passed.

Note: There's still a separate performance issue where MN_THREADS mode
is slower for sub-millisecond sleeps due to the timer thread using
millisecond-resolution polling. This will require a separate fix to
use sub-millisecond timeouts in kqueue/epoll.

[Bug #21836]
2026-01-26 10:17:35 -05:00
Kevin Newton
2947aa41d4 [ruby/prism] Use each_line to avoid allocating array
Though very unlikely, it could potentially allocate a large array
of whitespace.

https://github.com/ruby/prism/commit/3389947819
2026-01-26 14:43:01 +00:00
Earlopain
5f25420918 [ruby/prism] Fix on_words_sep for ripper translator with newlines
Ripper emits a token each per line.

https://github.com/ruby/prism/commit/4b5c9f5437
2026-01-26 11:34:49 +00:00
Hiroshi SHIBATA
e410d938fa Workround for directly loading Gem::Version 2026-01-26 20:24:14 +09:00
Hiroshi SHIBATA
a308311336 [ruby/rubygems] Removed unused deprecate loading
https://github.com/ruby/rubygems/commit/e379022ed0
2026-01-26 09:38:31 +00:00
Nobuyoshi Nakada
b839989fd2 win32: Add CR to all batch files.
This reverts commit 23f9a0d655c4d405bb2397a147a1523436205486, "win32:
Strip CR from batch files", and add CR to the other batch files too.

`cmd.exe` seems to work well with LF at a glance, but sometimes `goto`
jumps to an unexpected line.  This is probably because it is looking
for the beginning of a line, assuming that all lines end with CRLF,
and as a result mistaking the `goto` operand for a label.
2026-01-26 18:17:45 +09:00
Edouard CHIN
ace5b10de4 [ruby/rubygems] Fix Bundler that re-exec $0 when a version is present in the config:
- ### Problem

  If you have a `version` in your config file (this feature was
  introduced in #6817), then running any `bundle` command will
  make Bundler re-exec and ultimately run the `bundle` binstub twice.

  ### Details

  When the `bundle` binstub gets executed, a `require "bundler"` is
  evaluated. RubyGems tries to require the `bundler.rb` file from
  the right `bundler` gem (in the event where you have multiple
  bundler versions in your system).
  RubyGems will prioritize a bundler version based on a few
  heurisitics.

  b50c40c92a/lib/rubygems/bundler_version_finder.rb (L19-L21)

  This prioritize logic doesn't take into account the bundler version
  a user has specific in this config. So what happens is:

  1. User execute the `bundle` binstub
  2. `require 'bundler'` is evaluated.
  3. RubyGems prioritize activating the bundler version specified
     in the Gemfile.lock
  4. The CLI starts, and [Auto switch kicks in](b50c40c92a/bundler/lib/bundler/cli.rb (L81)). Bundler detects that
     user specifed a version in its config and the current Bundler
     version doesn't match.
  5. Bundler exit and re-exec with the right bundler version.

  ### Solution

  This patch introduce two fixes. First, it reads the bundler config
  file and check for the local config first and then the global
  config. This is because the local has precedence over global.

  Second, the prioritization takes into account the version in config
  and let RubyGems activate the right version in order to prevent
  re-exec moments later.

  Finally, I also want to fix this problem because its a step toward
  fixing https://github.com/ruby/rubygems/issues/8106. I'll open
  a follow up patch to explain.

https://github.com/ruby/rubygems/commit/d6e0f43133
2026-01-26 08:48:22 +00:00
Hiroshi SHIBATA
b3cca1e201 [ruby/rubygems] Re-generate certificates with sha256WithRSAEncryption for modern OS
https://github.com/ruby/rubygems/commit/41612df71d
2026-01-26 08:44:50 +00:00
Hiroshi SHIBATA
6e00da098a [ruby/rubygems] Revert "Merge pull request #8989 from nobu/test-tmpdir"
This reverts commit https://github.com/ruby/rubygems/commit/3aa3ee3ee440, reversing
changes made to https://github.com/ruby/rubygems/commit/d1ff3df70f55.

https://github.com/ruby/rubygems/commit/0231b5b1bc
2026-01-26 07:46:45 +00:00
Hiroshi SHIBATA
016b2628e8 [ruby/rubygems] Fixed missing classname
https://github.com/ruby/rubygems/commit/b2002d47d2
2026-01-26 07:01:48 +00:00
Nobuyoshi Nakada
b96416802d [ruby/rubygems] Do not pollute source directory by tests
https://github.com/ruby/rubygems/commit/ab3c2200d2
2026-01-26 07:01:47 +00:00
Edouard CHIN
78d9b454ce [ruby/rubygems] Fix RubyGems not able to require the right gem:
- Fix https://github.com/ruby/rubygems/issues/9238
- ### Problem

  This is an issue that bites gem maintainers from time to time, with
  the most recent one in https://github.com/minitest/minitest/issues/1040#issuecomment-3679370619

  The issue is summarized as follow:

  1) A gem "X" has a feature in "lib/feature.rb"
  2) Maintainer wants to extract this feature into its own gem "Y"
  3) Maintainer cut a release of X without that new feature.
  4) Users install the new version of X and also install the new
     gem "Y" since the feature is now extracted.
  5) When a call to "require 'feature'" is encountered, RG will
     fail to load the right gem, resulting in a `LoadError`.

  ### Details

  Now that we have two gems (old version of X and new gem Y) with
  the same path, RubyGems will detect that `feature.rb` can be loaded
  from the old version of X, but if the new version of X had already
  been loaded, then RubyGems will raise due to versions conflicting.

  ```ruby
  require 'x' # Loads the new version of X without the feature which was extracted.
  require 'feature' # Rubygems see that the old version of X include that file and tries to activate the spec.
  ```

  ### Solution

  I propose that RubyGems fallback to a spec that's not yet loaded.
  We try to find a spec by its path and filter it out in case a spec
  with the same name has already been loaded.

  Its worth to note that RubyGems already has a
  `find_inactive_by_path` but we can't use it. This method only checks
  if the spec object is active and doesn't look if other spec with the
  same name have been loaded. The new method we are introducing
  verifies this.

https://github.com/ruby/rubygems/commit/f298e2c68e
2026-01-26 05:56:37 +00:00
dependabot[bot]
ee32a2dc93 Bump lewagon/wait-on-check-action from 1.4.1 to 1.5.0
Bumps [lewagon/wait-on-check-action](https://github.com/lewagon/wait-on-check-action) from 1.4.1 to 1.5.0.
- [Release notes](https://github.com/lewagon/wait-on-check-action/releases)
- [Changelog](https://github.com/lewagon/wait-on-check-action/blob/master/CHANGELOG.md)
- [Commits](3603e826ee...74049309df)

---
updated-dependencies:
- dependency-name: lewagon/wait-on-check-action
  dependency-version: 1.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-25 18:32:38 -08:00
Nobuyoshi Nakada
2856aa67df
[DOC] State that an interpolated string in %W is not split
It is split statically at the parse time, not the whole string is
built then split.
2026-01-26 10:09:35 +09:00
Earlopain
9269069e90 [ruby/prism] Optimize ripper translator token sorting
With the benchmark from 2ea81398cc
Prism is:
* 1.33x slower before
* 1.07x slower after

https://github.com/ruby/prism/commit/a18b0acd80
2026-01-25 21:14:13 +00:00
Peter Zhu
b75938e2c3 [DOC] Improve class doc for Coverage 2026-01-25 10:09:17 -05:00
Nobuyoshi Nakada
23f9a0d655
win32: Strip CR from batch files
Recent versions of `cmd.exe` seem to work with just LF, and the other
batch files are LF only already.
2026-01-25 22:15:51 +09:00
Nobuyoshi Nakada
f23e554f68
Fix missing return
And align the condition with `enc_find_basename` to remove the code
path that `*baselen` potentially can be unset in that function.
2026-01-25 20:05:55 +09:00
Peter Zhu
8f9aade9be Fix warning in rb_file_s_basename
file.c:5053:16: warning: `f` may be used uninitialized [-Wmaybe-uninitialized]
    5053 |             if (!(f = rmext(p, f, n, fp, RSTRING_LEN(fext), enc))) {
         |                ^
2026-01-24 21:31:09 -05:00
Stan Lo
a00cc983dd
Ignore AI agents related files (#15955) 2026-01-25 01:47:23 +00:00
Earlopain
985b58a4ed [ruby/prism] Remove unneeded lex_compat token types
These are either fixed in prism or ruby/ripper itself.

https://github.com/ruby/prism/commit/41c7c126b2
2026-01-24 23:11:19 +00:00
Earlopain
f7bc28d824 [ruby/prism] Further optimize ripper translator by not using delegate
Using it seems pretty bad for performance:

```rb
require "benchmark/ips"
require "prism"
require "ripper"

codes = Dir["**/*.rb"].map { File.read(it) }

Benchmark.ips do |x|
  x.report("prism") { codes.each { Prism::Translation::Ripper.lex(it) } }
  x.report("ripper") { codes.each { Ripper.lex(it) } }
  x.compare!
end
```

```
# Before
ruby 4.0.0 (2025-12-25 revision https://github.com/ruby/prism/commit/553f1675f3) +PRISM [x86_64-linux]
Warming up --------------------------------------
               prism     1.000 i/100ms
              ripper     1.000 i/100ms
Calculating -------------------------------------
               prism      0.319 (± 0.0%) i/s     (3.14 s/i) -      2.000 in   6.276154s
              ripper      0.647 (± 0.0%) i/s     (1.54 s/i) -      4.000 in   6.182662s

Comparison:
              ripper:        0.6 i/s
               prism:        0.3 i/s - 2.03x  slower
# After
ruby 4.0.0 (2025-12-25 revision https://github.com/ruby/prism/commit/553f1675f3) +PRISM [x86_64-linux]
Warming up --------------------------------------
               prism     1.000 i/100ms
              ripper     1.000 i/100ms
Calculating -------------------------------------
               prism      0.482 (± 0.0%) i/s     (2.08 s/i) -      3.000 in   6.225603s
              ripper      0.645 (± 0.0%) i/s     (1.55 s/i) -      4.000 in   6.205636s

Comparison:
              ripper:        0.6 i/s
               prism:        0.5 i/s - 1.34x  slower
```

`vernier` tells me it does `method_missing` even for explicitly defined methods like `location`.

https://github.com/ruby/prism/commit/2ea81398cc
2026-01-24 23:10:34 +00:00
Peter Zhu
1de6133825 [DOC] Fix hash style in Hash#except 2026-01-24 09:43:54 -05:00
Bodhi Russell Silberling
3dd928c284
[DOC] Fix typo: occurences -> occurrences 2026-01-24 03:41:36 +00:00
Nelli Simkova
3328246b91 [DOC] Fix typo in String#scrub doc 2026-01-24 12:38:15 +09:00
Peter Zhu
887913efc0 [DOC] Improve docs for eval 2026-01-23 17:36:06 -05:00
Max Bernstein
7c75dbe51e
ZJIT: Reset all the counters in RubyVM::ZJIT::reset_stats! (#15950)
We previously forgot about these.
2026-01-23 16:14:59 -05:00
Luke Gruber
e7e9303236
Fix kqueue timeout for 0-valued timespec (#15940)
Timeout with 0-valued timespec means try to get an event, but return
immediately if there is none. Apparently timespec can have other
members, so best to 0 it out in that case.
2026-01-23 11:54:44 -05:00
Kazuki Yamaguchi
48848e8da4 [ruby/openssl] ssl: update tests for SSLContext#servername_cb callback
If an exception is raised by the SSLContext#servername_cb proc, the
handshake should be canceled by sending an "unrecognized_name" alert to
the client, and the exception should be re-raised from SSLSocket#accept.

Add more direct assertions to confirm these behaviors.

https://github.com/ruby/openssl/commit/ac8df7f30f
2026-01-23 16:47:31 +00:00
Kazuki Yamaguchi
0fddb9afca [ruby/openssl] ssl: refactor peeraddr_ip_str()
Remove an unnecessary instance variable lookup and constant lookup.
Ruby's public headers provide rb_eSystemCallError.

https://github.com/ruby/openssl/commit/46c92233fb
2026-01-23 16:41:17 +00:00
Kazuki Yamaguchi
0379aab6c0 [ruby/openssl] ssl: fix errno display in exception messages
The errno reported in an OpenSSL::SSL::SSLError raised by
SSLSocket#accept and #connect sometimes does not match what SSL_accept()
or SSL_connect() actually encountered. Depending on the evaluation order
of arguments passed to ossl_raise(), errno may be overwritten by
peeraddr_ip_str().

While we could just fix peeraddr_ip_str(), we should avoid passing
around errno since it is error-prone. Replace rb_sys_fail() and
rb_io_{maybe_,}wait_{read,writ}able() with equivalents that do not read
errno.

https://github.com/ruby/openssl/commit/bfc7df860f
2026-01-23 16:41:17 +00:00
Sharon Rosner
05b85fc1ab [ruby/openssl] Add sync_close kwarg to SSLSocket.new (fixes
https://github.com/ruby/openssl/pull/955)

https://github.com/ruby/openssl/commit/8d9a676dfa
2026-01-23 15:38:19 +00:00
git
f02fffbe04 * remove trailing spaces. [ci skip] 2026-01-23 06:06:16 +00:00
Benoit Daloze
aba48bd5d6
[ruby/pathname] Remove omit's for File.path since it is fixed in the last TruffleRuby release
https://github.com/ruby/pathname/commit/97c97bc956
2026-01-23 15:03:49 +09:00
Benoit Daloze
5b7b81a7b1
[ruby/pathname] Reenable truffleruby in CI and omit the 2 failing tests
* See https://github.com/ruby/pathname/pull/73

https://github.com/ruby/pathname/commit/a8d7f8bde3
2026-01-23 15:03:33 +09:00
BurdetteLamar
7d7c776fdf
[ruby/pathname] [DOC] Doc for ::getwd
https://github.com/ruby/pathname/commit/d99e62665e
2026-01-23 14:56:11 +09:00