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.