From fbea5f0fe6b6df925c4b6b935ff6d8680bbac37f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 5 Apr 2026 18:03:42 +0900 Subject: [PATCH 1/6] Fix error when `lsof` is not found --- tool/lib/leakchecker.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tool/lib/leakchecker.rb b/tool/lib/leakchecker.rb index 36662e9a46761d..1c045f5137aa63 100644 --- a/tool/lib/leakchecker.rb +++ b/tool/lib/leakchecker.rb @@ -113,8 +113,14 @@ def check_fd_leak(test_name) } unless fd_leaked.empty? unless @@try_lsof == false - open_list = IO.popen(%W[lsof -w -a -d #{fd_leaked.minmax.uniq.join("-")} -p #$$], &:readlines) - if @@try_lsof |= $?.success? + begin + open_list = IO.popen(%W[lsof -w -a -d #{fd_leaked.minmax.uniq.join("-")} -p #$$], &:readlines) + rescue + @@try_lsof = false + else + @@try_lsof |= $?.success? + end + if @@try_lsof columns = (header = open_list.shift).split fd_index, node_index = columns.index('FD'), columns.index('NODE') open_list.reject! do |of| From 79b5c50b500f3b82ad8c82b073d2ae59fcd1f551 Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Sat, 4 Apr 2026 12:30:28 +0200 Subject: [PATCH 2/6] [ruby/prism] Fix type for `ArrayPatternNode#rest` It can only ever be one of these two https://github.com/ruby/prism/commit/f871ce0260 --- prism/config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/prism/config.yml b/prism/config.yml index 7c283741d3b52c..bbbc5f3d336ae0 100644 --- a/prism/config.yml +++ b/prism/config.yml @@ -1017,7 +1017,9 @@ nodes: ^ ^ - name: rest type: node? - kind: pattern expression + kind: + - ImplicitRestNode + - SplatNode comment: | Represents the rest element of the array pattern. From 661344b1041fbbe661038d28ac0a2c8895ab608b Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Sat, 4 Apr 2026 13:08:59 +0200 Subject: [PATCH 3/6] [ruby/prism] Adapt `ParametersNode#signature` to `ErrorRecoveryNode` No need to list them all out anymore, it's just a single possibility now https://github.com/ruby/prism/commit/893f2734cb --- lib/prism/node_ext.rb | 5 +---- test/prism/ruby/parameters_signature_test.rb | 7 +++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/prism/node_ext.rb b/lib/prism/node_ext.rb index aa9dba57c7d89e..8a6624e76dad77 100644 --- a/lib/prism/node_ext.rb +++ b/lib/prism/node_ext.rb @@ -329,10 +329,7 @@ def signature case param when MultiTargetNode names << [:req] - when NoKeywordsParameterNode, KeywordRestParameterNode, - NoBlockParameterNode, BlockParameterNode, - ForwardingParameterNode - # Invalid syntax, e.g. "def f(**nil, ...)" moves the NoKeywordsParameterNode to posts + when ErrorRecoveryNode raise "Invalid syntax" else names << [:req, param.name] diff --git a/test/prism/ruby/parameters_signature_test.rb b/test/prism/ruby/parameters_signature_test.rb index 5a225862c338bb..1ca2b144a91b8d 100644 --- a/test/prism/ruby/parameters_signature_test.rb +++ b/test/prism/ruby/parameters_signature_test.rb @@ -77,6 +77,13 @@ def test_forwarding assert_parameters([[:rest, :*], [:keyrest, :**], [:block, :&]], "...") end + def test_invalid_syntax + e = assert_raise(RuntimeError) do + Prism.parse_statement("def f(**nil, ...); end").parameters.signature + end + assert_equal("Invalid syntax", e.message) + end + private def assert_parameters(expected, source, compare: true) From 21d360981c1a08a84b16d6998fa1ed672b104575 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 5 Apr 2026 22:37:10 +0900 Subject: [PATCH 4/6] Fix error when `lsof` did not work --- tool/lib/leakchecker.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tool/lib/leakchecker.rb b/tool/lib/leakchecker.rb index 1c045f5137aa63..58638bb3f6b553 100644 --- a/tool/lib/leakchecker.rb +++ b/tool/lib/leakchecker.rb @@ -120,8 +120,8 @@ def check_fd_leak(test_name) else @@try_lsof |= $?.success? end - if @@try_lsof - columns = (header = open_list.shift).split + if header = open_list&.shift + columns = header.split fd_index, node_index = columns.index('FD'), columns.index('NODE') open_list.reject! do |of| of = of.chomp.split(' ', node_index + 2) From 13ebc5368c5bfd9f0b405ac4115f1140544f9c23 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 5 Apr 2026 22:37:47 +0900 Subject: [PATCH 5/6] [DOC] Fill missing stars --- string.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/string.c b/string.c index 19b8a1e225c32a..ef0e3864ea31dd 100644 --- a/string.c +++ b/string.c @@ -4920,9 +4920,9 @@ rb_str_byterindex(VALUE str, VALUE sub, long pos) * s.size # => 3 # Three 1-byte characters. * s.bytesize # => 3 # Three bytes. * s.byterindex('f') # => 0 - s.byterindex('o') # => 2 - s.byterindex('oo') # => 1 - s.byterindex('ooo') # => nil + * s.byterindex('o') # => 2 + * s.byterindex('oo') # => 1 + * s.byterindex('ooo') # => nil * * When +object+ is a Regexp, * returns the index of the last found substring matching +object+; From a3c372a6dac78cd12d7d9ddc2a35cd3b99d325d7 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 5 Apr 2026 22:58:03 +0900 Subject: [PATCH 6/6] Fix error when `lsof` did not work --- tool/lib/leakchecker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/lib/leakchecker.rb b/tool/lib/leakchecker.rb index 58638bb3f6b553..33a546699f6145 100644 --- a/tool/lib/leakchecker.rb +++ b/tool/lib/leakchecker.rb @@ -135,8 +135,8 @@ def check_fd_leak(test_name) false end end + puts(header, open_list) unless open_list.empty? end - puts(header, open_list) unless open_list.empty? end end inspect.each {|fd, (str, pos)|