Kaydet (Commit) adf0e437 authored tarafından Guido van Rossum's avatar Guido van Rossum

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.
üst 885215c3
...@@ -167,6 +167,7 @@ PyMember_Set(addr, mlist, name, v) ...@@ -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) ...@@ -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) &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment