diff options
author | Barry Warsaw <barry@python.org> | 2001-08-16 20:39:24 (GMT) |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2001-08-16 20:39:24 (GMT) |
commit | 2907fe6ce7376e73d84c8a29dedd37d8b3e4a225 (patch) | |
tree | 5b6037aed9b5b2e8cefce3e8f8f26eb353db3eae | |
parent | e791a6421fae40dd7aae1f67fd6b6d737c510af7 (diff) | |
download | cpython-2907fe6ce7376e73d84c8a29dedd37d8b3e4a225.zip cpython-2907fe6ce7376e73d84c8a29dedd37d8b3e4a225.tar.gz cpython-2907fe6ce7376e73d84c8a29dedd37d8b3e4a225.tar.bz2 |
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
-rw-r--r-- | Objects/moduleobject.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 7faa3bb..2ccf0bf 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -157,9 +157,14 @@ module_dealloc(PyModuleObject *m) static PyObject * 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 *filename; + PyObject *rtn; + name = PyModule_GetName((PyObject *)m); if (name == NULL) { PyErr_Clear(); @@ -168,12 +173,19 @@ module_repr(PyModuleObject *m) filename = PyModule_GetFilename((PyObject *)m); if (filename == NULL) { PyErr_Clear(); - sprintf(buf, "<module '%.80s' (built-in)>", name); - } else { - sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename); + buf = PyObject_MALLOC( + sizeof(char) * (strlen(name) + template1len)); + sprintf(buf, "<module '%s' (built-in)>", name); } - - return PyString_FromString(buf); + else { + 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 |