https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112013-02-14T07:28:29ZRuby Issue Tracking SystemRuby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=362522013-02-14T07:28:29Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>I agree, this can only be a bug.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=362752013-02-14T16:14:48Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul></ul><p>Rather I expect [B, A] in this case.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=362832013-02-14T23:59:43Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul></ul><blockquote>
<p>Rather I expect [B, A] in this case.</p>
</blockquote>
<p>Fine. I just wanted to point out the weird skipping.<br>
(Actually, I expect nothing for such a code :-)</p>
<p>2013/2/14, SASADA Koichi <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a>:</p>
<blockquote>
<p>(2013/02/14 16:14), nobu (Nobuyoshi Nakada) wrote:</p>
<blockquote>
<p>Rather I expect [B, A] in this case.</p>
</blockquote>
<p>+1</p>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
</blockquote>
<p>--<br>
Yusuke Endoh <a href="mailto:mame@tsg.ne.jp" class="email">mame@tsg.ne.jp</a></p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=362922013-02-15T01:01:07Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>nobu (Nobuyoshi Nakada) wrote:</p>
<blockquote>
<p>Rather I expect [B, A] in this case.</p>
</blockquote>
<p>You do?</p>
<p>There would be no way to safely monkey patch this method without using Prepend! So any 1.9.x library that uses monkey patching like alias_method_chain could be incompatible with prepended classes!</p>
<p>I expect:<br>
B.instance_method(:m) == B.instance_method(:m2) # => true in rc2, false in trunk, should be true<br>
B.new.m2 # => [P, B, A], since they are aliases appart from their name</p>
<p>Here is another bug (even more clear) that might be related:<br>
B.instance_method(:m).owner # => P in rc2 (ok), B in trunk (not ok)<br>
B.instance_method(:m2).owner # => #<B:0x0000010384b418>, should be P</p>
<p>I wish I had time to look at it further.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=364432013-02-17T23:54:33Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul></ul><p>I expect:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="k">module</span> <span class="nn">P</span>
<span class="k">def</span> <span class="nf">m</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">"P"</span><span class="p">;</span> <span class="k">super</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">A</span>
<span class="k">def</span> <span class="nf">m</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">"A"</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">B</span> <span class="o"><</span> <span class="no">A</span>
<span class="k">def</span> <span class="nf">m</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">"B"</span><span class="p">;</span> <span class="k">end</span>
<span class="k">alias</span> <span class="n">m2</span> <span class="n">m</span>
<span class="n">prepend</span> <span class="no">P</span>
<span class="k">alias</span> <span class="n">m3</span> <span class="n">m</span>
<span class="k">end</span>
<span class="no">B</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">m2</span>
<span class="c1">#=> expected: B, A</span>
<span class="no">B</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">m3</span>
<span class="c1">#=> expected: P, B, A</span>
</code></pre>
<p>Matz.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=364532013-02-18T06:23:19Zphluid61 (Matthew Kerwin)matthew@kerwin.net.au
<ul></ul><p>I'm sorry, but this ticket confuses me. Why does "A" ever get output, if<br>
B#m does not also call super?</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=364842013-02-18T12:21:40Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>phluid61 (Matthew Kerwin) wrote:</p>
<blockquote>
<p>I'm sorry, but this ticket confuses me. Why does "A" ever get output, if<br>
B#m does not also call super?</p>
</blockquote>
<p>You're right to be confused, there's a missing <code>super</code> in the examples that everyone assumed was there.</p>
<p>So here's the corrected version:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="k">module</span> <span class="nn">P</span>
<span class="k">def</span> <span class="nf">m</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">"P"</span><span class="p">;</span> <span class="k">super</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">A</span>
<span class="k">def</span> <span class="nf">m</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">"A"</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">B</span> <span class="o"><</span> <span class="no">A</span>
<span class="k">def</span> <span class="nf">m</span><span class="p">;</span> <span class="nb">puts</span> <span class="s2">"B"</span><span class="p">;</span> <span class="k">super</span><span class="p">;</span> <span class="k">end</span>
<span class="k">alias</span> <span class="n">m2</span> <span class="n">m</span>
<span class="n">prepend</span> <span class="no">P</span>
<span class="k">alias</span> <span class="n">m3</span> <span class="n">m</span>
<span class="k">end</span>
<span class="no">B</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">m2</span> <span class="c1">#=> expected: B, A</span>
<span class="no">B</span><span class="p">.</span><span class="nf">new</span><span class="p">.</span><span class="nf">m3</span> <span class="c1">#=> expected: P, B, A</span>
</code></pre> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=364852013-02-18T12:22:06Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul><li><strong>Category</strong> set to <i>core</i></li><li><strong>Assignee</strong> deleted (<del><i>matz (Yukihiro Matsumoto)</i></del>)</li></ul> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=367292013-02-22T08:57:30Zko1 (Koichi Sasada)
<ul><li><strong>Assignee</strong> set to <i>nobu (Nobuyoshi Nakada)</i></li><li><strong>Target version</strong> changed from <i>2.6</i> to <i>2.1.0</i></li></ul><p>marcandre: why you remove assignee?<br>
you mean specification discussion was finished at <a href="/issues/7842">[ruby-core:52386]</a>#5?<br>
I assume the reason and I assign this ticket nobu, the patch monster.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=367552013-02-22T10:46:16Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>ko1 (Koichi Sasada) wrote:</p>
<blockquote>
<p>marcandre: why you remove assignee?<br>
you mean specification discussion was finished at <a href="/issues/7842">[ruby-core:52386]</a>#5?<br>
I assume the reason and I assign this ticket nobu, the patch monster.</p>
</blockquote>
<p>Exactly.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=436432013-12-13T22:29:25Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<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 r44175.<br>
Yusuke, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<hr>
<p><code>proc.c</code>, <code>vm_method.c</code>: fix super and alias</p>
<ul>
<li>
<code>proc.c</code> (<code>method_owner</code>): return the class where alias is defined, not<br>
the class original method is defined.</li>
<li>
<code>vm_method.c</code> (<code>rb_method_entry_make</code>, <code>rb_alias</code>): store the originally<br>
defined class in <code>me</code>. [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: owner of methods defined after using Module#prepend (Closed)" href="https://redmine.ruby-lang.org/issues/7993">#7993</a>] [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: An alias of a "prepend"ed method skips the original method when calling super (Closed)" href="https://redmine.ruby-lang.org/issues/7842">#7842</a>] [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: include + include + alias_method + super behaviour inconsistency between 1.9 and 2.0 (Closed)" href="https://redmine.ruby-lang.org/issues/9236">#9236</a>]</li>
<li>
<code>vm_method.c</code> (<code>rb_method_entry_get_without_cache</code>): cache included<br>
module but not iclass.</li>
</ul> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=437342013-12-18T12:49:46Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Backport</strong> set to <i>1.9.3: DONTNEED, 2.0.0: REQUIRED</i></li></ul> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=442202014-01-12T06:57:08Znagachika (Tomoyuki Chikanaga)nagachika00@gmail.com
<ul><li><strong>Backport</strong> changed from <i>1.9.3: DONTNEED, 2.0.0: REQUIRED</i> to <i>1.9.3: DONTNEED, 2.0.0: DONE</i></li></ul><p>r44175 was already backported to <code>ruby_2_0_0</code> at r44345.</p> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=463102014-04-25T06:17:55Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/46310/diff?detail_id=33414">diff</a>)</li></ul> Ruby master - Bug #7842: An alias of a "prepend"ed method skips the original method when calling superhttps://redmine.ruby-lang.org/issues/7842?journal_id=526632015-05-28T00:33:41Zusa (Usaku NAKAMURA)usa@garbagecollect.jp
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/11189">Bug #11189</a>: alias prepended module</i> added</li></ul>