Project

General

Profile

Actions

Bug #8870

closed

Method-Missing breaking irb

Added by bjhaid (Ayodele Abejide) over 10 years ago. Updated almost 5 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
Backport:
[ruby-core:57047]

Description

2.0.0p247 :001 > def method_missing m,*args; [m.to_s,args].flatten.join " "; end
=> nil
2.0.0p247 :002 > "j".happy "hh"

2.0.0p247 :001 > def method_missing *args; args.join " "; end
=> nil
2.0.0p247 :002 > "j".happy
SystemStackError: stack level too deep
from /Users/bjhaid/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/irb/workspace.rb:86
Maybe IRB bug!

2.0.0p247 :003 > def method_missing m,*args; args.join " "; end
Segmentation fault: 11

2.0.0p247 :001 > def method_missing m,*args; [m,args].flatten " "; end
=> nil
2.0.0p247 :002 > "j".happy hah
Segmentation fault: 11

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

Array#flatten tries to call #to_ary method on non-Array arguments, but the result of `m.to_s' doesn't have it, so the method_missing is called, and continues infinitely.

In short, do not redefine global method_missing method.

Updated by bjhaid (Ayodele Abejide) over 10 years ago

I do understand that its bad to use method_missing in the global space, but the behavior should be same irrespective of scope

This works:
2.0.0-p247 :002 > m "2","a","b"
=> ["2", "a", "b"]
2.0.0-p247 :003 > (m "2","a","b").class
=> Array

This breaks:
2.0.0-p247 :004 > def method_missing m,*args; args.class; end
=> nil
2.0.0-p247 :005 > m "2","a","b"
/Users/bjhaid/.rvm/scripts/irbrc.rb:32:in `initialize': can't convert String to Fixnum (String#to_int gives Class) (TypeError)

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

I know nothing about what your script does.

Actions #4

Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago

  • Status changed from Open to Closed
  • Backport deleted (1.9.3: UNKNOWN, 2.0.0: UNKNOWN)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0