printobject now returns an error code
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);
 	}
 }