diff options
| author | Guido van Rossum <guido@python.org> | 1998-05-20 22:25:32 +0000 | 
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 1998-05-20 22:25:32 +0000 | 
| commit | adf0e437cb15791c9bbfd99929388f3ff8e07e3a (patch) | |
| tree | 5435d878f2e985f819c7a6bdafbf4ed2c35de61b /Python/structmember.c | |
| parent | 885215c3da9b70f535acbea2c15ccebe1705da04 (diff) | |
| download | cpython-git-adf0e437cb15791c9bbfd99929388f3ff8e07e3a.tar.gz | |
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.c | 4 | 
1 files changed, 3 insertions, 1 deletions
| diff --git a/Python/structmember.c b/Python/structmember.c index 02464c611f..ba0772008a 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) && | 
