* Extended X interface: pixmap objects, colormap objects visual objects,
  image objects, and lots of new methods.
* Added counting of allocations and deallocations of builtin types if
  COUNT_ALLOCS is defined.  Had to move calls to NEWREF down in some
  files.
* Bug fix in sorting lists.
diff --git a/Objects/object.c b/Objects/object.c
index a469797..a20b24d 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -34,6 +34,36 @@
    These are used by the individual routines for object creation.
    Do not call them otherwise, they do not initialize the object! */
 
+#ifdef COUNT_ALLOCS
+static typeobject *type_list;
+
+void
+dump_counts()
+{
+	typeobject *tp;
+
+	for (tp = type_list; tp; tp = tp->tp_next)
+		printf("%s %d %d %d\n", tp->tp_name, tp->tp_alloc, tp->tp_free,
+		       tp->tp_maxalloc);
+}
+
+void
+inc_count(tp)
+	typeobject *tp;
+{
+	if (tp->tp_alloc == 0) {
+		/* first time; hang in linked list */
+		if (tp->tp_next != NULL) /* sanity check */
+			abort();
+		tp->tp_next = type_list;
+		type_list = tp;
+	}
+	tp->tp_alloc++;
+	if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
+		tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
+}
+#endif
+
 object *
 newobject(tp)
 	typeobject *tp;
@@ -41,8 +71,8 @@
 	object *op = (object *) malloc(tp->tp_basicsize);
 	if (op == NULL)
 		return err_nomem();
-	NEWREF(op);
 	op->ob_type = tp;
+	NEWREF(op);
 	return op;
 }
 
@@ -55,9 +85,9 @@
 		malloc(tp->tp_basicsize + size * tp->tp_itemsize);
 	if (op == NULL)
 		return (varobject *)err_nomem();
-	NEWREF(op);
 	op->ob_type = tp;
 	op->ob_size = size;
+	NEWREF(op);
 	return op;
 }
 
@@ -301,6 +331,9 @@
 	op->_ob_prev = &refchain;
 	refchain._ob_next->_ob_prev = op;
 	refchain._ob_next = op;
+#ifdef COUNT_ALLOCS
+	inc_count(op->ob_type);
+#endif
 }
 
 UNREF(op)
@@ -335,6 +368,9 @@
 	object *op;
 {
 	UNREF(op);
+#ifdef COUNT_ALLOCS
+	op->ob_type->tp_free++;
+#endif
 	(*(op)->ob_type->tp_dealloc)(op);
 	op->ob_type = NULL;
 }