@@ -744,12 +744,22 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flag
744744int
745745PyRun_InteractiveOneFlags (FILE * fp , const char * filename , PyCompilerFlags * flags )
746746{
747- PyObject * m , * d , * v , * w ;
747+ PyObject * m , * d , * v , * w , * oenc = NULL ;
748748 mod_ty mod ;
749749 PyArena * arena ;
750- char * ps1 = "" , * ps2 = "" ;
750+ char * ps1 = "" , * ps2 = "" , * enc = NULL ;
751751 int errcode = 0 ;
752752
753+ if (fp == stdin ) {
754+ /* Fetch encoding from sys.stdin */
755+ v = PySys_GetObject ("stdin" );
756+ if (!v )
757+ return -1 ;
758+ oenc = PyObject_GetAttrString (v , "encoding" );
759+ if (!oenc )
760+ return -1 ;
761+ enc = PyUnicode_AsString (oenc );
762+ }
753763 v = PySys_GetObject ("ps1" );
754764 if (v != NULL ) {
755765 v = PyObject_Str (v );
@@ -770,13 +780,15 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags
770780 if (arena == NULL ) {
771781 Py_XDECREF (v );
772782 Py_XDECREF (w );
783+ Py_XDECREF (oenc );
773784 return -1 ;
774785 }
775- mod = PyParser_ASTFromFile (fp , filename ,
786+ mod = PyParser_ASTFromFile (fp , filename , enc ,
776787 Py_single_input , ps1 , ps2 ,
777788 flags , & errcode , arena );
778789 Py_XDECREF (v );
779790 Py_XDECREF (w );
791+ Py_XDECREF (oenc );
780792 if (mod == NULL ) {
781793 PyArena_Free (arena );
782794 if (errcode == E_EOF ) {
@@ -1254,7 +1266,7 @@ PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
12541266 if (arena == NULL )
12551267 return NULL ;
12561268
1257- mod = PyParser_ASTFromFile (fp , filename , start , 0 , 0 ,
1269+ mod = PyParser_ASTFromFile (fp , filename , NULL , start , 0 , 0 ,
12581270 flags , NULL , arena );
12591271 if (closeit )
12601272 fclose (fp );
@@ -1379,13 +1391,15 @@ PyParser_ASTFromString(const char *s, const char *filename, int start,
13791391}
13801392
13811393mod_ty
1382- PyParser_ASTFromFile (FILE * fp , const char * filename , int start , char * ps1 ,
1394+ PyParser_ASTFromFile (FILE * fp , const char * filename , const char * enc ,
1395+ int start , char * ps1 ,
13831396 char * ps2 , PyCompilerFlags * flags , int * errcode ,
13841397 PyArena * arena )
13851398{
13861399 mod_ty mod ;
13871400 perrdetail err ;
1388- node * n = PyParser_ParseFileFlags (fp , filename , & _PyParser_Grammar ,
1401+ node * n = PyParser_ParseFileFlags (fp , filename , enc ,
1402+ & _PyParser_Grammar ,
13891403 start , ps1 , ps2 , & err , PARSER_FLAGS (flags ));
13901404 if (n ) {
13911405 mod = PyAST_FromNode (n , flags , filename , arena );
@@ -1406,7 +1420,8 @@ node *
14061420PyParser_SimpleParseFileFlags (FILE * fp , const char * filename , int start , int flags )
14071421{
14081422 perrdetail err ;
1409- node * n = PyParser_ParseFileFlags (fp , filename , & _PyParser_Grammar ,
1423+ node * n = PyParser_ParseFileFlags (fp , filename , NULL ,
1424+ & _PyParser_Grammar ,
14101425 start , NULL , NULL , & err , flags );
14111426 if (n == NULL )
14121427 err_input (& err );
0 commit comments