Skip to content

Commit 05c0883

Browse files
committed
Add delete for __abstractmethods__
1 parent 3085218 commit 05c0883

File tree

1 file changed

+27
-8
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type

1 file changed

+27
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
package com.oracle.graal.python.builtins.objects.type;
2828

29+
import static com.oracle.graal.python.builtins.objects.str.StringUtils.canEncodeUTF8;
2930
import static com.oracle.graal.python.builtins.objects.str.StringUtils.containsNullCharacter;
3031
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__ABSTRACTMETHODS__;
3132
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__BASES__;
@@ -83,7 +84,6 @@
8384
import com.oracle.graal.python.builtins.objects.list.PList;
8485
import com.oracle.graal.python.builtins.objects.object.PythonObject;
8586
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
86-
import static com.oracle.graal.python.builtins.objects.str.StringUtils.canEncodeUTF8;
8787
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
8888
import com.oracle.graal.python.builtins.objects.type.TypeBuiltinsFactory.CallNodeFactory;
8989
import com.oracle.graal.python.builtins.objects.type.TypeNodes.CheckCompatibleForAssigmentNode;
@@ -1255,9 +1255,9 @@ Object doGeneric(Object self,
12551255
}
12561256
}
12571257

1258-
@Builtin(name = __ABSTRACTMETHODS__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
1258+
@Builtin(name = __ABSTRACTMETHODS__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true, allowsDelete = true)
12591259
@GenerateNodeFactory
1260-
abstract static class AbstracMethodsNode extends PythonBinaryBuiltinNode {
1260+
abstract static class AbstractMethodsNode extends PythonBinaryBuiltinNode {
12611261
@Specialization(guards = "isNoValue(none)")
12621262
Object get(Object self, @SuppressWarnings("unused") PNone none,
12631263
@Cached IsSameTypeNode isSameTypeNode,
@@ -1272,13 +1272,32 @@ Object get(Object self, @SuppressWarnings("unused") PNone none,
12721272
throw raise(AttributeError, ErrorMessages.OBJ_S_HAS_NO_ATTR_S, GetNameNode.getUncached().execute(self), __ABSTRACTMETHODS__);
12731273
}
12741274

1275-
@Specialization(guards = "!isNoValue(value)", limit = "3")
1276-
static Object set(VirtualFrame frame, PythonClass self, Object value,
1275+
@Specialization(guards = {"!isNoValue(value)", "!isDeleteMarker(value)"}, limit = "3")
1276+
Object set(VirtualFrame frame, PythonClass self, Object value,
12771277
@CachedLibrary("value") PythonObjectLibrary lib,
1278+
@Cached IsSameTypeNode isSameTypeNode,
12781279
@Cached WriteAttributeToObjectNode writeAttributeToObjectNode) {
1279-
writeAttributeToObjectNode.execute(self, __ABSTRACTMETHODS__, value);
1280-
self.setAbstractClass(lib.isTrue(value, frame));
1281-
return PNone.NONE;
1280+
if (!isSameTypeNode.execute(self, PythonBuiltinClassType.PythonClass)) {
1281+
writeAttributeToObjectNode.execute(self, __ABSTRACTMETHODS__, value);
1282+
self.setAbstractClass(lib.isTrue(value, frame));
1283+
return PNone.NONE;
1284+
}
1285+
throw raise(AttributeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE_S, GetNameNode.getUncached().execute(self));
1286+
}
1287+
1288+
@Specialization(guards = "!isNoValue(value)")
1289+
Object delete(PythonClass self, @SuppressWarnings("unused") DescriptorDeleteMarker value,
1290+
@Cached IsSameTypeNode isSameTypeNode,
1291+
@Cached ReadAttributeFromObjectNode readAttributeFromObjectNode,
1292+
@Cached WriteAttributeToObjectNode writeAttributeToObjectNode) {
1293+
if (!isSameTypeNode.execute(self, PythonBuiltinClassType.PythonClass)) {
1294+
if (readAttributeFromObjectNode.execute(self, __ABSTRACTMETHODS__) != PNone.NO_VALUE) {
1295+
writeAttributeToObjectNode.execute(self, __ABSTRACTMETHODS__, PNone.NO_VALUE);
1296+
self.setAbstractClass(false);
1297+
return PNone.NONE;
1298+
}
1299+
}
1300+
throw raise(AttributeError, ErrorMessages.CANT_SET_ATTRIBUTES_OF_TYPE_S, GetNameNode.getUncached().execute(self));
12821301
}
12831302

12841303
@Fallback

0 commit comments

Comments
 (0)