public static DynamicObject createRubyClass( RubyContext context, DynamicObject classClass, DynamicObject lexicalParent, DynamicObject superclass, String name, boolean isSingleton, DynamicObject attached) { final ModuleFields model = new ModuleFields(context, lexicalParent, name); final DynamicObject rubyClass = Layouts.CLASS.createClass( Layouts.CLASS.getInstanceFactory(classClass), model, isSingleton, attached, null); assert RubyGuards.isRubyClass(rubyClass) : classClass.getShape().getObjectType().getClass(); assert RubyGuards.isRubyModule(rubyClass) : classClass.getShape().getObjectType().getClass(); model.rubyModuleObject = rubyClass; if (model.lexicalParent == null) { // bootstrap or anonymous module Layouts.MODULE.getFields(rubyClass).name = Layouts.MODULE.getFields(rubyClass).givenBaseName; } else { Layouts.MODULE .getFields(rubyClass) .getAdoptedByLexicalParent(model.lexicalParent, model.givenBaseName, null); } if (superclass != null) { assert RubyGuards.isRubyClass(superclass); assert RubyGuards.isRubyClass(Layouts.MODULE.getFields(rubyClass).rubyModuleObject); Layouts.MODULE.getFields(rubyClass).parentModule = Layouts.MODULE.getFields(superclass).start; Layouts.MODULE .getFields(superclass) .addDependent(Layouts.MODULE.getFields(rubyClass).rubyModuleObject); Layouts.MODULE.getFields(rubyClass).newVersion(); } DynamicObjectFactory factory = Layouts.CLASS.getInstanceFactory(superclass); factory = Layouts.BASIC_OBJECT.setLogicalClass(factory, rubyClass); factory = Layouts.BASIC_OBJECT.setMetaClass(factory, rubyClass); Layouts.CLASS.setInstanceFactoryUnsafe(rubyClass, factory); return rubyClass; }
/** * This constructor supports initialization and solves boot-order problems and should not normally * be used from outside this class. */ public static DynamicObject createBootClass( DynamicObject classClass, DynamicObject superclass, String name) { assert RubyGuards.isRubyClass(classClass); assert superclass == null || RubyGuards.isRubyClass(superclass); final ModuleFields model = new ModuleFields( Layouts.MODULE.getFields(Layouts.BASIC_OBJECT.getLogicalClass(classClass)).getContext(), null, name); final DynamicObject rubyClass = Layouts.CLASS.createClass( Layouts.CLASS.getInstanceFactory(classClass), model, false, null, null); assert RubyGuards.isRubyClass(rubyClass) : classClass.getShape().getObjectType().getClass(); assert RubyGuards.isRubyModule(rubyClass) : classClass.getShape().getObjectType().getClass(); model.rubyModuleObject = rubyClass; if (model.lexicalParent == null) { // bootstrap or anonymous module Layouts.MODULE.getFields(rubyClass).name = Layouts.MODULE.getFields(rubyClass).givenBaseName; } else { Layouts.MODULE .getFields(rubyClass) .getAdoptedByLexicalParent(model.lexicalParent, model.givenBaseName, null); } if (superclass != null) { assert RubyGuards.isRubyClass(superclass); assert RubyGuards.isRubyClass(Layouts.MODULE.getFields(rubyClass).rubyModuleObject); Layouts.MODULE.getFields(rubyClass).parentModule = Layouts.MODULE.getFields(superclass).start; Layouts.MODULE .getFields(superclass) .addDependent(Layouts.MODULE.getFields(rubyClass).rubyModuleObject); Layouts.MODULE.getFields(rubyClass).newVersion(); } return rubyClass; }
/** Special constructor for class Class */ public static DynamicObject createClassClass(RubyContext context) { final ModuleFields model = new ModuleFields(context, null, "Class"); final DynamicObject rubyClass = LAYOUT.newInstance(LAYOUT.createShape(new ObjectType())); final DynamicObjectFactory factory = Layouts.CLASS.createClassShape(rubyClass, rubyClass); rubyClass.setShapeAndGrow(rubyClass.getShape(), factory.getShape()); assert RubyGuards.isRubyModule(rubyClass); assert RubyGuards.isRubyClass(rubyClass); model.rubyModuleObject = rubyClass; Layouts.CLASS.setInstanceFactoryUnsafe(rubyClass, factory); Layouts.MODULE.setFields(rubyClass, model); model.name = model.givenBaseName; assert RubyGuards.isRubyModule(rubyClass); assert RubyGuards.isRubyClass(rubyClass); assert Layouts.MODULE.getFields(rubyClass) == model; assert Layouts.BASIC_OBJECT.getLogicalClass(rubyClass) == rubyClass; return rubyClass; }