diff Objects/typeobject.c @ 67549:236e11ba18c5

don't segfault on deleting __abstractmethods__ #10892
author Benjamin Peterson <benjamin@python.org>
date Wed, 12 Jan 2011 15:34:01 +0000
parents 3bf4d9f1660a
children aeccbd16970f
line wrap: on
line diff
--- a/Objects/typeobject.c	Wed Jan 12 15:25:02 2011 +0000
+++ b/Objects/typeobject.c	Wed Jan 12 15:34:01 2011 +0000
@@ -340,8 +340,17 @@
        abc.ABCMeta.__new__, so this function doesn't do anything
        special to update subclasses.
     */
-    int res = PyDict_SetItemString(type->tp_dict,
-                                   "__abstractmethods__", value);
+    int res;
+    if (value != NULL) {
+        res = PyDict_SetItemString(type->tp_dict, "__abstractmethods__", value);
+    }
+    else {
+        res = PyDict_DelItemString(type->tp_dict, "__abstractmethods__");
+        if (res && PyErr_ExceptionMatches(PyExc_KeyError)) {
+            PyErr_Format(PyExc_AttributeError, "__abstractmethods__", value);
+            return -1;
+        }
+    }
     if (res == 0) {
         PyType_Modified(type);
         if (value && PyObject_IsTrue(value)) {