Project

General

Profile

Actions

Bug #9622

closed

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

Bug #9622: Extra method arguments are magically swallowed after first successful call, possible method cache bug

Added by byroot (Jean Boussier) over 11 years ago. Updated over 11 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 - Bug #10291: Strange behaviour of splat in Ruby 2.0.0ClosedActions
Has duplicate Ruby - Bug #10353: weird behavior when dynamically adding method using instance_eval ClosedActions
Actions

Also available in: PDF Atom