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.