Mercurial > cpython-lru_cache-weakref
comparison Python/pythonrun.c @ 85417:df2fdd42b375
Close #11619: The parser and the import machinery do not encode Unicode
filenames anymore on Windows.
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Mon, 26 Aug 2013 22:28:21 +0200 |
| parents | becbb65074e1 |
| children | ef889c3d5dc6 |
comparison
equal
deleted
inserted
replaced
| 85416:8fb3a6f9b0a4 | 85417:df2fdd42b375 |
|---|---|
| 2049 Py_DECREF(co); | 2049 Py_DECREF(co); |
| 2050 return v; | 2050 return v; |
| 2051 } | 2051 } |
| 2052 | 2052 |
| 2053 PyObject * | 2053 PyObject * |
| 2054 Py_CompileStringExFlags(const char *str, const char *filename, int start, | 2054 Py_CompileStringObject(const char *str, PyObject *filename, int start, |
| 2055 PyCompilerFlags *flags, int optimize) | 2055 PyCompilerFlags *flags, int optimize) |
| 2056 { | 2056 { |
| 2057 PyCodeObject *co; | 2057 PyCodeObject *co; |
| 2058 mod_ty mod; | 2058 mod_ty mod; |
| 2059 PyArena *arena = PyArena_New(); | 2059 PyArena *arena = PyArena_New(); |
| 2060 if (arena == NULL) | 2060 if (arena == NULL) |
| 2061 return NULL; | 2061 return NULL; |
| 2062 | 2062 |
| 2063 mod = PyParser_ASTFromString(str, filename, start, flags, arena); | 2063 mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); |
| 2064 if (mod == NULL) { | 2064 if (mod == NULL) { |
| 2065 PyArena_Free(arena); | 2065 PyArena_Free(arena); |
| 2066 return NULL; | 2066 return NULL; |
| 2067 } | 2067 } |
| 2068 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) { | 2068 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) { |
| 2069 PyObject *result = PyAST_mod2obj(mod); | 2069 PyObject *result = PyAST_mod2obj(mod); |
| 2070 PyArena_Free(arena); | 2070 PyArena_Free(arena); |
| 2071 return result; | 2071 return result; |
| 2072 } | 2072 } |
| 2073 co = PyAST_CompileEx(mod, filename, flags, optimize, arena); | 2073 co = PyAST_CompileObject(mod, filename, flags, optimize, arena); |
| 2074 PyArena_Free(arena); | 2074 PyArena_Free(arena); |
| 2075 return (PyObject *)co; | 2075 return (PyObject *)co; |
| 2076 } | |
| 2077 | |
| 2078 PyObject * | |
| 2079 Py_CompileStringExFlags(const char *str, const char *filename_str, int start, | |
| 2080 PyCompilerFlags *flags, int optimize) | |
| 2081 { | |
| 2082 PyObject *filename, *co; | |
| 2083 filename = PyUnicode_DecodeFSDefault(filename_str); | |
| 2084 if (filename == NULL) | |
| 2085 return NULL; | |
| 2086 co = Py_CompileStringObject(str, filename, start, flags, optimize); | |
| 2087 Py_DECREF(filename); | |
| 2088 return co; | |
| 2076 } | 2089 } |
| 2077 | 2090 |
| 2078 /* For use in Py_LIMITED_API */ | 2091 /* For use in Py_LIMITED_API */ |
| 2079 #undef Py_CompileString | 2092 #undef Py_CompileString |
| 2080 PyObject * | 2093 PyObject * |
| 2082 { | 2095 { |
| 2083 return Py_CompileStringFlags(str, filename, start, NULL); | 2096 return Py_CompileStringFlags(str, filename, start, NULL); |
| 2084 } | 2097 } |
| 2085 | 2098 |
| 2086 struct symtable * | 2099 struct symtable * |
| 2087 Py_SymtableString(const char *str, const char *filename, int start) | 2100 Py_SymtableStringObject(const char *str, PyObject *filename, int start) |
| 2088 { | 2101 { |
| 2089 struct symtable *st; | 2102 struct symtable *st; |
| 2090 mod_ty mod; | 2103 mod_ty mod; |
| 2091 PyCompilerFlags flags; | 2104 PyCompilerFlags flags; |
| 2092 PyArena *arena = PyArena_New(); | 2105 PyArena *arena; |
| 2106 | |
| 2107 arena = PyArena_New(); | |
| 2093 if (arena == NULL) | 2108 if (arena == NULL) |
| 2094 return NULL; | 2109 return NULL; |
| 2095 | 2110 |
| 2096 flags.cf_flags = 0; | 2111 flags.cf_flags = 0; |
| 2097 mod = PyParser_ASTFromString(str, filename, start, &flags, arena); | 2112 mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena); |
| 2098 if (mod == NULL) { | 2113 if (mod == NULL) { |
| 2099 PyArena_Free(arena); | 2114 PyArena_Free(arena); |
| 2100 return NULL; | 2115 return NULL; |
| 2101 } | 2116 } |
| 2102 st = PySymtable_Build(mod, filename, 0); | 2117 st = PySymtable_BuildObject(mod, filename, 0); |
| 2103 PyArena_Free(arena); | 2118 PyArena_Free(arena); |
| 2104 return st; | 2119 return st; |
| 2105 } | 2120 } |
| 2106 | 2121 |
| 2122 struct symtable * | |
| 2123 Py_SymtableString(const char *str, const char *filename_str, int start) | |
| 2124 { | |
| 2125 PyObject *filename; | |
| 2126 struct symtable *st; | |
| 2127 | |
| 2128 filename = PyUnicode_DecodeFSDefault(filename_str); | |
| 2129 if (filename == NULL) | |
| 2130 return NULL; | |
| 2131 st = Py_SymtableStringObject(str, filename, start); | |
| 2132 Py_DECREF(filename); | |
| 2133 return st; | |
| 2134 } | |
| 2135 | |
| 2107 /* Preferred access to parser is through AST. */ | 2136 /* Preferred access to parser is through AST. */ |
| 2108 mod_ty | 2137 mod_ty |
| 2109 PyParser_ASTFromString(const char *s, const char *filename, int start, | 2138 PyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, |
| 2110 PyCompilerFlags *flags, PyArena *arena) | 2139 PyCompilerFlags *flags, PyArena *arena) |
| 2111 { | 2140 { |
| 2112 mod_ty mod; | 2141 mod_ty mod; |
| 2113 PyCompilerFlags localflags; | 2142 PyCompilerFlags localflags; |
| 2114 perrdetail err; | 2143 perrdetail err; |
| 2115 int iflags = PARSER_FLAGS(flags); | 2144 int iflags = PARSER_FLAGS(flags); |
| 2116 | 2145 |
| 2117 node *n = PyParser_ParseStringFlagsFilenameEx(s, filename, | 2146 node *n = PyParser_ParseStringObject(s, filename, |
| 2118 &_PyParser_Grammar, start, &err, | 2147 &_PyParser_Grammar, start, &err, |
| 2119 &iflags); | 2148 &iflags); |
| 2120 if (flags == NULL) { | 2149 if (flags == NULL) { |
| 2121 localflags.cf_flags = 0; | 2150 localflags.cf_flags = 0; |
| 2122 flags = &localflags; | 2151 flags = &localflags; |
| 2123 } | 2152 } |
| 2124 if (n) { | 2153 if (n) { |
| 2125 flags->cf_flags |= iflags & PyCF_MASK; | 2154 flags->cf_flags |= iflags & PyCF_MASK; |
| 2126 mod = PyAST_FromNode(n, flags, filename, arena); | 2155 mod = PyAST_FromNodeObject(n, flags, filename, arena); |
| 2127 PyNode_Free(n); | 2156 PyNode_Free(n); |
| 2128 } | 2157 } |
| 2129 else { | 2158 else { |
| 2130 err_input(&err); | 2159 err_input(&err); |
| 2131 mod = NULL; | 2160 mod = NULL; |
| 2133 err_free(&err); | 2162 err_free(&err); |
| 2134 return mod; | 2163 return mod; |
| 2135 } | 2164 } |
| 2136 | 2165 |
| 2137 mod_ty | 2166 mod_ty |
| 2138 PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc, | 2167 PyParser_ASTFromString(const char *s, const char *filename_str, int start, |
| 2139 int start, char *ps1, | 2168 PyCompilerFlags *flags, PyArena *arena) |
| 2140 char *ps2, PyCompilerFlags *flags, int *errcode, | 2169 { |
| 2141 PyArena *arena) | 2170 PyObject *filename; |
| 2171 mod_ty mod; | |
| 2172 filename = PyUnicode_DecodeFSDefault(filename_str); | |
| 2173 if (filename == NULL) | |
| 2174 return NULL; | |
| 2175 mod = PyParser_ASTFromStringObject(s, filename, start, flags, arena); | |
| 2176 Py_DECREF(filename); | |
| 2177 return mod; | |
| 2178 } | |
| 2179 | |
| 2180 mod_ty | |
| 2181 PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, | |
| 2182 int start, char *ps1, | |
| 2183 char *ps2, PyCompilerFlags *flags, int *errcode, | |
| 2184 PyArena *arena) | |
| 2142 { | 2185 { |
| 2143 mod_ty mod; | 2186 mod_ty mod; |
| 2144 PyCompilerFlags localflags; | 2187 PyCompilerFlags localflags; |
| 2145 perrdetail err; | 2188 perrdetail err; |
| 2146 int iflags = PARSER_FLAGS(flags); | 2189 int iflags = PARSER_FLAGS(flags); |
| 2147 | 2190 |
| 2148 node *n = PyParser_ParseFileFlagsEx(fp, filename, enc, | 2191 node *n = PyParser_ParseFileObject(fp, filename, enc, |
| 2149 &_PyParser_Grammar, | 2192 &_PyParser_Grammar, |
| 2150 start, ps1, ps2, &err, &iflags); | 2193 start, ps1, ps2, &err, &iflags); |
| 2151 if (flags == NULL) { | 2194 if (flags == NULL) { |
| 2152 localflags.cf_flags = 0; | 2195 localflags.cf_flags = 0; |
| 2153 flags = &localflags; | 2196 flags = &localflags; |
| 2154 } | 2197 } |
| 2155 if (n) { | 2198 if (n) { |
| 2156 flags->cf_flags |= iflags & PyCF_MASK; | 2199 flags->cf_flags |= iflags & PyCF_MASK; |
| 2157 mod = PyAST_FromNode(n, flags, filename, arena); | 2200 mod = PyAST_FromNodeObject(n, flags, filename, arena); |
| 2158 PyNode_Free(n); | 2201 PyNode_Free(n); |
| 2159 } | 2202 } |
| 2160 else { | 2203 else { |
| 2161 err_input(&err); | 2204 err_input(&err); |
| 2162 if (errcode) | 2205 if (errcode) |
| 2163 *errcode = err.error; | 2206 *errcode = err.error; |
| 2164 mod = NULL; | 2207 mod = NULL; |
| 2165 } | 2208 } |
| 2166 err_free(&err); | 2209 err_free(&err); |
| 2210 return mod; | |
| 2211 } | |
| 2212 | |
| 2213 mod_ty | |
| 2214 PyParser_ASTFromFile(FILE *fp, const char *filename_str, const char* enc, | |
| 2215 int start, char *ps1, | |
| 2216 char *ps2, PyCompilerFlags *flags, int *errcode, | |
| 2217 PyArena *arena) | |
| 2218 { | |
| 2219 mod_ty mod; | |
| 2220 PyObject *filename; | |
| 2221 filename = PyUnicode_DecodeFSDefault(filename_str); | |
| 2222 if (filename == NULL) | |
| 2223 return NULL; | |
| 2224 mod = PyParser_ASTFromFileObject(fp, filename, enc, start, ps1, ps2, | |
| 2225 flags, errcode, arena); | |
| 2226 Py_DECREF(filename); | |
| 2167 return mod; | 2227 return mod; |
| 2168 } | 2228 } |
| 2169 | 2229 |
| 2170 /* Simplified interface to parsefile -- return node or set exception */ | 2230 /* Simplified interface to parsefile -- return node or set exception */ |
| 2171 | 2231 |
