comparison Python/pythonrun.c @ 69147:6e9dc970ac0e

Issue #10785: Store the filename as Unicode in the Python parser.
author Victor Stinner <victor.stinner@haypocalc.com>
date Tue, 05 Apr 2011 00:39:01 +0200
parents a4fa79b0d478
children c8338cfa3578
comparison
equal deleted inserted replaced
69146:8da8cd1ba9d9 69147:6e9dc970ac0e
60 static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, 60 static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
61 PyCompilerFlags *, PyArena *); 61 PyCompilerFlags *, PyArena *);
62 static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, 62 static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
63 PyCompilerFlags *); 63 PyCompilerFlags *);
64 static void err_input(perrdetail *); 64 static void err_input(perrdetail *);
65 static void err_free(perrdetail *);
65 static void initsigs(void); 66 static void initsigs(void);
66 static void call_py_exitfuncs(void); 67 static void call_py_exitfuncs(void);
67 static void wait_for_thread_shutdown(void); 68 static void wait_for_thread_shutdown(void);
68 static void call_ll_exitfuncs(void); 69 static void call_ll_exitfuncs(void);
69 extern void _PyUnicode_Init(void); 70 extern void _PyUnicode_Init(void);
1885 } 1886 }
1886 if (n) { 1887 if (n) {
1887 flags->cf_flags |= iflags & PyCF_MASK; 1888 flags->cf_flags |= iflags & PyCF_MASK;
1888 mod = PyAST_FromNode(n, flags, filename, arena); 1889 mod = PyAST_FromNode(n, flags, filename, arena);
1889 PyNode_Free(n); 1890 PyNode_Free(n);
1890 return mod;
1891 } 1891 }
1892 else { 1892 else {
1893 err_input(&err); 1893 err_input(&err);
1894 return NULL; 1894 mod = NULL;
1895 } 1895 }
1896 err_free(&err);
1897 return mod;
1896 } 1898 }
1897 1899
1898 mod_ty 1900 mod_ty
1899 PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc, 1901 PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
1900 int start, char *ps1, 1902 int start, char *ps1,
1915 } 1917 }
1916 if (n) { 1918 if (n) {
1917 flags->cf_flags |= iflags & PyCF_MASK; 1919 flags->cf_flags |= iflags & PyCF_MASK;
1918 mod = PyAST_FromNode(n, flags, filename, arena); 1920 mod = PyAST_FromNode(n, flags, filename, arena);
1919 PyNode_Free(n); 1921 PyNode_Free(n);
1920 return mod;
1921 } 1922 }
1922 else { 1923 else {
1923 err_input(&err); 1924 err_input(&err);
1924 if (errcode) 1925 if (errcode)
1925 *errcode = err.error; 1926 *errcode = err.error;
1926 return NULL; 1927 mod = NULL;
1927 } 1928 }
1929 err_free(&err);
1930 return mod;
1928 } 1931 }
1929 1932
1930 /* Simplified interface to parsefile -- return node or set exception */ 1933 /* Simplified interface to parsefile -- return node or set exception */
1931 1934
1932 node * 1935 node *
1936 node *n = PyParser_ParseFileFlags(fp, filename, NULL, 1939 node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1937 &_PyParser_Grammar, 1940 &_PyParser_Grammar,
1938 start, NULL, NULL, &err, flags); 1941 start, NULL, NULL, &err, flags);
1939 if (n == NULL) 1942 if (n == NULL)
1940 err_input(&err); 1943 err_input(&err);
1944 err_free(&err);
1941 1945
1942 return n; 1946 return n;
1943 } 1947 }
1944 1948
1945 /* Simplified interface to parsestring -- return node or set exception */ 1949 /* Simplified interface to parsestring -- return node or set exception */
1950 perrdetail err; 1954 perrdetail err;
1951 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, 1955 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1952 start, &err, flags); 1956 start, &err, flags);
1953 if (n == NULL) 1957 if (n == NULL)
1954 err_input(&err); 1958 err_input(&err);
1959 err_free(&err);
1955 return n; 1960 return n;
1956 } 1961 }
1957 1962
1958 node * 1963 node *
1959 PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename, 1964 PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
1962 perrdetail err; 1967 perrdetail err;
1963 node *n = PyParser_ParseStringFlagsFilename(str, filename, 1968 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1964 &_PyParser_Grammar, start, &err, flags); 1969 &_PyParser_Grammar, start, &err, flags);
1965 if (n == NULL) 1970 if (n == NULL)
1966 err_input(&err); 1971 err_input(&err);
1972 err_free(&err);
1967 return n; 1973 return n;
1968 } 1974 }
1969 1975
1970 node * 1976 node *
1971 PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start) 1977 PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
1975 1981
1976 /* May want to move a more generalized form of this to parsetok.c or 1982 /* May want to move a more generalized form of this to parsetok.c or
1977 even parser modules. */ 1983 even parser modules. */
1978 1984
1979 void 1985 void
1986 PyParser_ClearError(perrdetail *err)
1987 {
1988 err_free(err);
1989 }
1990
1991 void
1980 PyParser_SetError(perrdetail *err) 1992 PyParser_SetError(perrdetail *err)
1981 { 1993 {
1982 err_input(err); 1994 err_input(err);
1995 }
1996
1997 static void
1998 err_free(perrdetail *err)
1999 {
2000 Py_CLEAR(err->filename);
1983 } 2001 }
1984 2002
1985 /* Set the error appropriate to the given input error code (see errcode.h) */ 2003 /* Set the error appropriate to the given input error code (see errcode.h) */
1986 2004
1987 static void 2005 static void
1988 err_input(perrdetail *err) 2006 err_input(perrdetail *err)
1989 { 2007 {
1990 PyObject *v, *w, *errtype, *errtext; 2008 PyObject *v, *w, *errtype, *errtext;
1991 PyObject *msg_obj = NULL; 2009 PyObject *msg_obj = NULL;
1992 PyObject *filename;
1993 char *msg = NULL; 2010 char *msg = NULL;
1994 2011
1995 errtype = PyExc_SyntaxError; 2012 errtype = PyExc_SyntaxError;
1996 switch (err->error) { 2013 switch (err->error) {
1997 case E_ERROR: 2014 case E_ERROR:
2073 Py_INCREF(Py_None); 2090 Py_INCREF(Py_None);
2074 } else { 2091 } else {
2075 errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text), 2092 errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text),
2076 "replace"); 2093 "replace");
2077 } 2094 }
2078 if (err->filename != NULL) 2095 v = Py_BuildValue("(OiiN)", err->filename,
2079 filename = PyUnicode_DecodeFSDefault(err->filename); 2096 err->lineno, err->offset, errtext);
2080 else {
2081 Py_INCREF(Py_None);
2082 filename = Py_None;
2083 }
2084 if (filename != NULL)
2085 v = Py_BuildValue("(NiiN)", filename,
2086 err->lineno, err->offset, errtext);
2087 else
2088 v = NULL;
2089 if (v != NULL) { 2097 if (v != NULL) {
2090 if (msg_obj) 2098 if (msg_obj)
2091 w = Py_BuildValue("(OO)", msg_obj, v); 2099 w = Py_BuildValue("(OO)", msg_obj, v);
2092 else 2100 else
2093 w = Py_BuildValue("(sO)", msg, v); 2101 w = Py_BuildValue("(sO)", msg, v);