BUGS in metaclasses inheritance

Hi all,

It will probably not change the world but I’ve found 3 bugs regarding
the
inheritance between metaclasses both in Ruby 1.8.5 and 1.8.6.

The inheritance should be as defined in the object.c source code (best
seen
with a fixed font) :

  •                        +------------------+
    
  •                        |                  |
    
  •          Object---->(Object)              |
    
  •           ^  ^        ^  ^                |
    
  •           |  |        |  |                |
    
  •           |  |  +-----+  +---------+      |
    
  •           |  |  |                  |      |
    
  •           |  +-----------+         |      |
    
  •           |     |        |         |      |
    
  •    +------+     |     Module--->(Module)  |
    
  •    |            |        ^         ^      |
    
  • OtherClass–>(OtherClass) | | |
  •                          |         |      |
    
  •                        Class---->(Class)  |
    
  •                          ^                |
    
  •                          |                |
    
  •                          +----------------+
    

The following code and output show that the actual inheritance between
the
metaclasses (noted between parentheses) is incorrect :

def inspect_class name, obj
puts “#################”
puts “class : #{name} - id : #{obj.object_id}”
puts “superclass : #{obj.superclass.name} - id : #{
obj.superclass.object_id}” if obj.superclass
puts “#################”
end

class OtherClass
end

class Object
inspect_class self.name, self
end

class << Object
inspect_class “(Object)”, self
end

class Module
inspect_class self.name, self
end

class << Module
inspect_class “(Module)”, self
end

class Class
inspect_class self.name, self
end

class << Class
inspect_class “(Class)”, self
end

class OtherClass
inspect_class self.name, self
end

class << OtherClass
inspect_class “(OtherClass)”, self
end

The output :

#################
class : Object - id : 22251190
#################
#################
class : (Object) - id : 22251160
superclass : Class - id : 22251170
#################
#################
class : Module - id : 22251180
superclass : Object - id : 22251190
#################
#################
class : (Module) - id : 22251150
superclass : Class - id : 22251170
#################
#################
class : Class - id : 22251170
superclass : Module - id : 22251180
#################
#################
class : (Class) - id : 22251140
superclass : - id : 22251140
#################
#################
class : OtherClass - id : 24175280
superclass : Object - id : 22251190
#################
#################
class : (OtherClass) - id : 24175220
superclass : - id : 22251140
#################

The bugs :

  • The superclass of (OtherClass) is (Class) instead of (Object) !

  • The superclass of (Class) is (Class) instead of (Module) !

  • The superclass of (Module) is (Class) instead of (Object) !

I hope that Matz or another Ruby core developer will see this thread and
fix
these bugs.

Chauk-Mean.

I hope that Matz or another Ruby core developer will see this thread
and fix
these bugs.

Chauk-Mean.

Please submit bugs to the Ruby bug tracker:
http://rubyforge.org/tracker/?atid=1698&group_id=426&func=browse

-Justin

OK. I’ve just done it:

Issue #9462.

Chauk-Mean.