Skip to content

Commit 7d3be8a

Browse files
committed
test for unary/binary/... classes at specialization time, not execution time in special call nodes
1 parent 2343e3c commit 7d3be8a

File tree

5 files changed

+27
-33
lines changed

5 files changed

+27
-33
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallBinaryMethodNode.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,56 +69,56 @@ public static CallBinaryMethodNode create() {
6969

7070
public abstract Object executeObject(Object callable, Object arg1, Object arg2);
7171

72-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
72+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
7373
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, boolean arg1, boolean arg2,
7474
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
7575
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
7676
return builtinNode.executeBool(arg1, arg2);
7777
}
7878

79-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
79+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
8080
int callInt(@SuppressWarnings("unused") PBuiltinFunction func, int arg1, int arg2,
8181
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
8282
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
8383
return builtinNode.executeInt(arg1, arg2);
8484
}
8585

86-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
86+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
8787
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, int arg1, int arg2,
8888
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
8989
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
9090
return builtinNode.executeBool(arg1, arg2);
9191
}
9292

93-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
93+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
9494
long callLong(@SuppressWarnings("unused") PBuiltinFunction func, long arg1, long arg2,
9595
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
9696
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
9797
return builtinNode.executeLong(arg1, arg2);
9898
}
9999

100-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
100+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
101101
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, long arg1, long arg2,
102102
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
103103
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
104104
return builtinNode.executeBool(arg1, arg2);
105105
}
106106

107-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
107+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
108108
double callDouble(@SuppressWarnings("unused") PBuiltinFunction func, double arg1, double arg2,
109109
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
110110
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
111111
return builtinNode.executeDouble(arg1, arg2);
112112
}
113113

114-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
114+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
115115
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, double arg1, double arg2,
116116
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
117117
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) throws UnexpectedResultException {
118118
return builtinNode.executeBool(arg1, arg2);
119119
}
120120

