|
34 | 34 | import com.oracle.graal.python.builtins.CoreFunctions;
|
35 | 35 | import com.oracle.graal.python.builtins.PythonBuiltinClassType;
|
36 | 36 | import com.oracle.graal.python.builtins.PythonBuiltins;
|
| 37 | +import com.oracle.graal.python.builtins.objects.type.LazyPythonClass; |
| 38 | +import com.oracle.graal.python.builtins.objects.type.PythonClass; |
37 | 39 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
38 | 40 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
39 | 41 | import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
|
| 42 | +import com.oracle.graal.python.runtime.exception.PythonErrorType; |
40 | 43 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
41 | 44 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
42 | 45 | import com.oracle.truffle.api.dsl.NodeFactory;
|
@@ -68,4 +71,25 @@ Object reprClassFunction(PBuiltinFunction self) {
|
68 | 71 | return String.format("<method '%s' of '%s' objects>", self.getName(), self.getEnclosingType().getName());
|
69 | 72 | }
|
70 | 73 | }
|
| 74 | + |
| 75 | + @Builtin(name = "__objclass__", fixedNumOfPositionalArgs = 1, isGetter = true) |
| 76 | + @TypeSystemReference(PythonArithmeticTypes.class) |
| 77 | + @GenerateNodeFactory |
| 78 | + public abstract static class ObjclassNode extends PythonUnaryBuiltinNode { |
| 79 | + @Specialization(guards = "self.getEnclosingType() == null") |
| 80 | + Object objclassMissing(@SuppressWarnings("unused") PBuiltinFunction self) { |
| 81 | + throw raise(PythonErrorType.AttributeError, "'builtin_function_or_method' object has no attribute '__objclass__'"); |
| 82 | + } |
| 83 | + |
| 84 | + @Specialization(guards = "self.getEnclosingType() != null") |
| 85 | + @TruffleBoundary |
| 86 | + PythonClass objclass(PBuiltinFunction self) { |
| 87 | + LazyPythonClass enclosingType = self.getEnclosingType(); |
| 88 | + if (enclosingType instanceof PythonBuiltinClassType) { |
| 89 | + return getCore().lookupType((PythonBuiltinClassType) enclosingType); |
| 90 | + } else { |
| 91 | + return (PythonClass) enclosingType; |
| 92 | + } |
| 93 | + } |
| 94 | + } |
71 | 95 | }
|
0 commit comments