summaryrefslogtreecommitdiffstats
path: root/Python/structmember.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-05-20 22:25:32 (GMT)
committerGuido van Rossum <guido@python.org>1998-05-20 22:25:32 (GMT)
commitadf0e437cb15791c9bbfd99929388f3ff8e07e3a (patch)
tree5435d878f2e985f819c7a6bdafbf4ed2c35de61b /Python/structmember.c
parent885215c3da9b70f535acbea2c15ccebe1705da04 (diff)
downloadcpython-adf0e437cb15791c9bbfd99929388f3ff8e07e3a.zip
cpython-adf0e437cb15791c9bbfd99929388f3ff8e07e3a.tar.gz
cpython-adf0e437cb15791c9bbfd99929388f3ff8e07e3a.tar.bz2
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.
Diffstat (limited to 'Python/structmember.c')
-rw-r--r--Python/structmember.c4
1 files changed, 3 insertions, 1 deletions
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 @@ 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) &&