Skip to content

Commit 457c9b0

Browse files
committed
Add __isabstractmethod__ to staticmethod and classmethod
1 parent fbde6bb commit 457c9b0

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/DecoratedMethodBuiltins.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
4545
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__FUNC__;
4646
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
47+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ISABSTRACTMETHOD__;
4748

4849
import java.util.List;
4950

@@ -66,8 +67,10 @@
6667
import com.oracle.truffle.api.dsl.ImportStatic;
6768
import com.oracle.truffle.api.dsl.NodeFactory;
6869
import com.oracle.truffle.api.dsl.Specialization;
70+
import com.oracle.truffle.api.frame.VirtualFrame;
6971
import com.oracle.truffle.api.interop.UnsupportedMessageException;
7072
import com.oracle.truffle.api.library.CachedLibrary;
73+
import com.oracle.truffle.api.profiles.ConditionProfile;
7174

7275
@CoreFunctions(extendClasses = {PythonBuiltinClassType.PStaticmethod, PythonBuiltinClassType.PClassmethod})
7376
public class DecoratedMethodBuiltins extends PythonBuiltins {
@@ -134,4 +137,19 @@ protected Object setDict(@SuppressWarnings("unused") PDecoratedMethod self, Obje
134137
throw raise(TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, mapping);
135138
}
136139
}
140+
141+
@Builtin(name = __ISABSTRACTMETHOD__, minNumOfPositionalArgs = 1, isGetter = true)
142+
@GenerateNodeFactory
143+
abstract static class IsAbstractMethodNode extends PythonUnaryBuiltinNode {
144+
@Specialization
145+
static boolean isAbstract(VirtualFrame frame, PDecoratedMethod self,
146+
@CachedLibrary(limit = "4") PythonObjectLibrary lib,
147+
@Cached ConditionProfile hasAttrProfile) {
148+
Object result = lib.lookupAttribute(self.getCallable(), frame, __ISABSTRACTMETHOD__);
149+
if (hasAttrProfile.profile(result != PNone.NO_VALUE)) {
150+
return lib.isTrue(result, frame);
151+
}
152+
return false;
153+
}
154+
}
137155
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/SpecialMethodNames.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public abstract class SpecialMethodNames {
156156
public static final String __GETFORMAT__ = "__getformat__";
157157
public static final String __SETFORMAT__ = "__setformat__";
158158
public static final String __OBJCLASS__ = "__objclass__";
159+
public static final String __ISABSTRACTMETHOD__ = "__isabstractmethod__";
159160
public static final String KEYS = "keys";
160161
public static final String ITEMS = "items";
161162
public static final String VALUES = "values";

0 commit comments

Comments
 (0)