Skip to content

Commit fbad85e

Browse files
committed
NameToJavaStringNode supports DSL inlining
1 parent 20f6625 commit fbad85e

File tree

7 files changed

+111
-205
lines changed

7 files changed

+111
-205
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ protected Object vmMethodLookup(VirtualFrame frame, Object receiver, Object name
194194
@Cached NameToJavaStringNode nameToJavaStringNode,
195195
@Cached LookupMethodOnSelfNode lookupMethodNode) {
196196
// TODO BJF Sep 14, 2016 Handle private
197-
final String normalizedName = nameToJavaStringNode.execute(name);
197+
final String normalizedName = nameToJavaStringNode.execute(this, name);
198198
InternalMethod method = lookupMethodNode.lookupIgnoringVisibility(frame, receiver, normalizedName);
199199
if (method == null) {
200200
return nil;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ protected Object send(Frame callerFrame, Object self, Object[] rubyArgs, RootCal
558558
@Cached DispatchNode dispatchNode,
559559
@Cached NameToJavaStringNode nameToJavaString) {
560560
Object name = RubyArguments.getArgument(rubyArgs, 0);
561-
return dispatchNode.dispatch(callerFrame, self, nameToJavaString.execute(name),
561+
return dispatchNode.dispatch(callerFrame, self, nameToJavaString.execute(this, name),
562562
RubyArguments.repack(rubyArgs, self, 1));
563563
}
564564
}

src/main/java/org/truffleruby/core/binding/BindingNodes.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5151
import com.oracle.truffle.api.Truffle;
5252
import com.oracle.truffle.api.dsl.Cached;
53-
import com.oracle.truffle.api.dsl.CreateCast;
5453
import com.oracle.truffle.api.dsl.ImportStatic;
5554
import com.oracle.truffle.api.dsl.NodeChild;
5655
import com.oracle.truffle.api.dsl.ReportPolymorphism;
@@ -223,7 +222,7 @@ public abstract static class BindingLocalVariableDefinedNode extends CoreMethodN
223222
protected boolean localVariableDefined(RubyBinding binding, Object nameObject,
224223
@Cached NameToJavaStringNode nameToJavaStringNode,
225224
@Cached LocalVariableDefinedNode localVariableDefinedNode) {
226-
final var name = nameToJavaStringNode.execute(nameObject);
225+
final var name = nameToJavaStringNode.execute(this, nameObject);
227226
return localVariableDefinedNode.execute(this, binding, name);
228227
}
229228
}
@@ -274,14 +273,11 @@ protected int getCacheLimit() {
274273
@ImportStatic(BindingNodes.class)
275274
public abstract static class BindingLocalVariableGetNode extends CoreMethodNode {
276275

277-
@CreateCast("nameNode")
278-
protected RubyBaseNodeWithExecute coerceToString(RubyBaseNodeWithExecute name) {
279-
return NameToJavaStringNode.create(name);
280-
}
281-
282276
@Specialization
283-
protected Object localVariableGet(RubyBinding binding, String name,
277+
protected Object localVariableGet(RubyBinding binding, Object nameObject,
278+
@Cached NameToJavaStringNode nameToJavaStringNode,
284279
@Cached LocalVariableGetNode localVariableGetNode) {
280+
final var name = nameToJavaStringNode.execute(this, nameObject);
285281
return localVariableGetNode.execute(binding, name);
286282
}
287283
}
@@ -321,14 +317,11 @@ protected Object localVariableGetLastLine(RubyBinding binding, String name) {
321317
@NodeChild(value = "valueNode", type = RubyNode.class)
322318
public abstract static class BindingLocalVariableSetNode extends CoreMethodNode {
323319

324-
@CreateCast("nameNode")
325-
protected RubyBaseNodeWithExecute coerceToString(RubyBaseNodeWithExecute name) {
326-
return NameToJavaStringNode.create(name);
327-
}
328-
329320
@Specialization
330-
protected Object localVariableSet(RubyBinding binding, String name, Object value,
321+
protected Object localVariableSet(RubyBinding binding, Object nameObject, Object value,
322+
@Cached NameToJavaStringNode nameToJavaStringNode,
331323
@Cached LocalVariableSetNode localVariableSetNode) {
324+
final var name = nameToJavaStringNode.execute(this, nameObject);
332325
return localVariableSetNode.execute(binding, name, value);
333326
}
334327
}

src/main/java/org/truffleruby/core/cast/NameToJavaStringNode.java

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
*/
1010
package org.truffleruby.core.cast;
1111

12-
import com.oracle.truffle.api.dsl.Bind;
1312
import com.oracle.truffle.api.dsl.Cached.Shared;
14-
import com.oracle.truffle.api.dsl.NeverDefault;
13+
import com.oracle.truffle.api.dsl.GenerateCached;
14+
import com.oracle.truffle.api.dsl.GenerateInline;
1515
import com.oracle.truffle.api.nodes.Node;
1616
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
1717
import org.truffleruby.core.symbol.RubySymbol;
1818
import org.truffleruby.interop.ToJavaStringNode;
19-
import org.truffleruby.language.RubyBaseNodeWithExecute;
19+
import org.truffleruby.language.RubyBaseNode;
2020
import org.truffleruby.language.control.RaiseException;
2121
import org.truffleruby.language.dispatch.DispatchNode;
2222
import org.truffleruby.language.library.RubyStringLibrary;
@@ -25,57 +25,45 @@
2525
import com.oracle.truffle.api.dsl.Cached;
2626
import com.oracle.truffle.api.dsl.Cached.Exclusive;
2727
import com.oracle.truffle.api.dsl.GenerateUncached;
28-
import com.oracle.truffle.api.dsl.NodeChild;
2928
import com.oracle.truffle.api.dsl.Specialization;
3029

3130
/** Converts a method name to a Java String. The exception message below assumes this conversion is done for a method
3231
* name. */
3332
@GenerateUncached
34-
@NodeChild(value = "valueNode", type = RubyBaseNodeWithExecute.class)
35-
public abstract class NameToJavaStringNode extends RubyBaseNodeWithExecute {
33+
@GenerateCached(false)
34+
@GenerateInline
35+
public abstract class NameToJavaStringNode extends RubyBaseNode {
3636

37-
@NeverDefault
38-
public static NameToJavaStringNode create() {
39-
return NameToJavaStringNodeGen.create(null);
40-
}
41-
42-
public static NameToJavaStringNode create(RubyBaseNodeWithExecute name) {
43-
return NameToJavaStringNodeGen.create(name);
44-
}
37+
public abstract String execute(Node node, Object name);
4538

46-
public static NameToJavaStringNode getUncached() {
47-
return NameToJavaStringNodeGen.getUncached();
39+
public static String executeUncached(Object name) {
40+
return NameToJavaStringNodeGen.getUncached().execute(null, name);
4841
}
4942

50-
public abstract String execute(Object name);
51-
52-
public abstract RubyBaseNodeWithExecute getValueNode();
53-
5443
@Specialization(guards = "libString.isRubyString(value)", limit = "1")
55-
protected String stringNameToJavaString(Object value,
44+
protected static String stringNameToJavaString(Object value,
5645
@Cached @Exclusive RubyStringLibrary libString,
5746
@Cached @Shared ToJavaStringNode toJavaStringNode) {
5847
return toJavaStringNode.execute(value);
5948
}
6049

6150
@Specialization
62-
protected String symbolNameToJavaString(RubySymbol value,
51+
protected static String symbolNameToJavaString(RubySymbol value,
6352
@Cached @Shared ToJavaStringNode toJavaStringNode) {
6453
return toJavaStringNode.execute(value);
6554
}
6655

6756
@Specialization
68-
protected String nameToJavaString(String value) {
57+
protected static String nameToJavaString(String value) {
6958
return value;
7059
}
7160

7261
@Specialization(guards = { "!isString(object)", "!isRubySymbol(object)", "isNotRubyString(object)" })
73-
protected static String nameToJavaString(Object object,
62+
protected static String nameToJavaString(Node node, Object object,
7463
@Cached InlinedBranchProfile errorProfile,
7564
@Cached DispatchNode toStr,
7665
@Cached @Exclusive RubyStringLibrary libString,
77-
@Cached @Exclusive ToJavaStringNode toJavaStringNode,
78-
@Bind("this") Node node) {
66+
@Cached @Exclusive ToJavaStringNode toJavaStringNode) {
7967
final Object coerced;
8068
try {
8169
coerced = toStr.call(object, "to_str");
@@ -102,9 +90,4 @@ protected static String nameToJavaString(Object object,
10290
node));
10391
}
10492
}
105-
106-
@Override
107-
public RubyBaseNodeWithExecute cloneUninitialized() {
108-
return create(getValueNode().cloneUninitialized());
109-
}
11093
}

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

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ protected boolean isInstanceVariableDefined(RubyDynamicObject object, Object nam
990990
@Cached CheckIVarNameNode checkIVarNameNode,
991991
@CachedLibrary(limit = "getDynamicObjectCacheLimit()") DynamicObjectLibrary objectLibrary,
992992
@Cached NameToJavaStringNode nameToJavaStringNode) {
993-
final String nameString = nameToJavaStringNode.execute(name);
993+
final String nameString = nameToJavaStringNode.execute(this, name);
994994
checkIVarNameNode.execute(object, nameString, name);
995995
return objectLibrary.containsKey(object, nameString);
996996
}
@@ -1009,7 +1009,7 @@ protected Object instanceVariableGetSymbol(RubyDynamicObject object, Object name
10091009
@Cached @Shared CheckIVarNameNode checkIVarNameNode,
10101010
@CachedLibrary(limit = "getDynamicObjectCacheLimit()") DynamicObjectLibrary objectLibrary,
10111011
@Cached @Shared NameToJavaStringNode nameToJavaStringNode) {
1012-
final String nameString = nameToJavaStringNode.execute(name);
1012+
final String nameString = nameToJavaStringNode.execute(this, name);
10131013
checkIVarNameNode.execute(object, nameString, name);
10141014
return objectLibrary.getOrDefault(object, nameString, nil);
10151015
}
@@ -1018,7 +1018,7 @@ protected Object instanceVariableGetSymbol(RubyDynamicObject object, Object name
10181018
protected Object immutable(Object object, Object name,
10191019
@Cached @Shared CheckIVarNameNode checkIVarNameNode,
10201020
@Cached @Shared NameToJavaStringNode nameToJavaStringNode) {
1021-
final String nameString = nameToJavaStringNode.execute(name);
1021+
final String nameString = nameToJavaStringNode.execute(this, name);
10221022
checkIVarNameNode.execute(object, nameString, name);
10231023
return nil;
10241024
}
@@ -1033,7 +1033,7 @@ protected Object instanceVariableSet(RubyDynamicObject object, Object name, Obje
10331033
@Cached WriteObjectFieldNode writeNode,
10341034
@Cached @Shared NameToJavaStringNode nameToJavaStringNode,
10351035
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
1036-
final String nameString = nameToJavaStringNode.execute(name);
1036+
final String nameString = nameToJavaStringNode.execute(this, name);
10371037
checkIVarNameNode.execute(object, nameString, name);
10381038
raiseIfFrozenNode.execute(object);
10391039
writeNode.execute(this, object, nameString, value);
@@ -1044,7 +1044,7 @@ protected Object instanceVariableSet(RubyDynamicObject object, Object name, Obje
10441044
protected Object immutable(Object object, Object name, Object value,
10451045
@Cached @Shared CheckIVarNameNode checkIVarNameNode,
10461046
@Cached @Shared NameToJavaStringNode nameToJavaStringNode) {
1047-
final String nameString = nameToJavaStringNode.execute(name);
1047+
final String nameString = nameToJavaStringNode.execute(this, name);
10481048
checkIVarNameNode.execute(object, nameString, name);
10491049
throw new RaiseException(getContext(), coreExceptions().frozenError(object, this));
10501050
}
@@ -1058,7 +1058,7 @@ protected Object removeInstanceVariable(RubyDynamicObject object, Object name,
10581058
@Cached @Shared CheckIVarNameNode checkIVarNameNode,
10591059
@Cached @Shared NameToJavaStringNode nameToJavaStringNode,
10601060
@Cached TypeNodes.CheckFrozenNode raiseIfFrozenNode) {
1061-
final String nameString = nameToJavaStringNode.execute(name);
1061+
final String nameString = nameToJavaStringNode.execute(this, name);
10621062
checkIVarNameNode.execute(object, nameString, name);
10631063
raiseIfFrozenNode.execute(object);
10641064
return removeIVar(object, nameString);
@@ -1068,7 +1068,7 @@ protected Object removeInstanceVariable(RubyDynamicObject object, Object name,
10681068
protected Object immutable(Object object, Object name,
10691069
@Cached @Shared CheckIVarNameNode checkIVarNameNode,
10701070
@Cached @Shared NameToJavaStringNode nameToJavaStringNode) {
1071-
final String nameString = nameToJavaStringNode.execute(name);
1071+
final String nameString = nameToJavaStringNode.execute(this, name);
10721072
checkIVarNameNode.execute(object, nameString, name);
10731073
throw new RaiseException(getContext(), coreExceptions().frozenError(object, this));
10741074
}
@@ -1408,7 +1408,7 @@ protected Object send(Frame callerFrame, Object self, Object[] rubyArgs, RootCal
14081408
@Cached NameToJavaStringNode nameToJavaString) {
14091409
Object name = RubyArguments.getArgument(rubyArgs, 0);
14101410
Object[] newArgs = RubyArguments.repack(rubyArgs, self, 1);
1411-
return dispatchNode.dispatch(callerFrame, self, nameToJavaString.execute(name), newArgs);
1411+
return dispatchNode.dispatch(callerFrame, self, nameToJavaString.execute(this, name), newArgs);
14121412
}
14131413

14141414
}
@@ -1514,18 +1514,14 @@ protected RubyClass singletonClass(Object self,
15141514
@NodeChild(value = "name", type = RubyBaseNodeWithExecute.class)
15151515
public abstract static class SingletonMethodNode extends CoreMethodNode {
15161516

1517-
1518-
@CreateCast("name")
1519-
protected RubyBaseNodeWithExecute coerceToString(RubyBaseNodeWithExecute name) {
1520-
return NameToJavaStringNode.create(name);
1521-
}
1522-
15231517
@Specialization
1524-
protected RubyMethod singletonMethod(Object self, String name,
1518+
protected RubyMethod singletonMethod(Object self, Object nameObject,
1519+
@Cached NameToJavaStringNode nameToJavaStringNode,
15251520
@Cached InlinedBranchProfile errorProfile,
15261521
@Cached InlinedConditionProfile singletonProfile,
15271522
@Cached InlinedConditionProfile methodProfile,
15281523
@Cached MetaClassNode metaClassNode) {
1524+
final var name = nameToJavaStringNode.execute(this, nameObject);
15291525
final RubyClass metaClass = metaClassNode.execute(this, self);
15301526

15311527
if (singletonProfile.profile(this, metaClass.isSingleton)) {

0 commit comments

Comments
 (0)