Skip to content

Commit 174771f

Browse files
committed
[GR-64489] Refactor CallNode
PullRequest: graalpython/3770
2 parents a0933eb + 3d5f40c commit 174771f

File tree

13 files changed

+368
-474
lines changed

13 files changed

+368
-474
lines changed

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

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,29 @@
5151

5252
import org.graalvm.collections.EconomicMap;
5353

54-
import com.oracle.graal.python.PythonLanguage;
5554
import com.oracle.graal.python.builtins.Builtin;
5655
import com.oracle.graal.python.builtins.CoreFunctions;
5756
import com.oracle.graal.python.builtins.Python3Core;
58-
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5957
import com.oracle.graal.python.builtins.PythonBuiltins;
6058
import com.oracle.graal.python.builtins.objects.PNone;
59+
import com.oracle.graal.python.builtins.objects.array.PArray;
6160
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
6261
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
62+
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
6363
import com.oracle.graal.python.builtins.objects.cext.common.NativePointer;
6464
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
65+
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
66+
import com.oracle.graal.python.builtins.objects.mmap.PMMap;
6567
import com.oracle.graal.python.builtins.objects.module.PythonModule;
6668
import com.oracle.graal.python.builtins.objects.object.PythonObject;
6769
import com.oracle.graal.python.builtins.objects.slice.SliceNodes;
68-
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6970
import com.oracle.graal.python.lib.PyLongAsIntNode;
7071
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
7172
import com.oracle.graal.python.lib.PyNumberIndexNode;
7273
import com.oracle.graal.python.lib.PyObjectGetItem;
7374
import com.oracle.graal.python.lib.PyObjectLookupAttr;
7475
import com.oracle.graal.python.lib.PyObjectSizeNode;
76+
import com.oracle.graal.python.lib.PyUnicodeCheckNode;
7577
import com.oracle.graal.python.nodes.BuiltinNames;
7678
import com.oracle.graal.python.nodes.ErrorMessages;
7779
import com.oracle.graal.python.nodes.HiddenAttr;
@@ -89,7 +91,6 @@
8991
import com.oracle.graal.python.runtime.PythonContext;
9092
import com.oracle.graal.python.runtime.PythonOptions;
9193
import com.oracle.graal.python.runtime.exception.PException;
92-
import com.oracle.graal.python.runtime.object.PFactory;
9394
import com.oracle.truffle.api.CompilerDirectives;
9495
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
9596
import com.oracle.truffle.api.dsl.Bind;
@@ -556,32 +557,26 @@ abstract static class RECheckInputTypeNode extends Node {
556557
public abstract void execute(VirtualFrame frame, Object input, boolean expectBytes);
557558

558559
@Specialization
559-
static void check(VirtualFrame frame, Object input, boolean expectBytes,
560+
static void check(Object input, boolean expectBytes,
560561
@Bind("this") Node inliningTarget,
561-
@Cached("getSupportedBinaryInputTypes()") PTuple supportedBinaryInputTypes,
562-
@Cached BuiltinFunctions.IsInstanceNode isStringNode,
563-
@Cached BuiltinFunctions.IsInstanceNode isBytesNode,
564-
@Cached InlinedConditionProfile unsupportedInputTypeProfile,
565-
@Cached InlinedConditionProfile unexpectedInputTypeProfile,
566-
@Cached PRaiseNode raiseNode) {
567-
boolean isString = (boolean) isStringNode.execute(frame, input, PythonBuiltinClassType.PString);
568-
boolean isBytes = !isString && (boolean) isBytesNode.execute(frame, input, supportedBinaryInputTypes);
569-
if (unsupportedInputTypeProfile.profile(inliningTarget, !isString && !isBytes)) {
570-
throw raiseNode.raise(inliningTarget, TypeError, T_UNSUPPORTED_INPUT_TYPE);
571-
}
572-
if (unexpectedInputTypeProfile.profile(inliningTarget, expectBytes != isBytes)) {
562+
@Cached PyUnicodeCheckNode unicodeCheckNode,
563+
@Cached BytesNodes.BytesLikeCheck bytesLikeCheck,
564+
@Cached PRaiseNode unexpectedStrRaise,
565+
@Cached PRaiseNode unexpectedBytesRaise,
566+
@Cached PRaiseNode unexpectedTypeRaise) {
567+
if (unicodeCheckNode.execute(inliningTarget, input)) {
573568
if (expectBytes) {
574-
throw raiseNode.raise(inliningTarget, TypeError, T_UNEXPECTED_STR);
575-
} else {
576-
throw raiseNode.raise(inliningTarget, TypeError, T_UNEXPECTED_BYTES);
569+
throw unexpectedStrRaise.raise(inliningTarget, TypeError, T_UNEXPECTED_STR);
577570
}
571+
return;
578572
}
579-
}
580-
581-
@NeverDefault
582-
protected PTuple getSupportedBinaryInputTypes() {
583-
return PFactory.createTuple(PythonLanguage.get(null), new Object[]{PythonBuiltinClassType.PBytes, PythonBuiltinClassType.PByteArray, PythonBuiltinClassType.PMMap,
584-
PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PArray});
573+
if (bytesLikeCheck.execute(inliningTarget, input) || input instanceof PMMap || input instanceof PMemoryView || input instanceof PArray) {
574+
if (!expectBytes) {
575+
throw unexpectedBytesRaise.raise(inliningTarget, TypeError, T_UNEXPECTED_BYTES);
576+
}
577+
return;
578+
}
579+
throw unexpectedTypeRaise.raise(inliningTarget, TypeError, T_UNSUPPORTED_INPUT_TYPE);
585580
}
586581
}
587582

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextCEvalBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ static Object doGeneric(PCode code, Object globals, Object locals,
157157
@Cached SequenceNodes.GetObjectArrayNode getObjectArrayNode,
158158
@Cached CodeNodes.GetCodeSignatureNode getSignatureNode,
159159
@Cached CodeNodes.GetCodeCallTargetNode getCallTargetNode,
160-
@Cached CreateArgumentsNode.CreateAndCheckArgumentsNode createAndCheckArgumentsNode,
160+
@Cached CreateArgumentsNode createArgumentsNode,
161161
@Cached CallDispatchers.SimpleIndirectInvokeNode invoke) {
162162
Object[] defaults = readNode.readPyObjectArray(defaultValueArrayPtr, defaultValueCount);
163163
PKeyword[] kwdefaults = castKwargsNode.execute(inliningTarget, kwdefaultsWrapper);
@@ -177,7 +177,7 @@ static Object doGeneric(PCode code, Object globals, Object locals,
177177
// prepare Python frame arguments
178178
Object[] userArguments = readNode.readPyObjectArray(argumentArrayPtr, argumentCount);
179179
Signature signature = getSignatureNode.execute(inliningTarget, code);
180-
Object[] pArguments = createAndCheckArgumentsNode.execute(inliningTarget, code, userArguments, keywords, signature, null, null, defaults, kwdefaults, false);
180+
Object[] pArguments = createArgumentsNode.execute(inliningTarget, code, userArguments, keywords, signature, null, null, defaults, kwdefaults, false);
181181

182182
// set custom locals
183183
if (!(locals instanceof PNone)) {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
5353
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5454
import com.oracle.graal.python.builtins.objects.function.Signature;
55-
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode.CreateAndCheckArgumentsNode;
55+
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
5656
import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode;
5757
import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode;
5858
import com.oracle.graal.python.nodes.call.CallDispatchers;
@@ -201,7 +201,7 @@ static final class PyCFunctionUnaryWrapper extends PyCFunctionWrapper {
201201
Object execute(Object[] arguments,
202202
@Bind("$node") Node inliningTarget,
203203
@Cached PythonToNativeNewRefNode toNativeNode,
204-
@Cached CreateAndCheckArgumentsNode createArgsNode,
204+
@Cached CreateArgumentsNode createArgsNode,
205205
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
206206
@Cached NativeToPythonNode toJavaNode,
207207
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
@@ -259,7 +259,7 @@ Object execute(Object[] arguments,
259259
@Bind("$node") Node inliningTarget,
260260
@Cached PythonToNativeNewRefNode toNativeNode,
261261
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
262-
@Cached CreateAndCheckArgumentsNode createArgsNode,
262+
@Cached CreateArgumentsNode createArgsNode,
263263
@Cached NativeToPythonNode toJavaNode,
264264
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
265265
@Exclusive @Cached GilNode gil) throws ArityException {
@@ -327,7 +327,7 @@ Object execute(Object[] arguments,
327327
@Bind("$node") Node inliningTarget,
328328
@Cached PythonToNativeNewRefNode toNativeNode,
329329
@Cached ExecutePositionalStarargsNode posStarargsNode,
330-
@Cached CreateAndCheckArgumentsNode createArgsNode,
330+
@Cached CreateArgumentsNode createArgsNode,
331331
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
332332
@Cached NativeToPythonNode toJavaNode,
333333
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
@@ -390,7 +390,7 @@ Object execute(Object[] arguments,
390390
@Bind("$node") Node inliningTarget,
391391
@Cached PythonToNativeNewRefNode toNativeNode,
392392
@Cached ExecutePositionalStarargsNode posStarargsNode,
393-
@Cached CreateAndCheckArgumentsNode createArgsNode,
393+
@Cached CreateArgumentsNode createArgsNode,
394394
@Cached CallDispatchers.CallTargetCachedInvokeNode invokeNode,
395395
@Cached ExpandKeywordStarargsNode expandKwargsNode,
396396
@Cached NativeToPythonNode toJavaNode,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/CodeNodes.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@
8080
import com.oracle.truffle.api.frame.VirtualFrame;
8181
import com.oracle.truffle.api.nodes.Node;
8282
import com.oracle.truffle.api.nodes.RootNode;
83-
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
8483
import com.oracle.truffle.api.source.Source;
8584
import com.oracle.truffle.api.strings.TruffleString;
8685

@@ -259,10 +258,8 @@ public static Signature getInSingleContextMode(Node inliningTarget, PCode code)
259258
}
260259

261260
@Specialization(replaces = "doCached")
262-
static Signature doCode(Node inliningTarget, PCode code,
263-
@Cached InlinedConditionProfile signatureProfile,
264-
@Cached InlinedConditionProfile ctProfile) {
265-
return code.getSignature(inliningTarget, signatureProfile);
261+
static Signature doCode(PCode code) {
262+
return code.getSignature();
266263
}
267264
}
268265

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/PCode.java

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@
7979
import com.oracle.graal.python.runtime.sequence.storage.LongSequenceStorage;
8080
import com.oracle.graal.python.util.PythonUtils;
8181
import com.oracle.truffle.api.CompilerAsserts;
82-
import com.oracle.truffle.api.CompilerDirectives;
83-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
8482
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
8583
import com.oracle.truffle.api.RootCallTarget;
8684
import com.oracle.truffle.api.bytecode.BytecodeNode;
@@ -91,10 +89,8 @@
9189
import com.oracle.truffle.api.interop.UnsupportedMessageException;
9290
import com.oracle.truffle.api.library.ExportLibrary;
9391
import com.oracle.truffle.api.library.ExportMessage;
94-
import com.oracle.truffle.api.nodes.Node;
9592
import com.oracle.truffle.api.nodes.RootNode;
9693
import com.oracle.truffle.api.object.Shape;
97-
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
9894
import com.oracle.truffle.api.source.SourceSection;
9995
import com.oracle.truffle.api.strings.TruffleString;
10096

@@ -114,7 +110,7 @@ public final class PCode extends PythonBuiltinObject {
114110
public static final int CO_GRAALPYHON_MODULE = 0x1000;
115111

116112
private final RootCallTarget callTarget;
117-
@CompilationFinal private Signature signature;
113+
private final Signature signature;
118114

119115
// number of local variables
120116
private int nlocals = -1;
@@ -151,7 +147,7 @@ public final class PCode extends PythonBuiltinObject {
151147
public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget) {
152148
super(cls, instanceShape);
153149
this.callTarget = callTarget;
154-
initializeSignature(callTarget);
150+
this.signature = Signature.fromCallTarget(callTarget);
155151
}
156152

157153
public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, int flags, int firstlineno, byte[] linetable, TruffleString filename) {
@@ -195,6 +191,7 @@ public PCode(Object cls, Shape instanceShape, RootCallTarget callTarget, Signatu
195191
this.cellvars = cellvars;
196192
this.callTarget = callTarget;
197193
this.signature = signature;
194+
assert signature != null;
198195
}
199196

200197
private static TruffleString[] extractFreeVars(RootNode rootNode) {
@@ -631,29 +628,6 @@ public boolean takesVarKeywordArgs() {
631628
}
632629

633630
public Signature getSignature() {
634-
return getSignature(null, InlinedConditionProfile.getUncached());
635-
}
636-
637-
public Signature getSignature(Node inliningTarget, InlinedConditionProfile signatureProfile) {
638-
if (signatureProfile.profile(inliningTarget, signature == null)) {
639-
if (CompilerDirectives.isPartialEvaluationConstant(this)) {
640-
CompilerDirectives.transferToInterpreterAndInvalidate();
641-
}
642-
signature = initializeSignature(callTarget);
643-
}
644-
return signature;
645-
}
646-
647-
@TruffleBoundary
648-
synchronized Signature initializeSignature(RootCallTarget rootCallTarget) {
649-
assert PythonContext.get(null).ownsGil(); // otherwise this is racy
650-
if (signature == null) {
651-
if (rootCallTarget.getRootNode() instanceof PRootNode) {
652-
signature = ((PRootNode) rootCallTarget.getRootNode()).getSignature();
653-
} else {
654-
signature = Signature.createVarArgsAndKwArgsOnly();
655-
}
656-
}
657631
return signature;
658632
}
659633

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
import com.oracle.graal.python.nodes.ErrorMessages;
6666
import com.oracle.graal.python.nodes.PRaiseNode;
6767
import com.oracle.graal.python.nodes.StringLiterals;
68-
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
6968
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
7069
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
7170
import com.oracle.graal.python.nodes.call.CallDispatchers;
@@ -110,17 +109,15 @@ public abstract static class CallNode extends PythonBuiltinNode {
110109
@Specialization
111110
Object doIt(VirtualFrame frame, PFunction self, Object[] arguments, PKeyword[] keywords,
112111
@Bind Node inliningTarget,
113-
@Shared @Cached CreateArgumentsNode createArgs,
114-
@Cached CallDispatchers.FunctionCachedInvokeNode invoke) {
115-
return invoke.execute(frame, inliningTarget, self, createArgs.execute(self, arguments, keywords));
112+
@Cached CallDispatchers.FunctionCachedCallNode callNode) {
113+
return callNode.execute(frame, inliningTarget, self, arguments, keywords);
116114
}
117115

118116
@Specialization
119117
Object doIt(VirtualFrame frame, PBuiltinFunction self, Object[] arguments, PKeyword[] keywords,
120118
@Bind Node inliningTarget,
121-
@Shared @Cached CreateArgumentsNode createArgs,
122-
@Cached CallDispatchers.BuiltinFunctionCachedInvokeNode invoke) {
123-
return invoke.execute(frame, inliningTarget, self, createArgs.execute(self, arguments, keywords));
119+
@Cached CallDispatchers.BuiltinFunctionCachedCallNode callNode) {
120+
return callNode.execute(frame, inliningTarget, self, arguments, keywords);
124121
}
125122
}
126123

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,16 @@
3131
import java.util.ArrayList;
3232
import java.util.List;
3333

34+
import com.oracle.graal.python.nodes.PRootNode;
3435
import com.oracle.graal.python.util.PythonUtils;
3536
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
3637
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
38+
import com.oracle.truffle.api.RootCallTarget;
3739
import com.oracle.truffle.api.strings.TruffleString;
3840

3941
public final class Signature {
4042
public static final Signature EMPTY = new Signature(-1, false, -1, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY, PythonUtils.EMPTY_TRUFFLESTRING_ARRAY);
43+
public static final Signature GENERIC_VARARGS = new Signature(-1, true, 0, null, null);
4144

4245
private final int varArgIndex;
4346
private final int positionalOnlyArgIndex;
@@ -83,10 +86,6 @@ public Signature(int positionOnlyArgIndex, boolean takesVarKeywordArgs, int take
8386
this.hidden = hidden;
8487
}
8588

86-
public static Signature createVarArgsAndKwArgsOnly() {
87-
return new Signature(-1, true, 0, null, null);
88-
}
89-
9089
public int getNumOfRequiredKeywords() {
9190
return keywordOnlyNames.length;
9291
}
@@ -163,4 +162,8 @@ public TruffleString getRaiseErrorName() {
163162
public boolean isHidden() {
164163
return hidden;
165164
}
165+
166+
public static Signature fromCallTarget(RootCallTarget callTarget) {
167+
return callTarget.getRootNode() instanceof PRootNode rootNode ? rootNode.getSignature() : Signature.GENERIC_VARARGS;
168+
}
166169
}

0 commit comments

Comments
 (0)