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);
}
}