From ebe8f8a8ff52f4b32a13458a92c96e18299d5286 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Wed, 10 Oct 2007 18:53:36 +0000
Subject: [PATCH] Minor cleanup of the comment for PyErr_ProgramText() and a
 tweak to the code to guarantee the claim that it doesn't set an exception.

---
 Python/errors.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/Python/errors.c b/Python/errors.c
index b1a70ef85c9..e543506faac 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -800,13 +800,11 @@ PyErr_SyntaxLocation(const char *filename, int lineno)
 	PyErr_Restore(exc, v, tb);
 }
 
-/* com_fetch_program_text will attempt to load the line of text that
-   the exception refers to.  If it fails, it will return NULL but will
-   not set an exception.
+/* Attempt to load the line of text that the exception refers to.  If it
+   fails, it will return NULL but will not set an exception.
 
    XXX The functionality of this function is quite similar to the
-   functionality in tb_displayline() in traceback.c.
-*/
+   functionality in tb_displayline() in traceback.c. */
 
 PyObject *
 PyErr_ProgramText(const char *filename, int lineno)
@@ -824,7 +822,8 @@ PyErr_ProgramText(const char *filename, int lineno)
 		char *pLastChar = &linebuf[sizeof(linebuf) - 2];
 		do {
 			*pLastChar = '\0';
-			if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, fp, NULL) == NULL)
+			if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
+						     fp, NULL) == NULL)
 				break;
 			/* fgets read *something*; if it didn't get as
 			   far as pLastChar, it must have found a newline
@@ -836,9 +835,13 @@ PyErr_ProgramText(const char *filename, int lineno)
 	fclose(fp);
 	if (i == lineno) {
 		char *p = linebuf;
+                PyObject *res;
 		while (*p == ' ' || *p == '\t' || *p == '\014')
 			p++;
-		return PyUnicode_FromString(p);
+		res = PyUnicode_FromString(p);
+                if (res == NULL)
+			PyErr_Clear();
+		return res;
 	}
 	return NULL;
 }
-- 
2.30.9