From: Guido van Rossum Date: Wed, 20 May 1998 22:25:32 +0000 (+0000) Subject: Trivial little change: when setting a member to an object, hold the X-Git-Tag: v1.5.2a1~575 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=adf0e437cb15791c9bbfd99929388f3ff8e07e3a;p=thirdparty%2FPython%2Fcpython.git 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 02464c611f0a..ba0772008ab3 100644 --- a/Python/structmember.c +++ b/Python/structmember.c @@ -167,6 +167,7 @@ PyMember_Set(addr, mlist, name, v) PyObject *v; { struct memberlist *l; + PyObject *oldv; for (l = mlist; l->name != NULL; l++) { if (strcmp(l->name, name) == 0) { @@ -253,9 +254,10 @@ PyMember_Set(addr, mlist, name, v) } 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) &&