Skip to content

Commit 9d53516

Browse files
committed
Refactor SingletonClassNode so it can be DSL inlinable
1 parent 597e6fe commit 9d53516

File tree

10 files changed

+44
-43
lines changed

10 files changed

+44
-43
lines changed

src/main/java/org/truffleruby/builtins/CoreMethodNodeManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ private RubyModule getModule(String fullName, boolean isClass) {
120120
}
121121

122122
private RubyClass getSingletonClass(Object object) {
123-
return SingletonClassNode.getUncached().executeSingletonClass(object);
123+
return SingletonClassNode.getUncached().execute(object);
124124
}
125125

126126
private Split effectiveSplit(Split split, boolean needsBlock) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ public void loadCoreNodes() {
608608
final CoreMethodNodeManager coreMethodNodeManager = new CoreMethodNodeManager(context);
609609
coreMethodNodeManager.loadCoreMethodNodes();
610610

611-
truffleBootMainInfo = getMethod(node.executeSingletonClass(truffleBootModule), "main").getSharedMethodInfo();
611+
truffleBootMainInfo = getMethod(node.execute(truffleBootModule), "main").getSharedMethodInfo();
612612
}
613613

614614
private InternalMethod getMethod(RubyModule module, String name) {

src/main/java/org/truffleruby/core/basicobject/BasicObjectNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ private static LexicalScope prependReceiverClassToScope(LexicalScope callerLexic
364364
LexicalScope lexicalScope = new LexicalScope(callerLexicalScope, logicalClass, true);
365365

366366
if (CanHaveSingletonClassNode.getUncached().execute(receiver)) {
367-
final RubyClass singletonClass = SingletonClassNode.getUncached().executeSingletonClass(receiver);
367+
final RubyClass singletonClass = SingletonClassNode.getUncached().execute(receiver);
368368

369369
// For true/false/nil Ruby objects #singleton_class (and SingletonClassNode as well) returns
370370
// a logical class (e.g. TrueClass etc). Ignore duplicate in this case.

src/main/java/org/truffleruby/core/kernel/KernelNodes.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ protected static RubyDynamicObject copyable(Object object, Object freeze,
571571
// Copy the singleton class if any.
572572
final RubyClass selfMetaClass = metaClassNode.execute(node, object);
573573
if (isSingletonProfile.profile(node, selfMetaClass.isSingleton)) {
574-
final RubyClass newObjectMetaClass = lazySingletonClassNode.get(node).executeSingletonClass(newObject);
574+
final RubyClass newObjectMetaClass = lazySingletonClassNode.get(node).execute(newObject);
575575
newObjectMetaClass.fields.initCopy(selfMetaClass);
576576
}
577577

@@ -1500,13 +1500,12 @@ protected RubyProc setTraceFunc(RubyProc traceFunc) {
15001500
@CoreMethod(names = "singleton_class")
15011501
public abstract static class SingletonClassMethodNode extends CoreMethodArrayArgumentsNode {
15021502

1503-
@Child private SingletonClassNode singletonClassNode = SingletonClassNode.create();
1504-
15051503
public abstract RubyClass executeSingletonClass(Object self);
15061504

15071505
@Specialization
1508-
protected RubyClass singletonClass(Object self) {
1509-
return singletonClassNode.executeSingletonClass(self);
1506+
protected RubyClass singletonClass(Object self,
1507+
@Cached SingletonClassNode singletonClassNode) {
1508+
return singletonClassNode.execute(self);
15101509
}
15111510

15121511
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
import org.truffleruby.language.objects.IsANode;
117117
import org.truffleruby.language.objects.IsFrozenNode;
118118
import org.truffleruby.language.objects.SingletonClassNode;
119+
import org.truffleruby.language.objects.SingletonClassNodeGen;
119120
import org.truffleruby.language.objects.WriteObjectFieldNode;
120121
import org.truffleruby.language.objects.classvariables.CheckClassVariableNameNode;
121122
import org.truffleruby.language.objects.classvariables.ClassVariableStorage;
@@ -1533,10 +1534,9 @@ protected boolean isExpectedMethodParameterType(Object method) {
15331534
@CoreMethod(names = "extend_object", required = 1, visibility = Visibility.PRIVATE)
15341535
public abstract static class ExtendObjectNode extends CoreMethodArrayArgumentsNode {
15351536

1536-
@Child private SingletonClassNode singletonClassNode = SingletonClassNode.create();
1537-
15381537
@Specialization
15391538
protected RubyModule extendObject(RubyModule module, Object object,
1539+
@Cached SingletonClassNode singletonClassNode,
15401540
@Cached InlinedBranchProfile errorProfile) {
15411541
if (module instanceof RubyClass) {
15421542
errorProfile.enter(this);
@@ -1545,7 +1545,7 @@ protected RubyModule extendObject(RubyModule module, Object object,
15451545
coreExceptions().typeErrorWrongArgumentType(module, "Module", this));
15461546
}
15471547

1548-
singletonClassNode.executeSingletonClass(object).fields
1548+
singletonClassNode.execute(object).fields
15491549
.include(getContext(), this, module);
15501550
return module;
15511551
}
@@ -1625,10 +1625,10 @@ protected Object initializeCopyClass(RubyClass self, RubyClass from,
16251625
protected RubyClass getSingletonClass(RubyModule object) {
16261626
if (singletonClassNode == null) {
16271627
CompilerDirectives.transferToInterpreterAndInvalidate();
1628-
singletonClassNode = insert(SingletonClassNode.create());
1628+
singletonClassNode = insert(SingletonClassNodeGen.create());
16291629
}
16301630

1631-
return singletonClassNode.executeSingletonClass(object);
1631+
return singletonClassNode.execute(object);
16321632
}
16331633

16341634
}
@@ -1808,12 +1808,12 @@ protected Object methods(Frame callerFrame, RubyModule module, Object[] rubyArgs
18081808
@CoreMethod(names = "public_class_method", rest = true)
18091809
public abstract static class PublicClassMethodNode extends CoreMethodArrayArgumentsNode {
18101810

1811-
@Child private SingletonClassNode singletonClassNode = SingletonClassNode.create();
18121811
@Child private SetMethodVisibilityNode setMethodVisibilityNode = SetMethodVisibilityNode.create();
18131812

18141813
@Specialization
1815-
protected RubyModule publicClassMethod(RubyModule module, Object[] names) {
1816-
final RubyClass singletonClass = singletonClassNode.executeSingletonClass(module);
1814+
protected RubyModule publicClassMethod(RubyModule module, Object[] names,
1815+
@Cached SingletonClassNode singletonClassNode) {
1816+
final RubyClass singletonClass = singletonClassNode.execute(module);
18171817

18181818
for (Object name : names) {
18191819
setMethodVisibilityNode.execute(singletonClass, name, Visibility.PUBLIC);
@@ -1867,12 +1867,12 @@ protected Object prependFeatures(RubyModule features, RubyModule target,
18671867
@CoreMethod(names = "private_class_method", rest = true)
18681868
public abstract static class PrivateClassMethodNode extends CoreMethodArrayArgumentsNode {
18691869

1870-
@Child private SingletonClassNode singletonClassNode = SingletonClassNode.create();
18711870
@Child private SetMethodVisibilityNode setMethodVisibilityNode = SetMethodVisibilityNode.create();
18721871

18731872
@Specialization
1874-
protected RubyModule privateClassMethod(VirtualFrame frame, RubyModule module, Object[] names) {
1875-
final RubyClass singletonClass = singletonClassNode.executeSingletonClass(module);
1873+
protected RubyModule privateClassMethod(VirtualFrame frame, RubyModule module, Object[] names,
1874+
@Cached SingletonClassNode singletonClassNode) {
1875+
final RubyClass singletonClass = singletonClassNode.execute(module);
18761876

18771877
for (Object name : names) {
18781878
setMethodVisibilityNode.execute(singletonClass, name, Visibility.PRIVATE);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void addMethodIgnoreNameVisibility(RubyContext context, InternalMethod me
8989
Node currentNode) {
9090
if (visibility == Visibility.MODULE_FUNCTION) {
9191
fields.addMethod(context, currentNode, method.withVisibility(Visibility.PRIVATE));
92-
final RubyClass singletonClass = SingletonClassNode.getUncached().executeSingletonClass(this);
92+
final RubyClass singletonClass = SingletonClassNode.getUncached().execute(this);
9393
singletonClass.fields.addMethod(
9494
context,
9595
currentNode,

src/main/java/org/truffleruby/core/support/TypeNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public abstract static class SingletonClassPrimitiveNode extends PrimitiveArrayA
108108
@Specialization
109109
protected RubyClass singletonClass(Object object,
110110
@Cached SingletonClassNode singletonClassNode) {
111-
return singletonClassNode.executeSingletonClass(object);
111+
return singletonClassNode.execute(object);
112112
}
113113
}
114114

src/main/java/org/truffleruby/language/methods/DeclarationContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public SingletonClassOfSelfDefaultDefinee(Object self) {
5151
}
5252

5353
public RubyModule getModuleToDefineMethods() {
54-
return SingletonClassNode.getUncached().executeSingletonClass(self);
54+
return SingletonClassNode.getUncached().execute(self);
5555
}
5656
}
5757

src/main/java/org/truffleruby/language/objects/SingletonClassNode.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,17 @@
1010
package org.truffleruby.language.objects;
1111

1212
import com.oracle.truffle.api.dsl.GenerateUncached;
13-
import com.oracle.truffle.api.dsl.NeverDefault;
1413
import org.truffleruby.RubyContext;
1514
import org.truffleruby.core.klass.ClassNodes;
1615
import org.truffleruby.core.klass.RubyClass;
1716
import org.truffleruby.language.ImmutableRubyObject;
1817
import org.truffleruby.language.Nil;
18+
import org.truffleruby.language.RubyBaseNode;
19+
import org.truffleruby.language.RubyContextSourceNode;
1920
import org.truffleruby.language.RubyDynamicObject;
2021
import org.truffleruby.language.RubyNode;
21-
import org.truffleruby.language.RubySourceNode;
2222
import org.truffleruby.language.control.RaiseException;
23+
import org.truffleruby.language.objects.SingletonClassNodeGen.SingletonClassASTNodeGen;
2324
import org.truffleruby.language.objects.shared.SharedObjects;
2425

2526
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -29,19 +30,13 @@
2930

3031
// Specializations are order by their frequency on railsbench using --engine.SpecializationStatistics
3132
@GenerateUncached
32-
@NodeChild(value = "valueNode", type = RubyNode.class)
33-
public abstract class SingletonClassNode extends RubySourceNode {
33+
public abstract class SingletonClassNode extends RubyBaseNode {
3434

3535
public static SingletonClassNode getUncached() {
3636
return SingletonClassNodeGen.getUncached();
3737
}
3838

39-
@NeverDefault
40-
public static SingletonClassNode create() {
41-
return SingletonClassNodeGen.create(null);
42-
}
43-
44-
public abstract RubyClass executeSingletonClass(Object value);
39+
public abstract RubyClass execute(Object value);
4540

4641
@Specialization(
4742
// no need to guard on the context, the rubyClass is context-specific
@@ -147,14 +142,21 @@ protected RubyClass getSingletonClassForInstance(RubyContext context, RubyDynami
147142
}
148143
}
149144

150-
protected int getCacheLimit() {
151-
return getLanguage().options.CLASS_CACHE;
152-
}
145+
@NodeChild(value = "valueNode", type = RubyNode.class)
146+
public abstract static class SingletonClassASTNode extends RubyContextSourceNode {
153147

154-
abstract RubyNode getValueNode();
148+
@Specialization
149+
protected Object singletonClass(Object value,
150+
@Cached SingletonClassNode singletonClassNode) {
151+
return singletonClassNode.execute(value);
152+
}
155153

156-
@Override
157-
public RubyNode cloneUninitialized() {
158-
return SingletonClassNodeGen.create(getValueNode().cloneUninitialized()).copyFlags(this);
154+
abstract RubyNode getValueNode();
155+
156+
@Override
157+
public RubyNode cloneUninitialized() {
158+
return SingletonClassASTNodeGen.create(getValueNode().cloneUninitialized()).copyFlags(this);
159+
}
159160
}
161+
160162
}

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@
138138
import org.truffleruby.language.objects.ReadInstanceVariableNode;
139139
import org.truffleruby.language.objects.RunModuleDefinitionNode;
140140
import org.truffleruby.language.objects.SelfNode;
141-
import org.truffleruby.language.objects.SingletonClassNode;
142-
import org.truffleruby.language.objects.SingletonClassNodeGen;
141+
import org.truffleruby.language.objects.SingletonClassNode.SingletonClassASTNode;
142+
import org.truffleruby.language.objects.SingletonClassNodeGen.SingletonClassASTNodeGen;
143143
import org.truffleruby.language.objects.classvariables.WriteClassVariableNode;
144144
import org.truffleruby.language.objects.WriteInstanceVariableNode;
145145
import org.truffleruby.language.yield.YieldExpressionNode;
@@ -1304,7 +1304,7 @@ public RubyNode visitDefsNode(DefsParseNode node) {
13041304
final boolean isReceiverSelf = node.getReceiverNode() instanceof SelfParseNode;
13051305
final RubyNode objectNode = node.getReceiverNode().accept(this);
13061306

1307-
final SingletonClassNode singletonClassNode = SingletonClassNodeGen.create(objectNode);
1307+
final SingletonClassASTNode singletonClassNode = SingletonClassASTNodeGen.create(objectNode);
13081308
singletonClassNode.unsafeSetSourceSection(sourceSection);
13091309

13101310
final RubyNode ret = translateMethodDefinition(
@@ -2749,7 +2749,7 @@ public RubyNode visitSClassNode(SClassParseNode node) {
27492749
final SourceIndexLength sourceSection = node.getPosition();
27502750

27512751
final RubyNode receiverNode = node.getReceiverNode().accept(this);
2752-
final SingletonClassNode singletonClassNode = SingletonClassNodeGen.create(receiverNode);
2752+
final SingletonClassASTNode singletonClassNode = SingletonClassASTNodeGen.create(receiverNode);
27532753
singletonClassNode.unsafeSetSourceSection(sourceSection);
27542754

27552755
boolean dynamicConstantLookup = environment.isDynamicConstantLookup();

0 commit comments

Comments
 (0)