|
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