Project

General

Profile

Actions

Bug #6722

closed

Weird behavior of defined?(super) check invoked from a metaprogrammatically defined class method

Added by alexisowl (Alexey Smolianinov) over 12 years ago. Updated over 12 years ago.

Status:
Closed
Assignee:
-
Target version:
ruby -v:
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]
Backport:
[ruby-core:46322]

Description

=begin
Hi guys,

Sorry for the duplicate - I already reported ((<this issue|URL:https://bugs.ruby-lang.org/issues/6644)>))
2 weeks ago, but didn't receive any answer.
I had mistakenly assigned "target version", maybe that was the reason
of no response? Please let me know if my bug report is wrong or irrelevant
in any other respect.

Here's a link to the discussion of the issue on stackoverflow:
((URL:http://stackoverflow.com/questions/11180909))

Bellow is my initial description:

--

Lately I came across some weird behavior with the (({defined?})) operator used to check if (({super})) keyword can be invoked in current context. Usually it works fine, but when I tried to combine the (({defined? super})) check with a tiny bit of metaprogramming, it gave me unexpected results.

class A; 
  def self.def_f!; 
    singleton_class.send(:define_method, :f) { defined? super }
  end
end
class AA < A; end

A.def_f!

A.f  # => nil
AA.f # => nil

AA.def_f!

AA.f # => "super"
A.f  # => "super" - WHY???

The last result is really strange, isn't it?

(({A.f})) has no super method, so I would expect the last (({A.f})) to return (({nil})).
=end


Related issues 1 (0 open1 closed)

Is duplicate of Ruby master - Bug #6644: Weird behavior of defined?(super) check invoked from a metaprogrammatically defined class methodClosed06/25/2012Actions
Actions #1

Updated by nobu (Nobuyoshi Nakada) over 12 years ago

  • Status changed from Open to Closed

This issue was solved with changeset r36369.
Alexey, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


defined: me in cfp

  • insns.def (defined): use method entry and id in cfp for proper
    superclass, since klass in iseq is shared by dynamically defined
    methods from the same block. [ruby-core:45831][Bug #6644]

Updated by nobu (Nobuyoshi Nakada) over 12 years ago

  • Category set to core
  • Target version set to 2.0.0
  • % Done changed from 0 to 100
Actions

Also available in: Atom PDF

Like0
Like0Like0