Skip to content

Commit 3300d11

Browse files
committed
Support higher order BuiltinMethodDescriptors in Call{Unary/Binary}MethodNode
1 parent 9c35c5d commit 3300d11

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PGuards.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ public static boolean isCallableOrDescriptor(Object value) {
178178
return isCallable(value) || BuiltinMethodDescriptor.isInstance(value);
179179
}
180180

181+
public static boolean isBuiltinDescriptor(Object value) {
182+
return BuiltinMethodDescriptor.isInstance(value);
183+
}
184+
181185
public static boolean isClass(Object obj, InteropLibrary lib) {
182186
try {
183187
return lib.isMetaObject(obj) && lib.hasLanguage(obj) && lib.getLanguage(obj) == PythonLanguage.class;

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.oracle.graal.python.PythonLanguage;
4444
import com.oracle.graal.python.builtins.objects.PNone;
4545
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor;
46+
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor;
4647
import com.oracle.graal.python.builtins.objects.function.PArguments;
4748
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4849
import com.oracle.graal.python.builtins.objects.function.PKeyword;
@@ -87,13 +88,24 @@ public final Object executeObject(Object callable, Object arg1, Object arg2) {
8788
}
8889

8990
@Specialization(guards = "cachedInfo == info", limit = "getCallSiteInlineCacheMaxDepth()")
90-
Object callSpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") BinaryBuiltinDescriptor info, Object arg1, Object arg2,
91+
Object callBinarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") BinaryBuiltinDescriptor info, Object arg1, Object arg2,
9192
@SuppressWarnings("unused") @Cached("info") BinaryBuiltinDescriptor cachedInfo,
9293
@Cached("cachedInfo.createNode()") PythonBinaryBuiltinNode node) {
9394
return node.call(frame, arg1, arg2);
9495
}
9596

96-
@Specialization(replaces = "callSpecialMethodSlotInlined")
97+
@Specialization(guards = "cachedInfo == info", limit = "getCallSiteInlineCacheMaxDepth()")
98+
Object callTernarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") TernaryBuiltinDescriptor info, Object arg1, Object arg2,
99+
@SuppressWarnings("unused") @Cached("info") TernaryBuiltinDescriptor cachedInfo,
100+
@Cached("cachedInfo.createNode()") PythonTernaryBuiltinNode node) {
101+
return node.call(frame, arg1, arg2, PNone.NO_VALUE);
102+
}
103+
104+
protected static boolean isBinaryOrTernaryBuiltinDescriptor(Object value) {
105+
return value instanceof BinaryBuiltinDescriptor || value instanceof TernaryBuiltinDescriptor;
106+
}
107+
108+
@Specialization(guards = "isBinaryOrTernaryBuiltinDescriptor(info)", replaces = {"callBinarySpecialMethodSlotInlined", "callTernarySpecialMethodSlotInlined"})
97109
Object callSpecialMethodSlotCallTarget(VirtualFrame frame, BinaryBuiltinDescriptor info, Object arg1, Object arg2,
98110
@CachedLanguage PythonLanguage language,
99111
@Cached GenericInvokeNode invokeNode) {
@@ -402,7 +414,7 @@ static Object callQuaternaryFunction(VirtualFrame frame, @SuppressWarnings("unus
402414
return builtinNode.call(frame, arg1, arg2, PNone.NO_VALUE, PNone.NO_VALUE);
403415
}
404416

405-
@Specialization(guards = "!isBinaryBuiltinDescriptor(func)", //
417+
@Specialization(guards = "!isBinaryOrTernaryBuiltinDescriptor(func)", //
406418
replaces = {"callBoolSingle", "callBool", "callIntSingle", "callInt", "callBoolIntSingle", "callBoolInt", "callLongSingle", "callLong", "callBoolLongSingle",
407419
"callBoolLong", "callDoubleSingle", "callDouble", "callBoolDoubleSingle", "callBoolDouble", "callObjectSingleContext", "callObject",
408420
"callMethodSingleContext", "callSelfMethodSingleContext", "callMethod", "callSelfMethod", "callTernaryFunction", "callQuaternaryFunction"})

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242

4343
import com.oracle.graal.python.PythonLanguage;
4444
import com.oracle.graal.python.builtins.objects.PNone;
45+
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
46+
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.BinaryBuiltinDescriptor;
47+
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.TernaryBuiltinDescriptor;
4548
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor;
4649
import com.oracle.graal.python.builtins.objects.function.PArguments;
4750
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
@@ -51,6 +54,7 @@
5154
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
5255
import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode.BoundDescriptor;
5356
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
57+
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
5458
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5559
import com.oracle.graal.python.util.PythonUtils;
5660
import com.oracle.truffle.api.RootCallTarget;
@@ -104,14 +108,28 @@ public final Object executeObject(Object callable, Object receiver) {
104108
}
105109

106110
@Specialization(guards = "cachedInfo == info", limit = "getCallSiteInlineCacheMaxDepth()")
107-
Object callSpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") UnaryBuiltinDescriptor info, Object receiver,
111+
Object callUnarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") UnaryBuiltinDescriptor info, Object receiver,
108112
@SuppressWarnings("unused") @Cached("info") UnaryBuiltinDescriptor cachedInfo,
109113
@Cached("cachedInfo.createNode()") PythonUnaryBuiltinNode node) {
110114
return node.call(frame, receiver);
111115
}
112116

113-
@Specialization(replaces = "callSpecialMethodSlotInlined")
114-
Object callSpecialMethodSlotCallTarget(VirtualFrame frame, UnaryBuiltinDescriptor info, Object receiver,
117+
@Specialization(guards = "cachedInfo == info", limit = "getCallSiteInlineCacheMaxDepth()")
118+
Object callBinarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") BinaryBuiltinDescriptor info, Object receiver,
119+
@SuppressWarnings("unused") @Cached("info") BinaryBuiltinDescriptor cachedInfo,
120+
@Cached("cachedInfo.createNode()") PythonBinaryBuiltinNode node) {
121+
return node.call(frame, receiver, PNone.NO_VALUE);
122+
}
123+
124+
@Specialization(guards = "cachedInfo == info", limit = "getCallSiteInlineCacheMaxDepth()")
125+
Object callTernarySpecialMethodSlotInlined(VirtualFrame frame, @SuppressWarnings("unused") TernaryBuiltinDescriptor info, Object receiver,
126+
@SuppressWarnings("unused") @Cached("info") TernaryBuiltinDescriptor cachedInfo,
127+
@Cached("cachedInfo.createNode()") PythonTernaryBuiltinNode node) {
128+
return node.call(frame, receiver, PNone.NO_VALUE, PNone.NO_VALUE);
129+
}
130+
131+
@Specialization(guards = "isBuiltinDescriptor(info)", replaces = {"callUnarySpecialMethodSlotInlined", "callBinarySpecialMethodSlotInlined", "callTernarySpecialMethodSlotInlined"})
132+
Object callSpecialMethodSlotCallTarget(VirtualFrame frame, BuiltinMethodDescriptor info, Object receiver,
115133
@CachedLanguage PythonLanguage language,
116134
@Cached GenericInvokeNode invokeNode) {
117135
RootCallTarget callTarget = language.getDescriptorCallTarget(info);
@@ -281,7 +299,7 @@ static Object callBinaryMethod(VirtualFrame frame, @SuppressWarnings("unused") P
281299
return builtinNode.call(frame, arg, PNone.NO_VALUE);
282300
}
283301

284-
@Specialization(guards = "!isUnaryBuiltinDescriptor(func)", replaces = {"callIntSingle", "callInt", "callLongSingle", "callLong", "callDoubleSingle", "callDouble", "callBoolSingle", "callBool",
302+
@Specialization(guards = "!isBuiltinDescriptor(func)", replaces = {"callIntSingle", "callInt", "callLongSingle", "callLong", "callDoubleSingle", "callDouble", "callBoolSingle", "callBool",
285303
"callObjectSingle", "callObject",
286304
"callMethodSingleContext", "callSelfMethodSingleContext", "callMethod", "callSelfMethod", "callBinaryMethodSingleContext", "callBinaryMethod"})
287305
@Megamorphic

0 commit comments

Comments
 (0)