|
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