Skip to content

Commit 7db4041

Browse files
committed
Create the ModuleFields in the RubyModule constructor
* So ModuleFields#rubyModule can be final. * Cleanup the creation of the class Class.
1 parent b36acc3 commit 7db4041

File tree

6 files changed

+58
-44
lines changed

6 files changed

+58
-44
lines changed

src/main/java/org/truffleruby/core/CoreLibrary.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -388,19 +388,19 @@ public CoreLibrary(RubyContext context) {
388388

389389
// Create the cyclic classes and modules
390390

391-
classClass = ClassNodes.createClassClass(context, null);
391+
classClass = ClassNodes.createClassClass(context);
392392
classShape = classClass.getShape();
393393
classClass.instanceShape = classShape;
394394

395-
basicObjectClass = ClassNodes.createBootClass(context, null, classClass, Nil.INSTANCE, "BasicObject");
395+
basicObjectClass = ClassNodes.createBootClass(context, classClass, Nil.INSTANCE, "BasicObject");
396396
Shape basicObjectShape = createShape(RubyBasicObject.class, basicObjectClass);
397397
basicObjectClass.instanceShape = basicObjectShape;
398398

399-
objectClass = ClassNodes.createBootClass(context, null, classClass, basicObjectClass, "Object");
399+
objectClass = ClassNodes.createBootClass(context, classClass, basicObjectClass, "Object");
400400
objectShape = createShape(RubyBasicObject.class, objectClass);
401401
objectClass.instanceShape = objectShape;
402402

403-
moduleClass = ClassNodes.createBootClass(context, null, classClass, objectClass, "Module");
403+
moduleClass = ClassNodes.createBootClass(context, classClass, objectClass, "Module");
404404
Shape moduleShape = createShape(RubyModule.class, moduleClass);
405405
moduleClass.instanceShape = moduleShape;
406406

src/main/java/org/truffleruby/core/klass/ClassNodes.java

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import org.truffleruby.builtins.CoreModule;
1616
import org.truffleruby.core.CoreLibrary;
1717
import org.truffleruby.core.basicobject.BasicObjectType;
18-
import org.truffleruby.core.module.ModuleFields;
1918
import org.truffleruby.core.module.RubyModule;
2019
import org.truffleruby.core.proc.RubyProc;
2120
import org.truffleruby.core.string.StringUtils;
@@ -63,17 +62,12 @@ public static void setLogicalAndMetaClass(RubyDynamicObject object, RubyClass ru
6362

6463
/** Special constructor for class Class */
6564
@TruffleBoundary
66-
public static RubyClass createClassClass(RubyContext context, SourceSection sourceSection) {
67-
final ModuleFields model = new ModuleFields(context, sourceSection, null, "Class");
68-
model.setFullName("Class");
69-
65+
public static RubyClass createClassClass(RubyContext context) {
7066
final Shape tempShape = CoreLibrary.createShape(RubyClass.class, null);
71-
final RubyClass rubyClass = new RubyClass(tempShape, model);
67+
final RubyClass rubyClass = new RubyClass(context, tempShape);
7268

7369
setLogicalAndMetaClass(rubyClass, rubyClass);
7470

75-
model.rubyModule = rubyClass;
76-
7771
assert rubyClass.getLogicalClass() == rubyClass;
7872
assert rubyClass.getMetaClass() == rubyClass;
7973

@@ -83,13 +77,9 @@ public static RubyClass createClassClass(RubyContext context, SourceSection sour
8377
/** This constructor supports initialization and solves boot-order problems and should not normally be used from
8478
* outside this class. */
8579
@TruffleBoundary
86-
public static RubyClass createBootClass(RubyContext context, SourceSection sourceSection,
87-
RubyClass classClass, Object superclass, String name) {
88-
final ModuleFields fields = new ModuleFields(context, sourceSection, null, name);
89-
final RubyClass rubyClass = new RubyClass(classClass, fields, false, null, superclass);
90-
91-
fields.rubyModule = rubyClass;
92-
fields.setFullName(name);
80+
public static RubyClass createBootClass(RubyContext context, RubyClass classClass, Object superclass, String name) {
81+
final RubyClass rubyClass = new RubyClass(classClass, context, null, null, name, false, null, superclass);
82+
rubyClass.fields.setFullName(name);
9383

9484
if (superclass != Nil.INSTANCE) {
9585
rubyClass.setSuperClass((RubyClass) superclass);
@@ -145,14 +135,20 @@ public static RubyClass createRubyClass(RubyContext context,
145135
boolean isSingleton,
146136
RubyDynamicObject attached) {
147137
assert superclass != null;
148-
final ModuleFields fields = new ModuleFields(context, sourceSection, lexicalParent, name);
149-
final RubyClass rubyClass = new RubyClass(classClass, fields, isSingleton, attached, superclass);
150-
fields.rubyModule = rubyClass;
138+
final RubyClass rubyClass = new RubyClass(
139+
classClass,
140+
context,
141+
sourceSection,
142+
lexicalParent,
143+
name,
144+
isSingleton,
145+
attached,
146+
superclass);
151147

152148
if (lexicalParent != null) {
153-
fields.getAdoptedByLexicalParent(context, lexicalParent, name, null);
149+
rubyClass.fields.getAdoptedByLexicalParent(context, lexicalParent, name, null);
154150
} else if (name != null) { // bootstrap module
155-
fields.setFullName(name);
151+
rubyClass.fields.setFullName(name);
156152
}
157153

158154
rubyClass.setSuperClass(superclass);
@@ -173,12 +169,10 @@ public static RubyClass createUninitializedRubyClass(RubyContext context,
173169
throw CompilerDirectives.shouldNotReachHere("Subclasses of class Class are forbidden in Ruby");
174170
}
175171

176-
final ModuleFields fields = new ModuleFields(context, sourceSection, null, null);
177-
final RubyClass rubyClass = new RubyClass(classClass, fields, false, null, null);
178-
fields.rubyModule = rubyClass;
172+
final RubyClass rubyClass = new RubyClass(classClass, context, sourceSection, null, null, false, null, null);
179173

180174
// For Class.allocate, set it in the fields but not in RubyClass#superclass to mark as not yet initialized
181-
fields.setSuperClass(context.getCoreLibrary().objectClass);
175+
rubyClass.fields.setSuperClass(context.getCoreLibrary().objectClass);
182176

183177
setInstanceShape(rubyClass, context.getCoreLibrary().objectClass);
184178

src/main/java/org/truffleruby/core/klass/RubyClass.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
import java.util.Set;
1313

14-
import org.truffleruby.core.module.ModuleFields;
14+
import com.oracle.truffle.api.source.SourceSection;
15+
import org.truffleruby.RubyContext;
1516
import org.truffleruby.core.module.RubyModule;
1617
import org.truffleruby.language.RubyDynamicObject;
1718
import org.truffleruby.language.objects.IsANode;
@@ -37,11 +38,14 @@ public final class RubyClass extends RubyModule implements ObjectGraphNode {
3738

3839
public RubyClass(
3940
RubyClass classClass,
40-
ModuleFields fields,
41+
RubyContext context,
42+
SourceSection sourceSection,
43+
RubyModule lexicalParent,
44+
String givenBaseName,
4145
boolean isSingleton,
4246
RubyDynamicObject attached,
4347
Object superclass) {
44-
super(classClass, classClass.instanceShape, fields);
48+
super(classClass, classClass.instanceShape, context, sourceSection, lexicalParent, givenBaseName);
4549
this.isSingleton = isSingleton;
4650
this.attached = attached;
4751
this.superclass = superclass;
@@ -50,8 +54,8 @@ public RubyClass(
5054
}
5155

5256
/** Special constructor to build the 'Class' RubyClass itself */
53-
RubyClass(Shape tempShape, ModuleFields fields) {
54-
super(tempShape, fields, "constructor only for Class Class");
57+
RubyClass(RubyContext context, Shape tempShape) {
58+
super(context, tempShape, "constructor only for the class Class");
5559
this.isSingleton = false;
5660
this.attached = null;
5761
this.superclass = null;

src/main/java/org/truffleruby/core/module/ModuleFields.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static void debugModuleChain(RubyModule module) {
6767
RubyLanguage.LOGGER.info(builder.toString());
6868
}
6969

70-
public RubyModule rubyModule;
70+
public final RubyModule rubyModule;
7171

7272
// The context is stored here - objects can obtain it via their class (which is a module)
7373
private final RubyContext context;
@@ -106,12 +106,14 @@ public ModuleFields(
106106
RubyContext context,
107107
SourceSection sourceSection,
108108
RubyModule lexicalParent,
109-
String givenBaseName) {
109+
String givenBaseName,
110+
RubyModule rubyModule) {
110111
super(null);
111112
this.context = context;
112113
this.sourceSection = sourceSection;
113114
this.lexicalParent = lexicalParent;
114115
this.givenBaseName = givenBaseName;
116+
this.rubyModule = rubyModule;
115117
this.methodsUnmodifiedAssumption = new CyclicAssumption("methods are unmodified");
116118
this.constantsUnmodifiedAssumption = new CyclicAssumption("constants are unmodified");
117119
start = new PrependMarker(this);

src/main/java/org/truffleruby/core/module/ModuleNodes.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,18 @@ public abstract class ModuleNodes {
130130
@TruffleBoundary
131131
public static RubyModule createModule(RubyContext context, SourceSection sourceSection, RubyClass selfClass,
132132
RubyModule lexicalParent, String name, Node currentNode) {
133-
final ModuleFields fields = new ModuleFields(context, sourceSection, lexicalParent, name);
134-
final RubyModule module = new RubyModule(selfClass, selfClass.instanceShape, fields);
135-
fields.rubyModule = module;
133+
final RubyModule module = new RubyModule(
134+
selfClass,
135+
selfClass.instanceShape,
136+
context,
137+
sourceSection,
138+
lexicalParent,
139+
name);
136140

137141
if (lexicalParent != null) {
138-
fields.getAdoptedByLexicalParent(context, lexicalParent, name, currentNode);
139-
} else if (fields.givenBaseName != null) { // bootstrap module
140-
fields.setFullName(fields.givenBaseName);
142+
module.fields.getAdoptedByLexicalParent(context, lexicalParent, name, currentNode);
143+
} else if (name != null) { // bootstrap module
144+
module.fields.setFullName(name);
141145
}
142146
return module;
143147
}

src/main/java/org/truffleruby/core/module/RubyModule.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.util.Set;
1313

14+
import org.truffleruby.RubyContext;
1415
import org.truffleruby.core.klass.RubyClass;
1516
import org.truffleruby.language.RubyDynamicObject;
1617
import org.truffleruby.language.objects.ObjectGraph;
@@ -30,13 +31,22 @@ public class RubyModule extends RubyDynamicObject implements ObjectGraphNode {
3031

3132
public final ModuleFields fields;
3233

33-
public RubyModule(RubyClass rubyClass, Shape shape, ModuleFields fields) {
34+
public RubyModule(
35+
RubyClass rubyClass,
36+
Shape shape,
37+
RubyContext context,
38+
SourceSection sourceSection,
39+
RubyModule lexicalParent,
40+
String givenBaseName) {
3441
super(rubyClass, shape);
35-
this.fields = fields;
42+
this.fields = new ModuleFields(context, sourceSection, lexicalParent, givenBaseName, this);
3643
}
3744

38-
protected RubyModule(Shape tempShape, ModuleFields fields, String constructorOnlyForClassClass) {
45+
protected RubyModule(RubyContext context, Shape tempShape, String constructorOnlyForClassClass) {
3946
super(tempShape, constructorOnlyForClassClass);
47+
48+
final ModuleFields fields = new ModuleFields(context, null, null, "Class", this);
49+
fields.setFullName("Class");
4050
this.fields = fields;
4151
}
4252

0 commit comments

Comments
 (0)