comparison Python/pythonrun.c @ 35742:1c4d192f1568 legacy-trunk

Merge ast-branch to head This change implements a new bytecode compiler, based on a transformation of the parse tree to an abstract syntax defined in Parser/Python.asdl. The compiler implementation is not complete, but it is in stable enough shape to run the entire test suite excepting two disabled tests.
author Jeremy Hylton <jeremy@alum.mit.edu>
date Thu, 20 Oct 2005 19:59:25 +0000
parents b8e571e6de2e
children 72555a967d6a
comparison
equal deleted inserted replaced
35741:3716051830c2 35742:1c4d192f1568
1 1
2 /* Python interpreter top-level routines, including init/exit */ 2 /* Python interpreter top-level routines, including init/exit */
3 3
4 #include "Python.h" 4 #include "Python.h"
5 5
6 #include "Python-ast.h"
6 #include "grammar.h" 7 #include "grammar.h"
7 #include "node.h" 8 #include "node.h"
8 #include "token.h" 9 #include "token.h"
9 #include "parsetok.h" 10 #include "parsetok.h"
10 #include "errcode.h" 11 #include "errcode.h"
12 #include "code.h"
11 #include "compile.h" 13 #include "compile.h"
12 #include "symtable.h" 14 #include "symtable.h"
15 #include "ast.h"
13 #include "eval.h" 16 #include "eval.h"
14 #include "marshal.h" 17 #include "marshal.h"
15 18
16 #include <signal.h> 19 #include <signal.h>
17 20
30 extern grammar _PyParser_Grammar; /* From graminit.c */ 33 extern grammar _PyParser_Grammar; /* From graminit.c */
31 34
32 /* Forward */ 35 /* Forward */
33 static void initmain(void); 36 static void initmain(void);
34 static void initsite(void); 37 static void initsite(void);
35 static PyObject *run_err_node(node *, const char *, PyObject *, PyObject *, 38 static PyObject *run_err_mod(mod_ty, const char *, PyObject *, PyObject *,
36 PyCompilerFlags *); 39 PyCompilerFlags *);
37 static PyObject *run_node(node *, const char *, PyObject *, PyObject *, 40 static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
38 PyCompilerFlags *); 41 PyCompilerFlags *);
39 static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, 42 static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
40 PyCompilerFlags *); 43 PyCompilerFlags *);
41 static void err_input(perrdetail *); 44 static void err_input(perrdetail *);
42 static void initsigs(void); 45 static void initsigs(void);
632 } 635 }
633 636
634 /* Parse input from a file and execute it */ 637 /* Parse input from a file and execute it */
635 638
636 int 639 int
637 PyRun_AnyFile(FILE *fp, const char *filename) 640 PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
638 {
639 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
640 }
641
642 int
643 PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
644 {
645 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
646 }
647
648 int
649 PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)
650 {
651 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
652 }
653
654 int
655 PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
656 PyCompilerFlags *flags) 641 PyCompilerFlags *flags)
657 { 642 {
658 if (filename == NULL) 643 if (filename == NULL)
659 filename = "???"; 644 filename = "???";
660 if (Py_FdIsInteractive(fp, filename)) { 645 if (Py_FdIsInteractive(fp, filename)) {
666 else 651 else
667 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags); 652 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
668 } 653 }
669 654
670 int 655 int
671 PyRun_InteractiveLoop(FILE *fp, const char *filename)
672 {
673 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
674 }
675
676 int
677 PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 656 PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
678 { 657 {
679 PyObject *v; 658 PyObject *v;
680 int ret; 659 int ret;
681 PyCompilerFlags local_flags; 660 PyCompilerFlags local_flags;
706 return -1; 685 return -1;
707 */ 686 */
708 } 687 }
709 } 688 }
710 689
711 int
712 PyRun_InteractiveOne(FILE *fp, const char *filename)
713 {
714 return PyRun_InteractiveOneFlags(fp, filename, NULL);
715 }
716
717 /* compute parser flags based on compiler flags */ 690 /* compute parser flags based on compiler flags */
718 #define PARSER_FLAGS(flags) \ 691 #define PARSER_FLAGS(flags) \
719 (((flags) && (flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ 692 (((flags) && (flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
720 PyPARSE_DONT_IMPLY_DEDENT : 0) 693 PyPARSE_DONT_IMPLY_DEDENT : 0)
721 694
722 int 695 int
723 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 696 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
724 { 697 {
725 PyObject *m, *d, *v, *w; 698 PyObject *m, *d, *v, *w;
726 node *n; 699 mod_ty mod;
727 perrdetail err;
728 char *ps1 = "", *ps2 = ""; 700 char *ps1 = "", *ps2 = "";
701 int errcode = 0;
729 702
730 v = PySys_GetObject("ps1"); 703 v = PySys_GetObject("ps1");
731 if (v != NULL) { 704 if (v != NULL) {
732 v = PyObject_Str(v); 705 v = PyObject_Str(v);
733 if (v == NULL) 706 if (v == NULL)
741 if (w == NULL) 714 if (w == NULL)
742 PyErr_Clear(); 715 PyErr_Clear();
743 else if (PyString_Check(w)) 716 else if (PyString_Check(w))
744 ps2 = PyString_AsString(w); 717 ps2 = PyString_AsString(w);
745 } 718 }
746 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, 719 mod = PyParser_ASTFromFile(fp, filename,
747 Py_single_input, ps1, ps2, &err, 720 Py_single_input, ps1, ps2,
748 PARSER_FLAGS(flags)); 721 flags, &errcode);
749 Py_XDECREF(v); 722 Py_XDECREF(v);
750 Py_XDECREF(w); 723 Py_XDECREF(w);
751 if (n == NULL) { 724 if (mod == NULL) {
752 if (err.error == E_EOF) { 725 if (errcode == E_EOF) {
753 if (err.text) 726 PyErr_Clear();
754 PyMem_DEL(err.text);
755 return E_EOF; 727 return E_EOF;
756 } 728 }
757 err_input(&err);
758 PyErr_Print(); 729 PyErr_Print();
759 return err.error; 730 return -1;
760 } 731 }
761 m = PyImport_AddModule("__main__"); 732 m = PyImport_AddModule("__main__");
762 if (m == NULL) 733 if (m == NULL)
763 return -1; 734 return -1;
764 d = PyModule_GetDict(m); 735 d = PyModule_GetDict(m);
765 v = run_node(n, filename, d, d, flags); 736 v = run_mod(mod, filename, d, d, flags);
737 free_mod(mod);
766 if (v == NULL) { 738 if (v == NULL) {
767 PyErr_Print(); 739 PyErr_Print();
768 return -1; 740 return -1;
769 } 741 }
770 Py_DECREF(v); 742 Py_DECREF(v);
771 if (Py_FlushLine()) 743 if (Py_FlushLine())
772 PyErr_Clear(); 744 PyErr_Clear();
773 return 0; 745 return 0;
774 }
775
776 int
777 PyRun_SimpleFile(FILE *fp, const char *filename)
778 {
779 return PyRun_SimpleFileEx(fp, filename, 0);
780 } 746 }
781 747
782 /* Check whether a file maybe a pyc file: Look at the extension, 748 /* Check whether a file maybe a pyc file: Look at the extension,
783 the file type, and, if we may close it, at the first few bytes. */ 749 the file type, and, if we may close it, at the first few bytes. */
784 750
818 } 784 }
819 return 0; 785 return 0;
820 } 786 }
821 787
822 int 788 int
823 PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
824 {
825 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
826 }
827
828 int
829 PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, 789 PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
830 PyCompilerFlags *flags) 790 PyCompilerFlags *flags)
831 { 791 {
832 PyObject *m, *d, *v; 792 PyObject *m, *d, *v;
833 const char *ext; 793 const char *ext;
869 } 829 }
870 Py_DECREF(v); 830 Py_DECREF(v);
871 if (Py_FlushLine()) 831 if (Py_FlushLine())
872 PyErr_Clear(); 832 PyErr_Clear();
873 return 0; 833 return 0;
874 }
875
876 int
877 PyRun_SimpleString(const char *command)
878 {
879 return PyRun_SimpleStringFlags(command, NULL);
880 } 834 }
881 835
882 int 836 int
883 PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) 837 PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
884 { 838 {
1052 1006
1053 if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 1007 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1054 handle_system_exit(); 1008 handle_system_exit();
1055 } 1009 }
1056 PyErr_Fetch(&exception, &v, &tb); 1010 PyErr_Fetch(&exception, &v, &tb);
1011 if (exception == NULL)
1012 return;
1057 PyErr_NormalizeException(&exception, &v, &tb); 1013 PyErr_NormalizeException(&exception, &v, &tb);
1058 if (exception == NULL) 1014 if (exception == NULL)
1059 return; 1015 return;
1060 if (set_sys_last_vars) { 1016 if (set_sys_last_vars) {
1061 PySys_SetObject("last_type", exception); 1017 PySys_SetObject("last_type", exception);
1193 if (err != 0) 1149 if (err != 0)
1194 PyErr_Clear(); 1150 PyErr_Clear();
1195 } 1151 }
1196 1152
1197 PyObject * 1153 PyObject *
1198 PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals) 1154 PyRun_StringFlags(const char *str, int start, PyObject *globals,
1199 { 1155 PyObject *locals, PyCompilerFlags *flags)
1200 return run_err_node(PyParser_SimpleParseString(str, start), 1156 {
1201 "<string>", globals, locals, NULL); 1157 PyObject *ret;
1202 } 1158 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags);
1203 1159 ret = run_err_mod(mod, "<string>", globals, locals, flags);
1204 PyObject * 1160 free_mod(mod);
1205 PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, 1161 return ret;
1206 PyObject *locals)
1207 {
1208 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
1209 }
1210
1211 PyObject *
1212 PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals,
1213 PyObject *locals, int closeit)
1214 {
1215 node *n = PyParser_SimpleParseFile(fp, filename, start);
1216 if (closeit)
1217 fclose(fp);
1218 return run_err_node(n, filename, globals, locals, NULL);
1219 }
1220
1221 PyObject *
1222 PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals,
1223 PyCompilerFlags *flags)
1224 {
1225 return run_err_node(PyParser_SimpleParseStringFlags(
1226 str, start, PARSER_FLAGS(flags)),
1227 "<string>", globals, locals, flags);
1228 }
1229
1230 PyObject *
1231 PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals,
1232 PyObject *locals, PyCompilerFlags *flags)
1233 {
1234 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1235 flags);
1236 } 1162 }
1237 1163
1238 PyObject * 1164 PyObject *
1239 PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, 1165 PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
1240 PyObject *locals, int closeit, PyCompilerFlags *flags) 1166 PyObject *locals, int closeit, PyCompilerFlags *flags)
1241 { 1167 {
1242 node *n = PyParser_SimpleParseFileFlags(fp, filename, start, 1168 PyObject *ret;
1243 PARSER_FLAGS(flags)); 1169 mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
1170 flags, NULL);
1171 if (mod == NULL)
1172 return NULL;
1244 if (closeit) 1173 if (closeit)
1245 fclose(fp); 1174 fclose(fp);
1246 return run_err_node(n, filename, globals, locals, flags); 1175 ret = run_err_mod(mod, filename, globals, locals, flags);
1176 free_mod(mod);
1177 return ret;
1247 } 1178 }
1248 1179
1249 static PyObject * 1180 static PyObject *
1250 run_err_node(node *n, const char *filename, PyObject *globals, PyObject *locals, 1181 run_err_mod(mod_ty mod, const char *filename, PyObject *globals,
1251 PyCompilerFlags *flags) 1182 PyObject *locals, PyCompilerFlags *flags)
1252 { 1183 {
1253 if (n == NULL) 1184 if (mod == NULL)
1254 return NULL; 1185 return NULL;
1255 return run_node(n, filename, globals, locals, flags); 1186 return run_mod(mod, filename, globals, locals, flags);
1256 } 1187 }
1257 1188
1258 static PyObject * 1189 static PyObject *
1259 run_node(node *n, const char *filename, PyObject *globals, PyObject *locals, 1190 run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
1260 PyCompilerFlags *flags) 1191 PyCompilerFlags *flags)
1261 { 1192 {
1262 PyCodeObject *co; 1193 PyCodeObject *co;
1263 PyObject *v; 1194 PyObject *v;
1264 co = PyNode_CompileFlags(n, filename, flags); 1195 co = PyAST_Compile(mod, filename, flags);
1265 PyNode_Free(n);
1266 if (co == NULL) 1196 if (co == NULL)
1267 return NULL; 1197 return NULL;
1268 v = PyEval_EvalCode(co, globals, locals); 1198 v = PyEval_EvalCode(co, globals, locals);
1269 Py_DECREF(co); 1199 Py_DECREF(co);
1270 return v; 1200 return v;
1271 } 1201 }
1272 1202
1273 static PyObject * 1203 static PyObject *
1274 run_pyc_file(FILE *fp, const char *filename, PyObject *globals, PyObject *locals, 1204 run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
1275 PyCompilerFlags *flags) 1205 PyObject *locals, PyCompilerFlags *flags)
1276 { 1206 {
1277 PyCodeObject *co; 1207 PyCodeObject *co;
1278 PyObject *v; 1208 PyObject *v;
1279 long magic; 1209 long magic;
1280 long PyImport_GetMagicNumber(void); 1210 long PyImport_GetMagicNumber(void);
1301 Py_DECREF(co); 1231 Py_DECREF(co);
1302 return v; 1232 return v;
1303 } 1233 }
1304 1234
1305 PyObject * 1235 PyObject *
1306 Py_CompileString(const char *str, const char *filename, int start)
1307 {
1308 return Py_CompileStringFlags(str, filename, start, NULL);
1309 }
1310
1311 PyObject *
1312 Py_CompileStringFlags(const char *str, const char *filename, int start, 1236 Py_CompileStringFlags(const char *str, const char *filename, int start,
1313 PyCompilerFlags *flags) 1237 PyCompilerFlags *flags)
1314 { 1238 {
1315 node *n; 1239 mod_ty mod;
1316 PyCodeObject *co; 1240 PyCodeObject *co;
1317 1241 mod = PyParser_ASTFromString(str, filename, start, flags);
1318 n = PyParser_SimpleParseStringFlagsFilename(str, filename, start, 1242 if (mod == NULL)
1319 PARSER_FLAGS(flags));
1320 if (n == NULL)
1321 return NULL; 1243 return NULL;
1322 co = PyNode_CompileFlags(n, filename, flags); 1244 co = PyAST_Compile(mod, filename, flags);
1323 PyNode_Free(n); 1245 free_mod(mod);
1324 return (PyObject *)co; 1246 return (PyObject *)co;
1325 } 1247 }
1326 1248
1327 struct symtable * 1249 struct symtable *
1328 Py_SymtableString(const char *str, const char *filename, int start) 1250 Py_SymtableString(const char *str, const char *filename, int start)
1329 { 1251 {
1252 mod_ty mod;
1253 struct symtable *st;
1254
1255 mod = PyParser_ASTFromString(str, filename, start, NULL);
1256 if (mod == NULL)
1257 return NULL;
1258 st = PySymtable_Build(mod, filename, 0);
1259 free_mod(mod);
1260 return st;
1261 }
1262
1263 /* Preferred access to parser is through AST. */
1264 mod_ty
1265 PyParser_ASTFromString(const char *s, const char *filename, int start,
1266 PyCompilerFlags *flags)
1267 {
1330 node *n; 1268 node *n;
1331 struct symtable *st; 1269 mod_ty mod;
1332 n = PyParser_SimpleParseStringFlagsFilename(str, filename, 1270 perrdetail err;
1333 start, 0); 1271 n = PyParser_ParseStringFlagsFilename(s, filename, &_PyParser_Grammar,
1334 if (n == NULL) 1272 start, &err,
1273 PARSER_FLAGS(flags));
1274 if (n) {
1275 mod = PyAST_FromNode(n, flags, filename);
1276 PyNode_Free(n);
1277 return mod;
1278 }
1279 else {
1280 err_input(&err);
1335 return NULL; 1281 return NULL;
1336 st = PyNode_CompileSymtable(n, filename); 1282 }
1337 PyNode_Free(n); 1283 }
1338 return st; 1284
1285 mod_ty
1286 PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
1287 char *ps2, PyCompilerFlags *flags, int *errcode)
1288 {
1289 node *n;
1290 mod_ty mod;
1291 perrdetail err;
1292 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1293 ps1, ps2, &err, PARSER_FLAGS(flags));
1294 if (n) {
1295 mod = PyAST_FromNode(n, flags, filename);
1296 PyNode_Free(n);
1297 return mod;
1298 }
1299 else {
1300 err_input(&err);
1301 if (errcode)
1302 *errcode = err.error;
1303 return NULL;
1304 }
1339 } 1305 }
1340 1306
1341 /* Simplified interface to parsefile -- return node or set exception */ 1307 /* Simplified interface to parsefile -- return node or set exception */
1342 1308
1343 node * 1309 node *
1347 perrdetail err; 1313 perrdetail err;
1348 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, 1314 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1349 (char *)0, (char *)0, &err, flags); 1315 (char *)0, (char *)0, &err, flags);
1350 if (n == NULL) 1316 if (n == NULL)
1351 err_input(&err); 1317 err_input(&err);
1318
1352 return n; 1319 return n;
1353 }
1354
1355 node *
1356 PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1357 {
1358 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1359 } 1320 }
1360 1321
1361 /* Simplified interface to parsestring -- return node or set exception */ 1322 /* Simplified interface to parsestring -- return node or set exception */
1362 1323
1363 node * 1324 node *
1371 err_input(&err); 1332 err_input(&err);
1372 return n; 1333 return n;
1373 } 1334 }
1374 1335
1375 node * 1336 node *
1376 PyParser_SimpleParseString(const char *str, int start)
1377 {
1378 return PyParser_SimpleParseStringFlags(str, start, 0);
1379 }
1380
1381 node *
1382 PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename, 1337 PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
1383 int start, int flags) 1338 int start, int flags)
1384 { 1339 {
1385 node *n; 1340 node *n;
1386 perrdetail err; 1341 perrdetail err;
1416 { 1371 {
1417 PyObject *v, *w, *errtype; 1372 PyObject *v, *w, *errtype;
1418 PyObject* u = NULL; 1373 PyObject* u = NULL;
1419 char *msg = NULL; 1374 char *msg = NULL;
1420 errtype = PyExc_SyntaxError; 1375 errtype = PyExc_SyntaxError;
1421 v = Py_BuildValue("(ziiz)", err->filename,
1422 err->lineno, err->offset, err->text);
1423 if (err->text != NULL) {
1424 PyMem_DEL(err->text);
1425 err->text = NULL;
1426 }
1427 switch (err->error) { 1376 switch (err->error) {
1428 case E_SYNTAX: 1377 case E_SYNTAX:
1429 errtype = PyExc_IndentationError; 1378 errtype = PyExc_IndentationError;
1430 if (err->expected == INDENT) 1379 if (err->expected == INDENT)
1431 msg = "expected an indented block"; 1380 msg = "expected an indented block";
1448 msg = "EOL while scanning single-quoted string"; 1397 msg = "EOL while scanning single-quoted string";
1449 break; 1398 break;
1450 case E_INTR: 1399 case E_INTR:
1451 if (!PyErr_Occurred()) 1400 if (!PyErr_Occurred())
1452 PyErr_SetNone(PyExc_KeyboardInterrupt); 1401 PyErr_SetNone(PyExc_KeyboardInterrupt);
1453 Py_XDECREF(v);
1454 return; 1402 return;
1455 case E_NOMEM: 1403 case E_NOMEM:
1456 PyErr_NoMemory(); 1404 PyErr_NoMemory();
1457 Py_XDECREF(v);
1458 return; 1405 return;
1459 case E_EOF: 1406 case E_EOF:
1460 msg = "unexpected EOF while parsing"; 1407 msg = "unexpected EOF while parsing";
1461 break; 1408 break;
1462 case E_TABSPACE: 1409 case E_TABSPACE:
1496 default: 1443 default:
1497 fprintf(stderr, "error=%d\n", err->error); 1444 fprintf(stderr, "error=%d\n", err->error);
1498 msg = "unknown parsing error"; 1445 msg = "unknown parsing error";
1499 break; 1446 break;
1500 } 1447 }
1501 w = Py_BuildValue("(sO)", msg, v); 1448 v = Py_BuildValue("(ziiz)", err->filename,
1449 err->lineno, err->offset, err->text);
1450 if (err->text != NULL) {
1451 PyMem_DEL(err->text);
1452 err->text = NULL;
1453 }
1454 w = NULL;
1455 if (v != NULL)
1456 w = Py_BuildValue("(sO)", msg, v);
1502 Py_XDECREF(u); 1457 Py_XDECREF(u);
1503 Py_XDECREF(v); 1458 Py_XDECREF(v);
1504 PyErr_SetObject(errtype, w); 1459 PyErr_SetObject(errtype, w);
1505 Py_XDECREF(w); 1460 Py_XDECREF(w);
1506 } 1461 }
1685 siginterrupt(sig, 1); 1640 siginterrupt(sig, 1);
1686 #endif 1641 #endif
1687 return oldhandler; 1642 return oldhandler;
1688 #endif 1643 #endif
1689 } 1644 }
1645
1646 /* Deprecated C API functions still provided for binary compatiblity */
1647
1648 #undef PyParser_SimpleParseFile
1649 #undef PyParser_SimpleParseString
1650
1651 node *
1652 PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1653 {
1654 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1655 }
1656
1657 node *
1658 PyParser_SimpleParseString(const char *str, int start)
1659 {
1660 return PyParser_SimpleParseStringFlags(str, start, 0);
1661 }