pythonrun.c revision 46f50726a0047ae81d478c3a206f587b8f35ed08
11984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 21984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Python interpreter top-level routines, including init/exit */ 31984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum#include "Python.h" 51984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 63e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "Python-ast.h" 7d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum#undef Yield /* undefine macro conflicting with winbase.h */ 81984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "grammar.h" 91984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "node.h" 1085f363990cbd6df21015eebdc171c533176e3407Fred Drake#include "token.h" 111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "parsetok.h" 121984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "errcode.h" 133e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h" 144b38da664c107bc08768235a66621429beef5444Jeremy Hylton#include "symtable.h" 153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "ast.h" 16fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum#include "marshal.h" 17790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#include "osdefs.h" 18518e610977cce63d348d11c4081f9b7af79edd81Victor Stinner#include <locale.h> 191984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 200e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#ifdef HAVE_SIGNAL_H 21a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum#include <signal.h> 220e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#endif 23a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum 2480a50acbe9de08730124bf557e042be1829d0838Benjamin Peterson#ifdef MS_WINDOWS 255c88d8178442af4d2ac9f42774bc9ab4c45e5751Martin v. Löwis#include "malloc.h" /* for alloca */ 2680a50acbe9de08730124bf557e042be1829d0838Benjamin Peterson#endif 275c88d8178442af4d2ac9f42774bc9ab4c45e5751Martin v. Löwis 2873d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#ifdef HAVE_LANGINFO_H 2973d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <langinfo.h> 3073d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif 3173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis 326238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS 33a44823b7764281d398215564f2070257d08d0855Guido van Rossum#undef BYTE 34a44823b7764281d398215564f2070257d08d0855Guido van Rossum#include "windows.h" 35a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif 36a44823b7764281d398215564f2070257d08d0855Guido van Rossum 37bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(builtins); 38090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner_Py_IDENTIFIER(excepthook); 393f36a5736b92457273d06cc17d55dd379381873dVictor Stinner_Py_IDENTIFIER(flush); 40bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(last_traceback); 41090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner_Py_IDENTIFIER(last_type); 42090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner_Py_IDENTIFIER(last_value); 43bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(ps1); 44bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(ps2); 45bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(stdin); 46bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(stdout); 47bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner_Py_IDENTIFIER(stderr); 48efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner_Py_static_string(PyId_string, "<string>"); 49090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner 5049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 5149fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" { 524281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz#endif 534281cef2057e24384a1d59b6bcf9e9161fde26e8Neal Norwitz 5482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumextern grammar _PyParser_Grammar; /* From graminit.c */ 551984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 56b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */ 577fedbe513d5ccc735d36e1da9781fcab1ca5961eAmaury Forgeot d'Arcstatic void flush_io(void); 5895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerstatic PyObject *run_mod(mod_ty, PyObject *, PyObject *, PyObject *, 59f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags *, PyArena *); 6095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisstatic PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, 61f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags *); 62dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void err_input(perrdetail *); 637f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnerstatic void err_free(perrdetail *); 64ce3a72aec6eaa0293c397c8d0407f7afe0072b2fGuido van Rossum 651984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Parse input from a file and execute it */ 661984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint 684d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, 69f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags *flags) 70bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 71f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (filename == NULL) 72f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou filename = "???"; 73f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (Py_FdIsInteractive(fp, filename)) { 74f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int err = PyRun_InteractiveLoopFlags(fp, filename, flags); 75f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (closeit) 76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fclose(fp); 77f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return err; 78f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 79f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else 80f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_SimpleFileExFlags(fp, filename, closeit, flags); 811984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 821984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint 8495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_InteractiveLoopFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags) 85bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 8695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyObject *filename, *v; 8795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner int ret, err; 88f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags local_flags; 89f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 9095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 9195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (filename == NULL) { 9295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyErr_Print(); 9395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner return -1; 9495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner } 9595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 96f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags == NULL) { 97f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags = &local_flags; 98f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou local_flags.cf_flags = 0; 99f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 100090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner v = _PySys_GetObjectId(&PyId_ps1); 101f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) { 102090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> ")); 103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 105090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner v = _PySys_GetObjectId(&PyId_ps2); 106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) { 107090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... ")); 108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 11095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner err = -1; 111f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou for (;;) { 11295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner ret = PyRun_InteractiveOneObject(fp, filename, flags); 113d600951748d7a19cdb3e58a376c51ed804b630e6Nick Coghlan _PY_DEBUG_PRINT_TOTAL_REFS(); 11495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (ret == E_EOF) { 11595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner err = 0; 11695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner break; 11795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner } 118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* 119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (ret == E_NOMEM) 12095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner break; 121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 12395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner Py_DECREF(filename); 12495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner return err; 1251984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 1261984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 127c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer/* compute parser flags based on compiler flags */ 128f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Petersonstatic int PARSER_FLAGS(PyCompilerFlags *flags) 129f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Peterson{ 130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int parser_flags = 0; 131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!flags) 132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT) 134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou parser_flags |= PyPARSE_DONT_IMPLY_DEDENT; 135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags->cf_flags & PyCF_IGNORE_COOKIE) 136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou parser_flags |= PyPARSE_IGNORE_COOKIE; 137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL) 138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou parser_flags |= PyPARSE_BARRY_AS_BDFL; 139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return parser_flags; 140f5b52246ed8a1191c3aa1da7d3c63bbe11aee020Benjamin Peterson} 141c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer 14289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#if 0 14389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters/* Keep an example of flags with future keyword support. */ 14489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#define PARSER_FLAGS(flags) \ 145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ 146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyPARSE_DONT_IMPLY_DEDENT : 0) \ 147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \ 148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyPARSE_WITH_IS_KEYWORD : 0)) : 0) 14989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#endif 15089f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters 1519f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hyltonint 15295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_InteractiveOneObject(FILE *fp, PyObject *filename, PyCompilerFlags *flags) 1539f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton{ 15495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name; 155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 156f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena *arena; 157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *ps1 = "", *ps2 = "", *enc = NULL; 158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int errcode = 0; 159bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(encoding); 16095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner _Py_IDENTIFIER(__main__); 16195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 16295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner mod_name = _PyUnicode_FromId(&PyId___main__); /* borrowed */ 16395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (mod_name == NULL) { 16495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyErr_Print(); 16595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner return -1; 16695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner } 167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (fp == stdin) { 169fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson /* Fetch encoding from sys.stdin if possible. */ 170bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner v = _PySys_GetObjectId(&PyId_stdin); 171fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson if (v && v != Py_None) { 172fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson oenc = _PyObject_GetAttrId(v, &PyId_encoding); 173fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson if (oenc) 174fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson enc = _PyUnicode_AsString(oenc); 175fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson if (!enc) 176fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson PyErr_Clear(); 177fe1b22af0a9d696918204adaaae125a9bf86c5cfBenjamin Peterson } 178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 179090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner v = _PySys_GetObjectId(&PyId_ps1); 180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v != NULL) { 181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v = PyObject_Str(v); 182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) 183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 184386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner else if (PyUnicode_Check(v)) { 185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ps1 = _PyUnicode_AsString(v); 186386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner if (ps1 == NULL) { 187386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner PyErr_Clear(); 188386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner ps1 = ""; 189386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner } 190386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner } 191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 192090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner w = _PySys_GetObjectId(&PyId_ps2); 193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (w != NULL) { 194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou w = PyObject_Str(w); 195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (w == NULL) 196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 197386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner else if (PyUnicode_Check(w)) { 198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ps2 = _PyUnicode_AsString(w); 199386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner if (ps2 == NULL) { 200386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner PyErr_Clear(); 201386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner ps2 = ""; 202386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner } 203386fe71de1d0f35f53f082a88762e90d5b1c66bbVictor Stinner } 204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou arena = PyArena_New(); 206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (arena == NULL) { 207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(w); 209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(oenc); 210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 21295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner mod = PyParser_ASTFromFileObject(fp, filename, enc, 21395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner Py_single_input, ps1, ps2, 21495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner flags, &errcode, arena); 215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(w); 217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(oenc); 218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (mod == NULL) { 219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (errcode == E_EOF) { 221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return E_EOF; 223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Print(); 225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 22795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner m = PyImport_AddModuleObject(mod_name); 228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (m == NULL) { 229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 230f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 231f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 232f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou d = PyModule_GetDict(m); 233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v = run_mod(mod, filename, d, d, flags, arena); 234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) { 236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Print(); 2379845c7ebc5cf5af495123701664f275562f45243Antoine Pitrou flush_io(); 238f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 240f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 2419845c7ebc5cf5af495123701664f275562f45243Antoine Pitrou flush_io(); 242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 2431984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 2441984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 24595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerint 24695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_InteractiveOneFlags(FILE *fp, const char *filename_str, PyCompilerFlags *flags) 24795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner{ 24895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyObject *filename; 24995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner int res; 25095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 25195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 25295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (filename == NULL) { 25395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyErr_Print(); 25495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner return -1; 25595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner } 25695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner res = PyRun_InteractiveOneObject(fp, filename, flags); 25795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner Py_DECREF(filename); 25895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner return res; 25995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner} 26095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 26195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 262be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis/* Check whether a file maybe a pyc file: Look at the extension, 263be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis the file type, and, if we may close it, at the first few bytes. */ 264be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis 265be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwisstatic int 26695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwismaybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) 267be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis{ 268f299abdafa0f2b6eb7abae274861b19b361c96bcBrett Cannon if (strcmp(ext, ".pyc") == 0) 269f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 1; 270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Only look into the file if we are allowed to close it, since 272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou it then should also be seekable. */ 273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (closeit) { 274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Read only two bytes of the magic. If the file was opened in 275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou text mode, the bytes 3 and 4 of the magic (\r\n) might not 276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou be read as they are on disk. */ 277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; 278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou unsigned char buf[2]; 279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Mess: In case of -x, the stream is NOT at its start now, 280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou and ungetc() was used to push back the first newline, 281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou which makes the current stream position formally undefined, 282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou and a x-platform nightmare. 283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Unfortunately, we have no direct way to know whether -x 284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou was specified. So we use a terrible hack: if the current 285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou stream position is not 0, we assume -x was specified, and 286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou give up. Bug 132850 on SourceForge spells out the 287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou hopelessness of trying anything else (fseek and ftell 288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou don't work predictably x-platform for text-mode files). 289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int ispyc = 0; 291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (ftell(fp) == 0) { 292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (fread(buf, 1, 2, fp) == 2 && 293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) 294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ispyc = 1; 295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou rewind(fp); 296f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 297f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return ispyc; 298f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 300d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters} 301be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis 30232d483c39b4169b48ab3a98c36a77ea4e74b9f5aAntoine Pitroustatic int 30332d483c39b4169b48ab3a98c36a77ea4e74b9f5aAntoine Pitrouset_main_loader(PyObject *d, const char *filename, const char *loader_name) 30485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan{ 30585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan PyInterpreterState *interp; 30685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan PyThreadState *tstate; 30732439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow PyObject *filename_obj, *bootstrap, *loader_type = NULL, *loader; 308b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan int result = 0; 30990c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov 31090c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov filename_obj = PyUnicode_DecodeFSDefault(filename); 31190c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov if (filename_obj == NULL) 31290c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov return -1; 31385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan /* Get current thread state and interpreter pointer */ 31485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan tstate = PyThreadState_GET(); 31585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan interp = tstate->interp; 31632439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow bootstrap = PyObject_GetAttrString(interp->importlib, 31732439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow "_bootstrap_external"); 31832439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow if (bootstrap != NULL) { 31932439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow loader_type = PyObject_GetAttrString(bootstrap, loader_name); 32032439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow Py_DECREF(bootstrap); 32132439d6eb63f1ea31aed1e45459f0f50f965ef51Eric Snow } 3223f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan if (loader_type == NULL) { 32390c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov Py_DECREF(filename_obj); 3243f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan return -1; 3253f94cbf9eba7adef027cfc5d087b3660800df9d7Nick Coghlan } 32690c0eb28c5ff1da76b258f9cf6a54abc6df19675Andrew Svetlov loader = PyObject_CallFunction(loader_type, "sN", "__main__", filename_obj); 327b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan Py_DECREF(loader_type); 328b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan if (loader == NULL) { 32985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan return -1; 33085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan } 331b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan if (PyDict_SetItemString(d, "__loader__", loader) < 0) { 332b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan result = -1; 333b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan } 33485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan Py_DECREF(loader); 335b7a5894c64f4ac8353a90e518433cfe025b5b5bcNick Coghlan return result; 33685e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan} 33785e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan 33885e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlanint 33995292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, 340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags *flags) 341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *m, *d, *v; 343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou const char *ext; 3445c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack int set_file_name = 0, ret = -1; 3450fcab4a3ed5e39769609b60d6179c4c801e45985Victor Stinner size_t len; 346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou m = PyImport_AddModule("__main__"); 348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (m == NULL) 349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 3505c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack Py_INCREF(m); 351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou d = PyModule_GetDict(m); 352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyDict_GetItemString(d, "__file__") == NULL) { 353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *f; 3544c7c8c30235e42c47500b91549c2b6154b61f883Victor Stinner f = PyUnicode_DecodeFSDefault(filename); 355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (f == NULL) 3565c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack goto done; 357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyDict_SetItemString(d, "__file__", f) < 0) { 358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(f); 3595c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack goto done; 360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 361916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw if (PyDict_SetItemString(d, "__cached__", Py_None) < 0) { 362916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw Py_DECREF(f); 3635c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack goto done; 364916048d7807b179cbf839346768516bfdaeadecfBarry Warsaw } 365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou set_file_name = 1; 366f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(f); 367f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 368f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou len = strlen(filename); 369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ext = filename + len - (len > 4 ? 4 : 0); 370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (maybe_pyc_file(fp, filename, ext, closeit)) { 37104ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes FILE *pyc_fp; 372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Try to run a pyc file. First, re-open in binary */ 373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (closeit) 374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fclose(fp); 375daf455554bc21b6b5df0a016ab5fa639d36cc595Victor Stinner if ((pyc_fp = _Py_fopen(filename, "rb")) == NULL) { 376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "python: Can't reopen .pyc file\n"); 377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto done; 378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 37985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan 38085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan if (set_main_loader(d, filename, "SourcelessFileLoader") < 0) { 38185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan fprintf(stderr, "python: failed to set __main__.__loader__\n"); 38285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan ret = -1; 38304ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes fclose(pyc_fp); 38485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan goto done; 38585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan } 38604ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes v = run_pyc_file(pyc_fp, filename, d, d, flags); 38704ac4c1cb8e7af5571adbe64cb82938a323e5850Christian Heimes fclose(pyc_fp); 388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 38985e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan /* When running from stdin, leave __main__.__loader__ alone */ 39085e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan if (strcmp(filename, "<stdin>") != 0 && 39185e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan set_main_loader(d, filename, "SourceFileLoader") < 0) { 39285e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan fprintf(stderr, "python: failed to set __main__.__loader__\n"); 39385e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan ret = -1; 39485e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan goto done; 39585e729ec3b6708af956fb47ff4936521020ff5e5Nick Coghlan } 396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d, 397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou closeit, flags); 398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flush_io(); 400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) { 401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Print(); 402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto done; 403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ret = 0; 406d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum done: 407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (set_file_name && PyDict_DelItemString(d, "__file__")) 408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 4095c6b3e214ce3506c454e8009602f0de651cc7922Hynek Schlawack Py_DECREF(m); 410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return ret; 4111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 4121984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 4131984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint 41495292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) 415393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum{ 416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *m, *d, *v; 417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou m = PyImport_AddModule("__main__"); 418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (m == NULL) 419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou d = PyModule_GetDict(m); 421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v = PyRun_StringFlags(command, Py_file_input, d, d, flags); 422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL) { 423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Print(); 424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return -1; 425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 4281984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 4291984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 430035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawstatic int 431efa7a0e155e508f21dd7ace708b311066637538fVictor Stinnerparse_syntax_error(PyObject *err, PyObject **message, PyObject **filename, 432efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner int *lineno, int *offset, PyObject **text) 433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou long hold; 435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *v; 436bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(msg); 437bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(filename); 438bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(lineno); 439bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(offset); 440bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(text); 441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 44280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson *message = NULL; 443efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner *filename = NULL; 444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 44580d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson /* new style errors. `err' is an instance */ 4460a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson *message = _PyObject_GetAttrId(err, &PyId_msg); 44780d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (!*message) 448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 4500a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson v = _PyObject_GetAttrId(err, &PyId_filename); 45180d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (!v) 452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 45380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (v == Py_None) { 45480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson Py_DECREF(v); 455efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner *filename = _PyUnicode_FromId(&PyId_string); 456efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner if (*filename == NULL) 457efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner goto finally; 458efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner Py_INCREF(*filename); 45980d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson } 46080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson else { 461efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner *filename = v; 46280d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson } 463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 4640a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson v = _PyObject_GetAttrId(err, &PyId_lineno); 46580d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (!v) 466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou hold = PyLong_AsLong(v); 468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (hold < 0 && PyErr_Occurred()) 470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *lineno = (int)hold; 472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 4730a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson v = _PyObject_GetAttrId(err, &PyId_offset); 47480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (!v) 475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == Py_None) { 477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *offset = -1; 478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou hold = PyLong_AsLong(v); 481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v); 482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (hold < 0 && PyErr_Occurred()) 483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *offset = (int)hold; 485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 4870a9a6363025ba16b1c2041a05e6f33ee408b1bdaBenjamin Peterson v = _PyObject_GetAttrId(err, &PyId_text); 48880d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (!v) 489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto finally; 49080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson if (v == Py_None) { 49180d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson Py_DECREF(v); 492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *text = NULL; 49380d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson } 49480d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson else { 495efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner *text = v; 49680d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson } 497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 1; 498035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 499035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawfinally: 50080d50428ce7697cc2f1fdb4370800b89399c4cdaBenjamin Peterson Py_XDECREF(*message); 501efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner Py_XDECREF(*filename); 502f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return 0; 503035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw} 504035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 5051984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid 506f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_Print(void) 5071984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_PrintEx(1); 509a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum} 510a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum 5119f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hyltonstatic void 512efa7a0e155e508f21dd7ace708b311066637538fVictor Stinnerprint_error_text(PyObject *f, int offset, PyObject *text_obj) 5139f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton{ 514efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner char *text; 515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *nl; 516efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner 517efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner text = _PyUnicode_AsString(text_obj); 518efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner if (text == NULL) 519efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner return; 520efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner 521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (offset >= 0) { 52298ea54c35c37e4f9a7d7a923a7ccd792f4b7ff90Victor Stinner if (offset > 0 && (size_t)offset == strlen(text) && text[offset - 1] == '\n') 523a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson offset--; 524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou for (;;) { 525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou nl = strchr(text, '\n'); 526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (nl == NULL || nl-text >= offset) 527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou offset -= (int)(nl+1-text); 529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou text = nl+1; 530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou while (*text == ' ' || *text == '\t') { 532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou text++; 533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou offset--; 534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString(" ", f); 537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString(text, f); 538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (*text == '\0' || text[strlen(text)-1] != '\n') 539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString("\n", f); 540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (offset == -1) 541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return; 542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString(" ", f); 543a95e977e41ca13ac2677c455e5270cf4018f5838Benjamin Peterson while (--offset > 0) 544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString(" ", f); 545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString("^\n", f); 5469f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton} 5479f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton 54866e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumstatic void 54966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumhandle_system_exit(void) 55026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee{ 551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *exception, *value, *tb; 552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int exitcode = 0; 553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (Py_InspectFlag) 555f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Don't exit if -i flag was given. This flag is set to 0 556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * when entering interactive mode for inspecting. */ 557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return; 558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Fetch(&exception, &value, &tb); 560f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fflush(stdout); 561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (value == NULL || value == Py_None) 562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto done; 563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyExceptionInstance_Check(value)) { 564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* The error code should be in the `code' attribute. */ 565bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(code); 5661ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis PyObject *code = _PyObject_GetAttrId(value, &PyId_code); 567f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (code) { 568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(value); 569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou value = code; 570f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (value == Py_None) 571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto done; 572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 573f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* If we failed to dig out the 'code' attribute, 574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou just let the else clause below print the error. */ 575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyLong_Check(value)) 577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou exitcode = (int)PyLong_AsLong(value); 578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 579bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner PyObject *sys_stderr = _PySys_GetObjectId(&PyId_stderr); 580d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan /* We clear the exception here to avoid triggering the assertion 581d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan * in PyObject_Str that ensures it won't silently lose exception 582d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan * details. 583d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan */ 584d979e4335d02bee7301c2b2dec61fe2155fbae98Nick Coghlan PyErr_Clear(); 5857126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner if (sys_stderr != NULL && sys_stderr != Py_None) { 5867126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW); 5877126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner } else { 5887126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner PyObject_Print(value, stderr, Py_PRINT_RAW); 5897126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner fflush(stderr); 5907126dbc867e99e675ed29037c6b10681dbaa8dc9Victor Stinner } 591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_WriteStderr("\n"); 592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou exitcode = 1; 593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 594cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters done: 595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Restore and clear the exception info, in order to properly decref 596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * the exception, value, and traceback. If we just exit instead, 597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * these leak, which confuses PYTHONDUMPREFS output, and may prevent 598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * some finalizers from running. 599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 600f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Restore(exception, value, tb); 601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 602f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_Exit(exitcode); 603f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* NOTREACHED */ 60426fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee} 60526fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee 60626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yeevoid 607f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_PrintEx(int set_sys_last_vars) 608a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{ 609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *exception, *v, *tb, *hook; 610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou handle_system_exit(); 613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Fetch(&exception, &v, &tb); 615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (exception == NULL) 616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return; 617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_NormalizeException(&exception, &v, &tb); 618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (tb == NULL) { 619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou tb = Py_None; 620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(tb); 621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 622f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyException_SetTraceback(v, tb); 623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (exception == NULL) 624f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return; 625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Now we know v != NULL too */ 626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (set_sys_last_vars) { 627090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner _PySys_SetObjectId(&PyId_last_type, exception); 628090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner _PySys_SetObjectId(&PyId_last_value, v); 629090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner _PySys_SetObjectId(&PyId_last_traceback, tb); 630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 631090543736fa86c676252de7a44e6a7c6f347164eVictor Stinner hook = _PySys_GetObjectId(&PyId_excepthook); 632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (hook) { 633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *args = PyTuple_Pack(3, exception, v, tb); 634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *result = PyEval_CallObject(hook, args); 635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (result == NULL) { 636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *exception2, *v2, *tb2; 637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou handle_system_exit(); 639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Fetch(&exception2, &v2, &tb2); 641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_NormalizeException(&exception2, &v2, &tb2); 642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* It should not be possible for exception2 or v2 643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou to be NULL. However PyErr_Display() can't 644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou tolerate NULLs, so just be safe. */ 645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (exception2 == NULL) { 646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou exception2 = Py_None; 647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(exception2); 648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v2 == NULL) { 650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v2 = Py_None; 651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(v2); 652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fflush(stdout); 654f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_WriteStderr("Error in sys.excepthook:\n"); 655f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Display(exception2, v2, tb2); 656f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_WriteStderr("\nOriginal exception was:\n"); 657f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Display(exception, v, tb); 658f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(exception2); 659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(v2); 660f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(tb2); 661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 662f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(result); 663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(args); 664f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PySys_WriteStderr("sys.excepthook is missing\n"); 666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Display(exception, v, tb); 667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(exception); 669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(tb); 671b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee} 672b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee 673e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic void 674e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonprint_exception(PyObject *f, PyObject *value) 675b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee{ 676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int err = 0; 677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *type, *tb; 6781c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis _Py_IDENTIFIER(print_file_and_line); 679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!PyExceptionInstance_Check(value)) { 68152ce3b04d094b568c303968b2273e2322b422e38Victor Stinner err = PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f); 68252ce3b04d094b568c303968b2273e2322b422e38Victor Stinner err += PyFile_WriteString(Py_TYPE(value)->tp_name, f); 68352ce3b04d094b568c303968b2273e2322b422e38Victor Stinner err += PyFile_WriteString(" found\n", f); 68452ce3b04d094b568c303968b2273e2322b422e38Victor Stinner if (err) 68552ce3b04d094b568c303968b2273e2322b422e38Victor Stinner PyErr_Clear(); 686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return; 687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(value); 690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fflush(stdout); 691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou type = (PyObject *) Py_TYPE(value); 692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou tb = PyException_GetTraceback(value); 693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (tb && tb != Py_None) 694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = PyTraceBack_Print(tb, f); 695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err == 0 && 6961c67dd9b154d57baf58ed081767e199af1e84923Martin v. Löwis _PyObject_HasAttrId(value, &PyId_print_file_and_line)) 697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou { 698efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner PyObject *message, *filename, *text; 699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int lineno, offset; 700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!parse_syntax_error(value, &message, &filename, 701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou &lineno, &offset, &text)) 702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 704efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner PyObject *line; 705efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner 706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(value); 707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou value = message; 708efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner 709efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner line = PyUnicode_FromFormat(" File \"%U\", line %d\n", 710efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner filename, lineno); 711efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner Py_DECREF(filename); 712efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner if (line != NULL) { 713efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner PyFile_WriteObject(line, f, Py_PRINT_RAW); 714efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner Py_DECREF(line); 715efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner } 716efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner 717efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner if (text != NULL) { 718efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner print_error_text(f, offset, text); 719efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner Py_DECREF(text); 720efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner } 721efa7a0e155e508f21dd7ace708b311066637538fVictor Stinner 722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Can't be bothered to check all those 723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyFile_WriteString() calls */ 724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PyErr_Occurred()) 725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = -1; 726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err) { 729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Don't do anything else */ 730f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 731f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject* moduleName; 733f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char* className; 734bd928fef428e48084ff29ece0e21d07ad86d0793Martin v. Löwis _Py_IDENTIFIER(__module__); 735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou assert(PyExceptionClass_Check(type)); 736f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou className = PyExceptionClass_Name(type); 737f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (className != NULL) { 738f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *dot = strrchr(className, '.'); 739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (dot != NULL) 740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou className = dot+1; 741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 742f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 7431ee1b6fe0dd7baca0da50e365929d03d42128705Martin v. Löwis moduleName = _PyObject_GetAttrId(type, &PyId___module__); 744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (moduleName == NULL || !PyUnicode_Check(moduleName)) 745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou { 74613b21bd749aef0f6b18cec0e7e5d1d3e643f106aVictor Stinner Py_XDECREF(moduleName); 747f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = PyFile_WriteString("<unknown>", f); 748f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 750bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner if (_PyUnicode_CompareWithId(moduleName, &PyId_builtins) != 0) 751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou { 752937114f7043d6a52172a34fe04febcc5ed0eaed9Victor Stinner err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW); 753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err += PyFile_WriteString(".", f); 754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(moduleName); 756f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 757f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err == 0) { 758f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (className == NULL) 759f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = PyFile_WriteString("<unknown>", f); 760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else 761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = PyFile_WriteString(className, f); 762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 763f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 764f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err == 0 && (value != Py_None)) { 765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *s = PyObject_Str(value); 766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* only print colon if the str() of the 767f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou object is not the empty string 768f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 7693263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter if (s == NULL) { 7703263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter PyErr_Clear(); 771f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = -1; 7723263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter PyFile_WriteString(": <exception str() failed>", f); 7733263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter } 774f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (!PyUnicode_Check(s) || 775e251d6d69d27c0a9e4621fd98711db8958920409Victor Stinner PyUnicode_GetLength(s) != 0) 776f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = PyFile_WriteString(": ", f); 777f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err == 0) 778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err = PyFile_WriteObject(s, f, Py_PRINT_RAW); 779f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(s); 780f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 781f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* try to write a newline in any case */ 7823263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter if (err < 0) { 7833263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter PyErr_Clear(); 7843263f6874a96c7b2862bd91460a28e66ac039dbeMartin Panter } 785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err += PyFile_WriteString("\n", f); 786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(tb); 787f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(value); 788f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* If an error happened here, don't show it. 789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou XXX This is wrong, but too many callers rely on this behavior. */ 790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err != 0) 791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 7921984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 7931984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 794e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic const char *cause_message = 795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "\nThe above exception was the direct cause " 796f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "of the following exception:\n\n"; 797e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson 798e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic const char *context_message = 799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "\nDuring handling of the above exception, " 800f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "another exception occurred:\n\n"; 801e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson 802e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonstatic void 803e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonprint_exception_recursive(PyObject *f, PyObject *value, PyObject *seen) 804e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson{ 805f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int err = 0, res; 806f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *cause, *context; 807f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 808f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (seen != NULL) { 809f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Exception chaining */ 810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (PySet_Add(seen, value) == -1) 811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (PyExceptionInstance_Check(value)) { 813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou cause = PyException_GetCause(value); 814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou context = PyException_GetContext(value); 815d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson if (cause) { 816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou res = PySet_Contains(seen, cause); 817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (res == -1) 818f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 819f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (res == 0) { 820f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou print_exception_recursive( 821f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou f, cause, seen); 822f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err |= PyFile_WriteString( 823f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou cause_message, f); 824f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 825f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 826d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson else if (context && 827d5a1c44455d969968f453f029727bfc45e4ce0a9Benjamin Peterson !((PyBaseExceptionObject *)value)->suppress_context) { 828f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou res = PySet_Contains(seen, context); 829f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (res == -1) 830f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 831f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (res == 0) { 832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou print_exception_recursive( 833f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou f, context, seen); 834f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err |= PyFile_WriteString( 835f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou context_message, f); 836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(context); 839f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(cause); 840f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 841f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 842f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou print_exception(f, value); 843f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err != 0) 844f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 845e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson} 846e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson 847e65282114e96efb9e7eee77c57244943b746f6feBenjamin Petersonvoid 848e65282114e96efb9e7eee77c57244943b746f6feBenjamin PetersonPyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) 849e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson{ 850f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *seen; 851bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner PyObject *f = _PySys_GetObjectId(&PyId_stderr); 85224201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou if (PyExceptionInstance_Check(value) 85324201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou && tb != NULL && PyTraceBack_Check(tb)) { 85424201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou /* Put the traceback on the exception, otherwise it won't get 85524201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou displayed. See issue #18776. */ 85624201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou PyObject *cur_tb = PyException_GetTraceback(value); 85724201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou if (cur_tb == NULL) 85824201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou PyException_SetTraceback(value, tb); 85924201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou else 86024201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou Py_DECREF(cur_tb); 86124201d497cf23d399cceadad8058261c13ae536fAntoine Pitrou } 862f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (f == Py_None) { 863f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* pass */ 864f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 865f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (f == NULL) { 866f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou _PyObject_Dump(value); 867f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "lost sys.stderr\n"); 868f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 869f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 870f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* We choose to ignore seen being possibly NULL, and report 871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou at least the main exception (it could be a MemoryError). 872f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou */ 873f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou seen = PySet_New(NULL); 874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (seen == NULL) 875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou print_exception_recursive(f, value, seen); 877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(seen); 878f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 879e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson} 880e65282114e96efb9e7eee77c57244943b746f6feBenjamin Peterson 88182598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject * 8824d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas WoutersPyRun_StringFlags(const char *str, int start, PyObject *globals, 883f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *locals, PyCompilerFlags *flags) 8841984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 885f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *ret = NULL; 886f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 88795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyArena *arena; 88895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyObject *filename; 88995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 89095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner filename = _PyUnicode_FromId(&PyId_string); /* borrowed */ 89195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (filename == NULL) 89295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner return NULL; 89395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 89495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner arena = PyArena_New(); 895f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (arena == NULL) 896f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 89798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum 89895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); 899f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (mod != NULL) 90095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner ret = run_mod(mod, filename, globals, locals, flags, arena); 901f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 902f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return ret; 903bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton} 904bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton 905bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy HyltonPyObject * 90695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor StinnerPyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globals, 907f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *locals, int closeit, PyCompilerFlags *flags) 908f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 90995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyObject *ret = NULL; 910f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 91195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyArena *arena = NULL; 91295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyObject *filename; 91395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 91495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 91595701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (filename == NULL) 91695701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner goto exit; 91795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 91895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner arena = PyArena_New(); 919f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (arena == NULL) 92095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner goto exit; 921f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 92295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner mod = PyParser_ASTFromFileObject(fp, filename, NULL, start, 0, 0, 92395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner flags, NULL, arena); 924f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (closeit) 925f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fclose(fp); 926f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (mod == NULL) { 92795701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner goto exit; 928f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 929f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou ret = run_mod(mod, filename, globals, locals, flags, arena); 93095701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner 93195701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerexit: 93295701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner Py_XDECREF(filename); 93395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner if (arena != NULL) 93495701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyArena_Free(arena); 935f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return ret; 936bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton} 937bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton 9386c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossumstatic void 9396c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossumflush_io(void) 9406c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum{ 941f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *f, *r; 942f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *type, *value, *traceback; 9439ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc 944f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* Save the current exception */ 945f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Fetch(&type, &value, &traceback); 9469ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc 947bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner f = _PySys_GetObjectId(&PyId_stderr); 948f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (f != NULL) { 949afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis r = _PyObject_CallMethodId(f, &PyId_flush, ""); 950f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (r) 951f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(r); 952f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else 953f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 954f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 955bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner f = _PySys_GetObjectId(&PyId_stdout); 956f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (f != NULL) { 957afe55bba33a20f87a58f940186359237064b428fMartin v. Löwis r = _PyObject_CallMethodId(f, &PyId_flush, ""); 958f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (r) 959f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(r); 960f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else 961f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Clear(); 962f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 9639ed77358d618e4c65fbe5df67a87618be29fc391Amaury Forgeot d'Arc 964f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Restore(type, value, traceback); 9656c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum} 9666c193fa09d38b2eb34a3607381c1cbb495e34d6fGuido van Rossum 96782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject * 96895701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinnerrun_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals, 96995701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner PyCompilerFlags *flags, PyArena *arena) 9701984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 971f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCodeObject *co; 972f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *v; 97395701bdf40a00b3eb38aa4270b512ebac12fd87bVictor Stinner co = PyAST_CompileObject(mod, filename, flags, -1, arena); 974f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (co == NULL) 975f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 9764d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis v = PyEval_EvalCode((PyObject*)co, globals, locals); 977f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(co); 978f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return v; 9791984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 9801984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 98182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject * 9824d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Woutersrun_pyc_file(FILE *fp, const char *filename, PyObject *globals, 983f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *locals, PyCompilerFlags *flags) 984f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 985f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCodeObject *co; 986f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *v; 987f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou long magic; 988f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou long PyImport_GetMagicNumber(void); 989f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 990f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou magic = PyMarshal_ReadLongFromFile(fp); 991f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (magic != PyImport_GetMagicNumber()) { 9925200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner if (!PyErr_Occurred()) 9935200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner PyErr_SetString(PyExc_RuntimeError, 9945200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner "Bad magic number in .pyc file"); 995f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 996f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 9975136ac0ca21a05691978df8d0650f902c8ca3463Antoine Pitrou /* Skip mtime and size */ 9985136ac0ca21a05691978df8d0650f902c8ca3463Antoine Pitrou (void) PyMarshal_ReadLongFromFile(fp); 999f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou (void) PyMarshal_ReadLongFromFile(fp); 10005200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner if (PyErr_Occurred()) 10015200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner return NULL; 10025200f5502407045b747b97168b80d63a3cfafd4fVictor Stinner 1003f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou v = PyMarshal_ReadLastObjectFromFile(fp); 1004f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v == NULL || !PyCode_Check(v)) { 1005f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 1006f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_SetString(PyExc_RuntimeError, 1007f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "Bad code object in .pyc file"); 1008f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 1009f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1010f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou co = (PyCodeObject *)v; 10114d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis v = PyEval_EvalCode((PyObject*)co, globals, locals); 1012f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v && flags) 1013f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags->cf_flags |= (co->co_flags & PyCF_MASK); 1014f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_DECREF(co); 1015f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return v; 1016fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum} 1017fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum 101882598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject * 101914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_CompileStringObject(const char *str, PyObject *filename, int start, 102014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyCompilerFlags *flags, int optimize) 1021f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 1022f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCodeObject *co; 1023f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 1024f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena *arena = PyArena_New(); 1025f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (arena == NULL) 1026f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 1027f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 102814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod = PyParser_ASTFromStringObject(str, filename, start, flags, arena); 1029f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (mod == NULL) { 1030f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 1031f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 1032f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1033f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags && (flags->cf_flags & PyCF_ONLY_AST)) { 1034f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *result = PyAST_mod2obj(mod); 1035f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 1036f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return result; 1037f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 103814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner co = PyAST_CompileObject(mod, filename, flags, optimize, arena); 1039f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 1040f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return (PyObject *)co; 10415b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum} 10425b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum 104314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyObject * 104414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_CompileStringExFlags(const char *str, const char *filename_str, int start, 104514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyCompilerFlags *flags, int optimize) 104614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{ 104714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyObject *filename, *co; 104814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 104914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner if (filename == NULL) 105014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return NULL; 105114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner co = Py_CompileStringObject(str, filename, start, flags, optimize); 105214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner Py_DECREF(filename); 105314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return co; 105414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner} 105514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner 10564d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis/* For use in Py_LIMITED_API */ 10574d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis#undef Py_CompileString 10584d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. LöwisPyObject * 10594d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. LöwisPyCompileString(const char *str, const char *filename, int start) 10604d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis{ 10614d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis return Py_CompileStringFlags(str, filename, start, NULL); 10624d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis} 10634d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis 10644b38da664c107bc08768235a66621429beef5444Jeremy Hyltonstruct symtable * 106514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_SymtableStringObject(const char *str, PyObject *filename, int start) 10664b38da664c107bc08768235a66621429beef5444Jeremy Hylton{ 1067f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou struct symtable *st; 1068f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 1069f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags flags; 107014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyArena *arena; 107114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner 107214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner arena = PyArena_New(); 1073f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (arena == NULL) 1074f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 10750e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters 1076f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags.cf_flags = 0; 107714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod = PyParser_ASTFromStringObject(str, filename, start, &flags, arena); 1078f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (mod == NULL) { 1079f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 1080f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return NULL; 1081f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 108214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner st = PySymtable_BuildObject(mod, filename, 0); 1083f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyArena_Free(arena); 1084f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return st; 10854b38da664c107bc08768235a66621429beef5444Jeremy Hylton} 10864b38da664c107bc08768235a66621429beef5444Jeremy Hylton 108714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinnerstruct symtable * 108814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPy_SymtableString(const char *str, const char *filename_str, int start) 108914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{ 109014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyObject *filename; 109114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner struct symtable *st; 109214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner 109314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 109414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner if (filename == NULL) 109514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return NULL; 109614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner st = Py_SymtableStringObject(str, filename, start); 109714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner Py_DECREF(filename); 109814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return st; 109914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner} 110014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner 11013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Preferred access to parser is through AST. */ 11023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty 110314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromStringObject(const char *s, PyObject *filename, int start, 110414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyCompilerFlags *flags, PyArena *arena) 1105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 1106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 1107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags localflags; 1108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou perrdetail err; 1109f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int iflags = PARSER_FLAGS(flags); 1110f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 111114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner node *n = PyParser_ParseStringObject(s, filename, 111214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner &_PyParser_Grammar, start, &err, 111314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner &iflags); 1114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags == NULL) { 1115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou localflags.cf_flags = 0; 1116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags = &localflags; 1117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (n) { 1119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags->cf_flags |= iflags & PyCF_MASK; 112014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod = PyAST_FromNodeObject(n, flags, filename, arena); 1121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyNode_Free(n); 1122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 1124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err_input(&err); 11257f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner mod = NULL; 1126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 11277f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner err_free(&err); 11287f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner return mod; 11293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 11303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 11313e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty 113214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromString(const char *s, const char *filename_str, int start, 113314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyCompilerFlags *flags, PyArena *arena) 113414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{ 113514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyObject *filename; 113614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod_ty mod; 113714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 113814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner if (filename == NULL) 113914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return NULL; 114014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod = PyParser_ASTFromStringObject(s, filename, start, flags, arena); 114114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner Py_DECREF(filename); 114214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return mod; 114314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner} 114414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner 114514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinnermod_ty 114614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromFileObject(FILE *fp, PyObject *filename, const char* enc, 114714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner int start, char *ps1, 114814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner char *ps2, PyCompilerFlags *flags, int *errcode, 114914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyArena *arena) 1150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou{ 1151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou mod_ty mod; 1152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags localflags; 1153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou perrdetail err; 1154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int iflags = PARSER_FLAGS(flags); 1155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 115614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner node *n = PyParser_ParseFileObject(fp, filename, enc, 115714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner &_PyParser_Grammar, 115814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner start, ps1, ps2, &err, &iflags); 1159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (flags == NULL) { 1160f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou localflags.cf_flags = 0; 1161f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags = &localflags; 1162f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (n) { 1164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou flags->cf_flags |= iflags & PyCF_MASK; 116514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod = PyAST_FromNodeObject(n, flags, filename, arena); 1166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyNode_Free(n); 1167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 1169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err_input(&err); 1170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (errcode) 1171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou *errcode = err.error; 11727f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner mod = NULL; 1173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 11747f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner err_free(&err); 11757f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner return mod; 11763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 11773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 117814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinnermod_ty 117914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor StinnerPyParser_ASTFromFile(FILE *fp, const char *filename_str, const char* enc, 118014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner int start, char *ps1, 118114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner char *ps2, PyCompilerFlags *flags, int *errcode, 118214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyArena *arena) 118314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner{ 118414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod_ty mod; 118514e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner PyObject *filename; 118614e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner filename = PyUnicode_DecodeFSDefault(filename_str); 118714e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner if (filename == NULL) 118814e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return NULL; 118914e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner mod = PyParser_ASTFromFileObject(fp, filename, enc, start, ps1, ps2, 119014e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner flags, errcode, arena); 119114e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner Py_DECREF(filename); 119214e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner return mod; 119314e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner} 119414e461d5b92000ec4e89182fa25ab0d5b5b31234Victor Stinner 1195a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsefile -- return node or set exception */ 11961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1197a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode * 119895292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) 11991984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 1200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou perrdetail err; 1201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou node *n = PyParser_ParseFileFlags(fp, filename, NULL, 1202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou &_PyParser_Grammar, 1203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou start, NULL, NULL, &err, flags); 1204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (n == NULL) 1205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err_input(&err); 12067f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner err_free(&err); 12074d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouters 1208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return n; 12091984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 12101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1211a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsestring -- return node or set exception */ 12121984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1213a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode * 121495292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlags(const char *str, int start, int flags) 12151984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 1216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou perrdetail err; 1217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, 1218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou start, &err, flags); 1219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (n == NULL) 1220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err_input(&err); 12217f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner err_free(&err); 1222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return n; 1223a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum} 1224a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum 1225fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Petersnode * 122695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename, 1227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou int start, int flags) 12286b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{ 1229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou perrdetail err; 1230f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou node *n = PyParser_ParseStringFlagsFilename(str, filename, 1231f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou &_PyParser_Grammar, start, &err, flags); 1232f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (n == NULL) 1233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err_input(&err); 12347f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner err_free(&err); 1235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return n; 12366b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller} 12376b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller 12386b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Hellernode * 123995292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFilename(const char *str, const char *filename, int start) 12406b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{ 1241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0); 12426b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller} 12436b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller 124466ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum/* May want to move a more generalized form of this to parsetok.c or 124566ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum even parser modules. */ 124666ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum 124766ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossumvoid 12487f2fee36401f7b987a368fe043637b3ae7116600Victor StinnerPyParser_ClearError(perrdetail *err) 12497f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner{ 12507f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner err_free(err); 12517f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner} 12527f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner 12537f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnervoid 125466ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van RossumPyParser_SetError(perrdetail *err) 125566ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum{ 1256f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err_input(err); 125766ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum} 125866ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum 12597f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnerstatic void 12607f2fee36401f7b987a368fe043637b3ae7116600Victor Stinnererr_free(perrdetail *err) 12617f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner{ 12627f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner Py_CLEAR(err->filename); 12637f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner} 12647f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner 1265a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Set the error appropriate to the given input error code (see errcode.h) */ 1266a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum 1267a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumstatic void 1268f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterserr_input(perrdetail *err) 1269a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum{ 1270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *v, *w, *errtype, *errtext; 1271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *msg_obj = NULL; 1272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou char *msg = NULL; 127365fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka int offset = err->offset; 12744c7c8c30235e42c47500b91549c2b6154b61f883Victor Stinner 1275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtype = PyExc_SyntaxError; 1276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou switch (err->error) { 1277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_ERROR: 1278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return; 1279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_SYNTAX: 1280f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtype = PyExc_IndentationError; 1281f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err->expected == INDENT) 1282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "expected an indented block"; 1283f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (err->token == INDENT) 1284f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unexpected indent"; 1285f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else if (err->token == DEDENT) 1286f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unexpected unindent"; 1287f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else { 1288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtype = PyExc_SyntaxError; 1289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "invalid syntax"; 1290f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1291f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1292f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_TOKEN: 1293f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "invalid token"; 1294f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1295f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_EOFS: 1296f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "EOF while scanning triple-quoted string literal"; 1297f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1298f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_EOLS: 1299f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "EOL while scanning string literal"; 1300f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1301f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_INTR: 1302f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!PyErr_Occurred()) 1303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_SetNone(PyExc_KeyboardInterrupt); 1304f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto cleanup; 1305f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_NOMEM: 1306f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_NoMemory(); 1307f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou goto cleanup; 1308f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_EOF: 1309f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unexpected EOF while parsing"; 1310f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1311f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_TABSPACE: 1312f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtype = PyExc_TabError; 1313f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "inconsistent use of tabs and spaces in indentation"; 1314f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1315f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_OVERFLOW: 1316f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "expression too long"; 1317f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1318f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_DEDENT: 1319f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtype = PyExc_IndentationError; 1320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unindent does not match any outer indentation level"; 1321f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_TOODEEP: 1323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtype = PyExc_IndentationError; 1324f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "too many levels of indentation"; 1325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_DECODE: { 1327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject *type, *value, *tb; 1328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_Fetch(&type, &value, &tb); 1329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unknown decode error"; 1330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (value != NULL) 1331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg_obj = PyObject_Str(value); 1332f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(type); 1333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(value); 1334f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(tb); 1335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_LINECONT: 1338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unexpected character after line continuation character"; 1339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou 1341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou case E_IDENTIFIER: 1342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "invalid character in identifier"; 1343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1344fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge case E_BADSINGLE: 1345fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge msg = "multiple statements found while compiling a single statement"; 1346fa21bf015d4e9cb0c010fde28db0c344174634d1Meador Inge break; 1347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou default: 1348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou fprintf(stderr, "error=%d\n", err->error); 1349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou msg = "unknown parsing error"; 1350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou break; 1351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 1352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* err->text may not be UTF-8 in case of decoding errors. 1353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Explicitly convert to an object. */ 1354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!err->text) { 1355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou errtext = Py_None; 1356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_INCREF(Py_None); 1357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else { 135865fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka errtext = PyUnicode_DecodeUTF8(err->text, err->offset, 1359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou "replace"); 136065fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka if (errtext != NULL) { 136165fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka Py_ssize_t len = strlen(err->text); 136265fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka offset = (int)PyUnicode_GET_LENGTH(errtext); 136365fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka if (len != err->offset) { 136465fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka Py_DECREF(errtext); 136565fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka errtext = PyUnicode_DecodeUTF8(err->text, len, 136665fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka "replace"); 136765fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka } 136865fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka } 1369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 13707f2fee36401f7b987a368fe043637b3ae7116600Victor Stinner v = Py_BuildValue("(OiiN)", err->filename, 137165fd0592fb3845c17b27c441380553fc22f78812Serhiy Storchaka err->lineno, offset, errtext); 1372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (v != NULL) { 1373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (msg_obj) 1374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou w = Py_BuildValue("(OO)", msg_obj, v); 1375f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou else 1376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou w = Py_BuildValue("(sO)", msg, v); 1377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } else 1378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou w = NULL; 1379f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(v); 1380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyErr_SetObject(errtype, w); 1381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(w); 13823dbca81c9b7903e8d808089a6a76dc97807b3df3Georg Brandlcleanup: 1383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_XDECREF(msg_obj); 1384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (err->text != NULL) { 1385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyObject_FREE(err->text); 1386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou err->text = NULL; 1387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 13881984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 13891984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 13902f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 1391c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#if defined(USE_STACKCHECK) 1392c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#if defined(WIN32) && defined(_MSC_VER) 1393c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 1394c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware/* Stack checking for Microsoft C */ 1395c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 1396c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#include <malloc.h> 1397c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#include <excpt.h> 1398c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 1399c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware/* 1400c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware * Return non-zero when we run out of memory on the stack; zero otherwise. 1401c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware */ 1402c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Wareint 1403c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary WarePyOS_CheckStack(void) 1404c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware{ 1405c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware __try { 1406c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware /* alloca throws a stack overflow exception if there's 1407c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware not enough space left on the stack */ 1408c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware alloca(PYOS_STACK_MARGIN * sizeof(void*)); 1409c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware return 0; 1410c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ? 1411c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware EXCEPTION_EXECUTE_HANDLER : 1412c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware EXCEPTION_CONTINUE_SEARCH) { 1413c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware int errcode = _resetstkoflw(); 1414c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware if (errcode == 0) 1415c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware { 1416c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware Py_FatalError("Could not reset the stack!"); 1417c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware } 1418c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware } 1419c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware return 1; 1420c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware} 1421c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 1422c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#endif /* WIN32 && _MSC_VER */ 1423c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 1424c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware/* Alternate implementations can be added here... */ 1425c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 1426c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware#endif /* USE_STACKCHECK */ 1427c4821d62b4f777a530f20aecd03fd819c4f4a009Zachary Ware 142846f50726a0047ae81d478c3a206f587b8f35ed08Martin Panter/* Deprecated C API functions still provided for binary compatibility */ 14293e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 14303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseFile 143149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(node *) 14323e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseFile(FILE *fp, const char *filename, int start) 14333e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{ 1434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyParser_SimpleParseFileFlags(fp, filename, start, 0); 14353e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 14363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 143749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyParser_SimpleParseString 143849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(node *) 14393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseString(const char *str, int start) 14403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{ 1441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyParser_SimpleParseStringFlags(str, start, 0); 14423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 144349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 144449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFile 144549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 144649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFile(FILE *fp, const char *name) 144749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_AnyFileExFlags(fp, name, 0, NULL); 144949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 145049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 145149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFileEx 145249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 145349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFileEx(FILE *fp, const char *name, int closeit) 145449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_AnyFileExFlags(fp, name, closeit, NULL); 145649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 145749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 145849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_AnyFileFlags 145949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 146049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags) 146149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_AnyFileExFlags(fp, name, 0, flags); 146349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 146449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 146549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_File 146649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *) 146749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l) 146849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL); 147049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 147149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 147249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_FileEx 147349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *) 147449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c) 147549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_FileExFlags(fp, p, s, g, l, c, NULL); 147749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 147849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 147949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_FileFlags 148049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *) 148149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, 1482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyCompilerFlags *flags) 148349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_FileExFlags(fp, p, s, g, l, 0, flags); 148549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 148649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 148749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleFile 148849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 148949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleFile(FILE *f, const char *p) 149049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_SimpleFileExFlags(f, p, 0, NULL); 149249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 149349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 149449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleFileEx 149549fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 149649fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleFileEx(FILE *f, const char *p, int c) 149749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1498f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_SimpleFileExFlags(f, p, c, NULL); 149949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 150049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 150149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 150249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_String 150349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *) 150449fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_String(const char *str, int s, PyObject *g, PyObject *l) 150549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1506f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_StringFlags(str, s, g, l, NULL); 150749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 150849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 150949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_SimpleString 151049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 151149fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_SimpleString(const char *s) 151249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1513f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_SimpleStringFlags(s, NULL); 151449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 151549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 151649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef Py_CompileString 151749fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(PyObject *) 151849fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPy_CompileString(const char *str, const char *p, int s) 151949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 15208334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl return Py_CompileStringExFlags(str, p, s, NULL, -1); 15218334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl} 15228334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl 15238334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl#undef Py_CompileStringFlags 15248334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPyAPI_FUNC(PyObject *) 15258334fd9285a8e9f0864b0453ae738fe3f6893b21Georg BrandlPy_CompileStringFlags(const char *str, const char *p, int s, 15268334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl PyCompilerFlags *flags) 15278334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl{ 15288334fd9285a8e9f0864b0453ae738fe3f6893b21Georg Brandl return Py_CompileStringExFlags(str, p, s, flags, -1); 152949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 153049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 153149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_InteractiveOne 153249fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 153349fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_InteractiveOne(FILE *f, const char *p) 153449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_InteractiveOneFlags(f, p, NULL); 153649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 153749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 153849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#undef PyRun_InteractiveLoop 153949fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyAPI_FUNC(int) 154049fd7fa4431da299196d74087df4a04f99f9c46fThomas WoutersPyRun_InteractiveLoop(FILE *f, const char *p) 154149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters{ 1542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyRun_InteractiveLoopFlags(f, p, NULL); 154349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 154449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 154549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 154649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 154749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 1548