Kernel#system is being called when there is a column or method name named system.
The other methods of Kernel reproduce the problem.
Ex.Rand returns a random value, and exit terminates the program.
This problem did not occur until Ruby 3.3 series, but has occurred since Ruby 3.4.
classObjectifiedHashdefinitialize(hash)@hash=hashendprivateattr_reader:hashdefmethod_missing(method_name,*args,&block)ifhash.key?(method_name.to_sym)hash[method_name.to_sym]elsesuperendenddefrespond_to_missing?(method_name,include_private=false)hash.key?(method_name.to_sym)||superendendclassFoodefsystem(...)# Kernel#system is calledraw.system(...)# (...) passes if there is no# raw.systemenddefinitialize(raw)@raw=rawenddefget_systemsystemendprivateattr_reader:rawendclassTestdefself.runobj=ObjectifiedHash.new({system: 'system'})foo=Foo.new(obj)# foo.system would pass.# After executing foo.system, hoge.get_system also passes.# p foo.systempfoo.get_systemendendTest.run
hoge.rb:26:in 'Kernel#system': wrong number of arguments (given 0, expected 1+)(ArgumentError)
raw.system(...)
^^^
from ruby.rb:26:in 'Foo#system'
from ruby.rb:36:in 'Foo#get_system'
from ruby.rb:54:in 'Test.run'
from ruby.rb:58:in '<main>'
You are correct. It also works on Ruby 3.4 when using --parser=parse.y, so this appears to be related to prism. I'll have to do more analysis to determine which behavior is correct, but it's certainly a bug that the behavior is not the same between prism and parse.y.
You are correct. It also works on Ruby 3.4 when using --parser=parse.y, so this appears to be related to prism. I'll have to do more analysis to determine which behavior is correct, but it's certainly a bug that the behavior is not the same between prism and parse.y.
Sorry, that was me testing the wrong version. The behavior is the same between prism and parse.y, so this is a difference in behavior between Ruby 3.3 and 3.4. I still need to more analysis to determine which behavior is correct.
Assignee set to tenderlovemaking (Aaron Patterson)
The reason this works in Ruby 3.3 and below is that system is a private method and not a public method, and calls to private methods where the receiver is not self call method_missing. raw.system is a method call where the receiver is not self, but Kernel#system is a private method, so this should be calling method_missing. The fact that method_missing is not called in Ruby 3.4 is a bug. I've determined the bug is in generic argument forwarding. If you switch ... (generic argument forwarding) to *, **, & (anonymous splat usage), things work correctly. Assigning to @tenderlovemaking (Aaron Patterson).