mirror of
https://github.com/mistergibson/gxg-web-client.git
synced 2026-08-15 11:34:29 -07:00
67 lines
1.7 KiB
Ruby
67 lines
1.7 KiB
Ruby
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
|