Skip to content

Commit

Permalink
Showing 2 changed files with 13 additions and 9 deletions.
2 changes: 2 additions & 0 deletions truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Original file line number Diff line number Diff line change
@@ -356,11 +356,13 @@ public CoreLibrary(RubyContext context) {
Layouts.CLASS.setInstanceFactoryUnsafe(moduleClass, Layouts.MODULE.createModuleShape(moduleClass, moduleClass));

// Close the cycles
// Set superclass of Class to Module
Layouts.MODULE.getFields(classClass).parentModule = Layouts.MODULE.getFields(moduleClass).start;
Layouts.MODULE.getFields(moduleClass).addDependent(classClass);
Layouts.CLASS.setSuperclass(classClass, moduleClass);
Layouts.MODULE.getFields(classClass).newVersion();

// Set constants in Object and lexical parents
Layouts.MODULE.getFields(classClass).getAdoptedByLexicalParent(context, objectClass, "Class", node);
Layouts.MODULE.getFields(basicObjectClass).getAdoptedByLexicalParent(context, objectClass, "BasicObject", node);
Layouts.MODULE.getFields(objectClass).getAdoptedByLexicalParent(context, objectClass, "Object", node);
20 changes: 11 additions & 9 deletions truffle/src/main/java/org/jruby/truffle/core/klass/ClassNodes.java
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import com.oracle.truffle.api.object.ObjectType;
import com.oracle.truffle.api.profiles.BranchProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.runtime.Visibility;
@@ -43,32 +42,35 @@
@CoreClass("Class")
public abstract class ClassNodes {

private final static com.oracle.truffle.api.object.Layout LAYOUT = com.oracle.truffle.api.object.Layout.createLayout();

/**
* Special constructor for class Class
*/
@TruffleBoundary
public static DynamicObject createClassClass(RubyContext context) {
final ModuleFields model = new ModuleFields(context, null, "Class");
model.setFullName(model.givenBaseName);

final DynamicObject rubyClass = LAYOUT.newInstance(LAYOUT.createShape(new ObjectType()));
final DynamicObjectFactory tempFactory = Layouts.CLASS.createClassShape(null, null);
final DynamicObject rubyClass = Layouts.CLASS.createClass(tempFactory, model, false, null, null, null);

final DynamicObjectFactory factory = Layouts.CLASS.createClassShape(rubyClass, rubyClass);
Layouts.BASIC_OBJECT.setLogicalClass(rubyClass, rubyClass);
Layouts.BASIC_OBJECT.setMetaClass(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.setFullName(model.givenBaseName);

// Class.new creates instance of Class
final DynamicObjectFactory instanceFactory = Layouts.CLASS.createClassShape(rubyClass, rubyClass);
Layouts.CLASS.setInstanceFactoryUnsafe(rubyClass, instanceFactory);

assert RubyGuards.isRubyModule(rubyClass);
assert RubyGuards.isRubyClass(rubyClass);

assert Layouts.MODULE.getFields(rubyClass) == model;
assert Layouts.BASIC_OBJECT.getLogicalClass(rubyClass) == rubyClass;
assert Layouts.BASIC_OBJECT.getMetaClass(rubyClass) == rubyClass;

return rubyClass;
}

0 comments on commit 9467004

Please sign in to comment.