From 2907fe6ce7376e73d84c8a29dedd37d8b3e4a225 Mon Sep 17 00:00:00 2001
From: Barry Warsaw <barry@python.org>
Date: Thu, 16 Aug 2001 20:39:24 +0000
Subject: 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
---
 Objects/moduleobject.c | 24 ++++++++++++++++++------
 1 file 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
-- 
cgit v0.12

