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