core/class.rb
class Class
def self.allocate
Rubinius.primitive :class_s_allocate
raise PrimitiveFailure, "Class.allocate primitive failed"
end
def set_superclass(sup)
Rubinius.primitive :class_set_superclass
kind = Rubinius::Type.object_class(sup)
raise TypeError, "Class.set_superclass: argument must be a Class (#{kind} given)"
end
private :set_superclass
def initialize(sclass=Object, name=nil, under=nil)
raise TypeError, "already initialized class" if @instance_type
raise TypeError, "can't make subclass of Class" if Class.equal?(sclass)
set_superclass sclass
# Things (rails) depend on the fact that a normal class is in the constant
# table and have a name BEFORE inherited is run.
under.const_set name, self if under
if sclass
Rubinius.privately do
sclass.inherited self
end
end
super()
end
private :initialize
##
# Specialized initialize_copy because Class needs additional protection
def initialize_copy(other)
# The code in super (Module#initialize_copy) will duplicate
# the method table. Therefore do this check here to see whether
# we've already initialized this class before continuing.
unless @method_table == other.method_table
raise TypeError, "already initialized class"
end
@module_name = nil
super
end
private :initialize_copy
def inherited(name)
end
private :inherited
def superclass
cls = direct_superclass
unless cls
return nil if self == BasicObject
raise TypeError, "uninitialized class"
end
while cls and cls.kind_of? Rubinius::IncludedModule
cls = cls.direct_superclass
end
return cls
end
end