Skip to content

Commit b700e40

Browse files
committed
Refactor InvokeMember node to support DSL inlining
1 parent 60a7f70 commit b700e40

File tree

3 files changed

+50
-41
lines changed

3 files changed

+50
-41
lines changed

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

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,6 @@ public static Object execute(Object receiver, Object[] args, InteropLibrary rece
9292
}
9393
}
9494

95-
public static Object invoke(InteropLibrary receivers, Object receiver, String member, Object[] args,
96-
TranslateInteropExceptionNode translateInteropExceptionNode) {
97-
try {
98-
return receivers.invokeMember(receiver, member, args);
99-
} catch (InteropException e) {
100-
throw translateInteropExceptionNode.executeInInvokeMember(e, receiver, args);
101-
}
102-
}
103-
10495
public static Object readMember(InteropLibrary interop, Object receiver, String name,
10596
TranslateInteropExceptionNode translateInteropException) {
10697
try {
@@ -1468,41 +1459,15 @@ protected Nil remove(Object receiver, Object identifier,
14681459
}
14691460
}
14701461

1471-
@GenerateUncached
14721462
@GenerateNodeFactory
14731463
@CoreMethod(names = "invoke_member", onSingleton = true, required = 2, rest = true)
1474-
@NodeChild(value = "argumentNodes", type = RubyNode[].class)
1475-
public abstract static class InvokeMemberNode extends RubySourceNode {
1476-
1477-
@NeverDefault
1478-
public static InvokeMemberNode create() {
1479-
return InteropNodesFactory.InvokeMemberNodeFactory.create(null);
1480-
}
1481-
1482-
public static InvokeMemberNode create(RubyNode[] argumentNodes) {
1483-
return InteropNodesFactory.InvokeMemberNodeFactory.create(argumentNodes);
1484-
}
1485-
1486-
public abstract Object execute(Object receiver, Object identifier, Object[] args);
1487-
1488-
abstract RubyNode[] getArgumentNodes();
1464+
public abstract static class InteropInvokeMemberNode extends CoreMethodArrayArgumentsNode {
14891465

1490-
@Specialization(limit = "getInteropCacheLimit()")
1491-
protected Object invokeCached(Object receiver, Object identifier, Object[] args,
1492-
@Cached ToJavaStringNode toJavaStringNode,
1493-
@CachedLibrary("receiver") InteropLibrary receivers,
1494-
@Cached ForeignToRubyNode foreignToRubyNode,
1495-
@Cached TranslateInteropExceptionNode translateInteropException) {
1496-
final String name = toJavaStringNode.executeToJavaString(identifier);
1497-
final Object foreign = invoke(receivers, receiver, name, args, translateInteropException);
1498-
return foreignToRubyNode.executeConvert(foreign);
1499-
}
1500-
1501-
@Override
1502-
public RubyNode cloneUninitialized() {
1503-
return create(cloneUninitialized(getArgumentNodes())).copyFlags(this);
1466+
@Specialization
1467+
protected Object invokeMember(Object receiver, Object identifier, Object[] args,
1468+
@Cached InvokeMemberNode invokeMemberNode) {
1469+
return invokeMemberNode.execute(receiver, identifier, args);
15041470
}
1505-
15061471
}
15071472

15081473
@CoreMethod(names = "member_readable?", onSingleton = true, required = 2)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved. This
3+
* code is released under a tri EPL/GPL/LGPL license. You can use it,
4+
* redistribute it and/or modify it under the terms of the:
5+
*
6+
* Eclipse Public License version 2.0, or
7+
* GNU General Public License version 2, or
8+
* GNU Lesser General Public License version 2.1.
9+
*/
10+
package org.truffleruby.interop;
11+
12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.GenerateUncached;
14+
import com.oracle.truffle.api.dsl.Specialization;
15+
import com.oracle.truffle.api.interop.InteropException;
16+
import com.oracle.truffle.api.interop.InteropLibrary;
17+
import com.oracle.truffle.api.library.CachedLibrary;
18+
import org.truffleruby.language.RubyBaseNode;
19+
20+
@GenerateUncached
21+
public abstract class InvokeMemberNode extends RubyBaseNode {
22+
23+
private static Object invoke(InteropLibrary receivers, Object receiver, String member, Object[] args,
24+
TranslateInteropExceptionNode translateInteropExceptionNode) {
25+
try {
26+
return receivers.invokeMember(receiver, member, args);
27+
} catch (InteropException e) {
28+
throw translateInteropExceptionNode.executeInInvokeMember(e, receiver, args);
29+
}
30+
}
31+
32+
public abstract Object execute(Object receiver, Object identifier, Object[] args);
33+
34+
@Specialization(limit = "getInteropCacheLimit()")
35+
protected Object invokeCached(Object receiver, Object identifier, Object[] args,
36+
@Cached ToJavaStringNode toJavaStringNode,
37+
@CachedLibrary("receiver") InteropLibrary receivers,
38+
@Cached ForeignToRubyNode foreignToRubyNode,
39+
@Cached TranslateInteropExceptionNode translateInteropException) {
40+
final String name = toJavaStringNode.executeToJavaString(identifier);
41+
final Object foreign = invoke(receivers, receiver, name, args, translateInteropException);
42+
return foreignToRubyNode.executeConvert(foreign);
43+
}
44+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.truffleruby.core.cast.ToSymbolNode;
2727
import org.truffleruby.core.numeric.RubyBignum;
2828
import org.truffleruby.core.proc.RubyProc;
29-
import org.truffleruby.interop.InteropNodes.InvokeMemberNode;
29+
import org.truffleruby.interop.InvokeMemberNode;
3030
import org.truffleruby.interop.InteropNodes.ReadMemberNode;
3131
import org.truffleruby.interop.InteropNodes.WriteMemberWithoutConversionNode;
3232
import org.truffleruby.interop.TranslateInteropExceptionNode;

0 commit comments

Comments
 (0)