Forum: Ruby Bug in Kernel#method objects that call super?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Charles Oliver N. (Guest)
on 2007-07-09 19:32
(Received via mailing list)
I posted this to ruby-core and got a somewhat mixed response. I'm
curious what the rest of you might think of this behavior.

-------- Original Message --------
Subject: Bug in Kernel#method objects that call super?
Date: Sat, 07 Jul 2007 05:57:13 +0900
From: Charles Oliver N. <removed_email_address@domain.invalid>
Reply-To: removed_email_address@domain.invalid
To: removed_email_address@domain.invalid

This seems very wrong to me. Calling through a method object should
behave the same for super as calling directly or calling through an
alias:


class Foo
   def a; puts 'Foo a'; end
   def b; puts 'Foo b'; end
end

class Bar < Foo
   def a; puts 'Bar a'; super; end
   alias b a
end

Bar.new.a # => "Bar a\nFoo a"
Bar.new.b # => "Bar a\nFoo a"
Bar.new.method(:b).call # => "Bar a\nFoo b"


It seems incorrect for method objects to change the behavior of super.
If I super in 'a', I want super's 'a' to be called, without exception.

Can someone confirm this is a bug? In JRuby we always super up the
same-named chain, so this represents an incompatibility.

- Charlie
unknown (Guest)
on 2007-07-10 00:46
(Received via mailing list)
HI --

On Tue, 10 Jul 2007, Charles Oliver N. wrote:

>  def a; puts 'Bar a'; super; end
>  alias b a
> end
>
> Bar.new.a # => "Bar a\nFoo a"
> Bar.new.b # => "Bar a\nFoo a"
> Bar.new.method(:b).call # => "Bar a\nFoo b"
>
>
> It seems incorrect for method objects to change the behavior of super.
> If I super in 'a', I want super's 'a' to be called, without exception.

I agree that it's very odd that the two ways of calling behave
differently.  A secondary question is whether the #method behavior --
the dynamic calculation of what method super should look for -- has
any useful application.  I can't think of any.  Maybe we need "super!"
:-)


David
Charles Oliver N. (Guest)
on 2007-07-10 01:35
(Received via mailing list)
removed_email_address@domain.invalid wrote:
> I agree that it's very odd that the two ways of calling behave
> differently.  A secondary question is whether the #method behavior --
> the dynamic calculation of what method super should look for -- has
> any useful application.  I can't think of any.  Maybe we need "super!"
> :-)

I can't really think of any either; if you want that sort of
polymorphism on a superclass, you shouldn't use super.

- Charlie
ara.t.howard (Guest)
on 2007-07-10 05:05
(Received via mailing list)
On Jul 9, 2007, at 9:31 AM, Charles Oliver N. wrote:

> This seems very wrong to me

me too.

-a
Tim P. (Guest)
on 2007-07-10 06:25
(Received via mailing list)
On 7/9/07, Charles Oliver N. <removed_email_address@domain.invalid> wrote:
> This seems very wrong to me. Calling through a method object should
>    alias b a
> Can someone confirm this is a bug? In JRuby we always super up the
> same-named chain, so this represents an incompatibility.
>

I think the bug is in alias and not in #method ....

Or at least the bug is brought about by some odd interaction between
alias and #method. My WAG at the problem is that alias creates a copy
of the method :a and renames it method :b in Bar. There is some hint
in the lookup table in class Bar that tells the Ruby interpreter --
"hey, this is really method :a, so super should redirect to method :a
in the superclass".

When #method generates the Proc object, this hinting is not preserved.
So, when super is called, it redirects to method :b in Foo.

Again, just my WAG -- I have not looked at the source code on this one.

Blessings,
TwP
This topic is locked and can not be replied to.