From 909336104b70cae29c0c4fde4477d508e1d709ac Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 7 Jun 1991 16:10:43 +0000 Subject: printobject now returns an error code --- Objects/fileobject.c | 9 ++++-- Objects/floatobject.c | 3 +- Objects/intobject.c | 3 +- Objects/listobject.c | 13 ++++---- Objects/longobject.c | 15 ++++----- Objects/methodobject.c | 3 +- Objects/moduleobject.c | 3 +- Objects/object.c | 88 ++++++++++++++++++-------------------------------- Python/bltinmodule.c | 12 ++++--- Python/ceval.c | 7 ++-- 10 files changed, 70 insertions(+), 86 deletions(-) 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 @@ file_dealloc(f) 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 @@ float_buf_repr(buf, v) } } -static void +static int float_print(v, fp, flags) floatobject *v; FILE *fp; @@ -107,6 +107,7 @@ float_print(v, fp, flags) 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 @@ getintvalue(op) /* 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 @@ list_dealloc(op) free((ANY *)op); } -static void +static int list_print(op, fp, flags) listobject *op; FILE *fp; @@ -193,13 +193,14 @@ list_print(op, fp, flags) { 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 @@ list_concat(a, bb) 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 @@ long_dealloc(v) 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 @@ meth_dealloc(m) free((char *)m); } -static void +static int meth_print(m, fp, flags) methodobject *m; FILE *fp; @@ -96,6 +96,7 @@ meth_print(m, fp, flags) else fprintf(fp, "", 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 @@ module_dealloc(m) free((char *)m); } -static void +static int module_print(m, fp, flags) moduleobject *m; FILE *fp; int flags; { fprintf(fp, "", 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 @@ newvarobject(tp, size) 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, ""); - } - 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, ""); } - 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(""); - } - 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(""); + 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 @@ There is (and should be!) no way to create other objects of this type, 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 @@ printrefs(fp) 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); } } diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 47dc920..98eb231 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -192,8 +192,10 @@ builtin_input(self, v) int err; object *m, *d; flushline(); - if (v != NULL) - printobject(v, out, PRINT_RAW); + if (v != NULL) { + if (printobject(v, out, PRINT_RAW) != 0) + return NULL; + } m = add_module("__main__"); d = getmoduledict(m); return run_file(in, "", expr_input, d, d); @@ -450,8 +452,10 @@ builtin_raw_input(self, v) { FILE *out = sysgetfile("stdout", stdout); flushline(); - if (v != NULL) - printobject(v, out, PRINT_RAW); + if (v != NULL) { + if (printobject(v, out, PRINT_RAW) != 0) + return NULL; + } return filegetline(sysget("stdin"), -1); } diff --git a/Python/ceval.c b/Python/ceval.c index e24866c..975b788 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -428,7 +428,7 @@ eval_code(co, globals, locals, arg) if (v != None) { flushline(); softspace(sysget("stdout"), 1); - printobject(v, fp, 0); + err = printobject(v, fp, 0); flushline(); } DECREF(v); @@ -447,7 +447,7 @@ eval_code(co, globals, locals, arg) softspace(sysget("stdout"), 0); } else { - printobject(v, fp, 0); + err = printobject(v, fp, 0); } DECREF(v); break; @@ -933,7 +933,8 @@ prtrace(v, str) char *str; { printf("%s ", str); - printobject(v, stdout, 0); + if (printobject(v, stdout, 0) != 0) + err_clear(); /* Don't know what else to do */ printf("\n"); } #endif -- cgit v0.12