Skip to content

Commit 3e43d0a

Browse files
committed
Unify call dispatchers and builtin slot dispatchers
1 parent 2dbbd03 commit 3e43d0a

24 files changed

+144
-252
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2490,7 +2490,8 @@ private static Object buildJavaClass(Object namespace, TruffleString name, Objec
24902490
}
24912491

24922492
@InliningCutoff
2493-
private static Object buildJavaClass(VirtualFrame frame, Node inliningTarget, PythonLanguage language, PFunction function, Object[] arguments, CallDispatchers.FunctionInvokeNode invokeBody,
2493+
private static Object buildJavaClass(VirtualFrame frame, Node inliningTarget, PythonLanguage language, PFunction function, Object[] arguments,
2494+
CallDispatchers.FunctionCachedInvokeNode invokeBody,
24942495
TruffleString name) {
24952496
PDict ns = PFactory.createDict(language, new DynamicObjectStorage(language));
24962497
Object[] args = PArguments.create(0);
@@ -2509,7 +2510,7 @@ protected Object doItNonFunction(VirtualFrame frame, Object function, Object[] a
25092510
@Cached PyMappingCheckNode pyMappingCheckNode,
25102511
@Cached CallNode callPrep,
25112512
@Cached CallNode callType,
2512-
@Cached CallDispatchers.FunctionInvokeNode invokeBody,
2513+
@Cached CallDispatchers.FunctionCachedInvokeNode invokeBody,
25132514
@Cached UpdateBasesNode update,
25142515
@Cached PyObjectSetItem setOrigBases,
25152516
@Cached GetClassNode getClass,

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

Lines changed: 8 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
5353
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor;
5454
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor;
55-
import com.oracle.graal.python.builtins.objects.function.PArguments;
5655
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
5756
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5857
import com.oracle.graal.python.builtins.objects.function.Signature;
@@ -72,10 +71,6 @@
7271
import com.oracle.truffle.api.dsl.Bind;
7372
import com.oracle.truffle.api.dsl.Cached;
7473
import com.oracle.truffle.api.dsl.Cached.Exclusive;
75-
import com.oracle.truffle.api.dsl.GenerateCached;
76-
import com.oracle.truffle.api.dsl.GenerateInline;
77-
import com.oracle.truffle.api.dsl.GenerateUncached;
78-
import com.oracle.truffle.api.dsl.Specialization;
7974
import com.oracle.truffle.api.interop.ArityException;
8075
import com.oracle.truffle.api.interop.InteropLibrary;
8176
import com.oracle.truffle.api.interop.TruffleObject;
@@ -84,7 +79,6 @@
8479
import com.oracle.truffle.api.library.CachedLibrary;
8580
import com.oracle.truffle.api.library.ExportLibrary;
8681
import com.oracle.truffle.api.library.ExportMessage;
87-
import com.oracle.truffle.api.nodes.DirectCallNode;
8882
import com.oracle.truffle.api.nodes.Node;
8983
import com.oracle.truffle.api.strings.TruffleString;
9084
import com.oracle.truffle.nfi.api.SignatureLibrary;
@@ -247,34 +241,6 @@ public static PyCFunctionWrapper createFromBuiltinFunction(CApiContext cApiConte
247241
}
248242
}
249243

250-
@GenerateUncached
251-
@GenerateInline
252-
@GenerateCached(false)
253-
// TODO move, use in eval etc?
254-
abstract static class CallTargetDispatchNode extends Node {
255-
256-
abstract Object execute(Node inliningTarget, RootCallTarget ct, Object[] pythonArguments);
257-
258-
@Specialization(guards = "sameCallTarget(callTarget, callNode)", limit = "1")
259-
static Object doCallTargetDirect(Node inliningTarget, @SuppressWarnings("unused") RootCallTarget callTarget, Object[] args,
260-
@Cached(parameters = "callTarget") DirectCallNode callNode,
261-
@Cached CallDispatchers.SimpleDirectInvokeNode invoke) {
262-
assert PArguments.isPythonFrame(args);
263-
return invoke.execute(null, inliningTarget, callNode, args);
264-
}
265-
266-
@Specialization(replaces = "doCallTargetDirect")
267-
static Object doCallTargetIndirect(Node inliningTarget, RootCallTarget ct, Object[] args,
268-
@Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
269-
assert PArguments.isPythonFrame(args);
270-
return invoke.execute(null, inliningTarget, ct, args);
271-
}
272-
273-
protected static boolean sameCallTarget(RootCallTarget callTarget, DirectCallNode callNode) {
274-
return callTarget == callNode.getCallTarget();
275-
}
276-
}
277-
278244
@ExportLibrary(InteropLibrary.class)
279245
static final class PyCFunctionUnaryWrapper extends PyCFunctionWrapper {
280246

@@ -292,7 +258,7 @@ Object execute(Object[] arguments,
292258
@Cached PythonToNativeNewRefNode toNativeNode,
293259
@Cached CallUnaryMethodNode callUnaryNode,
294260
@Cached CreateAndCheckArgumentsNode createArgsNode,
295-
@Cached CallTargetDispatchNode invokeNode,
261+
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
296262
@Cached NativeToPythonNode toJavaNode,
297263
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
298264
@Exclusive @Cached GilNode gil) throws ArityException {
@@ -318,7 +284,7 @@ Object execute(Object[] arguments,
318284
assert callTargetName != null;
319285
Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, signature, jArg0, null,
320286
PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, false);
321-
result = invokeNode.execute(inliningTarget, callTarget, pArgs);
287+
result = invokeNode.execute(null, inliningTarget, callTarget, pArgs);
322288
}
323289
return toNativeNode.execute(result);
324290
} catch (Throwable t) {
@@ -360,7 +326,7 @@ Object execute(Object[] arguments,
360326
@Bind("$node") Node inliningTarget,
361327
@Cached PythonToNativeNewRefNode toNativeNode,
362328
@Cached CallBinaryMethodNode callBinaryMethodNode,
363-
@Cached CallTargetDispatchNode invokeNode,
329+
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
364330
@Cached CreateAndCheckArgumentsNode createArgsNode,
365331
@Cached NativeToPythonNode toJavaNode,
366332
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
@@ -385,7 +351,7 @@ Object execute(Object[] arguments,
385351
assert callTargetName != null;
386352
Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, new Object[]{jArg1}, PKeyword.EMPTY_KEYWORDS, signature, jArg0, null,
387353
PythonUtils.EMPTY_OBJECT_ARRAY, PKeyword.EMPTY_KEYWORDS, false);
388-
result = invokeNode.execute(inliningTarget, callTarget, pArgs);
354+
result = invokeNode.execute(null, inliningTarget, callTarget, pArgs);
389355
}
390356
return toNativeNode.execute(result);
391357
} catch (Throwable t) {
@@ -438,7 +404,7 @@ Object execute(Object[] arguments,
438404
@Cached PythonToNativeNewRefNode toNativeNode,
439405
@Cached ExecutePositionalStarargsNode posStarargsNode,
440406
@Cached CreateAndCheckArgumentsNode createArgsNode,
441-
@Cached CallTargetDispatchNode invokeNode,
407+
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
442408
@Cached NativeToPythonNode toJavaNode,
443409
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
444410
@Exclusive @Cached GilNode gil) throws ArityException {
@@ -459,7 +425,7 @@ Object execute(Object[] arguments,
459425
Object[] starArgsArray = posStarargsNode.executeWith(null, starArgs);
460426
Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, starArgsArray, PKeyword.EMPTY_KEYWORDS, signature, receiver, null,
461427
PBuiltinFunction.generateDefaults(numDefaults), PKeyword.EMPTY_KEYWORDS, false);
462-
result = invokeNode.execute(inliningTarget, callTarget, pArgs);
428+
result = invokeNode.execute(null, inliningTarget, callTarget, pArgs);
463429
return toNativeNode.execute(result);
464430
} catch (Throwable t) {
465431
throw checkThrowableBeforeNative(t, toString(), "");
@@ -504,7 +470,7 @@ Object execute(Object[] arguments,
504470
@Cached PythonToNativeNewRefNode toNativeNode,
505471
@Cached ExecutePositionalStarargsNode posStarargsNode,
506472
@Cached CreateAndCheckArgumentsNode createArgsNode,
507-
@Cached CallTargetDispatchNode invokeNode,
473+
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
508474
@Cached ExpandKeywordStarargsNode expandKwargsNode,
509475
@Cached NativeToPythonNode toJavaNode,
510476
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
@@ -529,7 +495,7 @@ Object execute(Object[] arguments,
529495
PKeyword[] kwArgsArray = expandKwargsNode.execute(inliningTarget, kwArgs);
530496
Object[] pArgs = createArgsNode.execute(inliningTarget, callTargetName, starArgsArray, kwArgsArray, signature, receiver, null, PBuiltinFunction.generateDefaults(numDefaults),
531497
PKeyword.EMPTY_KEYWORDS, false);
532-
Object result = invokeNode.execute(inliningTarget, callTarget, pArgs);
498+
Object result = invokeNode.execute(null, inliningTarget, callTarget, pArgs);
533499
return toNativeNode.execute(result);
534500
} catch (Throwable t) {
535501
throw checkThrowableBeforeNative(t, toString(), "");

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,15 @@ public abstract static class CallNode extends PythonBuiltinNode {
111111
Object doIt(VirtualFrame frame, PFunction self, Object[] arguments, PKeyword[] keywords,
112112
@Bind Node inliningTarget,
113113
@Shared @Cached CreateArgumentsNode createArgs,
114-
@Cached CallDispatchers.FunctionInvokeNode invoke) {
114+
@Cached CallDispatchers.FunctionCachedInvokeNode invoke) {
115115
return invoke.execute(frame, inliningTarget, self, createArgs.execute(self, arguments, keywords));
116116
}
117117

118118
@Specialization
119119
Object doIt(VirtualFrame frame, PBuiltinFunction self, Object[] arguments, PKeyword[] keywords,
120120
@Bind Node inliningTarget,
121121
@Shared @Cached CreateArgumentsNode createArgs,
122-
@Cached CallDispatchers.BuiltinFunctionInvokeNode invoke) {
122+
@Cached CallDispatchers.BuiltinFunctionCachedInvokeNode invoke) {
123123
return invoke.execute(frame, inliningTarget, self, createArgs.execute(self, arguments, keywords));
124124
}
125125
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/BuiltinDispatchers.java

Lines changed: 0 additions & 77 deletions
This file was deleted.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryFunc.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@
5656
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotBuiltinBase;
5757
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotCExtNative;
5858
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot.TpSlotPythonSingle;
59+
import com.oracle.graal.python.nodes.call.CallDispatchers;
5960
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
60-
import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
6161
import com.oracle.graal.python.runtime.PythonContext;
6262
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
6363
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
@@ -71,9 +71,7 @@
7171
import com.oracle.truffle.api.dsl.NodeFactory;
7272
import com.oracle.truffle.api.dsl.Specialization;
7373
import com.oracle.truffle.api.frame.VirtualFrame;
74-
import com.oracle.truffle.api.nodes.IndirectCallNode;
7574
import com.oracle.truffle.api.nodes.Node;
76-
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
7775
import com.oracle.truffle.api.strings.TruffleString;
7876

7977
public class TpSlotBinaryFunc {
@@ -160,13 +158,12 @@ static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNati
160158
@Specialization(replaces = "callCachedBuiltin")
161159
@InliningCutoff
162160
static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotBinaryFuncBuiltin<?> slot, Object self, Object arg,
163-
@Cached(inline = false) CallContext callContext,
164-
@Cached InlinedConditionProfile isNullFrameProfile,
165-
@Cached(inline = false) IndirectCallNode indirectCallNode) {
161+
@Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
166162
Object[] arguments = PArguments.create(2);
167163
PArguments.setArgument(arguments, 0, self);
168164
PArguments.setArgument(arguments, 1, arg);
169-
return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
165+
RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
166+
return invoke.execute(frame, inliningTarget, callTarget, arguments);
170167
}
171168
}
172169
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/slots/TpSlotBinaryOp.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@
9696
import com.oracle.graal.python.lib.RichCmpOp;
9797
import com.oracle.graal.python.nodes.PGuards;
9898
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
99+
import com.oracle.graal.python.nodes.call.CallDispatchers;
99100
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
100101
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
101-
import com.oracle.graal.python.runtime.ExecutionContext.CallContext;
102102
import com.oracle.graal.python.runtime.PythonContext;
103103
import com.oracle.graal.python.runtime.PythonContext.GetThreadStateNode;
104104
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
@@ -115,7 +115,6 @@
115115
import com.oracle.truffle.api.dsl.NodeFactory;
116116
import com.oracle.truffle.api.dsl.Specialization;
117117
import com.oracle.truffle.api.frame.VirtualFrame;
118-
import com.oracle.truffle.api.nodes.IndirectCallNode;
119118
import com.oracle.truffle.api.nodes.Node;
120119
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
121120
import com.oracle.truffle.api.strings.TruffleString;
@@ -383,13 +382,12 @@ static Object callNative(VirtualFrame frame, Node inliningTarget, TpSlotCExtNati
383382
@InliningCutoff
384383
static Object callGenericComplexBuiltin(VirtualFrame frame, Node inliningTarget, TpSlotBinaryOpBuiltin<?> slot,
385384
Object self, Object selfType, Object other, TpSlot otherSlot, Object otherType, boolean sameTypes, ReversibleSlot op,
386-
@Cached(inline = false) CallContext callContext,
387-
@Cached InlinedConditionProfile isNullFrameProfile,
388-
@Cached(inline = false) IndirectCallNode indirectCallNode) {
385+
@Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
389386
Object[] arguments = PArguments.create(2);
390387
PArguments.setArgument(arguments, 0, self);
391388
PArguments.setArgument(arguments, 1, other);
392-
return BuiltinDispatchers.callGenericBuiltin(frame, inliningTarget, slot.callTargetIndex, arguments, callContext, isNullFrameProfile, indirectCallNode);
389+
RootCallTarget callTarget = PythonLanguage.get(inliningTarget).getBuiltinSlotCallTarget(slot.callTargetIndex);
390+
return invoke.execute(frame, inliningTarget, callTarget, arguments);
393391
}
394392
}
395393

0 commit comments

Comments
 (0)