Skip to content

Commit 9d4882b

Browse files
fangerertimfel
authored andcommitted
Never overwrite existing attributes in PyTruffleType_AddSlot
1 parent e6b3445 commit 9d4882b

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextTypeBuiltins.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import com.oracle.graal.python.builtins.objects.cext.common.CExtContext;
8181
import com.oracle.graal.python.builtins.objects.cext.common.CExtContext.Store;
8282
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage;
83+
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem;
8384
import com.oracle.graal.python.builtins.objects.dict.DictBuiltins;
8485
import com.oracle.graal.python.builtins.objects.dict.PDict;
8586
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
@@ -292,12 +293,14 @@ abstract static class PyTruffleType_AddSlot extends CApi7BuiltinNode {
292293
@Specialization
293294
@TruffleBoundary
294295
static int addSlot(Object clazz, PDict tpDict, TruffleString memberName, Object cfunc, int flags, int wrapper, Object memberDoc) {
295-
// create wrapper descriptor
296-
Object wrapperDescriptor = CreateFunctionNodeGen.getUncached().execute(memberName, cfunc, wrapper, clazz, flags, PythonObjectFactory.getUncached());
297-
WriteAttributeToDynamicObjectNode.getUncached().execute(wrapperDescriptor, SpecialAttributeNames.T___DOC__, memberDoc);
296+
if (!HashingStorageGetItem.hasKeyUncached(tpDict.getDictStorage(), memberName)) {
297+
// create wrapper descriptor
298+
Object wrapperDescriptor = CreateFunctionNodeGen.getUncached().execute(memberName, cfunc, wrapper, clazz, flags, PythonObjectFactory.getUncached());
299+
WriteAttributeToDynamicObjectNode.getUncached().execute(wrapperDescriptor, SpecialAttributeNames.T___DOC__, memberDoc);
298300

299-
// add wrapper descriptor to tp_dict
300-
PyDictSetItem.executeUncached(tpDict, memberName, wrapperDescriptor);
301+
// add wrapper descriptor to tp_dict
302+
PyDictSetItem.executeUncached(tpDict, memberName, wrapperDescriptor);
303+
}
301304
return 0;
302305
}
303306
}

0 commit comments

Comments
 (0)