Skip to content

Commit 98f7ad3

Browse files
committed
Migrate foreign.__delattr__ to tp_setattro
1 parent fd39d61 commit 98f7ad3

File tree

3 files changed

+29
-34
lines changed

3 files changed

+29
-34
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/foreign/ForeignObjectBuiltins.java

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___AND__;
3838
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
3939
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CONTAINS__;
40-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELATTR__;
4140
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DELITEM__;
4241
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIR__;
4342
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___DIVMOD__;
@@ -1038,13 +1037,13 @@ static Object doIt(Node inliningTarget, Object object, Object memberObj,
10381037
@Slot(value = SlotKind.tp_setattro, isComplex = true)
10391038
@GenerateNodeFactory
10401039
abstract static class SetattrNode extends SetAttrBuiltinNode {
1041-
@Specialization
1042-
static void doIt(Object object, Object key, Object value,
1040+
@Specialization(guards = "!isNoValue(value)")
1041+
static void doSet(Object object, Object key, Object value,
10431042
@Bind("this") Node inliningTarget,
1044-
@CachedLibrary(limit = "3") InteropLibrary lib,
1045-
@Cached CastToJavaStringNode castToString,
1046-
@Cached GilNode gil,
1047-
@Cached PRaiseNode.Lazy raiseNode) {
1043+
@Shared @CachedLibrary(limit = "3") InteropLibrary lib,
1044+
@Shared @Cached CastToJavaStringNode castToString,
1045+
@Shared @Cached GilNode gil,
1046+
@Shared @Cached PRaiseNode.Lazy raiseNode) {
10481047
gil.release(true);
10491048
try {
10501049
lib.writeMember(object, castToString.execute(key), value);
@@ -1056,30 +1055,14 @@ static void doIt(Object object, Object key, Object value,
10561055
gil.acquire();
10571056
}
10581057
}
1059-
}
1060-
1061-
@Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3)
1062-
@GenerateNodeFactory
1063-
abstract static class SetitemNode extends PythonTernaryBuiltinNode {
1064-
@Child private AccessForeignItemNodes.SetForeignItemNode setForeignItemNode = AccessForeignItemNodes.SetForeignItemNode.create();
1065-
1066-
@Specialization
1067-
Object doit(VirtualFrame frame, Object object, Object key, Object value) {
1068-
setForeignItemNode.execute(frame, object, key, value);
1069-
return PNone.NONE;
1070-
}
1071-
}
10721058

1073-
@Builtin(name = J___DELATTR__, minNumOfPositionalArgs = 2)
1074-
@GenerateNodeFactory
1075-
abstract static class DelattrNode extends PythonBinaryBuiltinNode {
1076-
@Specialization
1077-
static PNone doIt(Object object, Object key,
1059+
@Specialization(guards = "isNoValue(value)")
1060+
static void doDelete(Object object, Object key, @SuppressWarnings("unused") PNone value,
10781061
@Bind("this") Node inliningTarget,
1079-
@CachedLibrary(limit = "3") InteropLibrary lib,
1080-
@Cached CastToJavaStringNode castToString,
1081-
@Cached GilNode gil,
1082-
@Cached PRaiseNode.Lazy raiseNode) {
1062+
@Shared @CachedLibrary(limit = "3") InteropLibrary lib,
1063+
@Shared @Cached CastToJavaStringNode castToString,
1064+
@Shared @Cached GilNode gil,
1065+
@Shared @Cached PRaiseNode.Lazy raiseNode) {
10831066
gil.release(true);
10841067
try {
10851068
lib.removeMember(object, castToString.execute(key));
@@ -1090,6 +1073,17 @@ static PNone doIt(Object object, Object key,
10901073
} finally {
10911074
gil.acquire();
10921075
}
1076+
}
1077+
}
1078+
1079+
@Builtin(name = J___SETITEM__, minNumOfPositionalArgs = 3)
1080+
@GenerateNodeFactory
1081+
abstract static class SetitemNode extends PythonTernaryBuiltinNode {
1082+
@Child private AccessForeignItemNodes.SetForeignItemNode setForeignItemNode = AccessForeignItemNodes.SetForeignItemNode.create();
1083+
1084+
@Specialization
1085+
Object doit(VirtualFrame frame, Object object, Object key, Object value) {
1086+
setForeignItemNode.execute(frame, object, key, value);
10931087
return PNone.NONE;
10941088
}
10951089
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -845,20 +845,21 @@ public static void initializeBuiltinSlots(PythonLanguage language) {
845845
}
846846
}
847847

848-
private static boolean checkNoMagicOverrides(PythonBuiltinClassType type) {
848+
private static boolean checkNoMagicOverrides(Python3Core core, PythonBuiltinClassType type) {
849849
// Check that no one is trying to define magic methods directly
850850
// If the assertion fires: you should define @Slot instead of @Builtin
851851
// We do not look in MRO, we may have already called addOperatorsToBuiltin on super
852852
var readAttr = ReadAttributeFromObjectNode.getUncachedForceType();
853+
PythonBuiltinClass typeObj = core.lookupType(type);
853854
for (TruffleString name : SPECIAL2SLOT.keySet()) {
854-
assert readAttr.execute(type, name) == PNone.NO_VALUE : name;
855+
assert readAttr.execute(typeObj, name) == PNone.NO_VALUE : type.name() + ":" + name;
855856
}
856857
return true;
857858
}
858859

859860
public static void addOperatorsToBuiltin(Map<TruffleString, BoundBuiltinCallable<?>> builtins, Python3Core core, PythonBuiltinClassType type) {
860861
TpSlots slots = type.getDeclaredSlots();
861-
assert checkNoMagicOverrides(type);
862+
assert checkNoMagicOverrides(core, type);
862863

863864
// Similar to CPython:add_operators
864865
for (var slotDefGroup : SLOTDEFS.entrySet()) {
@@ -868,7 +869,7 @@ public static void addOperatorsToBuiltin(Map<TruffleString, BoundBuiltinCallable
868869
continue;
869870
}
870871
for (TpSlotDef slotDef : slotDefGroup.getValue()) {
871-
if (slotDef.wrapper() != null) {
872+
if (slotDef.wrapper() != null && !builtins.containsKey(slotDef.name())) {
872873
var value = builtinSlot.createBuiltin(core, type, slotDef.name(), slotDef.wrapper());
873874
builtins.put(slotDef.name(), value);
874875
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectSetAttr.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public final void deleteCached(Frame frame, Object receiver, TruffleString name)
9797
}
9898

9999
public final void delete(Frame frame, Node inliningTarget, Object receiver, TruffleString name) {
100-
execute(frame, inliningTarget, receiver, name, null);
100+
execute(frame, inliningTarget, receiver, name, PNone.NO_VALUE);
101101
}
102102

103103
@Specialization(guards = {"name == cachedName", "value != null"}, limit = "1")

0 commit comments

Comments
 (0)