mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Close #11619: The parser and the import machinery do not encode Unicode
filenames anymore on Windows.
This commit is contained in:
		
							parent
							
								
									33824f6fd7
								
							
						
					
					
						commit
						14e461d5b9
					
				
					 22 changed files with 514 additions and 175 deletions
				
			
		| 
						 | 
				
			
			@ -149,8 +149,7 @@ handled by the symbol analysis pass.
 | 
			
		|||
*/
 | 
			
		||||
 | 
			
		||||
struct compiler {
 | 
			
		||||
    const char *c_filename;
 | 
			
		||||
    PyObject *c_filename_obj;
 | 
			
		||||
    PyObject *c_filename;
 | 
			
		||||
    struct symtable *c_st;
 | 
			
		||||
    PyFutureFeatures *c_future; /* pointer to module's __future__ */
 | 
			
		||||
    PyCompilerFlags *c_flags;
 | 
			
		||||
| 
						 | 
				
			
			@ -288,8 +287,8 @@ compiler_init(struct compiler *c)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
PyCodeObject *
 | 
			
		||||
PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
 | 
			
		||||
                int optimize, PyArena *arena)
 | 
			
		||||
PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
 | 
			
		||||
                   int optimize, PyArena *arena)
 | 
			
		||||
{
 | 
			
		||||
    struct compiler c;
 | 
			
		||||
    PyCodeObject *co = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -304,12 +303,10 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
 | 
			
		|||
 | 
			
		||||
    if (!compiler_init(&c))
 | 
			
		||||
        return NULL;
 | 
			
		||||
    Py_INCREF(filename);
 | 
			
		||||
    c.c_filename = filename;
 | 
			
		||||
    c.c_filename_obj = PyUnicode_DecodeFSDefault(filename);
 | 
			
		||||
    if (!c.c_filename_obj)
 | 
			
		||||
        goto finally;
 | 
			
		||||
    c.c_arena = arena;
 | 
			
		||||
    c.c_future = PyFuture_FromAST(mod, filename);
 | 
			
		||||
    c.c_future = PyFuture_FromASTObject(mod, filename);
 | 
			
		||||
    if (c.c_future == NULL)
 | 
			
		||||
        goto finally;
 | 
			
		||||
    if (!flags) {
 | 
			
		||||
| 
						 | 
				
			
			@ -323,7 +320,7 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
 | 
			
		|||
    c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize;
 | 
			
		||||
    c.c_nestlevel = 0;
 | 
			
		||||
 | 
			
		||||
    c.c_st = PySymtable_Build(mod, filename, c.c_future);
 | 
			
		||||
    c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
 | 
			
		||||
    if (c.c_st == NULL) {
 | 
			
		||||
        if (!PyErr_Occurred())
 | 
			
		||||
            PyErr_SetString(PyExc_SystemError, "no symtable");
 | 
			
		||||
| 
						 | 
				
			
			@ -338,6 +335,21 @@ PyAST_CompileEx(mod_ty mod, const char *filename, PyCompilerFlags *flags,
 | 
			
		|||
    return co;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PyCodeObject *
 | 
			
		||||
PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
 | 
			
		||||
                int optimize, PyArena *arena)
 | 
			
		||||
{
 | 
			
		||||
    PyObject *filename;
 | 
			
		||||
    PyCodeObject *co;
 | 
			
		||||
    filename = PyUnicode_DecodeFSDefault(filename_str);
 | 
			
		||||
    if (filename == NULL)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
 | 
			
		||||
    Py_DECREF(filename);
 | 
			
		||||
    return co;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PyCodeObject *
 | 
			
		||||
PyNode_Compile(struct _node *n, const char *filename)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -360,8 +372,7 @@ compiler_free(struct compiler *c)
 | 
			
		|||
        PySymtable_Free(c->c_st);
 | 
			
		||||
    if (c->c_future)
 | 
			
		||||
        PyObject_Free(c->c_future);
 | 
			
		||||
    if (c->c_filename_obj)
 | 
			
		||||
        Py_DECREF(c->c_filename_obj);
 | 
			
		||||
    Py_XDECREF(c->c_filename);
 | 
			
		||||
    Py_DECREF(c->c_stack);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1368,12 +1379,11 @@ get_ref_type(struct compiler *c, PyObject *name)
 | 
			
		|||
    if (scope == 0) {
 | 
			
		||||
        char buf[350];
 | 
			
		||||
        PyOS_snprintf(buf, sizeof(buf),
 | 
			
		||||
                      "unknown scope for %.100s in %.100s(%s) in %s\n"
 | 
			
		||||
                      "unknown scope for %.100s in %.100s(%s)\n"
 | 
			
		||||
                      "symbols: %s\nlocals: %s\nglobals: %s",
 | 
			
		||||
                      PyBytes_AS_STRING(name),
 | 
			
		||||
                      PyBytes_AS_STRING(c->u->u_name),
 | 
			
		||||
                      PyObject_REPR(c->u->u_ste->ste_id),
 | 
			
		||||
                      c->c_filename,
 | 
			
		||||
                      PyObject_REPR(c->u->u_ste->ste_symbols),
 | 
			
		||||
                      PyObject_REPR(c->u->u_varnames),
 | 
			
		||||
                      PyObject_REPR(c->u->u_names)
 | 
			
		||||
| 
						 | 
				
			
			@ -2411,6 +2421,7 @@ compiler_assert(struct compiler *c, stmt_ty s)
 | 
			
		|||
{
 | 
			
		||||
    static PyObject *assertion_error = NULL;
 | 
			
		||||
    basicblock *end;
 | 
			
		||||
    PyObject* msg;
 | 
			
		||||
 | 
			
		||||
    if (c->c_optimize)
 | 
			
		||||
        return 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -2421,11 +2432,17 @@ compiler_assert(struct compiler *c, stmt_ty s)
 | 
			
		|||
    }
 | 
			
		||||
    if (s->v.Assert.test->kind == Tuple_kind &&
 | 
			
		||||
        asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
 | 
			
		||||
        const char* msg =
 | 
			
		||||
            "assertion is always true, perhaps remove parentheses?";
 | 
			
		||||
        if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename,
 | 
			
		||||
                               c->u->u_lineno, NULL, NULL) == -1)
 | 
			
		||||
        msg = PyUnicode_FromString("assertion is always true, "
 | 
			
		||||
                                   "perhaps remove parentheses?");
 | 
			
		||||
        if (msg == NULL)
 | 
			
		||||
            return 0;
 | 
			
		||||
        if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
 | 
			
		||||
                                     c->c_filename, c->u->u_lineno,
 | 
			
		||||
                                     NULL, NULL) == -1) {
 | 
			
		||||
            Py_DECREF(msg);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        Py_DECREF(msg);
 | 
			
		||||
    }
 | 
			
		||||
    VISIT(c, expr, s->v.Assert.test);
 | 
			
		||||
    end = compiler_new_block(c);
 | 
			
		||||
| 
						 | 
				
			
			@ -3593,12 +3610,12 @@ compiler_error(struct compiler *c, const char *errstr)
 | 
			
		|||
    PyObject *loc;
 | 
			
		||||
    PyObject *u = NULL, *v = NULL;
 | 
			
		||||
 | 
			
		||||
    loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno);
 | 
			
		||||
    loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
 | 
			
		||||
    if (!loc) {
 | 
			
		||||
        Py_INCREF(Py_None);
 | 
			
		||||
        loc = Py_None;
 | 
			
		||||
    }
 | 
			
		||||
    u = Py_BuildValue("(OiiO)", c->c_filename_obj, c->u->u_lineno,
 | 
			
		||||
    u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
 | 
			
		||||
                      c->u->u_col_offset, loc);
 | 
			
		||||
    if (!u)
 | 
			
		||||
        goto exit;
 | 
			
		||||
| 
						 | 
				
			
			@ -4188,7 +4205,7 @@ makecode(struct compiler *c, struct assembler *a)
 | 
			
		|||
                    nlocals, stackdepth(c), flags,
 | 
			
		||||
                    bytecode, consts, names, varnames,
 | 
			
		||||
                    freevars, cellvars,
 | 
			
		||||
                    c->c_filename_obj, c->u->u_name,
 | 
			
		||||
                    c->c_filename, c->u->u_name,
 | 
			
		||||
                    c->u->u_firstlineno,
 | 
			
		||||
                    a->a_lnotab);
 | 
			
		||||
 error:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue