|
29 | 29 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DEFAULTS__; |
30 | 30 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__KWDEFAULTS__; |
31 | 31 | import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__; |
| 32 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.TRUFFLE_SOURCE; |
32 | 33 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__; |
33 | 34 | import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__; |
34 | 35 | import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError; |
|
43 | 44 | import com.oracle.graal.python.builtins.objects.PNone; |
44 | 45 | import com.oracle.graal.python.builtins.objects.function.FunctionBuiltinsFactory.GetFunctionDefaultsNodeFactory; |
45 | 46 | import com.oracle.graal.python.builtins.objects.function.FunctionBuiltinsFactory.GetFunctionKeywordDefaultsNodeFactory; |
| 47 | +import com.oracle.graal.python.builtins.objects.method.PMethod; |
46 | 48 | import com.oracle.graal.python.builtins.objects.str.PString; |
47 | 49 | import com.oracle.graal.python.builtins.objects.tuple.PTuple; |
48 | 50 | import com.oracle.graal.python.nodes.argument.ReadKeywordNode; |
@@ -234,4 +236,34 @@ Object doGeneric(@SuppressWarnings("unused") Object obj) { |
234 | 236 | } |
235 | 237 | } |
236 | 238 |
|
| 239 | + @Builtin(name = TRUFFLE_SOURCE, fixedNumOfPositionalArgs = 1, isGetter = true) |
| 240 | + @GenerateNodeFactory |
| 241 | + public abstract static class GetFunctionSourceNode extends PythonUnaryBuiltinNode { |
| 242 | + @Specialization |
| 243 | + Object doFunction(PFunction function) { |
| 244 | + String sourceCode = function.getSourceCode(); |
| 245 | + if (sourceCode != null) { |
| 246 | + return sourceCode; |
| 247 | + } |
| 248 | + return PNone.NONE; |
| 249 | + } |
| 250 | + |
| 251 | + @Specialization |
| 252 | + Object doMethod(PMethod method) { |
| 253 | + Object function = method.getFunction(); |
| 254 | + if (function instanceof PFunction) { |
| 255 | + String sourceCode = ((PFunction) function).getSourceCode(); |
| 256 | + if (sourceCode != null) { |
| 257 | + return sourceCode; |
| 258 | + } |
| 259 | + } |
| 260 | + return PNone.NONE; |
| 261 | + } |
| 262 | + |
| 263 | + @Fallback |
| 264 | + Object doGeneric(Object object) { |
| 265 | + throw raise(TypeError, "getting the source is not supported for '%p'", object); |
| 266 | + } |
| 267 | + } |
| 268 | + |
237 | 269 | } |
0 commit comments