Mercurial > cpython-lru_cache-weakref
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); |
