printobject now returns an error code
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index b168ccf..143f697 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -117,17 +117,20 @@
 	free((char *)f);
 }
 
-static void
+static int
 file_print(f, fp, flags)
 	fileobject *f;
 	FILE *fp;
 	int flags;
 {
 	fprintf(fp, "<%s file ", f->f_fp == NULL ? "closed" : "open");
-	printobject(f->f_name, fp, flags);
+	if (printobject(f->f_name, fp, flags) != 0)
+		return -1;
 	fprintf(fp, ", mode ");
-	printobject(f->f_mode, fp, flags);
+	if (printobject(f->f_mode, fp, flags) != 0)
+		return -1;
 	fprintf(fp, ">");
+	return 0;
 }
 
 static object *
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index cd7d084..a386e0c 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -98,7 +98,7 @@
 	}
 }
 
-static void
+static int
 float_print(v, fp, flags)
 	floatobject *v;
 	FILE *fp;
@@ -107,6 +107,7 @@
 	char buf[100];
 	float_buf_repr(buf, v);
 	fputs(buf, fp);
+	return 0;
 }
 
 static object *
diff --git a/Objects/intobject.c b/Objects/intobject.c
index 6e48a27..91c43b9 100644
--- a/Objects/intobject.c
+++ b/Objects/intobject.c
@@ -120,13 +120,14 @@
 
 /* Methods */
 
-static void
+static int
 int_print(v, fp, flags)
 	intobject *v;
 	FILE *fp;
 	int flags;
 {
 	fprintf(fp, "%ld", v->ob_ival);
+	return 0;
 }
 
 static object *
diff --git a/Objects/listobject.c b/Objects/listobject.c
index ce27834..4026622 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -185,7 +185,7 @@
 	free((ANY *)op);
 }
 
-static void
+static int
 list_print(op, fp, flags)
 	listobject *op;
 	FILE *fp;
@@ -193,13 +193,14 @@
 {
 	int i;
 	fprintf(fp, "[");
-	for (i = 0; i < op->ob_size && !StopPrint; i++) {
-		if (i > 0) {
+	for (i = 0; i < op->ob_size; i++) {
+		if (i > 0)
 			fprintf(fp, ", ");
-		}
-		printobject(op->ob_item[i], fp, flags);
+		if (printobject(op->ob_item[i], fp, flags) != 0)
+			return -1;
 	}
 	fprintf(fp, "]");
+	return 0;
 }
 
 object *
@@ -302,7 +303,7 @@
 	size = a->ob_size + b->ob_size;
 	np = (listobject *) newlistobject(size);
 	if (np == NULL) {
-		return err_nomem();
+		return NULL;
 	}
 	for (i = 0; i < a->ob_size; i++) {
 		object *v = a->ob_item[i];
diff --git a/Objects/longobject.c b/Objects/longobject.c
index de7ff39..ca4088c 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -533,21 +533,18 @@
 	DEL(v);
 }
 
-static void
+static int
 long_print(v, fp, flags)
 	longobject *v;
 	FILE *fp;
 	int flags;
 {
 	stringobject *str = long_format(v, 10);
-	if (str == NULL) {
-		err_clear();
-		fprintf(fp, "[err]");
-	}
-	else {
-		fprintf(fp, "%sL", GETSTRINGVALUE(str));
-		DECREF(str);
-	}
+	if (str == NULL)
+		return -1;
+	fprintf(fp, "%sL", GETSTRINGVALUE(str));
+	DECREF(str);
+	return 0;
 }
 
 static object *
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 62649f1..46a2f86 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -85,7 +85,7 @@
 	free((char *)m);
 }
 
-static void
+static int
 meth_print(m, fp, flags)
 	methodobject *m;
 	FILE *fp;
@@ -96,6 +96,7 @@
 	else
 		fprintf(fp, "<built-in method '%s' of some %s object>",
 			m->m_name, m->m_self->ob_type->tp_name);
+	return 0;
 }
 
 static object *
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index d30d465..ffc8e74 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -83,13 +83,14 @@
 	free((char *)m);
 }
 
