Skip to content

Commit 0d70209

Browse files
author
Nicolas Laurent
committed
make DispatchNode take a string
1 parent c2edba7 commit 0d70209

File tree

5 files changed

+45
-50
lines changed

5 files changed

+45
-50
lines changed

src/main/java/org/truffleruby/core/array/ArrayNodes.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import org.truffleruby.core.support.TypeNodes;
6565
import org.truffleruby.core.symbol.RubySymbol;
6666
import org.truffleruby.extra.ffi.Pointer;
67+
import org.truffleruby.interop.ToJavaStringNode;
6768
import org.truffleruby.language.Nil;
6869
import org.truffleruby.language.NotProvided;
6970
import org.truffleruby.language.RubyNode;
@@ -1351,9 +1352,18 @@ protected Object injectSymbolWithInitial(
13511352
RubySymbol symbol,
13521353
Nil block,
13531354
@CachedLibrary("array.store") ArrayStoreLibrary stores,
1354-
@Cached("createCountingProfile()") LoopConditionProfile loopProfile) {
1355+
@Cached("createCountingProfile()") LoopConditionProfile loopProfile,
1356+
@Cached ToJavaStringNode toJavaString) {
13551357
final Object store = array.store;
1356-
return injectSymbolHelper(frame, array, symbol, stores, store, initialOrSymbol, 0, loopProfile);
1358+
return injectSymbolHelper(
1359+
frame,
1360+
array,
1361+
toJavaString.executeToJavaString(symbol),
1362+
stores,
1363+
store,
1364+
initialOrSymbol,
1365+
0,
1366+
loopProfile);
13571367
}
13581368

