Skip to content

Commit 96b6d54

Browse files
committed
Added assert on inappropriate use of specific-arg-count builtin nodes, varArgsMarker does not imply takesVarArgs
1 parent 469090a commit 96b6d54

File tree

5 files changed

+22
-9
lines changed

5 files changed

+22
-9
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
import com.oracle.graal.python.nodes.call.CallNode;
6666
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6767
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
68-
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
68+
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
6969
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
7070
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
7171
import com.oracle.graal.python.nodes.statement.RaiseNode;
@@ -241,7 +241,7 @@ private void raiseObject(Object exceptionObject, String message) {
241241
@Builtin(name = "b2a_base64", minNumOfPositionalArgs = 1, numOfPositionalOnlyArgs = 1, parameterNames = {"data"}, keywordOnlyNames = {"newline"})
242242
@ArgumentClinic(name = "newline", conversion = ArgumentClinic.ClinicConversion.Int, defaultValue = "1", useDefaultForNone = true)
243243
@GenerateNodeFactory
244-
abstract static class B2aBase64Node extends PythonBinaryClinicBuiltinNode {
244+
abstract static class B2aBase64Node extends PythonClinicBuiltinNode {
245245
@TruffleBoundary
246246
private static byte[] b2a(byte[] data, int newline) {
247247
String encode = Base64.encode(data);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import com.oracle.graal.python.nodes.ErrorMessages;
1717
import com.oracle.graal.python.nodes.PGuards;
1818
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
19+
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
1920
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
20-
import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode;
2121
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
2222
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
2323
import com.oracle.graal.python.nodes.util.CoerceToComplexNode;
@@ -993,11 +993,11 @@ static TanhNode create() {
993993
}
994994
}
995995

996-
@Builtin(name = "isclose", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 2, keywordOnlyNames = {"rel_tol", "abs_tol"})
996+
@Builtin(name = "isclose", minNumOfPositionalArgs = 2, maxNumOfPositionalArgs = 2, varArgsMarker = true, keywordOnlyNames = {"rel_tol", "abs_tol"})
997997
@TypeSystemReference(PythonArithmeticTypes.class)
998998
@ImportStatic(MathGuards.class)
999999
@GenerateNodeFactory
1000-
abstract static class IsCloseNode extends PythonQuaternaryBuiltinNode {
1000+
abstract static class IsCloseNode extends PythonBuiltinNode {
10011001

10021002
private static final double DEFAULT_REL_TOL = 1e-09;
10031003
private static final double DEFAULT_ABS_TOL = 0;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1868,7 +1868,7 @@ protected static GetTerminalSizeNode create() {
18681868
@Builtin(name = "readlink", minNumOfPositionalArgs = 1, parameterNames = {"path"}, varArgsMarker = true, keywordOnlyNames = {"dirFd"}, doc = "readlink(path, *, dir_fd=None) -> path\n" +
18691869
"\nReturn a string representing the path to which the symbolic link points.\n")
18701870
@GenerateNodeFactory
1871-
abstract static class ReadlinkNode extends PythonBinaryBuiltinNode {
1871+
abstract static class ReadlinkNode extends PythonBuiltinNode {
18721872
@Specialization(limit = "1")
18731873
String readlink(VirtualFrame frame, Object str, @SuppressWarnings("unused") PNone none,
18741874
@CachedLibrary("str") PythonObjectLibrary lib) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.oracle.graal.python.nodes.ErrorMessages;
5555
import com.oracle.graal.python.nodes.SpecialMethodNames;
5656
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
57+
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5758
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5859
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5960
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -118,7 +119,7 @@ boolean test(PDirEntry self) {
118119

119120
@Builtin(name = "is_dir", minNumOfPositionalArgs = 1, keywordOnlyNames = {"follow_symlinks"}, needsFrame = true)
120121
@GenerateNodeFactory
121-
abstract static class IsDirNode extends PythonBinaryBuiltinNode {
122+
abstract static class IsDirNode extends PythonBuiltinNode {
122123
@Specialization
123124
boolean testBool(PDirEntry self, boolean followSymlinks) {
124125
return self.getFile().isDirectory(getLinkOption(followSymlinks));

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/BuiltinFunctionRootNode.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,23 @@ private static Signature createSignature(NodeFactory<? extends PythonBuiltinBase
179179
}
180180
}
181181
}
182-
183-
return new Signature(builtin.numOfPositionalOnlyArgs(), builtin.takesVarKeywordArgs(), (builtin.takesVarArgs() || builtin.varArgsMarker()) ? parameterNames.length : -1,
182+
assert canUseSpecialBuiltinNode(builtin) || !usesSpecialBuiltinNode(factory.getNodeClass()) : factory.getNodeClass().getName() +
183+
" must not use PythonUnary/Binary/Ternary/QuaternaryBultinNode";
184+
return new Signature(builtin.numOfPositionalOnlyArgs(), builtin.takesVarKeywordArgs(), builtin.takesVarArgs() ? parameterNames.length : -1,
184185
builtin.varArgsMarker(), parameterNames, builtin.keywordOnlyNames());
185186
}
186187

188+
// Nodes optimized for specific arg count (eg. PythonUnaryBultinNode, PythonBinaryBultinNode)
189+
// can only be used by functions with fixed number of positional arguments.
190+
private static boolean canUseSpecialBuiltinNode(Builtin builtin) {
191+
return !builtin.takesVarArgs() && !builtin.takesVarKeywordArgs() && !builtin.varArgsMarker() && builtin.keywordOnlyNames().length == 0;
192+
}
193+
194+
private static boolean usesSpecialBuiltinNode(Class<? extends PythonBuiltinBaseNode> clazz) {
195+
return PythonUnaryBuiltinNode.class.isAssignableFrom(clazz) || PythonBinaryBuiltinNode.class.isAssignableFrom(clazz) || PythonTernaryBuiltinNode.class.isAssignableFrom(clazz) ||
196+
PythonQuaternaryBuiltinNode.class.isAssignableFrom(clazz);
197+
}
198+
187199
/**
188200
* Must return argument reads compatible with
189201
* {@link #createSignature(NodeFactory, Builtin, boolean)}

0 commit comments

Comments
 (0)