Bug #5473

Raise in method_missing causes infinite loop

Added by Peter Vanbroekhoven over 3 years ago. Updated over 3 years ago.

[ruby-core:40287]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
ruby -v:ruby 1.9.3dev (2011-10-11 revision 33457) [i386-darwin9.8.0] Backport:

Description

=begin
The following code causes an infinite loop:

class ::Object

def method_missing(m, *a, &b)
  raise ArgumentError.new("haha")
end

end

1.foo

This is due to the raise calling (({to_str})) on the exception, which isn't defined. So a (({method_missing})) that also covers the (({Exception})) class and that contains a (({raise})) (at least the version with one argument) causes an infinite loop.

I'm a bit hesitant to call this a bug, except that the pattern above happened in code that works on Ruby 1.8 and breaks on 1.9.
=end

Associated revisions

Revision 34983
Added by Nobuyoshi Nakada over 3 years ago

  • vm_method.c (Init_eval_method): copy basic methods to Exception. [Bug #5473]

Revision 34983
Added by Nobuyoshi Nakada over 3 years ago

  • vm_method.c (Init_eval_method): copy basic methods to Exception. [Bug #5473]

History

#1 Updated by Koichi Sasada over 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada

#2 Updated by Nobuyoshi Nakada over 3 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r34983.
Peter, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • vm_method.c (Init_eval_method): copy basic methods to Exception. [Bug #5473]

Also available in: Atom PDF