Project

General

Profile

Actions

Bug #9622

closed

Extra method arguments are magically swallowed after first successful call, possible method cache bug

Added by byroot (Jean Boussier) about 10 years ago. Updated almost 10 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:61422]

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


Related issues 2 (0 open2 closed)

Has duplicate Ruby master - Bug #10291: Strange behaviour of splat in Ruby 2.0.0Closed09/24/2014Actions
Has duplicate Ruby master - Bug #10353: weird behavior when dynamically adding method using instance_eval Closed10/10/2014Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0