@@ -1692,7 +1692,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
16921692 functionality in tb_displayline() in traceback.c. */
16931693
16941694static PyObject *
1695- err_programtext (PyThreadState * tstate , FILE * fp , int lineno )
1695+ err_programtext (PyThreadState * tstate , FILE * fp , int lineno , const char * encoding )
16961696{
16971697 int i ;
16981698 char linebuf [1000 ];
@@ -1720,7 +1720,11 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
17201720 fclose (fp );
17211721 if (i == lineno ) {
17221722 PyObject * res ;
1723- res = PyUnicode_FromString (linebuf );
1723+ if (encoding != NULL ) {
1724+ res = PyUnicode_Decode (linebuf , strlen (linebuf ), encoding , "replace" );
1725+ } else {
1726+ res = PyUnicode_FromString (linebuf );
1727+ }
17241728 if (res == NULL )
17251729 _PyErr_Clear (tstate );
17261730 return res ;
@@ -1746,7 +1750,7 @@ PyErr_ProgramText(const char *filename, int lineno)
17461750}
17471751
17481752PyObject *
1749- PyErr_ProgramTextObject (PyObject * filename , int lineno )
1753+ _PyErr_ProgramDecodedTextObject (PyObject * filename , int lineno , const char * encoding )
17501754{
17511755 if (filename == NULL || lineno <= 0 ) {
17521756 return NULL ;
@@ -1758,7 +1762,13 @@ PyErr_ProgramTextObject(PyObject *filename, int lineno)
17581762 _PyErr_Clear (tstate );
17591763 return NULL ;
17601764 }
1761- return err_programtext (tstate , fp , lineno );
1765+ return err_programtext (tstate , fp , lineno , encoding );
1766+ }
1767+
1768+ PyObject *
1769+ PyErr_ProgramTextObject (PyObject * filename , int lineno )
1770+ {
1771+ return _PyErr_ProgramDecodedTextObject (filename , lineno , NULL );
17621772}
17631773
17641774#ifdef __cplusplus
0 commit comments