diff options
author | Raymond Hettinger <python@rcn.com> | 2006-12-29 18:49:13 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2006-12-29 18:49:13 (GMT) |
commit | 9cdf70399f9d61434741f1efb3eff01bfa26f656 (patch) | |
tree | 542eddd243be4b5a09120e1e6ffc846ed4c9e5ed /Objects | |
parent | 04e820443b78edebc986212e74291daba2480a12 (diff) | |
download | cpython-9cdf70399f9d61434741f1efb3eff01bfa26f656.zip cpython-9cdf70399f9d61434741f1efb3eff01bfa26f656.tar.gz cpython-9cdf70399f9d61434741f1efb3eff01bfa26f656.tar.bz2 |
For sets with cyclical reprs, emit '...' instead of recursing.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/setobject.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/Objects/setobject.c b/Objects/setobject.c index d33fff9..507a07b 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -572,34 +572,54 @@ set_tp_print(PySetObject *so, FILE *fp, int flags) Py_ssize_t pos=0; char *emit = ""; /* No separator emitted on first pass */ char *separator = ", "; + int status = Py_ReprEnter((PyObject*)so); + + if (status != 0) { + if (status < 0) + return status; + fprintf(fp, "%s(...)", so->ob_type->tp_name); + return 0; + } fprintf(fp, "%s([", so->ob_type->tp_name); while (set_next(so, &pos, &entry)) { fputs(emit, fp); emit = separator; - if (PyObject_Print(entry->key, fp, 0) != 0) + if (PyObject_Print(entry->key, fp, 0) != 0) { + Py_ReprLeave((PyObject*)so); return -1; + } } fputs("])", fp); + Py_ReprLeave((PyObject*)so); return 0; } static PyObject * set_repr(PySetObject *so) { - PyObject *keys, *result, *listrepr; + PyObject *keys, *result=NULL, *listrepr; + int status = Py_ReprEnter((PyObject*)so); + + if (status != 0) { + if (status < 0) + return NULL; + return PyString_FromFormat("%s(...)", so->ob_type->tp_name); + } keys = PySequence_List((PyObject *)so); if (keys == NULL) - return NULL; + goto done; listrepr = PyObject_Repr(keys); Py_DECREF(keys); if (listrepr == NULL) - return NULL; + goto done; result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name, PyString_AS_STRING(listrepr)); Py_DECREF(listrepr); +done: + Py_ReprLeave((PyObject*)so); return result; } |