Actions
Bug #9622
closedExtra method arguments are magically swallowed after first successful call, possible method cache bug
Description
The following code behaviour totally change since ruby 2.0.0
class Foo
def bar(*args)
attribute(:bar, *args)
end
def attribute(name)
puts name
end
end
foo = Foo.new
begin
foo.bar(100)
rescue => e
puts e.class.name
end
foo.bar # legit
5.times do
foo.bar(100)
end
puts 'No errors??? WTF???'
ruby < 2.0 output:
ArgumentError
bar
(eval):3:in `attribute': wrong number of arguments (2 for 1) (ArgumentError)
from (eval):3:in `bar'
from foo.rb:28
from foo.rb:27:in `times'
from foo.rb:27
Which is expected.
But ruby >= 2.0 output
ArgumentError
bar
bar
bar
bar
bar
bar
No errors??? WTF???
In short, after the first successful call, the extra arguments are just ignored. I have no idea of what is going on here, but it look like a broken optimization.
All rubies >= 2.0 are affected. 1.8.7 and 1.9.3 are fine.
Regards.
A gist describing the issue: https://gist.github.com/byroot/9495455
Updated by nobu (Nobuyoshi Nakada) about 11 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r45321.
vm_insnhelper.c: disable fastpath if splat
- vm_insnhelper.c (vm_callee_setup_arg): disable fastpath if splat
argument, since argc may differ for each calls.
[ruby-core:61422] [Bug #9622]
Updated by nobu (Nobuyoshi Nakada) about 11 years ago
- Priority changed from 5 to Normal
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN to 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) about 11 years ago
just for memorandum. r45320 is also required to be backported.
Updated by usa (Usaku NAKAMURA) almost 11 years ago
- Backport changed from 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: REQUIRED, 2.0.0: DONE, 2.1: REQUIRED
backported into ruby_2_0_0 at r45748.
Updated by nagachika (Tomoyuki Chikanaga) almost 11 years ago
- Backport changed from 1.9.3: REQUIRED, 2.0.0: DONE, 2.1: REQUIRED to 1.9.3: REQUIRED, 2.0.0: DONE, 2.1: DONE
Backported into ruby_2_1
at r46302.
Updated by marcandre (Marc-Andre Lafortune) over 10 years ago
- Has duplicate Bug #10291: Strange behaviour of splat in Ruby 2.0.0 added
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Has duplicate Bug #10353: weird behavior when dynamically adding method using instance_eval added
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0