pythonrun.c revision 3e0055f8c65c407e74ce476b8e2b1fb889723514
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" 71984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "grammar.h" 81984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "node.h" 985f363990cbd6df21015eebdc171c533176e3407Fred Drake#include "token.h" 101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "parsetok.h" 111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "errcode.h" 123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "code.h" 131984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#include "compile.h" 144b38da664c107bc08768235a66621429beef5444Jeremy Hylton#include "symtable.h" 153e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#include "ast.h" 16ff4949eeee7f86117d4a69599777ff5564315e39Guido van Rossum#include "eval.h" 17fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum#include "marshal.h" 181984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 19a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum#include <signal.h> 20a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum 2173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#ifdef HAVE_LANGINFO_H 2273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <locale.h> 2373d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#include <langinfo.h> 2473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif 2573d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis 266238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS 27a44823b7764281d398215564f2070257d08d0855Guido van Rossum#undef BYTE 28a44823b7764281d398215564f2070257d08d0855Guido van Rossum#include "windows.h" 29a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif 30a44823b7764281d398215564f2070257d08d0855Guido van Rossum 31f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern char *Py_GetPath(void); 321984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 3382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumextern grammar _PyParser_Grammar; /* From graminit.c */ 341984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 35b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */ 36dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initmain(void); 37dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initsite(void); 383e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *run_err_mod(mod_ty, const char *, PyObject *, PyObject *, 399f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton PyCompilerFlags *); 403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonstatic PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, 419f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton PyCompilerFlags *); 4295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisstatic PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, 43bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags *); 44dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void err_input(perrdetail *); 45dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void initsigs(void); 46dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void call_sys_exitfunc(void); 47dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersstatic void call_ll_exitfuncs(void); 48f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern void _PyUnicode_Init(void); 49f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersextern void _PyUnicode_Fini(void); 50c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum 518d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#ifdef WITH_THREAD 528d98d2cb95ac37147a4de5a119869211e8351324Mark Hammondextern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); 538d98d2cb95ac37147a4de5a119869211e8351324Mark Hammondextern void _PyGILState_Fini(void); 548d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#endif /* WITH_THREAD */ 558d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond 5682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumint Py_DebugFlag; /* Needed by parser.c */ 5782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumint Py_VerboseFlag; /* Needed by import.c */ 587433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossumint Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */ 59dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossumint Py_NoSiteFlag; /* Suppress 'import site' */ 603ce096459e348c95c2c3348f8d84720f25c1a4c9Barry Warsawint Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ 61a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumint Py_FrozenFlag; /* Needed by getpath.c */ 62b16d197d661915bf16c84e06cb07e1f7a934ad10Guido van Rossumint Py_UnicodeFlag = 0; /* Needed by compile.c */ 637d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauerint Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ 643caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Peters/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed, 653caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Peters on the command line, and is used in 2.2 by ceval.c to make all "/" divisions 663caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Peters true divisions (which they will be in 2.3). */ 673caca2326e04ea3c0d1f8c6a588e646d8201af38Tim Petersint _Py_QnewFlag = 0; 681984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 69a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond/* Reference to 'warnings' module, to avoid importing it 70edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond on the fly when the import lock may be held. See 683658/771097 71a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond*/ 72edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammondstatic PyObject *warnings_module = NULL; 73edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond 74edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond/* Returns a borrowed reference to the 'warnings' module, or NULL. 75edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond If the module is returned, it is guaranteed to have been obtained 76edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond without acquiring the import lock 77edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond*/ 78a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. LöwisPyObject *PyModule_GetWarningsModule(void) 79edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond{ 80edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond PyObject *typ, *val, *tb; 81edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond PyObject *all_modules; 82edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond /* If we managed to get the module at init time, just use it */ 83edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond if (warnings_module) 84edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond return warnings_module; 85edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond /* If it wasn't available at init time, it may be available 86edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond now in sys.modules (common scenario is frozen apps: import 87edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond at init time fails, but the frozen init code sets up sys.path 88edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond correctly, then does an implicit import of warnings for us 89edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond */ 90edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond /* Save and restore any exceptions */ 91edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond PyErr_Fetch(&typ, &val, &tb); 92edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond 935f4e8ca3767db1b9e2b783d0dacf15ea1fbf0589Mark Hammond all_modules = PySys_GetObject("modules"); 94edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond if (all_modules) { 95edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond warnings_module = PyDict_GetItemString(all_modules, "warnings"); 96edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond /* We keep a ref in the global */ 97edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond Py_XINCREF(warnings_module); 98edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond } 99edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond PyErr_Restore(typ, val, tb); 100edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond return warnings_module; 101edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond} 102a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond 10325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossumstatic int initialized = 0; 10425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 1057e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters/* API to access the initialized flag -- useful for esoteric use */ 106e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum 107e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossumint 108f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_IsInitialized(void) 109e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum{ 110e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum return initialized; 111e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum} 112e3c0d5eb3452f8bfcc15bf1e2985dcc83fa01901Guido van Rossum 11325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Global initializations. Can be undone by Py_Finalize(). Don't 11425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum call this twice without an intervening Py_Finalize() call. When 11525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum initializations fail, a fatal error is issued and the function does 11625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum not return. On return, the first thread and interpreter state have 11725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum been created. 11825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 11925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Locking: you must hold the interpreter lock while calling this. 12025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum (If the lock has not yet been initialized, that's equivalent to 12125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum having the lock, but you cannot use multiple threads.) 12225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 12325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/ 1241984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1259abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossumstatic int 1269abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossumadd_flag(int flag, const char *envs) 1279abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum{ 1289abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum int env = atoi(envs); 1299abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum if (flag < env) 1309abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum flag = env; 1319abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum if (flag < 1) 1329abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum flag = 1; 1339abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum return flag; 1349abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum} 1359abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum 1361984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid 137336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. LöwisPy_InitializeEx(int install_sigs) 1381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 13925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState *interp; 14025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyThreadState *tstate; 14125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyObject *bimod, *sysmod; 14225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum char *p; 143a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) 144a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis char *codeset; 145a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis char *saved_locale; 146a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis PyObject *sys_stream, *sys_isatty; 147a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis#endif 14870d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum extern void _Py_ReadyTypes(void); 14925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 150dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum if (initialized) 151aa61505fd222fb15cc2507c8a2a44dcfce0c971fGuido van Rossum return; 152dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum initialized = 1; 153d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters 1547d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0') 1559abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum Py_DebugFlag = add_flag(Py_DebugFlag, p); 1567d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0') 1579abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum Py_VerboseFlag = add_flag(Py_VerboseFlag, p); 1587d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0') 1599abaf4d3b78d756e4c0e30b7accb70e531dd9085Guido van Rossum Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); 16025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 16125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp = PyInterpreterState_New(); 16225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (interp == NULL) 16325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_Initialize: can't make first interpreter"); 16425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 16525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum tstate = PyThreadState_New(interp); 16625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (tstate == NULL) 16725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_Initialize: can't make first thread"); 16825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum (void) PyThreadState_Swap(tstate); 1691984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 17070d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum _Py_ReadyTypes(); 171528b7eb0b0fa5a6bbbf5f3dfbfb7c356edaf031cGuido van Rossum 172b2501f4cd18f65cc671482ceb1abe88c289b664cNeal Norwitz if (!_PyFrame_Init()) 173c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz Py_FatalError("Py_Initialize: can't init frames"); 174c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz 175b2501f4cd18f65cc671482ceb1abe88c289b664cNeal Norwitz if (!_PyInt_Init()) 176c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz Py_FatalError("Py_Initialize: can't init ints"); 177c91ed400e053dc9f11dd30c84e2bb611999dce50Neal Norwitz 178ba283e2b7f3d970246fbd53981b18234b6ca447cMichael W. Hudson _PyFloat_Init(); 179ba283e2b7f3d970246fbd53981b18234b6ca447cMichael W. Hudson 18025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp->modules = PyDict_New(); 18125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (interp->modules == NULL) 18225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_Initialize: can't make modules dictionary"); 18325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 184339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#ifdef Py_USING_UNICODE 185c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum /* Init Unicode implementation; relies on the codec registry */ 186c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum _PyUnicode_Init(); 187339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis#endif 188c94044c11d5e1f61443163d1c5ea44019d7c5871Guido van Rossum 189f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw bimod = _PyBuiltin_Init(); 19025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (bimod == NULL) 19125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_Initialize: can't initialize __builtin__"); 1924a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum interp->builtins = PyModule_GetDict(bimod); 1934a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum Py_INCREF(interp->builtins); 19425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 19525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum sysmod = _PySys_Init(); 19625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (sysmod == NULL) 19725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_Initialize: can't initialize sys"); 19825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp->sysdict = PyModule_GetDict(sysmod); 19925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_INCREF(interp->sysdict); 20025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum _PyImport_FixupExtension("sys", "sys"); 20182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PySys_SetPath(Py_GetPath()); 20225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyDict_SetItemString(interp->sysdict, "modules", 20325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp->modules); 20425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 2057c85ab829db9628a2f093767966cd92d6f71607bGuido van Rossum _PyImport_Init(); 2067c85ab829db9628a2f093767966cd92d6f71607bGuido van Rossum 207f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw /* initialize builtin exceptions */ 2086d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters _PyExc_Init(); 2095821bc5145437fd68f4ebc9dad01d1192462f60dBarry Warsaw _PyImport_FixupExtension("exceptions", "exceptions"); 210f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw 211035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw /* phase 2 of builtins */ 212963b871e86bd85b7fb3551fa9fac5363977fc43bBarry Warsaw _PyImport_FixupExtension("__builtin__", "__builtin__"); 213035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 21452e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum _PyImportHooks_Init(); 21552e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum 216336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis if (install_sigs) 217336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis initsigs(); /* Signal handling stuff, including initintr() */ 2186135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum 21925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum initmain(); /* Module __main__ */ 220dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum if (!Py_NoSiteFlag) 221dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum initsite(); /* Module site */ 2225bfba3aeb9f451599b89f6239467d485f4370b81Just van Rossum 2238d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond /* auto-thread-state API, if available */ 2248d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#ifdef WITH_THREAD 2258d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond _PyGILState_Init(interp, tstate); 2268d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond#endif /* WITH_THREAD */ 2278d98d2cb95ac37147a4de5a119869211e8351324Mark Hammond 228edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond warnings_module = PyImport_ImportModule("warnings"); 229edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond if (!warnings_module) 230edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond PyErr_Clear(); 23173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis 23273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) 23373d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis /* On Unix, set the file system encoding according to the 23473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis user's preference, if the CODESET names a well-known 23573d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis Python codec, and Py_FileSystemDefaultEncoding isn't 236a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis initialized by other means. Also set the encoding of 237a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis stdin and stdout if these are terminals. */ 238a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis 239f56d015a7123de2df3a32bc38f666a79dd8cab79Martin v. Löwis saved_locale = strdup(setlocale(LC_CTYPE, NULL)); 240a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis setlocale(LC_CTYPE, ""); 241a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis codeset = nl_langinfo(CODESET); 242a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (codeset && *codeset) { 243a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis PyObject *enc = PyCodec_Encoder(codeset); 244a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (enc) { 245a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis codeset = strdup(codeset); 246a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis Py_DECREF(enc); 247a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis } else { 248a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis codeset = NULL; 249a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis PyErr_Clear(); 250a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis } 251a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis } else 252a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis codeset = NULL; 253a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis setlocale(LC_CTYPE, saved_locale); 254f56d015a7123de2df3a32bc38f666a79dd8cab79Martin v. Löwis free(saved_locale); 255a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis 256a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (codeset) { 25768debc935b01b55ab4daf4032131101f86dc750eMichael W. Hudson sys_stream = PySys_GetObject("stdin"); 258a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); 259a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (!sys_isatty) 260a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis PyErr_Clear(); 261a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if(sys_isatty && PyObject_IsTrue(sys_isatty)) { 262a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (!PyFile_SetEncoding(sys_stream, codeset)) 263a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis Py_FatalError("Cannot set codeset of stdin"); 26473d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis } 265a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis Py_XDECREF(sys_isatty); 266a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis 267a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis sys_stream = PySys_GetObject("stdout"); 268a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); 269a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (!sys_isatty) 270a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis PyErr_Clear(); 271a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if(sys_isatty && PyObject_IsTrue(sys_isatty)) { 272a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (!PyFile_SetEncoding(sys_stream, codeset)) 273a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis Py_FatalError("Cannot set codeset of stdout"); 274a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis } 275a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis Py_XDECREF(sys_isatty); 276a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis 277a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis if (!Py_FileSystemDefaultEncoding) 278a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis Py_FileSystemDefaultEncoding = codeset; 279a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis else 280a2c17c58206cb3fc75bb5331a805663d635c62e2Martin v. Löwis free(codeset); 28173d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis } 28273d538b9c6d2f262a7d615248c84e509ebd64731Martin v. Löwis#endif 2836135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum} 2846135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum 285336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwisvoid 286336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. LöwisPy_Initialize(void) 287336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis{ 288336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis Py_InitializeEx(1); 289336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis} 290336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis 291336e85f56a87f2216855ca8a5771755f480ae7dbMartin v. Löwis 2922edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum#ifdef COUNT_ALLOCS 293dbd9ba6a6c19c3d06f5684b3384a934f740038dbTim Petersextern void dump_counts(void); 2942edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum#endif 2952edcf0d71c2938b4f7159bf586c2174326d57bd6Guido van Rossum 29625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Undo the effect of Py_Initialize(). 29725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 29825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Beware: if multiple interpreter and/or thread states exist, these 29925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum are not wiped out; only the current thread and interpreter state 30025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum are deleted. But since everything else is deleted, those other 30125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interpreter and thread states should no longer be used. 30225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 30325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum (XXX We should do better, e.g. wipe out all interpreters and 30425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum threads.) 30525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 30625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Locking: as above. 30725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 30825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/ 309a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum 310a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossumvoid 311f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_Finalize(void) 312a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum{ 31325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState *interp; 314a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum PyThreadState *tstate; 31525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 316dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum if (!initialized) 317aa61505fd222fb15cc2507c8a2a44dcfce0c971fGuido van Rossum return; 31825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 319384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters /* The interpreter is still entirely intact at this point, and the 320384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * exit funcs may be relying on that. In particular, if some thread 321384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * or exit func is still waiting to do an import, the import machinery 322384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * expects Py_IsInitialized() to return true. So don't say the 323384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * interpreter is uninitialized until after the exit funcs have run. 324384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * Note that Threading.py uses an exit func to do a join on all the 325384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * threads created thru it, so this also protects pending imports in 326384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters * the threads created via Threading. 327384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters */ 3284cc462e85b1c2c393460e780c314e73691e15852Guido van Rossum call_sys_exitfunc(); 329384fd106e89ec859ace7c098620aad8ce2c2abaaTim Peters initialized = 0; 3304cc462e85b1c2c393460e780c314e73691e15852Guido van Rossum 3313a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum /* Get current thread state and interpreter pointer */ 332e5662aedef12b8d49c5c6c52d0e3fb47e66dbe0aNicholas Bastin tstate = PyThreadState_GET(); 33325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp = tstate->interp; 33425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 3353a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum /* Disable signal handling */ 3363a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum PyOS_FiniInterrupts(); 3373a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum 338a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond /* drop module references we saved */ 339edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond Py_XDECREF(warnings_module); 340edd07737d70f9021d90f3990fd7f527aa9a54e48Mark Hammond warnings_module = NULL; 341a43fd0c8996eec2bdd0ec59edc252cb4f4ff4436Mark Hammond 342e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum /* Collect garbage. This may call finalizers; it's nice to call these 3431d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * before all modules are destroyed. 3441d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX If a __del__ or weakref callback is triggered here, and tries to 3451d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX import a module, bad things can happen, because Python no 3461d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX longer believes it's initialized. 3471d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX Fatal Python error: Interpreter not initialized (version mismatch?) 3481d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX is easy to provoke that way. I've also seen, e.g., 3491d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX Exception exceptions.ImportError: 'No module named sha' 3501d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX in <function callback at 0x008F5718> ignored 3511d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX but I'm unclear on exactly how that one happens. In any case, 3521d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX I haven't seen a real-life report of either of these. 3531d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters */ 354e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum PyGC_Collect(); 355e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum 3563a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum /* Destroy all modules */ 35725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyImport_Cleanup(); 3583a44e1b9fbf914769083239a1c5deb1a71b2862dGuido van Rossum 359e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum /* Collect final garbage. This disposes of cycles created by 3601d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * new-style class definitions, for example. 3611d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX This is disabled because it caused too many problems. If 3621d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX a __del__ or weakref callback triggers here, Python code has 3631d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX a hard time running, because even the sys module has been 3641d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc). 3651d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX One symptom is a sequence of information-free messages 3661d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX coming from threads (if a __del__ or callback is invoked, 3671d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX other threads can execute too, and any exception they encounter 3681d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX triggers a comedy of errors as subsystem after subsystem 3691d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX fails to find what it *expects* to find in sys to help report 3701d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX the exception and consequent unexpected failures). I've also 3711d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX seen segfaults then, after adding print statements to the 3721d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters * XXX Python code getting called. 3731d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters */ 3741d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters#if 0 375e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum PyGC_Collect(); 3761d7323e4e79c3ee3e99004037e5215620aa0b3f8Tim Peters#endif 377e13ddc9ec85287b17fd03454f836f495c1167de9Guido van Rossum 3781707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum /* Destroy the database used by _PyImport_{Fixup,Find}Extension */ 3791707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum _PyImport_Fini(); 3801707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum 3811707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum /* Debugging stuff */ 3821707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#ifdef COUNT_ALLOCS 3831707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum dump_counts(); 3841707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#endif 3851707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum 3861707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#ifdef Py_REF_DEBUG 3871707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum fprintf(stderr, "[%ld refs]\n", _Py_RefTotal); 3881707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum#endif 3891707aad27c36024d8ee00bd59ee223d16a9bb6d1Guido van Rossum 3909cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters#ifdef Py_TRACE_REFS 3919cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters /* Display all objects still alive -- this can invoke arbitrary 3929cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters * __repr__ overrides, so requires a mostly-intact interpreter. 3939cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters * Alas, a lot of stuff may still be alive now that will be cleaned 3949cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters * up later. 3959cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters */ 396269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters if (Py_GETENV("PYTHONDUMPREFS")) 3979cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters _Py_PrintReferences(stderr); 3989cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters#endif /* Py_TRACE_REFS */ 3999cf25ce3a03e299ebd167b161b3bc1b04683e73dTim Peters 4006cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond /* Cleanup auto-thread-state */ 4016cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond#ifdef WITH_THREAD 4026cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond _PyGILState_Fini(); 4036cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond#endif /* WITH_THREAD */ 4046cb9029a2273ae2d9ca3c3a0a7fe1111111c2713Mark Hammond 405d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum /* Clear interpreter state */ 406f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw PyInterpreterState_Clear(interp); 407d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum 40812b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter /* Now we decref the exception classes. After this point nothing 40912b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter can raise an exception. That's okay, because each Fini() method 41012b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter below has been checked to make sure no exceptions are ever 41112b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter raised. 41212b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter */ 41312b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter 41412b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter _PyExc_Fini(); 41512b6f6cac7299afc6790cb68591ccc9b2adbeff4Anthony Baxter 416d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum /* Delete current thread */ 417f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw PyThreadState_Swap(NULL); 418f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw PyInterpreterState_Delete(interp); 419f242aa0d1e7625a7ccbbd629bae2d88a95408ad3Barry Warsaw 420d922fa46ce0763e63c3d6a14bc89059b0eef33eaGuido van Rossum /* Sundry finalizers */ 421cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum PyMethod_Fini(); 422cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum PyFrame_Fini(); 423cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum PyCFunction_Fini(); 424cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum PyTuple_Fini(); 425fb09f0e85cd75ec46700562687a9da3063ff0b7cRaymond Hettinger PyList_Fini(); 426d794666048510deca0d4987a4c74d0fca85be411Raymond Hettinger PySet_Fini(); 42725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyString_Fini(); 428cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum PyInt_Fini(); 429cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum PyFloat_Fini(); 430cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum 43195de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg#ifdef Py_USING_UNICODE 43295de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg /* Cleanup Unicode implementation */ 43395de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg _PyUnicode_Fini(); 43495de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg#endif 43595de5c16310e0ace7dc2de17fd610daf19b9cdeaMarc-André Lemburg 436cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum /* XXX Still allocated: 437cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum - various static ad-hoc pointers to interned strings 438cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum - int and float free list blocks 439cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum - whatever various modules and libraries allocate 440cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum */ 44125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 44225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyGrammar_RemoveAccelerators(&_PyParser_Grammar); 443cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum 444269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters#ifdef Py_TRACE_REFS 445269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters /* Display addresses (& refcnts) of all objects still alive. 446269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters * An address can be used to find the repr of the object, printed 447269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters * above by _Py_PrintReferences. 448269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters */ 449269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters if (Py_GETENV("PYTHONDUMPREFS")) 450269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters _Py_PrintReferenceAddresses(stderr); 451269b2a6797a11958929a5c1102dd1dd67d29e411Tim Peters#endif /* Py_TRACE_REFS */ 4520e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters#ifdef PYMALLOC_DEBUG 4530e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters if (Py_GETENV("PYTHONMALLOCSTATS")) 4540e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters _PyObject_DebugMallocStats(); 4550e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters#endif 4560e871188e8cd9a4e41be7c734e250bfce2d92d56Tim Peters 457cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum call_ll_exitfuncs(); 45825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum} 45925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 46025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Create and initialize a new interpreter and thread, and return the 46125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum new thread. This requires that Py_Initialize() has been called 46225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum first. 46325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 46425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Unsuccessful initialization yields a NULL pointer. Note that *no* 46525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum exception information is available even in this case -- the 46625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum exception information is held in the thread, and there is no 46725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum thread. 46825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 46925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Locking: as above. 47025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 47125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/ 47225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 47325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van RossumPyThreadState * 474f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_NewInterpreter(void) 47525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum{ 476a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum PyInterpreterState *interp; 47725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyThreadState *tstate, *save_tstate; 47825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyObject *bimod, *sysmod; 479ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum 48025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (!initialized) 48125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_NewInterpreter: call Py_Initialize first"); 482ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum 483a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum interp = PyInterpreterState_New(); 484a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum if (interp == NULL) 48525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum return NULL; 486ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum 487a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum tstate = PyThreadState_New(interp); 48825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (tstate == NULL) { 48925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState_Delete(interp); 49025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum return NULL; 49125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum } 492a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum 49325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum save_tstate = PyThreadState_Swap(tstate); 494a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum 49525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum /* XXX The following is lax in error checking */ 49625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 49725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp->modules = PyDict_New(); 49825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 49925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum bimod = _PyImport_FindExtension("__builtin__", "__builtin__"); 50025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (bimod != NULL) { 5014a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum interp->builtins = PyModule_GetDict(bimod); 5024a1f39a26bd5ff97f0388b2a35ea6edf089a0e07Guido van Rossum Py_INCREF(interp->builtins); 50325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum } 50425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum sysmod = _PyImport_FindExtension("sys", "sys"); 50525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (bimod != NULL && sysmod != NULL) { 50625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp->sysdict = PyModule_GetDict(sysmod); 50725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_INCREF(interp->sysdict); 50825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PySys_SetPath(Py_GetPath()); 50925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyDict_SetItemString(interp->sysdict, "modules", 51025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum interp->modules); 511d7ceb222bd19ea25b0b4d234623df0a9f73c96b5Martin v. Löwis _PyImportHooks_Init(); 51225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum initmain(); 513dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum if (!Py_NoSiteFlag) 514dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum initsite(); 51525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum } 51625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 51725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (!PyErr_Occurred()) 51825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum return tstate; 51925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 52025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum /* Oops, it didn't work. Undo it all. */ 52125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 52225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyErr_Print(); 52325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyThreadState_Clear(tstate); 52425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyThreadState_Swap(save_tstate); 52525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyThreadState_Delete(tstate); 52625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState_Delete(interp); 52725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 52825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum return NULL; 52925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum} 53025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 53125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum/* Delete an interpreter and its last thread. This requires that the 53225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum given thread state is current, that the thread has no remaining 53325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum frames, and that it is its interpreter's only remaining thread. 53425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum It is a fatal error to violate these constraints. 53525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 53625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum (Py_Finalize() doesn't have these constraints -- it zaps 53725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum everything, regardless.) 53825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 53925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Locking: as above. 54025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 54125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum*/ 54225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 54325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossumvoid 544f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_EndInterpreter(PyThreadState *tstate) 54525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum{ 54625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState *interp = tstate->interp; 54725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 548e5662aedef12b8d49c5c6c52d0e3fb47e66dbe0aNicholas Bastin if (tstate != PyThreadState_GET()) 54925ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_EndInterpreter: thread is not current"); 55025ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (tstate->frame != NULL) 55125ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_EndInterpreter: thread still has a frame"); 55225ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum if (tstate != interp->tstate_head || tstate->next != NULL) 55325ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum Py_FatalError("Py_EndInterpreter: not the last thread"); 55425ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 55525ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyImport_Cleanup(); 55625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState_Clear(interp); 55725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyThreadState_Swap(NULL); 55825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum PyInterpreterState_Delete(interp); 559ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum} 560ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum 561ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumstatic char *progname = "python"; 562ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum 563ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumvoid 564f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_SetProgramName(char *pn) 565ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum{ 566ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum if (pn && *pn) 567ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum progname = pn; 568ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum} 569ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum 570ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossumchar * 571f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_GetProgramName(void) 572ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum{ 573ad6dfda9afa3459eb802618c07969f6a1a0a1287Guido van Rossum return progname; 574a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum} 575a027efa5bfa7911b5c4b522b6a0698749a6f2e4aGuido van Rossum 576a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumstatic char *default_home = NULL; 577a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum 578a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumvoid 579f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_SetPythonHome(char *home) 580a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{ 581a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum default_home = home; 582a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum} 583a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum 584a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossumchar * 585f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_GetPythonHome(void) 586a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{ 587a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum char *home = default_home; 5887d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer if (home == NULL && !Py_IgnoreEnvironmentFlag) 5897d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer home = Py_GETENV("PYTHONHOME"); 590a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum return home; 591a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum} 592a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum 5936135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum/* Create __main__ module */ 5946135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum 5956135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossumstatic void 596f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitmain(void) 5976135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum{ 59882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *m, *d; 59982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum m = PyImport_AddModule("__main__"); 6006135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum if (m == NULL) 60182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_FatalError("can't create __main__ module"); 60282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum d = PyModule_GetDict(m); 60382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum if (PyDict_GetItemString(d, "__builtins__") == NULL) { 604858cb73bb2643b73f4262857c865db285280e900Guido van Rossum PyObject *bimod = PyImport_ImportModule("__builtin__"); 605858cb73bb2643b73f4262857c865db285280e900Guido van Rossum if (bimod == NULL || 606858cb73bb2643b73f4262857c865db285280e900Guido van Rossum PyDict_SetItemString(d, "__builtins__", bimod) != 0) 60782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_FatalError("can't add __builtins__ to __main__"); 6083d05b1a0ae8ad4acf733f03b45cf9c51bf3ff47cBarry Warsaw Py_DECREF(bimod); 6096135a87f2b1474be6caf1bf776024d0c6d10a6d1Guido van Rossum } 6101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 6111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 612dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum/* Import the site module (not into __main__ though) */ 613dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum 614dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossumstatic void 615f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitsite(void) 616dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum{ 617dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum PyObject *m, *f; 618dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum m = PyImport_ImportModule("site"); 619dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum if (m == NULL) { 620dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum f = PySys_GetObject("stderr"); 621dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum if (Py_VerboseFlag) { 622dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum PyFile_WriteString( 623dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum "'import site' failed; traceback:\n", f); 624dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum PyErr_Print(); 625dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum } 626dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum else { 627dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum PyFile_WriteString( 628dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum "'import site' failed; use -v for traceback\n", f); 629dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum PyErr_Clear(); 630dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum } 631dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum } 632dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum else { 633dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum Py_DECREF(m); 634dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum } 635dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum} 636dcc0c13f74e3f62b00847f4aec93bb5c65e8cf64Guido van Rossum 6371984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Parse input from a file and execute it */ 6381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 6391984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint 6403e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit, 641bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags *flags) 642bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 6431984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (filename == NULL) 6441984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum filename = "???"; 6450df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum if (Py_FdIsInteractive(fp, filename)) { 646bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton int err = PyRun_InteractiveLoopFlags(fp, filename, flags); 6470df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum if (closeit) 6480df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum fclose(fp); 6490df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum return err; 6500df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum } 6511984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum else 652bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton return PyRun_SimpleFileExFlags(fp, filename, closeit, flags); 6531984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 6541984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 6551984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint 65695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 657bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 65882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *v; 6591984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum int ret; 660bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags local_flags; 6619f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton 662bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton if (flags == NULL) { 663bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton flags = &local_flags; 6645ba58662817b708a453020f0425fe4747ea6d5cbTim Peters local_flags.cf_flags = 0; 665bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton } 66682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum v = PySys_GetObject("ps1"); 6671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (v == NULL) { 66882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PySys_SetObject("ps1", v = PyString_FromString(">>> ")); 66982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_XDECREF(v); 6701984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 67182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum v = PySys_GetObject("ps2"); 6721984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (v == NULL) { 67382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PySys_SetObject("ps2", v = PyString_FromString("... ")); 67482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_XDECREF(v); 6751984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 6761984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum for (;;) { 677bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton ret = PyRun_InteractiveOneFlags(fp, filename, flags); 678aae0d32f6639894f33f336bad115660ad82de5d2Guido van Rossum#ifdef Py_REF_DEBUG 6796f9e433ab3520d06fd3bc0c97a6ba49c0d67816dGuido van Rossum fprintf(stderr, "[%ld refs]\n", _Py_RefTotal); 6801984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum#endif 6811984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (ret == E_EOF) 6821984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return 0; 6831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum /* 6841984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (ret == E_NOMEM) 6851984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 6861984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum */ 6871984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 6881984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 6891984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 690c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer/* compute parser flags based on compiler flags */ 691c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer#define PARSER_FLAGS(flags) \ 6924b499dd3fb49181efbd99f87e45ff923146cba8aGuido van Rossum (((flags) && (flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ 6934b499dd3fb49181efbd99f87e45ff923146cba8aGuido van Rossum PyPARSE_DONT_IMPLY_DEDENT : 0) 694c24ea08644279224a7a8be419648261f9566c9b3Neil Schemenauer 6959f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hyltonint 69695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 6979f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton{ 69882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *m, *d, *v, *w; 6993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod; 700ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum char *ps1 = "", *ps2 = ""; 7013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton int errcode = 0; 702fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters 70382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum v = PySys_GetObject("ps1"); 704ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum if (v != NULL) { 705ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum v = PyObject_Str(v); 706ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum if (v == NULL) 707ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum PyErr_Clear(); 708ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum else if (PyString_Check(v)) 709ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum ps1 = PyString_AsString(v); 7101984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 711ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum w = PySys_GetObject("ps2"); 712ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum if (w != NULL) { 713ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum w = PyObject_Str(w); 714ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum if (w == NULL) 715ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum PyErr_Clear(); 716ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum else if (PyString_Check(w)) 717ddc3fb573429a40ac7c80088edf25ee19f7a5265Guido van Rossum ps2 = PyString_AsString(w); 7181984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 7193e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod = PyParser_ASTFromFile(fp, filename, 7203e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton Py_single_input, ps1, ps2, 7213e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton flags, &errcode); 72282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_XDECREF(v); 72382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_XDECREF(w); 7243e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (mod == NULL) { 7253e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (errcode == E_EOF) { 7263e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyErr_Clear(); 727a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum return E_EOF; 728a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum } 72982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Print(); 7303e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return -1; 7311984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 73282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum m = PyImport_AddModule("__main__"); 7331984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (m == NULL) 7341984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 73582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum d = PyModule_GetDict(m); 7363e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton v = run_mod(mod, filename, d, d, flags); 7373e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton free_mod(mod); 7381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (v == NULL) { 73982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Print(); 7401984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 7411984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 74282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_DECREF(v); 74378a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (Py_FlushLine()) 74478a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum PyErr_Clear(); 7451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return 0; 7461984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 7471984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 748be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis/* Check whether a file maybe a pyc file: Look at the extension, 749be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis the file type, and, if we may close it, at the first few bytes. */ 750be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis 751be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwisstatic int 75295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwismaybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) 753be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis{ 754be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0) 755be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis return 1; 756be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis 757be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis /* Only look into the file if we are allowed to close it, since 758be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis it then should also be seekable. */ 759be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis if (closeit) { 760be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis /* Read only two bytes of the magic. If the file was opened in 761be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis text mode, the bytes 3 and 4 of the magic (\r\n) might not 762be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis be read as they are on disk. */ 763be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; 764be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis unsigned char buf[2]; 7653e876565a3913427fc64b57553cb6986f1f7512bTim Peters /* Mess: In case of -x, the stream is NOT at its start now, 7663e876565a3913427fc64b57553cb6986f1f7512bTim Peters and ungetc() was used to push back the first newline, 7676f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters which makes the current stream position formally undefined, 7686f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters and a x-platform nightmare. 7696f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters Unfortunately, we have no direct way to know whether -x 7706f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters was specified. So we use a terrible hack: if the current 7716f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters stream position is not 0, we assume -x was specified, and 7726f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters give up. Bug 132850 on SourceForge spells out the 7736f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters hopelessness of trying anything else (fseek and ftell 7746f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters don't work predictably x-platform for text-mode files). 7753e876565a3913427fc64b57553cb6986f1f7512bTim Peters */ 7763e876565a3913427fc64b57553cb6986f1f7512bTim Peters int ispyc = 0; 7776f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters if (ftell(fp) == 0) { 7786f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters if (fread(buf, 1, 2, fp) == 2 && 779d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) 7806f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters ispyc = 1; 7816f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters rewind(fp); 7826f5a4efc0afaaf87eb1f4b8be0fffd0566352c8dTim Peters } 7833e876565a3913427fc64b57553cb6986f1f7512bTim Peters return ispyc; 784be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis } 785be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis return 0; 786d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters} 787be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis 7880df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossumint 78995292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, 790bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags *flags) 791bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 79282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *m, *d, *v; 79395292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis const char *ext; 794fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum 79582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum m = PyImport_AddModule("__main__"); 7961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (m == NULL) 7971984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 79882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum d = PyModule_GetDict(m); 7998ed0204bc9249d314442158348b3949f1be50100Fred Drake if (PyDict_GetItemString(d, "__file__") == NULL) { 8008ed0204bc9249d314442158348b3949f1be50100Fred Drake PyObject *f = PyString_FromString(filename); 8018ed0204bc9249d314442158348b3949f1be50100Fred Drake if (f == NULL) 8028ed0204bc9249d314442158348b3949f1be50100Fred Drake return -1; 8038ed0204bc9249d314442158348b3949f1be50100Fred Drake if (PyDict_SetItemString(d, "__file__", f) < 0) { 8048ed0204bc9249d314442158348b3949f1be50100Fred Drake Py_DECREF(f); 8058ed0204bc9249d314442158348b3949f1be50100Fred Drake return -1; 8068ed0204bc9249d314442158348b3949f1be50100Fred Drake } 8078ed0204bc9249d314442158348b3949f1be50100Fred Drake Py_DECREF(f); 8088ed0204bc9249d314442158348b3949f1be50100Fred Drake } 809fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum ext = filename + strlen(filename) - 4; 810be4c0f56a28831f6121ef545ca8afb44a6723022Martin v. Löwis if (maybe_pyc_file(fp, filename, ext, closeit)) { 811fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum /* Try to run a pyc file. First, re-open in binary */ 8120df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum if (closeit) 8130df002c45b0bf2bf23bb8c0a395e86f907a94d81Guido van Rossum fclose(fp); 8148ed0204bc9249d314442158348b3949f1be50100Fred Drake if ((fp = fopen(filename, "rb")) == NULL) { 815fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum fprintf(stderr, "python: Can't reopen .pyc file\n"); 816fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum return -1; 817fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum } 8182a7f58de1c3011a9ed167172e628ecdc70dbdb82Guido van Rossum /* Turn on optimization if a .pyo file is given */ 8192a7f58de1c3011a9ed167172e628ecdc70dbdb82Guido van Rossum if (strcmp(ext, ".pyo") == 0) 8202a7f58de1c3011a9ed167172e628ecdc70dbdb82Guido van Rossum Py_OptimizeFlag = 1; 821bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton v = run_pyc_file(fp, filename, d, d, flags); 822fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum } else { 823d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d, 824bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton closeit, flags); 825fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum } 8261984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (v == NULL) { 82782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Print(); 8281984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 8291984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 83082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_DECREF(v); 83178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (Py_FlushLine()) 83278a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum PyErr_Clear(); 8331984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return 0; 8341984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 8351984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 8361984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumint 83795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) 838393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum{ 83982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *m, *d, *v; 84082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum m = PyImport_AddModule("__main__"); 8411984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (m == NULL) 8421984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 84382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum d = PyModule_GetDict(m); 844393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum v = PyRun_StringFlags(command, Py_file_input, d, d, flags); 8451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (v == NULL) { 84682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Print(); 8471984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return -1; 8481984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 84982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_DECREF(v); 85078a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (Py_FlushLine()) 85178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum PyErr_Clear(); 8521984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return 0; 8531984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 8541984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 855035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawstatic int 85695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisparse_syntax_error(PyObject *err, PyObject **message, const char **filename, 85795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis int *lineno, int *offset, const char **text) 858035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw{ 859035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw long hold; 860035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw PyObject *v; 861035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 862035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw /* old style errors */ 863035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (PyTuple_Check(err)) 8647829335763ef520b909d657525f8a0a6e7b759dbNeal Norwitz return PyArg_ParseTuple(err, "O(ziiz)", message, filename, 8657829335763ef520b909d657525f8a0a6e7b759dbNeal Norwitz lineno, offset, text); 866035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 867035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw /* new style errors. `err' is an instance */ 868035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 869035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (! (v = PyObject_GetAttrString(err, "msg"))) 870035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 871035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw *message = v; 872035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 873035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (!(v = PyObject_GetAttrString(err, "filename"))) 874035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 875035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (v == Py_None) 876035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw *filename = NULL; 877035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw else if (! (*filename = PyString_AsString(v))) 878035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 879035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 880035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw Py_DECREF(v); 881035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (!(v = PyObject_GetAttrString(err, "lineno"))) 882035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 883035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw hold = PyInt_AsLong(v); 884035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw Py_DECREF(v); 885035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw v = NULL; 886035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (hold < 0 && PyErr_Occurred()) 887035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 888035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw *lineno = (int)hold; 889035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 890035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (!(v = PyObject_GetAttrString(err, "offset"))) 891035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 8929f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (v == Py_None) { 8939f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton *offset = -1; 8949f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton Py_DECREF(v); 8959f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton v = NULL; 8969f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton } else { 8979f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton hold = PyInt_AsLong(v); 8989f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton Py_DECREF(v); 8999f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton v = NULL; 9009f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (hold < 0 && PyErr_Occurred()) 9019f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton goto finally; 9029f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton *offset = (int)hold; 9039f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton } 904035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 905035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (!(v = PyObject_GetAttrString(err, "text"))) 906035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 907035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw if (v == Py_None) 908035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw *text = NULL; 909035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw else if (! (*text = PyString_AsString(v))) 910035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw goto finally; 911035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw Py_DECREF(v); 912035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw return 1; 913035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 914035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsawfinally: 915035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw Py_XDECREF(v); 916035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw return 0; 917035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw} 918035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw 9191984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid 920f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_Print(void) 9211984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 922a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum PyErr_PrintEx(1); 923a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum} 924a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum 9259f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hyltonstatic void 92695292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwisprint_error_text(PyObject *f, int offset, const char *text) 9279f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton{ 9289f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton char *nl; 9299f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (offset >= 0) { 9309f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (offset > 0 && offset == (int)strlen(text)) 9319f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton offset--; 9329f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton for (;;) { 9339f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton nl = strchr(text, '\n'); 9349f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (nl == NULL || nl-text >= offset) 9359f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton break; 9369f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton offset -= (nl+1-text); 9379f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton text = nl+1; 9389f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton } 9399f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton while (*text == ' ' || *text == '\t') { 9409f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton text++; 9419f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton offset--; 9429f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton } 9439f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton } 9449f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton PyFile_WriteString(" ", f); 9459f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton PyFile_WriteString(text, f); 9469f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (*text == '\0' || text[strlen(text)-1] != '\n') 9479f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton PyFile_WriteString("\n", f); 9489f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (offset == -1) 9499f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton return; 9509f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton PyFile_WriteString(" ", f); 9519f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton offset--; 9529f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton while (offset > 0) { 9539f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton PyFile_WriteString(" ", f); 9549f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton offset--; 9559f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton } 9569f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton PyFile_WriteString("^\n", f); 9579f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton} 9589f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton 95966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumstatic void 96066e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossumhandle_system_exit(void) 96126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee{ 96266e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum PyObject *exception, *value, *tb; 963cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters int exitcode = 0; 964cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters 96566e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum PyErr_Fetch(&exception, &value, &tb); 96626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (Py_FlushLine()) 96726fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee PyErr_Clear(); 96826fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee fflush(stdout); 96926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (value == NULL || value == Py_None) 970cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters goto done; 97126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (PyInstance_Check(value)) { 97226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee /* The error code should be in the `code' attribute. */ 97326fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee PyObject *code = PyObject_GetAttrString(value, "code"); 97426fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (code) { 97526fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee Py_DECREF(value); 97626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee value = code; 97726fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (value == Py_None) 978cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters goto done; 97926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee } 98026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee /* If we failed to dig out the 'code' attribute, 98126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee just let the else clause below print the error. */ 98226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee } 98326fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (PyInt_Check(value)) 984cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters exitcode = (int)PyInt_AsLong(value); 98526fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee else { 98626fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee PyObject_Print(value, stderr, Py_PRINT_RAW); 98726fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee PySys_WriteStderr("\n"); 988cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters exitcode = 1; 98926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee } 990cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters done: 991cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters /* Restore and clear the exception info, in order to properly decref 992cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters * the exception, value, and traceback. If we just exit instead, 993cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters * these leak, which confuses PYTHONDUMPREFS output, and may prevent 994cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters * some finalizers from running. 995cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters */ 996cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters PyErr_Restore(exception, value, tb); 997cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters PyErr_Clear(); 998cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters Py_Exit(exitcode); 999cf615b52750f557d3c1d4fd8ba9142158e369acdTim Peters /* NOTREACHED */ 100026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee} 100126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee 100226fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yeevoid 1003f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPyErr_PrintEx(int set_sys_last_vars) 1004a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum{ 1005b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyObject *exception, *v, *tb, *hook; 100666e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum 100766e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 100866e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum handle_system_exit(); 100966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum } 101082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Fetch(&exception, &v, &tb); 10113e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (exception == NULL) 10123e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return; 1013035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw PyErr_NormalizeException(&exception, &v, &tb); 10141ae940a5870df2f706fa884afd533847f6b0b1a8Guido van Rossum if (exception == NULL) 1015296b4751e1dc6b40504e45e795d52594bee720d2Guido van Rossum return; 1016a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum if (set_sys_last_vars) { 1017a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum PySys_SetObject("last_type", exception); 1018a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum PySys_SetObject("last_value", v); 1019a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum PySys_SetObject("last_traceback", tb); 1020a61691e4e9e43da90fa2a5fa1c6764fe49e4dcdbGuido van Rossum } 1021b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee hook = PySys_GetObject("excepthook"); 1022b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee if (hook) { 10238ae468965700fd9900efc28bff8fa2015dae2befRaymond Hettinger PyObject *args = PyTuple_Pack(3, 1024b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee exception, v ? v : Py_None, tb ? tb : Py_None); 1025b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyObject *result = PyEval_CallObject(hook, args); 1026b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee if (result == NULL) { 1027b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyObject *exception2, *v2, *tb2; 102866e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 102966e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum handle_system_exit(); 103066e8e86cf8a2f48a4aca1b05cef7fa7f6dd3ca48Guido van Rossum } 1031b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyErr_Fetch(&exception2, &v2, &tb2); 1032b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyErr_NormalizeException(&exception2, &v2, &tb2); 1033b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee if (Py_FlushLine()) 1034b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyErr_Clear(); 1035b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee fflush(stdout); 1036b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PySys_WriteStderr("Error in sys.excepthook:\n"); 1037b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyErr_Display(exception2, v2, tb2); 1038b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PySys_WriteStderr("\nOriginal exception was:\n"); 1039b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyErr_Display(exception, v, tb); 10400702858d733e1ab37e3e7bb6258557fd7aca3d10Jeremy Hylton Py_XDECREF(exception2); 10410702858d733e1ab37e3e7bb6258557fd7aca3d10Jeremy Hylton Py_XDECREF(v2); 10420702858d733e1ab37e3e7bb6258557fd7aca3d10Jeremy Hylton Py_XDECREF(tb2); 1043b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee } 1044b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee Py_XDECREF(result); 1045b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee Py_XDECREF(args); 1046b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee } else { 1047b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PySys_WriteStderr("sys.excepthook is missing\n"); 1048b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyErr_Display(exception, v, tb); 1049b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee } 1050b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee Py_XDECREF(exception); 1051b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee Py_XDECREF(v); 1052b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee Py_XDECREF(tb); 1053b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee} 1054b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee 1055b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yeevoid PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) 1056b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee{ 1057b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee int err = 0; 1058b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee PyObject *f = PySys_GetObject("stderr"); 10595d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo Py_INCREF(value); 10603165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum if (f == NULL) 10613165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum fprintf(stderr, "lost sys.stderr\n"); 10623165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum else { 10630829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum if (Py_FlushLine()) 10640829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum PyErr_Clear(); 106578a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum fflush(stdout); 1066b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee if (tb && tb != Py_None) 1067b5c5132d1ac526dc97f8c51ef12299bde791a807Ka-Ping Yee err = PyTraceBack_Print(tb, f); 106836b8f945e794e8483a185db3b6847c083a724e44Barry Warsaw if (err == 0 && 10695d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo PyObject_HasAttrString(value, "print_file_and_line")) 107036b8f945e794e8483a185db3b6847c083a724e44Barry Warsaw { 107182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *message; 107295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. Löwis const char *filename, *text; 1073a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum int lineno, offset; 10745d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo if (!parse_syntax_error(value, &message, &filename, 1075035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw &lineno, &offset, &text)) 107682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Clear(); 1077a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum else { 1078a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum char buf[10]; 107982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyFile_WriteString(" File \"", f); 1080a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum if (filename == NULL) 108182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyFile_WriteString("<string>", f); 1082a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum else 108382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyFile_WriteString(filename, f); 108482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyFile_WriteString("\", line ", f); 1085518ab1c02a01a1a502fedeccb62ea73f2a952ba7Jeremy Hylton PyOS_snprintf(buf, sizeof(buf), "%d", lineno); 108682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyFile_WriteString(buf, f); 108782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyFile_WriteString("\n", f); 10889f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton if (text != NULL) 10899f1b9932b87a6da14f2c010dfcf2ed08cb50b768Jeremy Hylton print_error_text(f, offset, text); 10905d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo Py_DECREF(value); 10915d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo value = message; 109278a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum /* Can't be bothered to check all those 109378a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum PyFile_WriteString() calls */ 109478a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (PyErr_Occurred()) 109578a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum err = -1; 1096a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum } 1097a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum } 109878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (err) { 109978a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum /* Don't do anything else */ 110078a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum } 110178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum else if (PyClass_Check(exception)) { 11022f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw PyClassObject* exc = (PyClassObject*)exception; 11032f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw PyObject* className = exc->cl_name; 11042f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw PyObject* moduleName = 11052f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw PyDict_GetItemString(exc->cl_dict, "__module__"); 11062f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw 11072f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw if (moduleName == NULL) 110878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum err = PyFile_WriteString("<unknown>", f); 11092f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw else { 11102f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw char* modstr = PyString_AsString(moduleName); 1111d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters if (modstr && strcmp(modstr, "exceptions")) 11122f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw { 11132f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw err = PyFile_WriteString(modstr, f); 11142f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw err += PyFile_WriteString(".", f); 11152f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw } 11162f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw } 11172f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw if (err == 0) { 11182f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw if (className == NULL) 11192f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw err = PyFile_WriteString("<unknown>", f); 11202f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw else 11212f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw err = PyFile_WriteObject(className, f, 11222f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw Py_PRINT_RAW); 11232f5f6a2595d4796fea3aecc8e2ed8b800033eccaBarry Warsaw } 1124262e124107806a16ba45e2b68a76d89ebb7d2dc8Guido van Rossum } 112578a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum else 112678a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum err = PyFile_WriteObject(exception, f, Py_PRINT_RAW); 112778a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (err == 0) { 11285d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo if (value != Py_None) { 11295d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo PyObject *s = PyObject_Str(value); 1130035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw /* only print colon if the str() of the 1131035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw object is not the empty string 1132035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw */ 1133d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum if (s == NULL) 1134d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum err = -1; 1135d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum else if (!PyString_Check(s) || 1136d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum PyString_GET_SIZE(s) != 0) 1137035574d755bfc306704e9975dc10e4e05a47b3bbBarry Warsaw err = PyFile_WriteString(": ", f); 113878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (err == 0) 1139d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum err = PyFile_WriteObject(s, f, Py_PRINT_RAW); 1140d6bf45bcf669a13b2d8c3996b466c5171eca0e53Guido van Rossum Py_XDECREF(s); 114178a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum } 11423165fe6a56c07f4f85f4ea54b69f5b1f243e2463Guido van Rossum } 114378a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (err == 0) 114478a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum err = PyFile_WriteString("\n", f); 11451984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum } 11465d2c68359bcd6c2dde37fe0780475422b7329641Armin Rigo Py_DECREF(value); 114778a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum /* If an error happened here, don't show it. 114878a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum XXX This is wrong, but too many callers rely on this behavior. */ 114978a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum if (err != 0) 115078a1ed3d701590201a6865abd0f227ff7d591eb4Guido van Rossum PyErr_Clear(); 11511984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 11521984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 115382598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject * 11543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyRun_StringFlags(const char *str, int start, PyObject *globals, 11553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *locals, PyCompilerFlags *flags) 11561984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 11573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *ret; 11583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags); 11593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton ret = run_err_mod(mod, "<string>", globals, locals, flags); 11603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton free_mod(mod); 11613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return ret; 1162bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton} 1163bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton 1164bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy HyltonPyObject * 116595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, 1166bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyObject *locals, int closeit, PyCompilerFlags *flags) 1167bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 11683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *ret; 11693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, 11703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton flags, NULL); 11713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (mod == NULL) 11723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return NULL; 1173bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton if (closeit) 1174bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton fclose(fp); 11753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton ret = run_err_mod(mod, filename, globals, locals, flags); 11763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton free_mod(mod); 11773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return ret; 1178bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton} 1179bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton 118082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject * 11813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_err_mod(mod_ty mod, const char *filename, PyObject *globals, 11823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *locals, PyCompilerFlags *flags) 11831984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 11843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (mod == NULL) 1185a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum return NULL; 11863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return run_mod(mod, filename, globals, locals, flags); 11871984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 11881984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 118982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject * 11903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, 11919f324e964e06c79f9c47501afa12b1af4cb1a75fJeremy Hylton PyCompilerFlags *flags) 11921984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 119382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyCodeObject *co; 119482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *v; 11953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton co = PyAST_Compile(mod, filename, flags); 11961984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum if (co == NULL) 11971984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return NULL; 119882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum v = PyEval_EvalCode(co, globals, locals); 119982598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_DECREF(co); 12001984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum return v; 12011984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 12021984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 120382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossumstatic PyObject * 12043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonrun_pyc_file(FILE *fp, const char *filename, PyObject *globals, 12053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyObject *locals, PyCompilerFlags *flags) 1206fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum{ 120782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyCodeObject *co; 120882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *v; 1209fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum long magic; 1210e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake long PyImport_GetMagicNumber(void); 1211fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum 121282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum magic = PyMarshal_ReadLongFromFile(fp); 121382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum if (magic != PyImport_GetMagicNumber()) { 121482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_SetString(PyExc_RuntimeError, 1215fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum "Bad magic number in .pyc file"); 1216fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum return NULL; 1217fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum } 121882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum (void) PyMarshal_ReadLongFromFile(fp); 1219d9b9ac855c6bb297e7d5549e0d140ff7f48ebee6Tim Peters v = PyMarshal_ReadLastObjectFromFile(fp); 1220fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum fclose(fp); 122182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum if (v == NULL || !PyCode_Check(v)) { 122282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_XDECREF(v); 122382598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_SetString(PyExc_RuntimeError, 1224fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum "Bad code object in .pyc file"); 1225fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum return NULL; 1226fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum } 122782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum co = (PyCodeObject *)v; 122882598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum v = PyEval_EvalCode(co, globals, locals); 1229b857ba261fc468d956e350f51469efd7d5773da2Jeremy Hylton if (v && flags) 1230b857ba261fc468d956e350f51469efd7d5773da2Jeremy Hylton flags->cf_flags |= (co->co_flags & PyCF_MASK); 123182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_DECREF(co); 1232fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum return v; 1233fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum} 1234fdef2715503a56aa02716ee4bd0afcd431ba7c25Guido van Rossum 123582598051e6831fadad5f27a20f24f484a54691f3Guido van RossumPyObject * 1236d08e3824d40daa4c2fba9d6635256e44fe71936eTim PetersPy_CompileStringFlags(const char *str, const char *filename, int start, 1237bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton PyCompilerFlags *flags) 1238bc32024769eecd3c2251e00850e6a5c003aa9253Jeremy Hylton{ 12393e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod; 124082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyCodeObject *co; 12413e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod = PyParser_ASTFromString(str, filename, start, flags); 12423e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (mod == NULL) 12435b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum return NULL; 12443e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton co = PyAST_Compile(mod, filename, flags); 12453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton free_mod(mod); 124682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum return (PyObject *)co; 12475b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum} 12485b7221849e240c2a62ebbc48d58607417b42ef44Guido van Rossum 12494b38da664c107bc08768235a66621429beef5444Jeremy Hyltonstruct symtable * 125095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPy_SymtableString(const char *str, const char *filename, int start) 12514b38da664c107bc08768235a66621429beef5444Jeremy Hylton{ 12523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod; 12534b38da664c107bc08768235a66621429beef5444Jeremy Hylton struct symtable *st; 12543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 12553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod = PyParser_ASTFromString(str, filename, start, NULL); 12563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (mod == NULL) 12574b38da664c107bc08768235a66621429beef5444Jeremy Hylton return NULL; 12583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton st = PySymtable_Build(mod, filename, 0); 12593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton free_mod(mod); 12604b38da664c107bc08768235a66621429beef5444Jeremy Hylton return st; 12614b38da664c107bc08768235a66621429beef5444Jeremy Hylton} 12624b38da664c107bc08768235a66621429beef5444Jeremy Hylton 12633e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Preferred access to parser is through AST. */ 12643e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty 12653e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_ASTFromString(const char *s, const char *filename, int start, 12663e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyCompilerFlags *flags) 12673e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{ 12683e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton node *n; 12693e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod; 12703e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton perrdetail err; 12713e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton n = PyParser_ParseStringFlagsFilename(s, filename, &_PyParser_Grammar, 12723e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton start, &err, 12733e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PARSER_FLAGS(flags)); 12743e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (n) { 12753e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod = PyAST_FromNode(n, flags, filename); 12763e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyNode_Free(n); 12773e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return mod; 12783e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton } 12793e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton else { 12803e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton err_input(&err); 12813e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return NULL; 12823e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton } 12833e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 12843e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 12853e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonmod_ty 12863e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, 12873e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton char *ps2, PyCompilerFlags *flags, int *errcode) 12883e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{ 12893e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton node *n; 12903e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod_ty mod; 12913e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton perrdetail err; 12923e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, 12933e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton ps1, ps2, &err, PARSER_FLAGS(flags)); 12943e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (n) { 12953e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton mod = PyAST_FromNode(n, flags, filename); 12963e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyNode_Free(n); 12973e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return mod; 12983e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton } 12993e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton else { 13003e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton err_input(&err); 13013e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (errcode) 13023e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton *errcode = err.error; 13033e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return NULL; 13043e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton } 13053e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 13063e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 1307a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsefile -- return node or set exception */ 13081984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1309a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode * 131095292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) 13111984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 1312a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum node *n; 1313a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum perrdetail err; 1314fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start, 1315fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters (char *)0, (char *)0, &err, flags); 1316a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum if (n == NULL) 1317a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum err_input(&err); 13183e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 1319a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum return n; 13201984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 13211984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1322a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Simplified interface to parsestring -- return node or set exception */ 13231984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1324a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumnode * 132595292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlags(const char *str, int start, int flags) 13261984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 1327a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum node *n; 1328a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum perrdetail err; 1329fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err, 1330fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Peters flags); 1331a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum if (n == NULL) 1332a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum err_input(&err); 1333a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum return n; 1334a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum} 1335a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum 1336fe2127d3cbf34452a10b88c40e5ab06870936f94Tim Petersnode * 133795292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename, 13386b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller int start, int flags) 13396b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{ 13406b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller node *n; 13416b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller perrdetail err; 13426b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller 1343d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters n = PyParser_ParseStringFlagsFilename(str, filename, 13446b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller &_PyParser_Grammar, 13456b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller start, &err, flags); 13466b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller if (n == NULL) 13476b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller err_input(&err); 13486b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller return n; 13496b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller} 13506b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller 13516b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Hellernode * 135295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPyParser_SimpleParseStringFilename(const char *str, const char *filename, int start) 13536b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller{ 13546b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller return PyParser_SimpleParseStringFlagsFilename(str, filename, 13556b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller start, 0); 13566b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller} 13576b17abf6c0ddaed423a76e665124a80afbc39fe7Thomas Heller 135866ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum/* May want to move a more generalized form of this to parsetok.c or 135966ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum even parser modules. */ 136066ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum 136166ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossumvoid 136266ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van RossumPyParser_SetError(perrdetail *err) 136366ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum{ 136466ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum err_input(err); 136566ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum} 136666ebd9124491aada8e3e6b5f3da7f5ec93019abfGuido van Rossum 1367a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum/* Set the error appropriate to the given input error code (see errcode.h) */ 1368a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum 1369a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossumstatic void 1370f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterserr_input(perrdetail *err) 1371a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum{ 137285f363990cbd6df21015eebdc171c533176e3407Fred Drake PyObject *v, *w, *errtype; 137300f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis PyObject* u = NULL; 1374a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum char *msg = NULL; 137585f363990cbd6df21015eebdc171c533176e3407Fred Drake errtype = PyExc_SyntaxError; 1376a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum switch (err->error) { 1377a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum case E_SYNTAX: 137885f363990cbd6df21015eebdc171c533176e3407Fred Drake errtype = PyExc_IndentationError; 137985f363990cbd6df21015eebdc171c533176e3407Fred Drake if (err->expected == INDENT) 138085f363990cbd6df21015eebdc171c533176e3407Fred Drake msg = "expected an indented block"; 138185f363990cbd6df21015eebdc171c533176e3407Fred Drake else if (err->token == INDENT) 138285f363990cbd6df21015eebdc171c533176e3407Fred Drake msg = "unexpected indent"; 138385f363990cbd6df21015eebdc171c533176e3407Fred Drake else if (err->token == DEDENT) 138485f363990cbd6df21015eebdc171c533176e3407Fred Drake msg = "unexpected unindent"; 138585f363990cbd6df21015eebdc171c533176e3407Fred Drake else { 138685f363990cbd6df21015eebdc171c533176e3407Fred Drake errtype = PyExc_SyntaxError; 138785f363990cbd6df21015eebdc171c533176e3407Fred Drake msg = "invalid syntax"; 138885f363990cbd6df21015eebdc171c533176e3407Fred Drake } 1389a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum break; 1390a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum case E_TOKEN: 1391a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum msg = "invalid token"; 1392a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum break; 1393118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro case E_EOFS: 1394118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro msg = "EOF while scanning triple-quoted string"; 1395118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro break; 1396118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro case E_EOLS: 1397118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro msg = "EOL while scanning single-quoted string"; 1398118ec70ea27000db428ba3e3a757f4b423670db6Skip Montanaro break; 1399a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum case E_INTR: 140030ea2f223f5c0a85a13bd893063555a9f587cd6dMichael W. Hudson if (!PyErr_Occurred()) 140130ea2f223f5c0a85a13bd893063555a9f587cd6dMichael W. Hudson PyErr_SetNone(PyExc_KeyboardInterrupt); 1402a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum return; 1403a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum case E_NOMEM: 140482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_NoMemory(); 1405a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum return; 1406a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum case E_EOF: 1407a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum msg = "unexpected EOF while parsing"; 1408a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum break; 140985f363990cbd6df21015eebdc171c533176e3407Fred Drake case E_TABSPACE: 141085f363990cbd6df21015eebdc171c533176e3407Fred Drake errtype = PyExc_TabError; 1411560e8adef71dd10898e0f8a0a9a20599e6bec857Guido van Rossum msg = "inconsistent use of tabs and spaces in indentation"; 1412560e8adef71dd10898e0f8a0a9a20599e6bec857Guido van Rossum break; 141394988067b96c6187fd940eaff99c2c5a68daac68Jeremy Hylton case E_OVERFLOW: 141494988067b96c6187fd940eaff99c2c5a68daac68Jeremy Hylton msg = "expression too long"; 141594988067b96c6187fd940eaff99c2c5a68daac68Jeremy Hylton break; 141685f363990cbd6df21015eebdc171c533176e3407Fred Drake case E_DEDENT: 141785f363990cbd6df21015eebdc171c533176e3407Fred Drake errtype = PyExc_IndentationError; 141885f363990cbd6df21015eebdc171c533176e3407Fred Drake msg = "unindent does not match any outer indentation level"; 141985f363990cbd6df21015eebdc171c533176e3407Fred Drake break; 142085f363990cbd6df21015eebdc171c533176e3407Fred Drake case E_TOODEEP: 142185f363990cbd6df21015eebdc171c533176e3407Fred Drake errtype = PyExc_IndentationError; 142285f363990cbd6df21015eebdc171c533176e3407Fred Drake msg = "too many levels of indentation"; 142385f363990cbd6df21015eebdc171c533176e3407Fred Drake break; 1424d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis case E_DECODE: { 1425d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis PyObject *type, *value, *tb; 1426d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis PyErr_Fetch(&type, &value, &tb); 142700f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis if (value != NULL) { 1428d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis u = PyObject_Str(value); 142900f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis if (u != NULL) { 143000f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis msg = PyString_AsString(u); 143100f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis } 143200f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis } 1433c2632a5c34de3448fedc581a978a9a1924089fcdMartin v. Löwis if (msg == NULL) 1434c2632a5c34de3448fedc581a978a9a1924089fcdMartin v. Löwis msg = "unknown decode error"; 1435d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis Py_DECREF(type); 1436d35edda68245a7ab5f74c0f94ab13f6574df6a4eMartin v. Löwis Py_DECREF(value); 143740d37814166380b0fb585f818b446159cfbcec0fNeal Norwitz Py_XDECREF(tb); 1438c2632a5c34de3448fedc581a978a9a1924089fcdMartin v. Löwis break; 143900f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis } 14404bf108d74f2e36f16f4c0c00e7791e418e2d47ffMartin v. Löwis case E_LINECONT: 14414bf108d74f2e36f16f4c0c00e7791e418e2d47ffMartin v. Löwis msg = "unexpected character after line continuation character"; 14424bf108d74f2e36f16f4c0c00e7791e418e2d47ffMartin v. Löwis break; 1443a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum default: 1444a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum fprintf(stderr, "error=%d\n", err->error); 1445a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum msg = "unknown parsing error"; 1446a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum break; 1447a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum } 14483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton v = Py_BuildValue("(ziiz)", err->filename, 14493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton err->lineno, err->offset, err->text); 14503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (err->text != NULL) { 14513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton PyMem_DEL(err->text); 14523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton err->text = NULL; 14533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton } 14543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton w = NULL; 14553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton if (v != NULL) 14563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton w = Py_BuildValue("(sO)", msg, v); 145700f1e3f5a54adb0a7159a446edeca2e36da4092eMartin v. Löwis Py_XDECREF(u); 14584131830c23727aac262291934007c0b731b6e00cGuido van Rossum Py_XDECREF(v); 145985f363990cbd6df21015eebdc171c533176e3407Fred Drake PyErr_SetObject(errtype, w); 146082598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_XDECREF(w); 14611984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 14621984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 14631984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Print fatal error message and abort */ 14641984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 14651984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossumvoid 14667c321a80f93a572a5f4a94d5d2897f70b8315a2cTim PetersPy_FatalError(const char *msg) 14671984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 146883dd6c319e8c353b185038064e57282d8e396107Guido van Rossum fprintf(stderr, "Fatal Python error: %s\n", msg); 14696238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#ifdef MS_WINDOWS 147023c9446d9ab4b063211327a6f81eddf920c801caGuido van Rossum OutputDebugString("Fatal Python error: "); 1471a44823b7764281d398215564f2070257d08d0855Guido van Rossum OutputDebugString(msg); 1472a44823b7764281d398215564f2070257d08d0855Guido van Rossum OutputDebugString("\n"); 14730ba353608fb6315e2dfaab6d767aa92c05628b71Guido van Rossum#ifdef _DEBUG 14740ba353608fb6315e2dfaab6d767aa92c05628b71Guido van Rossum DebugBreak(); 1475a44823b7764281d398215564f2070257d08d0855Guido van Rossum#endif 14766238d2b024f061159b2613387ff700695c10deefMartin v. Löwis#endif /* MS_WINDOWS */ 14771984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum abort(); 14781984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 14791984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 14801984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum/* Clean up and exit */ 14811984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1482a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#ifdef WITH_THREAD 148349b560698b0bba848c4f8325803a26a4477fb12dGuido van Rossum#include "pythread.h" 1484f9f2e82fcade2d44a69bbdac1ba59bdf591743f4Guido van Rossum#endif 1485f9f2e82fcade2d44a69bbdac1ba59bdf591743f4Guido van Rossum 14862dcfc9618dbf1cf467436c4a0ccbb2d7df2ba25fGuido van Rossum#define NEXITFUNCS 32 1487f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersstatic void (*exitfuncs[NEXITFUNCS])(void); 14881662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossumstatic int nexitfuncs = 0; 14891662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum 1490f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersint Py_AtExit(void (*func)(void)) 14911662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum{ 14921662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum if (nexitfuncs >= NEXITFUNCS) 14931662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum return -1; 14941662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum exitfuncs[nexitfuncs++] = func; 14951662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum return 0; 14961662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum} 14971662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum 1498cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossumstatic void 1499f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterscall_sys_exitfunc(void) 15001984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum{ 150182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyObject *exitfunc = PySys_GetObject("exitfunc"); 150259bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum 150359bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum if (exitfunc) { 15046a12d8d3b4b7c70f92a17a20cb811b18069fd349Fred Drake PyObject *res; 150582598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_INCREF(exitfunc); 150682598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PySys_SetObject("exitfunc", (PyObject *)NULL); 150782598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum res = PyEval_CallObject(exitfunc, (PyObject *)NULL); 150859bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum if (res == NULL) { 150926fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { 151026fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee PySys_WriteStderr("Error in sys.exitfunc:\n"); 151126fabb00167143aaf7458284ce7201103d9b28ffKa-Ping Yee } 151282598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyErr_Print(); 151359bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum } 151482598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum Py_DECREF(exitfunc); 151559bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum } 151659bff399a08b29b93b9d87c422f7077fc75c2a2aGuido van Rossum 15170829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum if (Py_FlushLine()) 15180829c754bbb7b3ea66801c7da69f6cb189b80543Guido van Rossum PyErr_Clear(); 1519cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum} 15201662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum 1521cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossumstatic void 1522f70ef4f8606f99744252a804229d53a4d97601c1Thomas Wouterscall_ll_exitfuncs(void) 1523cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum{ 15241662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum while (nexitfuncs > 0) 15251662dd5a3d5301a54f15f861a5d24c179bf67bcaGuido van Rossum (*exitfuncs[--nexitfuncs])(); 152625ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum 152725ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum fflush(stdout); 152825ce566661c1b7446b3ddb4076513a62f93ce08dGuido van Rossum fflush(stderr); 1529a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum} 1530a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum 1531a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossumvoid 1532f70ef4f8606f99744252a804229d53a4d97601c1Thomas WoutersPy_Exit(int sts) 1533a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum{ 1534cc283f56a79e85fc7163f455b2ab4e0c28e93ff5Guido van Rossum Py_Finalize(); 15351984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 15361984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum exit(sts); 15371984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum} 15381984f1e1c6306d4e8073c28d2395638f80ea509bGuido van Rossum 1539f1dc56632881fe4e5beed047580bf927679f3669Guido van Rossumstatic void 1540f70ef4f8606f99744252a804229d53a4d97601c1Thomas Woutersinitsigs(void) 1541a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum{ 1542a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#ifdef SIGPIPE 15439ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter PyOS_setsig(SIGPIPE, SIG_IGN); 1544a110aa658bfb929e364f79675ab2c5879495dfedGuido van Rossum#endif 154570d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum#ifdef SIGXFZ 15469ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter PyOS_setsig(SIGXFZ, SIG_IGN); 154770d893a6aaf335383d2efcf7c40194e4f1a7e474Guido van Rossum#endif 15481b0bf9b7616a5d8b624ccb1670c7b71fa0850209Jeremy Hylton#ifdef SIGXFSZ 15499ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter PyOS_setsig(SIGXFSZ, SIG_IGN); 15501b0bf9b7616a5d8b624ccb1670c7b71fa0850209Jeremy Hylton#endif 155182598051e6831fadad5f27a20f24f484a54691f3Guido van Rossum PyOS_InitInterrupts(); /* May imply initsignal() */ 1552a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum} 1553a9e7dc10816dcf5eda63d3ef00930ef9d55e0675Guido van Rossum 15547433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum 15557433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum/* 15567433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum * The file descriptor fd is considered ``interactive'' if either 15577433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum * a) isatty(fd) is TRUE, or 15587433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum * b) the -i flag was given, and the filename associated with 15597433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum * the descriptor is NULL or "<stdin>" or "???". 15607433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum */ 15617433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossumint 156295292d6caa3af3196c5b9f5f95dae209815c09e5Martin v. LöwisPy_FdIsInteractive(FILE *fp, const char *filename) 15637433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum{ 15647433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum if (isatty((int)fileno(fp))) 15657433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum return 1; 15667433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum if (!Py_InteractiveFlag) 15677433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum return 0; 15687433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum return (filename == NULL) || 15697433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum (strcmp(filename, "<stdin>") == 0) || 15707433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum (strcmp(filename, "???") == 0); 15717433b12a5ca8c1c6a6685160edb09efbf61c4544Guido van Rossum} 15722f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 15732f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 1574d08e3824d40daa4c2fba9d6635256e44fe71936eTim Peters#if defined(USE_STACKCHECK) 15752f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#if defined(WIN32) && defined(_MSC_VER) 15762f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 15772f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh/* Stack checking for Microsoft C */ 15782f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 15792f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#include <malloc.h> 15802f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#include <excpt.h> 15812f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 1582e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake/* 1583e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake * Return non-zero when we run out of memory on the stack; zero otherwise. 1584e8de31cbd094bf9e909e1cb12a19c6c3ca854dd7Fred Drake */ 15852f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundhint 1586399739f79f1d6cef6bc8a8ec63f9a81255464f15Fred DrakePyOS_CheckStack(void) 15872f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh{ 15882f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh __try { 158992e4dd865709f4a4be2b11453ef4de954b8d7b14Tim Peters /* alloca throws a stack overflow exception if there's 15902f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh not enough space left on the stack */ 159192e4dd865709f4a4be2b11453ef4de954b8d7b14Tim Peters alloca(PYOS_STACK_MARGIN * sizeof(void*)); 15922f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh return 0; 15932f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh } __except (EXCEPTION_EXECUTE_HANDLER) { 15942f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh /* just ignore all errors */ 15952f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh } 15962f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh return 1; 15972f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh} 15982f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 15992f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#endif /* WIN32 && _MSC_VER */ 16002f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 16012f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh/* Alternate implementations can be added here... */ 16022f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh 16032f15b25da2060ab723e0bb82a8f4f713d547b2b8Fredrik Lundh#endif /* USE_STACKCHECK */ 16046f25618be5d8756284dc99c47953268e398175d0Guido van Rossum 16056f25618be5d8756284dc99c47953268e398175d0Guido van Rossum 16066f25618be5d8756284dc99c47953268e398175d0Guido van Rossum/* Wrappers around sigaction() or signal(). */ 16076f25618be5d8756284dc99c47953268e398175d0Guido van Rossum 16086f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_sighandler_t 16096f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_getsig(int sig) 16106f25618be5d8756284dc99c47953268e398175d0Guido van Rossum{ 16116f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#ifdef HAVE_SIGACTION 16126f25618be5d8756284dc99c47953268e398175d0Guido van Rossum struct sigaction context; 16139ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter if (sigaction(sig, NULL, &context) == -1) 16149ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter return SIG_ERR; 16156f25618be5d8756284dc99c47953268e398175d0Guido van Rossum return context.sa_handler; 16166f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#else 16176f25618be5d8756284dc99c47953268e398175d0Guido van Rossum PyOS_sighandler_t handler; 16186f25618be5d8756284dc99c47953268e398175d0Guido van Rossum handler = signal(sig, SIG_IGN); 16199ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter if (handler != SIG_ERR) 16209ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter signal(sig, handler); 16216f25618be5d8756284dc99c47953268e398175d0Guido van Rossum return handler; 16226f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#endif 16236f25618be5d8756284dc99c47953268e398175d0Guido van Rossum} 16246f25618be5d8756284dc99c47953268e398175d0Guido van Rossum 16256f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_sighandler_t 16266f25618be5d8756284dc99c47953268e398175d0Guido van RossumPyOS_setsig(int sig, PyOS_sighandler_t handler) 16276f25618be5d8756284dc99c47953268e398175d0Guido van Rossum{ 16286f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#ifdef HAVE_SIGACTION 16299ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter struct sigaction context, ocontext; 16306f25618be5d8756284dc99c47953268e398175d0Guido van Rossum context.sa_handler = handler; 16319ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter sigemptyset(&context.sa_mask); 16329ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter context.sa_flags = 0; 16339ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter if (sigaction(sig, &context, &ocontext) == -1) 16349ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter return SIG_ERR; 16359ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter return ocontext.sa_handler; 16366f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#else 16379ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter PyOS_sighandler_t oldhandler; 16389ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter oldhandler = signal(sig, handler); 16399ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter#ifdef HAVE_SIGINTERRUPT 16409ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter siginterrupt(sig, 1); 16419ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter#endif 16429ceaa72ebe96cb5423aa3fb2adede3fcd1c7b6b0Anthony Baxter return oldhandler; 16436f25618be5d8756284dc99c47953268e398175d0Guido van Rossum#endif 16446f25618be5d8756284dc99c47953268e398175d0Guido van Rossum} 16453e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 16463e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton/* Deprecated C API functions still provided for binary compatiblity */ 16473e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 16483e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseFile 16493e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton#undef PyParser_SimpleParseString 16503e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 16513e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnode * 16523e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseFile(FILE *fp, const char *filename, int start) 16533e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{ 16543e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return PyParser_SimpleParseFileFlags(fp, filename, start, 0); 16553e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 16563e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton 16573e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hyltonnode * 16583e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy HyltonPyParser_SimpleParseString(const char *str, int start) 16593e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton{ 16603e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton return PyParser_SimpleParseStringFlags(str, start, 0); 16613e0055f8c65c407e74ce476b8e2b1fb889723514Jeremy Hylton} 1662