summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2006-12-29 18:49:13 (GMT)
committerRaymond Hettinger <python@rcn.com>2006-12-29 18:49:13 (GMT)
commit9cdf70399f9d61434741f1efb3eff01bfa26f656 (patch)
tree542eddd243be4b5a09120e1e6ffc846ed4c9e5ed /Objects
parent04e820443b78edebc986212e74291daba2480a12 (diff)
downloadcpython-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.c28
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;
}