mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
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.
This commit is contained in:
parent
885215c3da
commit
adf0e437cb
1 changed files with 3 additions and 1 deletions
|
@ -167,6 +167,7 @@ PyMember_Set(addr, mlist, name, v)
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
{
|
{
|
||||||
struct memberlist *l;
|
struct memberlist *l;
|
||||||
|
PyObject *oldv;
|
||||||
|
|
||||||
for (l = mlist; l->name != NULL; l++) {
|
for (l = mlist; l->name != NULL; l++) {
|
||||||
if (strcmp(l->name, name) == 0) {
|
if (strcmp(l->name, name) == 0) {
|
||||||
|
@ -253,9 +254,10 @@ PyMember_Set(addr, mlist, name, v)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case T_OBJECT:
|
case T_OBJECT:
|
||||||
Py_XDECREF(*(PyObject **)addr);
|
|
||||||
Py_XINCREF(v);
|
Py_XINCREF(v);
|
||||||
|
oldv = *(PyObject **)addr;
|
||||||
*(PyObject **)addr = v;
|
*(PyObject **)addr = v;
|
||||||
|
Py_XDECREF(oldv);
|
||||||
break;
|
break;
|
||||||
case T_CHAR:
|
case T_CHAR:
|
||||||
if (PyString_Check(v) &&
|
if (PyString_Check(v) &&
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue