@@ -135,6 +135,7 @@ managed by compiler_enter_scope() and compiler_exit_scope().
135135
136136struct compiler {
137137 const char * c_filename ;
138+ PyObject * c_filename_obj ;
138139 struct symtable * c_st ;
139140 PyFutureFeatures * c_future ; /* pointer to module's __future__ */
140141 PyCompilerFlags * c_flags ;
@@ -272,6 +273,9 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
272273 if (!compiler_init (& c ))
273274 return NULL ;
274275 c .c_filename = filename ;
276+ c .c_filename_obj = PyUnicode_DecodeFSDefault (filename );
277+ if (!c .c_filename_obj )
278+ goto finally ;
275279 c .c_arena = arena ;
276280 c .c_future = PyFuture_FromAST (mod , filename );
277281 if (c .c_future == NULL )
@@ -324,6 +328,8 @@ compiler_free(struct compiler *c)
324328 PySymtable_Free (c -> c_st );
325329 if (c -> c_future )
326330 PyObject_Free (c -> c_future );
331+ if (c -> c_filename_obj )
332+ Py_DECREF (c -> c_filename_obj );
327333 Py_DECREF (c -> c_stack );
328334}
329335
@@ -3361,24 +3367,15 @@ compiler_in_loop(struct compiler *c) {
33613367static int
33623368compiler_error (struct compiler * c , const char * errstr )
33633369{
3364- PyObject * loc , * filename ;
3370+ PyObject * loc ;
33653371 PyObject * u = NULL , * v = NULL ;
33663372
33673373 loc = PyErr_ProgramText (c -> c_filename , c -> u -> u_lineno );
33683374 if (!loc ) {
33693375 Py_INCREF (Py_None );
33703376 loc = Py_None ;
33713377 }
3372- if (c -> c_filename != NULL ) {
3373- filename = PyUnicode_DecodeFSDefault (c -> c_filename );
3374- if (!filename )
3375- goto exit ;
3376- }
3377- else {
3378- Py_INCREF (Py_None );
3379- filename = Py_None ;
3380- }
3381- u = Py_BuildValue ("(NiiO)" , filename , c -> u -> u_lineno ,
3378+ u = Py_BuildValue ("(OiiO)" , c -> c_filename_obj , c -> u -> u_lineno ,
33823379 c -> u -> u_col_offset , loc );
33833380 if (!u )
33843381 goto exit ;
@@ -3927,7 +3924,6 @@ makecode(struct compiler *c, struct assembler *a)
39273924 PyObject * consts = NULL ;
39283925 PyObject * names = NULL ;
39293926 PyObject * varnames = NULL ;
3930- PyObject * filename = NULL ;
39313927 PyObject * name = NULL ;
39323928 PyObject * freevars = NULL ;
39333929 PyObject * cellvars = NULL ;
@@ -3951,10 +3947,6 @@ makecode(struct compiler *c, struct assembler *a)
39513947 freevars = dict_keys_inorder (c -> u -> u_freevars , PyTuple_Size (cellvars ));
39523948 if (!freevars )
39533949 goto error ;
3954- filename = PyUnicode_DecodeFSDefault (c -> c_filename );
3955- if (!filename )
3956- goto error ;
3957-
39583950 nlocals = PyDict_Size (c -> u -> u_varnames );
39593951 flags = compute_code_flags (c );
39603952 if (flags < 0 )
@@ -3974,14 +3966,13 @@ makecode(struct compiler *c, struct assembler *a)
39743966 nlocals , stackdepth (c ), flags ,
39753967 bytecode , consts , names , varnames ,
39763968 freevars , cellvars ,
3977- filename , c -> u -> u_name ,
3969+ c -> c_filename_obj , c -> u -> u_name ,
39783970 c -> u -> u_firstlineno ,
39793971 a -> a_lnotab );
39803972 error :
39813973 Py_XDECREF (consts );
39823974 Py_XDECREF (names );
39833975 Py_XDECREF (varnames );
3984- Py_XDECREF (filename );
39853976 Py_XDECREF (name );
39863977 Py_XDECREF (freevars );
39873978 Py_XDECREF (cellvars );
0 commit comments