[ruby-core:120919] [Ruby master Bug#21125] Kernel is called first
From:
"jeremyevans0 (Jeremy Evans) via ruby-core" <ruby-core@...>
Date:
2025-02-09 02:34:46 UTC
List:
ruby-core #120919
Issue #21125 has been updated by jeremyevans0 (Jeremy Evans).
jeremyevans0 (Jeremy Evans) wrote in #note-3:
> mikik0 (Hashino Mikiko) wrote in #note-2:
> > @jeremyevans0 san
> > It works with Ruby 3.3 series, but not from Ruby 3.4. Is it a specification?
>
> 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.
----------------------------------------
Bug #21125: Kernel is called first
https://bugs.ruby-lang.org/issues/21125#change-111801
* Author: mikik0 (Hashino Mikiko)
* Status: Open
* ruby -v: ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [arm64-darwin24]
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
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.
## Reproducible script:
``` ruby
class ObjectifiedHash
def initialize(hash)
@hash = hash
end
private
attr_reader :hash
def method_missing(method_name, *args, &block)
if hash.key?(method_name.to_sym)
hash[method_name.to_sym]
else
super
end
end
def respond_to_missing?(method_name, include_private = false)
hash.key?(method_name.to_sym) || super
end
end
class Foo
def system(...)
# Kernel#system is called
raw.system(...)
# (...) passes if there is no
# raw.system
end
def initialize(raw)
@raw = raw
end
def get_system
system
end
private
attr_reader :raw
end
class Test
def self.run
obj = ObjectifiedHash.new({
system: 'system'
})
foo = Foo.new(obj)
# foo.system would pass.
# After executing foo.system, hoge.get_system also passes.
# p foo.system
p foo.get_system
end
end
Test.run
```
## Execution Results
``` shell
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>'
```
## Expected results
``` shell
"system"
```
PR that may be relevant: https://github.com/ruby/ruby/pull/11028
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/