Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2907fe6

Browse files
committed
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
1 parent e791a64 commit 2907fe6

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

Objects/moduleobject.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,14 @@ module_dealloc(PyModuleObject *m)
157157
static PyObject *
158158
module_repr(PyModuleObject *m)
159159
{
160-
char buf[400];
160+
static int template1len = sizeof("<module '' (built-in)>") + 1;
161+
static int template2len = sizeof("<module '' from ''>") + 1;
162+
163+
char *buf;
161164
char *name;
162165
char *filename;
166+
PyObject *rtn;
167+
163168
name = PyModule_GetName((PyObject *)m);
164169
if (name == NULL) {
165170
PyErr_Clear();
@@ -168,12 +173,19 @@ module_repr(PyModuleObject *m)
168173
filename = PyModule_GetFilename((PyObject *)m);
169174
if (filename == NULL) {
170175
PyErr_Clear();
171-
sprintf(buf, "<module '%.80s' (built-in)>", name);
172-
} else {
173-
sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename);
176+
buf = PyObject_MALLOC(
177+
sizeof(char) * (strlen(name) + template1len));
178+
sprintf(buf, "<module '%s' (built-in)>", name);
174179
}
175-
176-
return PyString_FromString(buf);
180+
else {
181+
buf = PyObject_MALLOC(
182+
sizeof(char) * (strlen(name) + strlen(filename) +
183+
template2len));
184+
sprintf(buf, "<module '%s' from '%s'>", name, filename);
185+
}
186+
rtn = PyString_FromString(buf);
187+
PyObject_FREE(buf);
188+
return rtn;
177189
}
178190

179191
/* We only need a traverse function, no clear function: If the module

0 commit comments

Comments
 (0)