https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112011-07-22T21:58:36ZRuby Issue Tracking SystemRuby master - Bug #5077: method_missing throws NoMemoryError after inheriting from BasicObjecthttps://redmine.ruby-lang.org/issues/5077?journal_id=195442011-07-22T21:58:36ZEregon (Benoit Daloze)
<ul></ul><p>Farruco Sanjurjo wrote:</p>
<blockquote>
<p>If a class inherits from BasicObject and then overwrites method_missing like this:</p>
<p>class A < BasicObject<br>
def method_missing(*a)<br>
puts "#{a}"<br>
end<br>
end</p>
<p>And we try it:</p>
<p>A.new.fooooo</p>
<p>The interpreter enters what looks like a loop and then crashes with this trace (in irb):</p>
</blockquote>
<p>method_missing is called indefinitely recursively because "puts" is not a method in BasicObject.</p>
<p>Only methods available in BasicObject are:<br>
BasicObject.instance_methods # => [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :<strong>send</strong>]</p>
<p>"puts" is usually provided by Kernel#puts. But Kernel is not included in BasicObject.<br>
You could solve this two ways:</p>
<ul>
<li>use "::Kernel::puts" instead of "puts" (the documentation about the first :: is being discussed in Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: BasicObject's constant lookup documentation (Closed)" href="https://redmine.ruby-lang.org/issues/5067">#5067</a>)</li>
<li>include Kernel into your class A</li>
</ul> Ruby master - Bug #5077: method_missing throws NoMemoryError after inheriting from BasicObjecthttps://redmine.ruby-lang.org/issues/5077?journal_id=195482011-07-22T22:19:52Zmrkn (Kenta Murata)muraken@gmail.com
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li><li><strong>Priority</strong> changed from <i>5</i> to <i>Normal</i></li></ul><p>BasicObject doesn't include Kernel module.<br>
It is a spec.</p>