121-
@Specialization(guards = {"isBinary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()")
121+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
122122
Object callObject(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2,
123123
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
124124
@Cached("getBinary(func)") PythonBinaryBuiltinNode builtinNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallSpecialMethodNode.java

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
package com.oracle.graal.python.nodes.call.special;
4040

4141
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
42+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4243
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
4344
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
4445
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
@@ -52,35 +53,28 @@
5253
@TypeSystemReference(PythonTypes.class)
5354
@ImportStatic(PythonOptions.class)
5455
abstract class CallSpecialMethodNode extends Node {
55-
protected static boolean isUnary(PBuiltinFunction func) {
56-
return PythonUnaryBuiltinNode.class.isAssignableFrom(func.getBuiltinNodeFactory().getNodeClass());
57-
}
58-
59-
protected static boolean isBinary(PBuiltinFunction func) {
60-
return PythonBinaryBuiltinNode.class.isAssignableFrom(func.getBuiltinNodeFactory().getNodeClass());
61-
}
62-
63-
protected static boolean isTernary(PBuiltinFunction func) {
64-
return PythonTernaryBuiltinNode.class.isAssignableFrom(func.getBuiltinNodeFactory().getNodeClass());
65-
}
6656

67-
protected static boolean isVarargs(PBuiltinFunction func) {
68-
return PythonVarargsBuiltinNode.class.isAssignableFrom(func.getBuiltinNodeFactory().getNodeClass());
57+
/**
58+
* Returns a new instanceof the builtin if it's a subclass of the given class, and null
59+
* otherwise.
60+
*/
61+
private static <T extends PythonBuiltinBaseNode> T getBuiltin(PBuiltinFunction func, Class<T> clazz) {
62+
return clazz.isAssignableFrom(func.getBuiltinNodeFactory().getNodeClass()) ? clazz.cast(func.getBuiltinNodeFactory().createNode()) : null;
6963
}
7064

7165
protected static PythonUnaryBuiltinNode getUnary(PBuiltinFunction func) {
72-
return (PythonUnaryBuiltinNode) func.getBuiltinNodeFactory().createNode();
66+
return getBuiltin(func, PythonUnaryBuiltinNode.class);
7367
}
7468

7569
protected static PythonBinaryBuiltinNode getBinary(PBuiltinFunction func) {
76-
return (PythonBinaryBuiltinNode) func.getBuiltinNodeFactory().createNode();
70+
return getBuiltin(func, PythonBinaryBuiltinNode.class);
7771
}
7872

7973
protected static PythonTernaryBuiltinNode getTernary(PBuiltinFunction func) {
80-
return (PythonTernaryBuiltinNode) func.getBuiltinNodeFactory().createNode();
74+
return getBuiltin(func, PythonTernaryBuiltinNode.class);
8175
}
8276

8377
protected static PythonVarargsBuiltinNode getVarargs(PBuiltinFunction func) {
84-
return (PythonVarargsBuiltinNode) func.getBuiltinNodeFactory().createNode();
78+
return getBuiltin(func, PythonVarargsBuiltinNode.class);
8579
}
8680
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallTernaryMethodNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,14 @@ public static CallTernaryMethodNode create() {
5454

5555
public abstract Object execute(Object callable, Object arg1, int arg2, Object arg3);
5656

57-
@Specialization(guards = {"isTernary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()")
57+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
5858
Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, int arg2, Object arg3,
5959
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
6060
@Cached("getTernary(func)") PythonTernaryBuiltinNode builtinNode) {
6161
return builtinNode.execute(arg1, arg2, arg3);
6262
}
6363

64-
@Specialization(guards = {"isTernary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()")
64+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
6565
Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object arg1, Object arg2, Object arg3,
6666
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
6767
@Cached("getTernary(func)") PythonTernaryBuiltinNode builtinNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallUnaryMethodNode.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,35 +75,35 @@ public static CallUnaryMethodNode create() {
7575

7676
public abstract Object executeObject(Object callable, Object receiver);
7777

78-
@Specialization(guards = {"isUnary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
78+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
7979
int callInt(@SuppressWarnings("unused") PBuiltinFunction func, int receiver,
8080
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
8181
@Cached("getUnary(func)") PythonUnaryBuiltinNode builtinNode) throws UnexpectedResultException {
8282
return builtinNode.executeInt(receiver);
8383
}
8484

85-
@Specialization(guards = {"isUnary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
85+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
8686
long callLong(@SuppressWarnings("unused") PBuiltinFunction func, long receiver,
8787
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
8888
@Cached("getUnary(func)") PythonUnaryBuiltinNode builtinNode) throws UnexpectedResultException {
8989
return builtinNode.executeLong(receiver);
9090
}
9191

92-
@Specialization(guards = {"isUnary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
92+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
9393
double callDouble(@SuppressWarnings("unused") PBuiltinFunction func, double receiver,
9494
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
9595
@Cached("getUnary(func)") PythonUnaryBuiltinNode builtinNode) throws UnexpectedResultException {
9696
return builtinNode.executeDouble(receiver);
9797
}
9898

99-
@Specialization(guards = {"isUnary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
99+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = UnexpectedResultException.class)
100100
boolean callBool(@SuppressWarnings("unused") PBuiltinFunction func, boolean receiver,
101101
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
102102
@Cached("getUnary(func)") PythonUnaryBuiltinNode builtinNode) throws UnexpectedResultException {
103103
return builtinNode.executeBool(receiver);
104104
}
105105

106-
@Specialization(guards = {"isUnary(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()")
106+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()")
107107
Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object receiver,
108108
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
109109
@Cached("getUnary(func)") PythonUnaryBuiltinNode builtinNode) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/call/special/CallVarargsMethodNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public static CallVarargsMethodNode create() {
5353

5454
public abstract Object execute(Object callable, Object[] arguments, PKeyword[] keywords);
5555

56-
@Specialization(guards = {"isVarargs(func)", "func == cachedFunc"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class)
56+
@Specialization(guards = {"func == cachedFunc", "builtinNode != null"}, limit = "getCallSiteInlineCacheMaxDepth()", rewriteOn = VarargsBuiltinDirectInvocationNotSupported.class)
5757
Object call(@SuppressWarnings("unused") PBuiltinFunction func, Object[] arguments, PKeyword[] keywords,
5858
@SuppressWarnings("unused") @Cached("func") PBuiltinFunction cachedFunc,
5959
@Cached("getVarargs(func)") PythonVarargsBuiltinNode builtinNode) throws VarargsBuiltinDirectInvocationNotSupported {

0 commit comments

Comments
 (0)