Bugs: Browse | Submit New | Admin

[#9462] BUGS in metaclasses inheritance

Date:
2007-03-22 10:19
Priority:
3
Submitted By:
Chauk-Mean Proum (chauk-mean)
Assigned To:
Shyouhei Urabe (shyouhei)
Category:
Language / Runtime / Core Libraries
State:
Open
Platform:
 
Summary:
BUGS in metaclasses inheritance

Detailed description
 
The inheritance between metaclasses (noted between parentheses) 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 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) !

Chauk-Mean.

Add A Comment: Notepad

Please login


Followup

Message
Date: 2007-05-08 21:21
Sender: Tammo Freese

# Here is my test case. Both tests fail before rolling back 7768
# and pass afterwards

require 'test/unit'

class X
end

class RubyBugs9462FixTest < Test::Unit::TestCase

  def test_superclass_ruby_list_40519
    x = X.new
    metaclass_of_x = class<<x;self;end
    
    # This is from ruby-list:40519
    assert_equal X, metaclass_of_x.superclass
    
    # I added this one 
    assert_equal Object, metaclass_of_x.superclass.superclass
    
    # This one is from ruby-list:40519
    assert_nil metaclass_of_x < X
  end
  
  def test_ruby_bugs_9462_fix
    singleton_class_of_Class = class<<Class;self;end
    singleton_class_of_Module = class<<Module;self;end
    singleton_class_of_Object = class<<Object;self;end
    assert_equal singleton_class_of_Module,
singleton_class_of_Class.superclass
    assert_equal singleton_class_of_Object,
singleton_class_of_Module.superclass
    assert_equal Class, singleton_class_of_Object.superclass
  end
  
end
Date: 2007-05-08 21:18
Sender: Tammo Freese

It seems to me that this bug is related to object.c changes in
change set #7768.

After rolling it back (
svn diff -r7768:7767 object.c | patch -p0
)

everything works as expected (I'll submit a test case later).

#7768 comment is: 
'superclass of singleton class also should be a singleton class.
fixed: [ruby-list:40519]'


Tammo Freese
Date: 2007-04-23 12:14
Sender: Paolo Perrotta

I tried this:

  class Object
   # good old eigenclass accessor
   def eigenclass; class << self; self; end; end
  end

  class A; end
  class B < A; end
  b = B.new

  p "super of eigen of b: #{b.eigenclass.superclass}"
  p "super of eigen of B: #{B.eigenclass.superclass}"
  p "super of eigen of A: #{A.eigenclass.superclass}"

Ruby 1.8.2 and Ruby 1.9 give the same result (consistent with
method lookup):

  MacNusco:/usr/bin nusco$ ruby -v /strange.rb
  ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
  "super of eigen of b: B"
  "super of eigen of B: #<Class:A>"
  "super of eigen of A: #<Class:Object>"

Ruby 1.8.5 and 1.8.6 seem to be bugged:

  MacNusco:/ nusco$ ruby -v /strange.rb
  ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.9.1]
  "super of eigen of b: #<Class:B>"
  "super of eigen of B: #<Class:Class>"
  "super of eigen of A: #<Class:Class>"

Attached Files:

Name Description Download
No Files Currently Attached

Changes:

Field Old Value Date By
assigned_tonone2007-06-12 02:24zenspider
category_idMisc / Other Standard Library2007-05-29 21:16zenspider
category_idLanguage / Runtime / Core Libraries2007-05-29 15:55zenspider