@@ -1724,7 +1724,7 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
17241724 functionality in tb_displayline() in traceback.c. */
17251725
17261726static PyObject *
1727- err_programtext (PyThreadState * tstate , FILE * fp , int lineno )
1727+ err_programtext (PyThreadState * tstate , FILE * fp , int lineno , const char * encoding )
17281728{
17291729 int i ;
17301730 char linebuf [1000 ];
@@ -1752,7 +1752,11 @@ err_programtext(PyThreadState *tstate, FILE *fp, int lineno)
17521752 fclose (fp );
17531753 if (i == lineno ) {
17541754 PyObject * res ;
1755- res = PyUnicode_FromString (linebuf );
1755+ if (encoding != NULL ) {
1756+ res = PyUnicode_Decode (linebuf , strlen (linebuf ), encoding , "replace" );
1757+ } else {
1758+ res = PyUnicode_FromString (linebuf );
1759+ }
17561760 if (res == NULL )
17571761 _PyErr_Clear (tstate );
17581762 return res ;
@@ -1778,7 +1782,7 @@ PyErr_ProgramText(const char *filename, int lineno)
17781782}
17791783
17801784PyObject *
1781- PyErr_ProgramTextObject (PyObject * filename , int lineno )
1785+ _PyErr_ProgramDecodedTextObject (PyObject * filename , int lineno , const char * encoding )
17821786{
17831787 if (filename == NULL || lineno <= 0 ) {
17841788 return NULL ;
@@ -1790,7 +1794,13 @@ PyErr_ProgramTextObject(PyObject *filename, int lineno)
17901794 _PyErr_Clear (tstate );
17911795 return NULL ;
17921796 }
1793- return err_programtext (tstate , fp , lineno );
1797+ return err_programtext (tstate , fp , lineno , encoding );
1798+ }
1799+
1800+ PyObject *
1801+ PyErr_ProgramTextObject (PyObject * filename , int lineno )
1802+ {
1803+ return _PyErr_ProgramDecodedTextObject (filename , lineno , NULL );
17941804}
17951805
17961806#ifdef __cplusplus
0 commit comments