|
42 | 42 | import com.oracle.graal.python.builtins.objects.function.PFunction;
|
43 | 43 | import com.oracle.graal.python.builtins.objects.module.PythonModule;
|
44 | 44 | import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
|
| 45 | +import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; |
45 | 46 | import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetNameNode;
|
46 | 47 | import com.oracle.graal.python.nodes.ErrorMessages;
|
47 | 48 | import com.oracle.graal.python.nodes.SpecialAttributeNames;
|
| 49 | +import static com.oracle.graal.python.nodes.SpecialMethodNames.__OBJCLASS__; |
48 | 50 | import com.oracle.graal.python.nodes.attributes.GetAttributeNode;
|
49 | 51 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
|
50 | 52 | import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
|
51 | 53 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
|
| 54 | +import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; |
52 | 55 | import com.oracle.graal.python.nodes.util.CannotCastException;
|
53 | 56 | import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
|
54 | 57 | import com.oracle.graal.python.runtime.exception.PException;
|
| 58 | +import com.oracle.graal.python.runtime.exception.PythonErrorType; |
55 | 59 | import com.oracle.truffle.api.CompilerDirectives;
|
56 | 60 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
57 | 61 | import com.oracle.truffle.api.dsl.Cached;
|
58 | 62 | import com.oracle.truffle.api.dsl.Fallback;
|
59 | 63 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
60 | 64 | import com.oracle.truffle.api.dsl.NodeFactory;
|
61 | 65 | import com.oracle.truffle.api.dsl.Specialization;
|
| 66 | +import com.oracle.truffle.api.dsl.TypeSystemReference; |
62 | 67 | import com.oracle.truffle.api.frame.VirtualFrame;
|
63 | 68 | import com.oracle.truffle.api.library.CachedLibrary;
|
| 69 | +import com.oracle.truffle.api.profiles.ConditionProfile; |
64 | 70 |
|
65 | 71 | @CoreFunctions(extendClasses = {PythonBuiltinClassType.PBuiltinMethod})
|
66 | 72 | public class BuiltinMethodBuiltins extends PythonBuiltins {
|
@@ -194,4 +200,21 @@ Object getTextSignature(VirtualFrame frame, PMethod self, Object value) {
|
194 | 200 | return subNode.execute(frame, self.getFunction(), value);
|
195 | 201 | }
|
196 | 202 | }
|
| 203 | + |
| 204 | + @Builtin(name = __OBJCLASS__, minNumOfPositionalArgs = 1, isGetter = true) |
| 205 | + @TypeSystemReference(PythonArithmeticTypes.class) |
| 206 | + @GenerateNodeFactory |
| 207 | + public abstract static class ObjclassNode extends PythonUnaryBuiltinNode { |
| 208 | + @Specialization(guards = "self.getFunction().getEnclosingType() == null") |
| 209 | + Object objclassMissing(@SuppressWarnings("unused") PBuiltinMethod self) { |
| 210 | + throw raise(PythonErrorType.AttributeError, ErrorMessages.OBJ_P_HAS_NO_ATTR_S, "builtin_function_or_method", "__objclass__"); |
| 211 | + } |
| 212 | + |
| 213 | + @Specialization(guards = "self.getFunction().getEnclosingType() != null") |
| 214 | + @TruffleBoundary |
| 215 | + PythonAbstractClass objclass(PBuiltinMethod self, |
| 216 | + @Cached("createBinaryProfile()") ConditionProfile profile) { |
| 217 | + return getPythonClass(self.getFunction().getEnclosingType(), profile); |
| 218 | + } |
| 219 | + } |
197 | 220 | }
|
0 commit comments