|
41 | 41 | package com.oracle.graal.python.nodes.call.special;
|
42 | 42 |
|
43 | 43 | import com.oracle.graal.python.PythonLanguage;
|
| 44 | +import com.oracle.graal.python.builtins.objects.function.Arity; |
44 | 45 | import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
|
| 46 | +import com.oracle.graal.python.builtins.objects.function.PFunction; |
| 47 | +import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod; |
| 48 | +import com.oracle.graal.python.builtins.objects.method.PMethod; |
45 | 49 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
46 | 50 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
47 | 51 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
|
|
50 | 54 | import com.oracle.graal.python.nodes.truffle.PythonTypes;
|
51 | 55 | import com.oracle.graal.python.runtime.PythonOptions;
|
52 | 56 | import com.oracle.truffle.api.Assumption;
|
| 57 | +import com.oracle.truffle.api.RootCallTarget; |
53 | 58 | import com.oracle.truffle.api.dsl.ImportStatic;
|
54 | 59 | import com.oracle.truffle.api.dsl.NodeFactory;
|
55 | 60 | import com.oracle.truffle.api.dsl.ReportPolymorphism;
|
@@ -81,19 +86,67 @@ protected Assumption singleContextAssumption() {
|
81 | 86 | return language.singleContextAssumption;
|
82 | 87 | }
|
83 | 88 |
|
84 |
| - protected static PythonUnaryBuiltinNode getUnary(PBuiltinFunction func) { |
85 |
| - return getBuiltin(func, PythonUnaryBuiltinNode.class); |
| 89 | + protected static PythonUnaryBuiltinNode getUnary(Object func) { |
| 90 | + if (func instanceof PBuiltinFunction) { |
| 91 | + return getBuiltin((PBuiltinFunction) func, PythonUnaryBuiltinNode.class); |
| 92 | + } |
| 93 | + return null; |
| 94 | + } |
| 95 | + |
| 96 | + protected static PythonBinaryBuiltinNode getBinary(Object func) { |
| 97 | + if (func instanceof PBuiltinFunction) { |
| 98 | + return getBuiltin((PBuiltinFunction) func, PythonBinaryBuiltinNode.class); |
| 99 | + } |
| 100 | + return null; |
| 101 | + } |
| 102 | + |
| 103 | + protected static PythonTernaryBuiltinNode getTernary(Object func) { |
| 104 | + if (func instanceof PBuiltinFunction) { |
| 105 | + return getBuiltin((PBuiltinFunction) func, PythonTernaryBuiltinNode.class); |
| 106 | + } |
| 107 | + return null; |
| 108 | + } |
| 109 | + |
| 110 | + protected static PythonVarargsBuiltinNode getVarargs(Object func) { |
| 111 | + if (func instanceof PBuiltinFunction) { |
| 112 | + return getBuiltin((PBuiltinFunction) func, PythonVarargsBuiltinNode.class); |
| 113 | + } |
| 114 | + return null; |
86 | 115 | }
|
87 | 116 |
|
88 |
| - protected static PythonBinaryBuiltinNode getBinary(PBuiltinFunction func) { |
89 |
| - return getBuiltin(func, PythonBinaryBuiltinNode.class); |
| 117 | + protected static boolean takesFixedNumOfPositionalArgs(PMethod func) { |
| 118 | + Arity arity = getArity(func.getFunction()); |
| 119 | + return arity != null && arity.takesFixedNumOfPositionalArgs(); |
90 | 120 | }
|
91 | 121 |
|
92 |
| - protected static PythonTernaryBuiltinNode getTernary(PBuiltinFunction func) { |
93 |
| - return getBuiltin(func, PythonTernaryBuiltinNode.class); |
| 122 | + protected static boolean takesFixedNumOfPositionalArgs(PBuiltinMethod func) { |
| 123 | + Arity arity = getArity(func.getFunction()); |
| 124 | + return arity != null && arity.takesFixedNumOfPositionalArgs(); |
94 | 125 | }
|
95 | 126 |
|
96 |
| - protected static PythonVarargsBuiltinNode getVarargs(PBuiltinFunction func) { |
97 |
| - return getBuiltin(func, PythonVarargsBuiltinNode.class); |
| 127 | + private static Arity getArity(Object func) { |
| 128 | + if (func instanceof PFunction) { |
| 129 | + return ((PFunction) func).getArity(); |
| 130 | + } else if (func instanceof PBuiltinFunction) { |
| 131 | + return ((PBuiltinFunction) func).getArity(); |
| 132 | + } |
| 133 | + return null; |
| 134 | + } |
| 135 | + |
| 136 | + protected static RootCallTarget getCallTarget(PMethod meth) { |
| 137 | + return getCallTargetOfFunction(meth.getFunction()); |
| 138 | + } |
| 139 | + |
| 140 | + protected static RootCallTarget getCallTarget(PBuiltinMethod meth) { |
| 141 | + return getCallTargetOfFunction(meth.getFunction()); |
| 142 | + } |
| 143 | + |
| 144 | + private static RootCallTarget getCallTargetOfFunction(Object func) { |
| 145 | + if (func instanceof PFunction) { |
| 146 | + return ((PFunction) func).getCallTarget(); |
| 147 | + } else if (func instanceof PBuiltinFunction) { |
| 148 | + return ((PBuiltinFunction) func).getCallTarget(); |
| 149 | + } |
| 150 | + return null; |
98 | 151 | }
|
99 | 152 | }
|
0 commit comments