Skip to content

Commit 2e0749b

Browse files
committed
simplify ManagedMethodWrappersMR
1 parent 7ba69f9 commit 2e0749b

File tree

2 files changed

+37
-49
lines changed

2 files changed

+37
-49
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/ManagedMethodWrappersMR.java

Lines changed: 30 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -46,96 +46,77 @@
4646
import com.oracle.graal.python.builtins.objects.cext.ManagedMethodWrappers.MethVarargs;
4747
import com.oracle.graal.python.builtins.objects.cext.ManagedMethodWrappers.MethodWrapper;
4848
import com.oracle.graal.python.builtins.objects.function.PKeyword;
49-
import com.oracle.graal.python.nodes.argument.ArityCheckNode;
50-
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
5149
import com.oracle.graal.python.nodes.argument.keywords.ExecuteKeywordStarargsNode;
5250
import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode;
5351
import com.oracle.graal.python.nodes.argument.positional.PositionalArgumentsNode;
54-
import com.oracle.graal.python.nodes.call.CallDispatchNode;
52+
import com.oracle.graal.python.nodes.call.CallNode;
5553
import com.oracle.graal.python.runtime.interop.PythonMessageResolution;
5654
import com.oracle.truffle.api.CompilerDirectives;
5755
import com.oracle.truffle.api.interop.ArityException;
5856
import com.oracle.truffle.api.interop.MessageResolution;
5957
import com.oracle.truffle.api.interop.Resolve;
6058
import com.oracle.truffle.api.nodes.ExplodeLoop;
6159
import com.oracle.truffle.api.nodes.Node;
62-
import com.oracle.truffle.api.profiles.ValueProfile;
60+
import com.oracle.truffle.api.profiles.PrimitiveValueProfile;
6361

6462
@MessageResolution(receiverType = MethodWrapper.class)
6563
public class ManagedMethodWrappersMR {
6664

6765
@Resolve(message = "EXECUTE")
6866
abstract static class ExecuteNode extends Node {
69-
@Child PythonMessageResolution.ExecuteNode executeNode;
70-
@Child private ToJavaNode toJavaNode;
71-
@Child private ToSulongNode toSulongNode;
67+
68+
@Child private PythonMessageResolution.ExecuteNode executeNode;
69+
@Child private ToJavaNode toJavaNode = ToJavaNode.create();
70+
@Child private ToSulongNode toSulongNode = ToSulongNode.create();
7271

7372
@Child private ExecutePositionalStarargsNode posStarargsNode = ExecutePositionalStarargsNode.create();
74-
@Child private PositionalArgumentsNode posArgsNode = PositionalArgumentsNode.create();
7573
@Child private ExecuteKeywordStarargsNode expandKwargsNode = ExecuteKeywordStarargsNode.create();
76-
@Child private CallDispatchNode dispatch;
77-
@Child private CreateArgumentsNode createArgs = CreateArgumentsNode.create();
78-
@Child private ArityCheckNode arityCheckNode = ArityCheckNode.create();
79-
final ValueProfile classProfile = ValueProfile.createClassProfile();
74+
@Child private CallNode dispatch;
8075

81-
private CallDispatchNode getDispatchNode() {
82-
if (dispatch == null) {
83-
CompilerDirectives.transferToInterpreterAndInvalidate();
84-
dispatch = insert(CallDispatchNode.create());
85-
}
86-
return dispatch;
87-
}
76+
private final PrimitiveValueProfile starArgsLenProfile = PrimitiveValueProfile.createEqualityProfile();
8877

89-
@ExplodeLoop
9078
public Object access(MethKeywords object, Object[] arguments) {
91-
if (executeNode == null) {
92-
CompilerDirectives.transferToInterpreterAndInvalidate();
93-
executeNode = insert(new PythonMessageResolution.ExecuteNode());
94-
}
9579
if (arguments.length != 3) {
9680
throw ArityException.raise(3, arguments.length);
9781
}
9882

9983
// convert args
100-
Object[] converted = new Object[arguments.length];
101-
for (int i = 0; i < arguments.length; i++) {
102-
converted[i] = getToJavaNode().execute(arguments[i]);
103-
}
10484

105-
Object[] userArgs = posArgsNode.executeWithArguments(converted[0], posStarargsNode.executeWith(converted[1]));
106-
Object[] pArgs = createArgs.execute(userArgs);
107-
PKeyword[] kwargs = expandKwargsNode.executeWith(converted[2]);
108-
return getToSulongNode().execute(getDispatchNode().executeCall(object.getDelegate(), pArgs, kwargs));
85+
Object receiver = toJavaNode.execute(arguments[0]);
86+
Object starArgs = toJavaNode.execute(arguments[1]);
87+
Object kwArgs = toJavaNode.execute(arguments[2]);
88+
89+
Object[] starArgsArray = posStarargsNode.executeWith(starArgs);
90+
int starArgsLen = starArgsLenProfile.profile(starArgsArray.length);
91+
Object[] pArgs = PositionalArgumentsNode.prependArgument(receiver, starArgsArray, starArgsLen);
92+
PKeyword[] kwArgsArray = expandKwargsNode.executeWith(kwArgs);
93+
94+
// execute
95+
96+
if (dispatch == null) {
97+
CompilerDirectives.transferToInterpreterAndInvalidate();
98+
dispatch = insert(CallNode.create());
99+
}
100+
return toSulongNode.execute(dispatch.execute(object.getDelegate(), pArgs, kwArgsArray));
109101
}
110102

111103
@ExplodeLoop
112104
public Object access(MethVarargs object, Object[] arguments) {
113-
if (executeNode == null) {
114-
CompilerDirectives.transferToInterpreterAndInvalidate();
115-
executeNode = insert(new PythonMessageResolution.ExecuteNode());
116-
}
117105
if (arguments.length != 1) {
118106
throw ArityException.raise(1, arguments.length);
119107
}
120108

121109
// convert args
122-
return getToSulongNode().execute(executeNode.execute(object.getDelegate(), new Object[]{getToJavaNode().execute(arguments[0])}));
123-
}
124110

125-
private ToJavaNode getToJavaNode() {
126-
if (toJavaNode == null) {
127-
CompilerDirectives.transferToInterpreterAndInvalidate();
128-
toJavaNode = insert(ToJavaNode.create());
129-
}
130-
return toJavaNode;
131-
}
111+
Object varArgs = toJavaNode.execute(arguments[0]);
132112

133-
private ToSulongNode getToSulongNode() {
134-
if (toSulongNode == null) {
113+
// execute
114+
115+
if (executeNode == null) {
135116
CompilerDirectives.transferToInterpreterAndInvalidate();
136-
toSulongNode = insert(ToSulongNode.create());
117+
executeNode = insert(new PythonMessageResolution.ExecuteNode());
137118
}
138-
return toSulongNode;
119+
return toSulongNode.execute(executeNode.execute(object.getDelegate(), new Object[]{varArgs}));
139120
}
140121
}
141122
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/argument/positional/PositionalArgumentsNode.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,11 @@ Object[] arguments(VirtualFrame frame, Object primary, Object[] starargs) {
114114
}
115115
return values;
116116
}
117+
118+
public static Object[] prependArgument(Object primary, Object[] arguments, int argumentsLength) {
119+
Object[] result = new Object[argumentsLength + 1];
120+
result[0] = primary;
121+
System.arraycopy(arguments, 0, result, 1, argumentsLength);
122+
return result;
123+
}
117124
}

0 commit comments

Comments
 (0)