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 02464c6..ba07720 100644
--- a/Python/structmember.c
+++ b/Python/structmember.c
@@ -167,6 +167,7 @@
 	PyObject *v;
 {
 	struct memberlist *l;
+	PyObject *oldv;
 	
 	for (l = mlist; l->name != NULL; l++) {
 		if (strcmp(l->name, name) == 0) {
@@ -253,9 +254,10 @@
 				}
 				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) &&