-static void
+static int
 module_print(m, fp, flags)
 	moduleobject *m;
 	FILE *fp;
 	int flags;
 {
 	fprintf(fp, "<module '%s'>", getstringvalue(m->md_name));
+	return 0;
 }
 
 static object *
diff --git a/Objects/object.c b/Objects/object.c
index 2b5b891..b63f067 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -61,77 +61,49 @@
 	return op;
 }
 
-int StopPrint; /* Flag to indicate printing must be stopped */
-
-static int prlevel;
-
-void
+int
 printobject(op, fp, flags)
 	object *op;
 	FILE *fp;
 	int flags;
 {
-	/* Hacks to make printing a long or recursive object interruptible */
-	/* XXX Interrupts should leave a more permanent error */
-	prlevel++;
-	if (!StopPrint && intrcheck()) {
-		fprintf(fp, "\n[print interrupted]\n");
-		StopPrint = 1;
+	if (intrcheck()) {
+		err_set(KeyboardInterrupt);
+		return -1;
 	}
-	if (!StopPrint) {
-		if (op == NULL) {
-			fprintf(fp, "<nil>");
-		}
-		else {
-			if (op->ob_refcnt <= 0)
-				fprintf(fp, "(refcnt %d):", op->ob_refcnt);
-			if (op->ob_type->tp_print == NULL) {
-				fprintf(fp, "<%s object at %lx>",
-					op->ob_type->tp_name, (long)op);
-			}
-			else {
-				(*op->ob_type->tp_print)(op, fp, flags);
-			}
-		}
+	if (op == NULL) {
+		fprintf(fp, "<nil>");
 	}
-	prlevel--;
-	if (prlevel == 0)
-		StopPrint = 0;
+	else {
+		if (op->ob_refcnt <= 0)
+			fprintf(fp, "(refcnt %d):", op->ob_refcnt);
+		if (op->ob_type->tp_print == NULL)
+			fprintf(fp, "<%s object at %lx>",
+				op->ob_type->tp_name, (long)op);
+		else
+			return (*op->ob_type->tp_print)(op, fp, flags);
+	}
+	return 0;
 }
 
 object *
 reprobject(v)
 	object *v;
 {
-	object *w = NULL;
-	/* Hacks to make converting a long or recursive object interruptible */
-	prlevel++;
-	if (!StopPrint && intrcheck()) {
-		StopPrint = 1;
+	if (intrcheck()) {
 		err_set(KeyboardInterrupt);
+		return NULL;
 	}
-	if (!StopPrint) {
-		if (v == NULL) {
-			w = newstringobject("<NULL>");
-		}
-		else if (v->ob_type->tp_repr == NULL) {
-			char buf[100];
-			sprintf(buf, "<%.80s object at %lx>",
-				v->ob_type->tp_name, (long)v);
-			w = newstringobject(buf);
-		}
-		else {
-			w = (*v->ob_type->tp_repr)(v);
-		}
-		if (StopPrint) {
-			XDECREF(w);
-			w = NULL;
-		}
+	if (v == NULL)
+		return newstringobject("<NULL>");
+	else if (v->ob_type->tp_repr == NULL) {
+		char buf[120];
+		sprintf(buf, "<%.80s object at %lx>",
+			v->ob_type->tp_name, (long)v);
+		return newstringobject(buf);
 	}
-	prlevel--;
-	if (prlevel == 0)
-		StopPrint = 0;
-	return w;
+	else
+		return (*v->ob_type->tp_repr)(v);
 }
 
 int
@@ -191,13 +163,14 @@
 so there is exactly one (which is indestructible, by the way).
 */
 
-static void
+static int
 none_print(op, fp, flags)
 	object *op;
 	FILE *fp;
 	int flags;
 {
 	fprintf(fp, "None");
+	return 0;
 }
 
 static object *
@@ -278,7 +251,8 @@
 	fprintf(fp, "Remaining objects:\n");
 	for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
 		fprintf(fp, "[%d] ", op->ob_refcnt);
-		printobject(op, fp, 0);
+		if (printobject(op, fp, 0) != 0)
+			err_clear();
 		putc('\n', fp);
 	}
 }