mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
filenames encoded to the filesystem encoding with surrogateescape error handler (to support undecodable bytes), instead of UTF-8 in strict mode.
This commit is contained in:
parent
5a7913eb3b
commit
4c7c8c3023
7 changed files with 69 additions and 28 deletions
|
@ -524,6 +524,7 @@ static PyObject *
|
|||
builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
|
||||
{
|
||||
char *str;
|
||||
PyObject *filename_obj;
|
||||
char *filename;
|
||||
char *startstr;
|
||||
int mode = -1;
|
||||
|
@ -535,12 +536,16 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
static char *kwlist[] = {"source", "filename", "mode", "flags",
|
||||
"dont_inherit", NULL};
|
||||
int start[] = {Py_file_input, Py_eval_input, Py_single_input};
|
||||
PyObject *result;
|
||||
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oss|ii:compile",
|
||||
kwlist, &cmd, &filename, &startstr,
|
||||
&supplied_flags, &dont_inherit))
|
||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&s|ii:compile", kwlist,
|
||||
&cmd,
|
||||
PyUnicode_FSConverter, &filename_obj,
|
||||
&startstr, &supplied_flags,
|
||||
&dont_inherit))
|
||||
return NULL;
|
||||
|
||||
filename = PyBytes_AS_STRING(filename_obj);
|
||||
cf.cf_flags = supplied_flags | PyCF_SOURCE_IS_UTF8;
|
||||
|
||||
if (supplied_flags &
|
||||
|
@ -548,7 +553,7 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
{
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"compile(): unrecognised flags");
|
||||
return NULL;
|
||||
goto error;
|
||||
}
|
||||
/* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
|
||||
|
||||
|
@ -565,14 +570,13 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
else {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"compile() arg 3 must be 'exec', 'eval' or 'single'");
|
||||
return NULL;
|
||||
goto error;
|
||||
}
|
||||
|
||||
is_ast = PyAST_Check(cmd);
|
||||
if (is_ast == -1)
|
||||
return NULL;
|
||||
goto error;
|
||||
if (is_ast) {
|
||||
PyObject *result;
|
||||
if (supplied_flags & PyCF_ONLY_AST) {
|
||||
Py_INCREF(cmd);
|
||||
result = cmd;
|
||||
|
@ -585,20 +589,27 @@ builtin_compile(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
mod = PyAST_obj2mod(cmd, arena, mode);
|
||||
if (mod == NULL) {
|
||||
PyArena_Free(arena);
|
||||
return NULL;
|
||||
goto error;
|
||||
}
|
||||
result = (PyObject*)PyAST_Compile(mod, filename,
|
||||
&cf, arena);
|
||||
PyArena_Free(arena);
|
||||
}
|
||||
return result;
|
||||
goto finally;
|
||||
}
|
||||
|
||||
str = source_as_string(cmd, "compile", "string, bytes, AST or code", &cf);
|
||||
if (str == NULL)
|
||||
return NULL;
|
||||
goto error;
|
||||
|
||||
return Py_CompileStringFlags(str, filename, start[mode], &cf);
|
||||
result = Py_CompileStringFlags(str, filename, start[mode], &cf);
|
||||
goto finally;
|
||||
|
||||
error:
|
||||
result = NULL;
|
||||
finally:
|
||||
Py_DECREF(filename_obj);
|
||||
return result;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(compile_doc,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue