|
42 | 42 |
|
43 | 43 | import com.oracle.graal.python.PythonLanguage;
|
44 | 44 | 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; |
45 | 48 | import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor.UnaryBuiltinDescriptor;
|
46 | 49 | import com.oracle.graal.python.builtins.objects.function.PArguments;
|
47 | 50 | import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
|
|
51 | 54 | import com.oracle.graal.python.nodes.call.GenericInvokeNode;
|
52 | 55 | import com.oracle.graal.python.nodes.call.special.MaybeBindDescriptorNode.BoundDescriptor;
|
53 | 56 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
| 57 | +import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; |
54 | 58 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
55 | 59 | import com.oracle.graal.python.util.PythonUtils;
|
56 | 60 | import com.oracle.truffle.api.RootCallTarget;
|
@@ -104,14 +108,28 @@ public final Object executeObject(Object callable, Object receiver) {
|
104 | 108 | }
|
105 | 109 |
|
106 | 110 | @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, |
108 | 112 | @SuppressWarnings("unused") @Cached("info") UnaryBuiltinDescriptor cachedInfo,
|
109 | 113 | @Cached("cachedInfo.createNode()") PythonUnaryBuiltinNode node) {
|
110 | 114 | return node.call(frame, receiver);
|
111 | 115 | }
|
112 | 116 |
|
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, |
115 | 133 | @CachedLanguage PythonLanguage language,
|
116 | 134 | @Cached GenericInvokeNode invokeNode) {
|
117 | 135 | RootCallTarget callTarget = language.getDescriptorCallTarget(info);
|
@@ -281,7 +299,7 @@ static Object callBinaryMethod(VirtualFrame frame, @SuppressWarnings("unused") P
|
281 | 299 | return builtinNode.call(frame, arg, PNone.NO_VALUE);
|
282 | 300 | }
|
283 | 301 |
|
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", |
285 | 303 | "callObjectSingle", "callObject",
|
286 | 304 | "callMethodSingleContext", "callSelfMethodSingleContext", "callMethod", "callSelfMethod", "callBinaryMethodSingleContext", "callBinaryMethod"})
|
287 | 305 | @Megamorphic
|
|
0 commit comments