Trivial little change: when setting a member to an object, hold the
old value in a temporary and XDECREF it only after then new value has
been set. This prevents the (unlikely) case where the destructor of
the member uses the containing object -- it would find it in an
undefined state.
diff --git a/Python/structmember.c b/Python/structmember.c
index 02464c6..ba07720 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -167,6 +167,7 @@
PyObject *v;
{
struct memberlist *l;
+ PyObject *oldv;
for (l = mlist; l->name != NULL; l++) {
if (strcmp(l->name, name) == 0) {
@@ -253,9 +254,10 @@
}
break;
case T_OBJECT:
- Py_XDECREF(*(PyObject **)addr);
Py_XINCREF(v);
+ oldv = *(PyObject **)addr;
*(PyObject **)addr = v;
+ Py_XDECREF(oldv);
break;
case T_CHAR:
if (PyString_Check(v) &&