module_repr(): Instead of fixing the maximum buf size to 400,

calculate it on the fly.  This way even modules with long package
    names get an accurate repr instead of a truncated one.  The extra
    malloc/free cost shouldn't be a problem in a repr function.

    Closes SF bug #437984
This commit is contained in:
Barry Warsaw 2001-08-16 20:39:24 +00:00
parent e791a6421f
commit 2907fe6ce7
1 changed files with 18 additions and 6 deletions

View File

@ -157,9 +157,14 @@ module_dealloc(PyModuleObject *m)
static PyObject * static PyObject *
module_repr(PyModuleObject *m) module_repr(PyModuleObject *m)
{ {
char buf[400]; static int template1len = sizeof("<module '' (built-in)>") + 1;
static int template2len = sizeof("<module '' from ''>") + 1;
char *buf;
char *name; char *name;
char *filename; char *filename;
PyObject *rtn;
name = PyModule_GetName((PyObject *)m); name = PyModule_GetName((PyObject *)m);
if (name == NULL) { if (name == NULL) {
PyErr_Clear(); PyErr_Clear();
@ -168,12 +173,19 @@ module_repr(PyModuleObject *m)
filename = PyModule_GetFilename((PyObject *)m); filename = PyModule_GetFilename((PyObject *)m);
if (filename == NULL) { if (filename == NULL) {
PyErr_Clear(); PyErr_Clear();
sprintf(buf, "<module '%.80s' (built-in)>", name); buf = PyObject_MALLOC(
} else { sizeof(char) * (strlen(name) + template1len));
sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename); sprintf(buf, "<module '%s' (built-in)>", name);
} }
else {
return PyString_FromString(buf); buf = PyObject_MALLOC(
sizeof(char) * (strlen(name) + strlen(filename) +
template2len));
sprintf(buf, "<module '%s' from '%s'>", name, filename);
}
rtn = PyString_FromString(buf);
PyObject_FREE(buf);
return rtn;
} }
/* We only need a traverse function, no clear function: If the module /* We only need a traverse function, no clear function: If the module