Fixed calling of __del__ method with TRACE_REFS defined.
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 0d0a109..94ed2db 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -347,7 +347,18 @@
 	object *del;
 	/* Call the __del__ method if it exists.  First temporarily
 	   revive the object and save the current exception, if any. */
+#ifdef TRACE_REFS
+	/* much too complicated if TRACE_REFS defined */
+	extern long ref_total;
+	inst->ob_type = &Instancetype;
+	ref_total--;		/* compensate for increment in NEWREF */
+#ifdef COUNT_ALLOCS
+	inst->ob_type->tp_alloc--; /* ditto */
+#endif
+	NEWREF(inst);
+#else
 	INCREF(inst);
+#endif /* TRACE_REFS */
 	err_fetch(&error_type, &error_value, &error_traceback);
 	if ((del = instance_getattr1(inst, "__del__")) != NULL) {
 		object *res = call_object(del, (object *)NULL);
@@ -358,8 +369,19 @@
 	/* Restore the saved exception and undo the temporary revival */
 	err_restore(error_type, error_value, error_traceback);
 	/* Can't use DECREF here, it would cause a recursive call */
-	if (--inst->ob_refcnt > 0)
+	if (--inst->ob_refcnt > 0) {
+#ifdef COUNT_ALLOCS
+		inst->ob_type->tp_free--;
+#endif
 		return; /* __del__ added a reference; don't delete now */
+	}
+#ifdef TRACE_REFS
+#ifdef COUNT_ALLOCS
+	inst->ob_type->tp_free--;	/* compensate for increment in UNREF */
+#endif
+	UNREF(inst);
+	inst->ob_type = NULL;
+#endif /* TRACE_REFS */
 	DECREF(inst->in_class);
 	XDECREF(inst->in_dict);
 	free((ANY *)inst);