13591369
@Specialization(
@@ -1366,20 +1376,21 @@ protected Object injectSymbolNoInitial(
13661376
NotProvided symbol,
13671377
Nil block,
13681378
@CachedLibrary("array.store") ArrayStoreLibrary stores,
1369-
@Cached("createCountingProfile()") LoopConditionProfile loopProfile) {
1379+
@Cached("createCountingProfile()") LoopConditionProfile loopProfile,
1380+
@Cached ToJavaStringNode toJavaString) {
13701381
final Object store = array.store;
13711382
return injectSymbolHelper(
13721383
frame,
13731384
array,
1374-
initialOrSymbol,
1385+
toJavaString.executeToJavaString(initialOrSymbol),
13751386
stores,
13761387
store,
13771388
stores.read(store, 0),
13781389
1,
13791390
loopProfile);
13801391
}
13811392

1382-
public Object injectSymbolHelper(VirtualFrame frame, RubyArray array, RubySymbol symbol,
1393+
public Object injectSymbolHelper(VirtualFrame frame, RubyArray array, String symbol,
13831394
ArrayStoreLibrary stores, Object store, Object initial, int start,
13841395
LoopConditionProfile loopProfile) {
13851396
Object accumulator = initial;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.truffleruby.core.basicobject.BasicObjectNodesFactory.InstanceExecNodeFactory;
2020
import org.truffleruby.core.basicobject.BasicObjectNodesFactory.ReferenceEqualNodeFactory;
2121
import org.truffleruby.core.cast.BooleanCastNode;
22+
import org.truffleruby.core.cast.NameToJavaStringNode;
2223
import org.truffleruby.core.exception.ExceptionOperations;
2324
import org.truffleruby.core.exception.RubyException;
2425
import org.truffleruby.core.klass.RubyClass;
@@ -584,6 +585,7 @@ public abstract static class SendNode extends CoreMethodArrayArgumentsNode {
584585

585586
@Child private DispatchNode dispatchNode = DispatchNode.create(DispatchNode.PRIVATE);
586587
@Child private ReadCallerFrameNode readCallerFrame = ReadCallerFrameNode.create();
588+
@Child private NameToJavaStringNode nameToJavaString = NameToJavaStringNode.create();
587589

588590
@Specialization
589591
protected Object send(VirtualFrame frame, Object self, Object name, Object[] args, NotProvided block) {
@@ -595,7 +597,7 @@ protected Object send(VirtualFrame frame, Object self, Object name, Object[] arg
595597
DeclarationContext context = RubyArguments.getDeclarationContext(readCallerFrame.execute(frame));
596598
RubyArguments.setDeclarationContext(frame, context);
597599

598-
return dispatchNode.dispatch(frame, self, name, block, args);
600+
return dispatchNode.dispatch(frame, self, nameToJavaString.execute(name), block, args);
599601
}
600602

601603
}

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.truffleruby.core.thread.GetCurrentRubyThreadNode;
7979
import org.truffleruby.core.thread.RubyThread;
8080
import org.truffleruby.core.thread.ThreadManager.BlockingAction;
81+
import org.truffleruby.interop.ToJavaStringNode;
8182
import org.truffleruby.language.Nil;
8283
import org.truffleruby.language.NotProvided;
8384
import org.truffleruby.language.RubyContextNode;
@@ -1489,6 +1490,7 @@ public abstract static class PublicSendNode extends CoreMethodArrayArgumentsNode
14891490

14901491
@Child private DispatchNode dispatchNode = DispatchNode.create(PUBLIC);
14911492
@Child private ReadCallerFrameNode readCallerFrame = ReadCallerFrameNode.create();
1493+
@Child private NameToJavaStringNode nameToJavaString = NameToJavaStringNode.create();
14921494

14931495
@Specialization
14941496
protected Object send(VirtualFrame frame, Object self, Object name, Object[] args, NotProvided block) {
@@ -1500,7 +1502,7 @@ protected Object send(VirtualFrame frame, Object self, Object name, Object[] arg
15001502
DeclarationContext context = RubyArguments.getDeclarationContext(readCallerFrame.execute(frame));
15011503
RubyArguments.setDeclarationContext(frame, context);
15021504

1503-
return dispatchNode.dispatch(frame, self, name, block, args);
1505+
return dispatchNode.dispatch(frame, self, nameToJavaString.execute(name), block, args);
15041506
}
15051507

15061508
}
@@ -1539,13 +1541,14 @@ protected boolean doesRespondToString(
15391541
VirtualFrame frame,
15401542
Object object,
15411543
RubyString name,
1542-
boolean includeProtectedAndPrivate) {
1544+
boolean includeProtectedAndPrivate,
1545+
@Cached ToJavaStringNode toJavaString) {
15431546
final boolean ret;
15441547

15451548
if (ignoreVisibilityProfile.profile(includeProtectedAndPrivate)) {
1546-
ret = dispatchIgnoreVisibility.doesRespondTo(frame, name, object);
1549+
ret = dispatchIgnoreVisibility.doesRespondTo(frame, toJavaString.executeToJavaString(name), object);
15471550
} else {
1548-
ret = dispatch.doesRespondTo(frame, name, object);
1551+
ret = dispatch.doesRespondTo(frame, toJavaString.executeToJavaString(name), object);
15491552
}
15501553

15511554
if (isTrueProfile.profile(ret)) {
@@ -1567,13 +1570,14 @@ protected boolean doesRespondToSymbol(
15671570
VirtualFrame frame,
15681571
Object object,
15691572
RubySymbol name,
1570-
boolean includeProtectedAndPrivate) {
1573+
boolean includeProtectedAndPrivate,
1574+
@Cached ToJavaStringNode toJavaString) {
15711575
final boolean ret;
15721576

15731577
if (ignoreVisibilityProfile.profile(includeProtectedAndPrivate)) {
1574-
ret = dispatchIgnoreVisibility.doesRespondTo(frame, name, object);
1578+
ret = dispatchIgnoreVisibility.doesRespondTo(frame, toJavaString.executeToJavaString(name), object);
15751579
} else {
1576-
ret = dispatch.doesRespondTo(frame, name, object);
1580+
ret = dispatch.doesRespondTo(frame, toJavaString.executeToJavaString(name), object);
15771581
}
15781582

15791583
if (isTrueProfile.profile(ret)) {

src/main/java/org/truffleruby/interop/OutgoingForeignCallNode.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.truffleruby.RubyContext;
1515
import org.truffleruby.RubyLanguage;
1616
import org.truffleruby.core.array.ArrayUtils;
17+
import org.truffleruby.core.cast.NameToJavaStringNode;
1718
import org.truffleruby.core.cast.ToSymbolNode;
1819
import org.truffleruby.language.RubyBaseNode;
1920
import org.truffleruby.language.control.RaiseException;
@@ -163,12 +164,13 @@ protected Object newOutgoing(Object receiver, String name, Object[] args,
163164
@Specialization(guards = { "name == cachedName", "cachedName.equals(SEND)", "args.length >= 1" }, limit = "1")
164165
protected Object sendOutgoing(Object receiver, String name, Object[] args,
165166
@Cached(value = "name", allowUncached = true) @Shared("name") String cachedName,
166-
@Cached @Shared("dispatch") DispatchNode dispatchNode) {
167+
@Cached @Shared("dispatch") DispatchNode dispatchNode,
168+
@Cached NameToJavaStringNode nameToJavaString) {
167169

168170
final Object sendName = args[0];
169171
final Object[] sendArgs = Arrays.copyOfRange(args, 1, args.length);
170172

171-
return dispatchNode.dispatch(null, receiver, sendName, null, sendArgs);
173+
return dispatchNode.dispatch(null, receiver, nameToJavaString.execute(sendName), null, sendArgs);
172174
}
173175

174176
@Specialization(guards = { "name == cachedName", "cachedName.equals(NIL)", "args.length == 0" }, limit = "1")

src/main/java/org/truffleruby/language/dispatch/DispatchNode.java

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.oracle.truffle.api.profiles.BranchProfile;
1919
import com.oracle.truffle.api.profiles.ConditionProfile;
2020
import org.truffleruby.core.array.ArrayUtils;
21-
import org.truffleruby.core.cast.NameToJavaStringNode;
2221
import org.truffleruby.core.cast.ToSymbolNode;
2322
import org.truffleruby.core.exception.ExceptionOperations;
2423
import org.truffleruby.core.klass.RubyClass;
@@ -77,7 +76,6 @@ public static DispatchNode getUncached() {
7776
@Child protected MetaClassNode metaclassNode;
7877
@Child protected LookupMethodNode methodLookup;
7978
@Child protected CallInternalMethodNode callNode;
80-
@Child protected NameToJavaStringNode nameToString;
8179
@Child protected CallForeignMethodNode callForeign;
8280
@Child protected DispatchNode callMethodMissing;
8381
@Child protected ToSymbolNode toSymbol;
@@ -126,29 +124,25 @@ public Object callWithBlock(Object receiver, String method, RubyProc block, Obje
126124
return execute(null, receiver, method, block, arguments);
127125
}
128126

129-
public Object dispatch(VirtualFrame frame, Object receiver, Object methodName, RubyProc block, Object[] arguments) {
127+
public Object dispatch(VirtualFrame frame, Object receiver, String methodName, RubyProc block, Object[] arguments) {
130128
return execute(frame, receiver, methodName, block, arguments);
131129
}
132130

133-
public boolean doesRespondTo(VirtualFrame frame, Object methodName, Object receiver) {
131+
public boolean doesRespondTo(VirtualFrame frame, String methodName, Object receiver) {
134132
assert config == PRIVATE_DOES_RESPOND || config == PUBLIC_DOES_RESPOND;
135133
return (boolean) execute(frame, receiver, methodName, null, EMPTY_ARGUMENTS);
136134
}
137135

138-
public Object execute(VirtualFrame frame, Object receiver, Object methodName, RubyProc block, Object[] arguments) {
139-
140-
final String stringName = nameIsString.profile(methodName instanceof String)
141-
? (String) methodName
142-
: nameToString(methodName);
136+
public Object execute(VirtualFrame frame, Object receiver, String methodName, RubyProc block, Object[] arguments) {
143137

144138
final RubyClass metaclass = metaclassNode.execute(receiver);
145139

146140
if (isForeignCall.profile(metaclass == getContext().getCoreLibrary().truffleInteropForeignClass)) {
147141
assert config.dispatchAction == DispatchAction.CALL_METHOD;
148-
return callForeign(receiver, stringName, block, arguments);
142+
return callForeign(receiver, methodName, block, arguments);
149143
}
150144

151-
final InternalMethod method = methodLookup.execute(frame, metaclass, stringName, config);
145+
final InternalMethod method = methodLookup.execute(frame, metaclass, methodName, config);
152146

153147
if (methodMissing.profile(method == null || method.isUndefined())) {
154148
switch (config.dispatchAction) {
@@ -159,7 +153,7 @@ public Object execute(VirtualFrame frame, Object receiver, Object methodName, Ru
159153
case RETURN_MISSING:
160154
return MISSING;
161155
case CALL_METHOD_MISSING:
162-
return callMethodMissing(frame, receiver, methodName, stringName, block, arguments);
156+
return callMethodMissing(frame, receiver, methodName, block, arguments);
163157
}
164158
}
165159
}
@@ -176,7 +170,7 @@ public Object execute(VirtualFrame frame, Object receiver, Object methodName, Ru
176170
}
177171

178172
private Object callMethodMissing(
179-
VirtualFrame frame, Object receiver, Object methodName, String stringName, RubyProc block,
173+
VirtualFrame frame, Object receiver, String methodName, RubyProc block,
180174
Object[] arguments) {
181175

182176
final RubySymbol symbolName = nameToSymbol(methodName);
@@ -190,22 +184,14 @@ private Object callMethodMissing(
190184
throw new RaiseException(getContext(), coreExceptions().noMethodErrorFromMethodMissing(
191185
formatter,
192186
receiver,
193-
stringName,
187+
methodName,
194188
arguments,
195189
this));
196190
}
197191

198192
return result;
199193
}
200194

201-
protected String nameToString(Object methodName) {
202-
if (nameToString == null) {
203-
CompilerDirectives.transferToInterpreterAndInvalidate();
204-
nameToString = insert(NameToJavaStringNode.create());
205-
}
206-
return nameToString.execute(methodName);
207-
}
208-
209195
protected Object callForeign(Object receiver, String methodName, RubyProc block, Object[] arguments) {
210196
if (callForeign == null) {
211197
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -226,7 +212,7 @@ protected Object callMethodMissingNode(
226212
return callMethodMissing.execute(null, receiver, "method_missing", block, arguments);
227213
}
228214

229-
protected RubySymbol nameToSymbol(Object methodName) {
215+
protected RubySymbol nameToSymbol(String methodName) {
230216
if (toSymbol == null) {
231217
CompilerDirectives.transferToInterpreterAndInvalidate();
232218
toSymbol = insert(ToSymbolNode.create());
@@ -280,21 +266,11 @@ protected Uncached(DispatchConfiguration config) {
280266
}
281267

282268
@Override
283-
public Object execute(VirtualFrame frame, Object receiver, Object methodName, RubyProc block,
269+
public Object execute(VirtualFrame frame, Object receiver, String methodName, RubyProc block,
284270
Object[] arguments) {
285271
return super.execute(null, receiver, methodName, block, arguments);
286272
}
287273

288-
@Override
289-
protected String nameToString(Object methodName) {
290-
if (nameToString == null) {
291-
CompilerDirectives.transferToInterpreterAndInvalidate();
292-
nameToString = insert(NameToJavaStringNode.getUncached());
293-
}
294-
295-
return nameToString.execute(methodName);
296-
}
297-
298274
@Override
299275
protected Object callForeign(Object receiver, String methodName, RubyProc block, Object[] arguments) {
300276
if (callForeign == null) {
@@ -319,7 +295,7 @@ protected Object callMethodMissingNode(
319295
}
320296

321297
@Override
322-
protected RubySymbol nameToSymbol(Object methodName) {
298+
protected RubySymbol nameToSymbol(String methodName) {
323299
if (toSymbol == null) {
324300
CompilerDirectives.transferToInterpreterAndInvalidate();
325301
toSymbol = insert(ToSymbolNode.getUncached());

0 commit comments

Comments
 (0)