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/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. 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+; 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) diff --git a/tool/lib/leakchecker.rb b/tool/lib/leakchecker.rb index 36662e9a46761d..33a546699f6145 100644 --- a/tool/lib/leakchecker.rb +++ b/tool/lib/leakchecker.rb @@ -113,9 +113,15 @@ 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? - columns = (header = open_list.shift).split + 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 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) @@ -129,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)|