https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2009-11-27T19:30:37Z
Ruby Issue Tracking System
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=7020
2009-11-27T19:30:37Z
shugo (Shugo Maeda)
<ul></ul><p>特異クラス定義で<code>super</code>した時は<code>NoMethodError</code>になるようです。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">defiant</span><span class="ss">:build</span><span class="err">$</span> <span class="n">cat</span> <span class="n">t2</span><span class="p">.</span><span class="nf">rb</span>
<span class="k">class</span> <span class="nc">Foo</span>
<span class="k">def</span> <span class="nf">foo</span>
<span class="nb">p</span> <span class="nb">self</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">Bar</span> <span class="o"><</span> <span class="no">Foo</span>
<span class="k">def</span> <span class="nf">foo</span>
<span class="n">x</span> <span class="o">=</span> <span class="no">Object</span><span class="p">.</span><span class="nf">new</span>
<span class="k">class</span> <span class="o"><<</span> <span class="n">x</span>
<span class="k">super</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="no">Bar</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">foo</span>
</code></pre>
<pre><code>defiant:build$ ./ruby-trunk.1124 -v t2.rb
ruby 1.9.2dev (2009-11-24 trunk 25909) [i686-linux]
t2.rb:11:in `singletonclass': super called outside of method (NoMethodError)
from t2.rb:10:in `foo'
from t2.rb:16:in `<main>'
</code></pre>
<p>1.8では<code>Foo#foo</code>が呼ばれます。</p>
<pre><code>defiant:build$ ruby-1_8 -v t2.rb
ruby 1.8.8dev (2009-10-22 revision 25430) [i686-linux]
#<Bar:0xb7ea443c>
</code></pre>
<p>参考までに他の処理系では以下のような挙動でした。</p>
<pre><code>defiant:build$ ir -v t2.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
#<Bar:0x0000056>
</code></pre>
<pre><code>defiant:build$ jruby -v t2.rb
jruby 1.5.0.dev (ruby 1.8.7 patchlevel 174) (2009-11-12 421150b) (Java HotSpot(TM) Client VM 1.6.0_16) [i386-java]
#<Class:#<Object:0x180cf2a>>
</code></pre>
<pre><code>defiant:build$ rbx -v t2.rb
rubinius 0.13.0-dev (1.8.7 e614007b 2009-11-06) [i686-pc-linux-gnu]
An exception occurred running t2.rb
No method 'bytecode' on an instance of NilClass. (NoMethodError)
</code></pre>
<p>それぞれ個性があって面白いですね。</p>
<p>個人的には例外でもいいんじゃないかなと思いますが、1.9の<code>instance_eval</code>での<br>
<code>super</code>や、JRubyの特異クラス定義での<code>super</code>のように、変なレシーバで<code>super</code>が<br>
呼ばれてしまうのはまずいんじゃないかと思います。</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=7036
2009-11-28T07:16:39Z
ujihisa (Tatsuhiro Ujihisa)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>matz (Yukihiro Matsumoto)</i></li></ul>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=10262
2010-04-17T12:39:44Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Assignee</strong> changed from <i>matz (Yukihiro Matsumoto)</i> to <i>ko1 (Koichi Sasada)</i></li></ul><p>遠藤です。</p>
<blockquote>
<p><code>instance_eval</code>のブロック内で<code>super</code>を呼ぶと、<code>instance_eval</code>で変更された<br>
<code>self</code>に対して<code>super</code>の呼び出しを行ってしまうようです。</p>
</blockquote>
<p>再現しました。以下で SEGV することも確認しました。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">MyArray</span> <span class="o"><</span> <span class="no">Array</span>
<span class="k">def</span> <span class="nf">reverse</span>
<span class="s2">"foo"</span><span class="p">.</span><span class="nf">instance_eval</span> <span class="k">do</span>
<span class="k">super</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="no">MyArray</span><span class="p">.</span><span class="nf">new</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]).</span><span class="nf">reverse</span>
</code></pre>
<p>パッチも見ました。速度劣化は気になりますが、正しいと思います。</p>
<p><code>vm_search_superclass</code> を追ってみたところ、<code>recv</code> が必要になるのは、<br>
現在のコンテキストが <code>include</code> された <code>module</code> に所属するメソッドの<br>
場合 (<code>ICLASS</code>) だけのようですので、その時まで <code>recv</code> の同定を遅延<br>
させると、速度劣化も気にならなくなるかもと思います。</p>
<p>ただ、その辺の修正は <a href="/issues/3136">[ruby-dev:40959]</a> の修正の後にやったほうが<br>
いい予感がするので、最適化は後にして、とりあえずこの問題は前田<br>
さんのパッチで close するのがいいと思います。</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=10913
2010-05-11T00:27:43Z
ko1 (Koichi Sasada)
<ul></ul><p>パッチは全然見てないのですが,遠藤さんが良いと仰ってるので良いのではないかと思います.</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=11297
2010-05-28T00:49:40Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul><li><strong>Target version</strong> set to <i>2.0.0</i></li></ul><p>遠藤です。</p>
<p>[Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: strange behavior of anonymous class inside a proc (Closed)" href="https://bugs.ruby-lang.org/issues/2502">#2502</a>] [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: reuse of singleton method definition causes SEGV (Closed)" href="https://bugs.ruby-lang.org/issues/3136">#3136</a>] あたりで super の修正は後回しにしようということに<br>
なり、r28043 でとりあえずの対策をしたので、1.9.x にします。</p>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=18506
2011-06-26T23:20:02Z
nahi (Hiroshi Nakamura)
nakahiro@gmail.com
<ul><li><strong>Target version</strong> changed from <i>2.0.0</i> to <i>1.9.3</i></li></ul>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=19014
2011-07-10T14:15:52Z
ko1 (Koichi Sasada)
<ul><li><strong>Target version</strong> changed from <i>1.9.3</i> to <i>2.0.0</i></li></ul><p>すみません,1.9.4 送りで....</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=28671
2012-08-06T16:00:27Z
shugo (Shugo Maeda)
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>This issue was solved with changeset r36640.<br>
Shugo, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<hr>
<ul>
<li>internal.h, class.c, eval.c, insns.def: find the appropriate<br>
receiver for super called in instance_eval. If such a receiver is<br>
not found, raise NoMethodError. <a href="/issues/2402">[ruby-dev:39772]</a> [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: super in instance_eval (Closed)" href="https://bugs.ruby-lang.org/issues/2402">#2402</a>]</li>
</ul>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=28996
2012-08-23T13:05:52Z
shugo (Shugo Maeda)
<ul><li><strong>Status</strong> changed from <i>Closed</i> to <i>Open</i></li></ul><p>Reopened the issue because r36640 is reverted by r36795.</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=33897
2012-11-26T09:05:00Z
ko1 (Koichi Sasada)
<ul><li><strong>Priority</strong> changed from <i>Normal</i> to <i>5</i></li></ul><p>shugo-san<br>
これ,どういう話でしたっけ.</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=33931
2012-11-26T11:11:04Z
shugo (Shugo Maeda)
<ul></ul><p>ko1 (Koichi Sasada) wrote:</p>
<blockquote>
<p>shugo-san<br>
これ,どういう話でしたっけ.</p>
</blockquote>
<p>instance_evalの中でsuperを呼んだ時に正しいレシーバを見つけるために r36640 で外側のフレームを辿る<br>
ようにしたのですが、 Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Another problem with super (Closed)" href="https://bugs.ruby-lang.org/issues/6907">#6907</a> の問題があったので r36795 でrevertしました。</p>
<p>現状はNotImplementedErrorがraiseされますが、こういうケースでsuperが呼べないのを仕様ということに<br>
するなら(selfのtypeがおかしいという意味で)TypeErrorが妥当ですかねえ。</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=34001
2012-11-27T12:11:14Z
shugo (Shugo Maeda)
<ul></ul><p>shugo (Shugo Maeda) wrote:</p>
<blockquote>
<p>instance_evalの中でsuperを呼んだ時に正しいレシーバを見つけるために r36640 で外側のフレームを辿る<br>
ようにしたのですが、 Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Another problem with super (Closed)" href="https://bugs.ruby-lang.org/issues/6907">#6907</a> の問題があったので r36795 でrevertしました。</p>
<p>現状はNotImplementedErrorがraiseされますが、こういうケースでsuperが呼べないのを仕様ということに<br>
するなら(selfのtypeがおかしいという意味で)TypeErrorが妥当ですかねえ。</p>
</blockquote>
<p>一点補足すると、1.8ではinstance_evalではフレームのselfは変えずにrb_evalの引数だけ変えているみたいなので<br>
instance_evalの中でsuperした時もちゃんと元のselfが使われるようですが、このためだけにselfを二重に持つのは<br>
何だかなあという気がしています。<br>
でもorphanなProcからsuperを呼んだ時とかを考えると他の方法を思い付きません。</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=34963
2012-12-21T22:32:15Z
tarui (Masaya Tarui)
tarui@prx.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li></ul>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=35141
2012-12-29T22:01:54Z
shugo (Shugo Maeda)
<ul><li><strong>Assignee</strong> changed from <i>ko1 (Koichi Sasada)</i> to <i>matz (Yukihiro Matsumoto)</i></li></ul><p>まつもとさん、この件どうしましょうか?</p>
<p>個人的にはinstance_evalの中でsuperを呼ぶのはかなり特殊なケースだと思うので、<br>
TypeErrorでよいように思いますが。</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=35300
2013-01-09T17:24:47Z
shugo (Shugo Maeda)
<ul><li><strong>Category</strong> set to <i>core</i></li></ul><p>shugo (Shugo Maeda) wrote:</p>
<blockquote>
<p>まつもとさん、この件どうしましょうか?</p>
<p>個人的にはinstance_evalの中でsuperを呼ぶのはかなり特殊なケースだと思うので、<br>
TypeErrorでよいように思いますが。</p>
</blockquote>
<p>まつもとさん、いかがでしょうか。</p>
<p>再度まとめると、以下のように<code>instance_eval</code>中で<code>super</code>を呼ぶと、<code>super</code>で<br>
呼び出した先のクラス・モジュールと<code>self</code>の整合性が取れなくなるため、<br>
現状では、<code>NotImplementedError</code>が発生します。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">Bar</span> <span class="o"><</span> <span class="no">Foo</span>
<span class="k">def</span> <span class="nf">foo</span>
<span class="n">x</span> <span class="o">=</span> <span class="no">Object</span><span class="p">.</span><span class="nf">new</span>
<span class="n">x</span><span class="p">.</span><span class="nf">instance_eval</span> <span class="k">do</span>
<span class="k">super</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p><code>NotImplementedError</code>なのは、将来1.8と同様に動くように実装するという意図だと<br>
思いますが、次の点からこの場合はエラーでもよいのではないかと考えています。</p>
<ul>
<li>1.8とインタプリタの構造が異なるため、上記のコードを動くようにするには実装コストも<br>
実行コストもかかる。
<ul>
<li>制御フレームを辿ってもとの<code>self</code>を見つける修正を試みましたが、orphanな<code>Proc</code>から<br>
<code>super</code>を呼んだ時などに問題がありました。</li>
</ul>
</li>
<li>現状エラーが発生するが、誰も困っていなさそう。</li>
</ul>
<p>ただ、この場合はエラーになるのが仕様ということにするのであれば、<code>NotImplementedError</code>は<br>
不適切なので、<code>TypeError</code>(<code>self</code>と呼び出し先メソッドのクラスが不整合という意味)などの他の<br>
例外を発生させるようにしてはどうでしょうか。</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=35301
2013-01-09T17:35:43Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>うーん、では、禁止でいいですよ。</p>
<p>Matz.</p>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=35314
2013-01-10T16:51:37Z
shugo (Shugo Maeda)
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>This issue was solved with changeset r38761.<br>
Shugo, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<hr>
<ul>
<li>vm_insnhelper.c (vm_search_super_method): raise a TypeError<br>
instead of a NotImplementError if self is not an instance of the<br>
current class. <a href="/issues/2402">[ruby-dev:39772]</a> [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: super in instance_eval (Closed)" href="https://bugs.ruby-lang.org/issues/2402">#2402</a>]</li>
</ul>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=54647
2015-10-30T03:21:26Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/54647/diff?detail_id=39213">diff</a>)</li></ul>
Ruby master - Bug #2402: super in instance_eval
https://bugs.ruby-lang.org/issues/2402?journal_id=54649
2015-10-30T04:41:08Z
shugo (Shugo Maeda)
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/11636">Bug #11636</a>: super in instance_eval in a method defined in a module is invoked with a wrong receiver</i> added</li></ul>