pythonrun.c revision ad6dfda9afa3459eb802618c07969f6a1a0a1287
1f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum/*********************************************************** 2e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumCopyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, 3f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumThe Netherlands. 4f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum 5f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum All Rights Reserved 6e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum 7f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumPermission to use, copy, modify, and distribute this software and its 8f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumdocumentation for any purpose and without fee is hereby granted, 9f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumprovided that the above copyright notice appear in all copies and that 10f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumboth that copyright notice and this permission notice appear in 11f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumsupporting documentation, and that the names of Stichting Mathematisch 12e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumCentrum or CWI or Corporation for National Research Initiatives or 13f0dfc7ac5c2f76baaae0c3b45bc339281cfa2adcWalter DörwaldCNRI not be used in advertising or publicity pertaining to 14f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick Coghlandistribution of the software without specific, written prior 15f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick Coghlanpermission. 16f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick Coghlan 17f2b16f3eb4ae0bdcf267c49a6c46d230db2fbe23Nick CoghlanWhile CWI is the initial source for this software, a modified version 183fb55ca80e9edd3f87061d2ba7f82fbbe23ce674Nick Coghlanis made available by the Corporation for National Research Initiatives 1962b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum(CNRI) at the Internet address ftp://ftp.python.org. 2062b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum 21e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH 22f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 23f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH 24f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 25f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 26f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van RossumPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 27facf24bdc7b292029b3e611d241feee157cda4c4Guido van RossumTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 28e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van RossumPERFORMANCE OF THIS SOFTWARE. 29f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum 306e482569c8cba727d803e2283ae1481c5c308d54Neal Norwitz******************************************************************/ 3162b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum 3262b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum/* Python interpreter top-level routines, including init/exit */ 3362b297b698634969d6ce69f14ef3d268c8904a48Guido van Rossum 34f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "Python.h" 35f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum 36f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "grammar.h" 37f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "node.h" 38f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "parsetok.h" 39f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#undef argument /* Avoid conflict on Mac */ 40f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "errcode.h" 41f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "compile.h" 42f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "eval.h" 43f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "marshal.h" 44f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum 45f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#ifdef HAVE_UNISTD_H 46f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include <unistd.h> 476e482569c8cba727d803e2283ae1481c5c308d54Neal Norwitz#endif 486e482569c8cba727d803e2283ae1481c5c308d54Neal Norwitz 49f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#ifdef HAVE_SIGNAL_H 50f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include <signal.h> 51f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#endif 52f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum 53e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum#ifdef MS_WIN32 54e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum#undef BYTE 55f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#undef arglist 56f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#include "windows.h" 57f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum#endif 58e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum 59e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossumextern char *Py_GetPath(); 60e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossum 610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonextern grammar _PyParser_Grammar; /* From graminit.c */ 620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon/* Forward */ 645874ed6cee569a73cd0e947605210822b251df7fR. David Murraystatic void initmain Py_PROTO((void)); 65e57c96ee4cef00515e3bf6529d6888c4b5f8483bGuido van Rossumstatic PyObject *run_err_node Py_PROTO((node *n, char *filename, 66af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *globals, PyObject *locals)); 67af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject *run_node Py_PROTO((node *n, char *filename, 68af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *globals, PyObject *locals)); 69af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename, 70af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *globals, PyObject *locals)); 71764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadéstatic void err_input Py_PROTO((perrdetail *)); 72af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic void initsigs Py_PROTO((void)); 73764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 74764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadéint Py_DebugFlag; /* Needed by parser.c */ 75af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint Py_VerboseFlag; /* Needed by import.c */ 76af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */ 77af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 78d74fb6b12a9a53ce09648484076c84e727561612Guido van Rossum/* Initialize the current interpreter; pass in the Python path. */ 7938cb9f1f174415d3b37fbaeb5d152d65525839d2Fred Drake 80d2f6ae63cd546d84310324012740425772e83de7Victor Stinnervoid 81d2f6ae63cd546d84310324012740425772e83de7Victor StinnerPy_Setup() 82d2f6ae63cd546d84310324012740425772e83de7Victor Stinner{ 83d2f6ae63cd546d84310324012740425772e83de7Victor Stinner PyImport_Init(); 84d2f6ae63cd546d84310324012740425772e83de7Victor Stinner 851fb5ce0323926406e6b3db6879152e0dcc40f5ecFred Drake /* Modules '__builtin__' and 'sys' are initialized here, 8638cb9f1f174415d3b37fbaeb5d152d65525839d2Fred Drake they are needed by random bits of the interpreter. 87af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes All other modules are optional and are initialized 880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon when they are first imported. */ 890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyBuiltin_Init(); /* Also initializes builtin exceptions */ 910c469854bcb6f7180d261bc1f6adb67f27656419Neal Norwitz PySys_Init(); 92470321108019367e3bdd96309e89d79f04784d45Phillip J. Eby 930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PySys_SetPath(Py_GetPath()); 940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 95d2f6ae63cd546d84310324012740425772e83de7Victor Stinner initsigs(); /* Signal handling stuff, including initintr() */ 96d2f6ae63cd546d84310324012740425772e83de7Victor Stinner 970096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon initmain(); 98af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes} 990096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1000096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon/* Create and interpreter and thread state and initialize them; 1010096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if we already have an interpreter and thread, do nothing. 1020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Fatal error if the creation fails. */ 1030096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1040096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonvoid 1050096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPy_Initialize() 1060096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{ 1070096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyThreadState *tstate; 1080096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyInterpreterState *interp; 1090096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon char *p; 1100096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (PyThreadState_Get()) 1120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return; 1130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if ((p = getenv("PYTHONDEBUG")) && *p != '\0') 1150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_DebugFlag = 1; 1160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if ((p = getenv("PYTHONVERBOSE")) && *p != '\0') 117af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes Py_VerboseFlag = 1; 1187f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake 1190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon interp = PyInterpreterState_New(); 1200096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (interp == NULL) 1217f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake Py_FatalError("PyInterpreterState_New() failed"); 1220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon tstate = PyThreadState_New(interp); 1240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (tstate == NULL) 1250096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_FatalError("PyThreadState_New() failed"); 1260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon (void) PyThreadState_Swap(tstate); 1277f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake 1280096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_Setup(); 1297f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake 130af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PySys_SetPath(Py_GetPath()); 1310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon /* XXX Who should set the path -- Setup or Initialize? */ 1328d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandl} 1338d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandl 1348d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandlstatic char *progname = "python"; 1358d76cca0265aaa23d2a59af3bfb1bcd133c0a59dGeorg Brandl 1360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonvoid 1377f5296e7c06f5a6010960f34ae7db89d8902cddbFred DrakePy_SetProgramName(pn) 1387f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake char *pn; 1397f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake{ 1407f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake if (pn && *pn) 1410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon progname = pn; 1420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 1434d0bddfee66383e746a79d60cd64e40fc1ab1df7Brett Cannon 1440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonchar * 1450096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPy_GetProgramName() 146af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{ 1475874ed6cee569a73cd0e947605210822b251df7fR. David Murray return progname; 1480096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 1490096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1505874ed6cee569a73cd0e947605210822b251df7fR. David Murray/* 1515874ed6cee569a73cd0e947605210822b251df7fR. David Murray Py_Initialize() 1525874ed6cee569a73cd0e947605210822b251df7fR. David Murray -- do everything, no-op on second call, call fatal on failure, set path 1535874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1545874ed6cee569a73cd0e947605210822b251df7fR. David Murray #2 1555874ed6cee569a73cd0e947605210822b251df7fR. David Murray -- create new interp+tstate & make it current, return NULL on failure, 1565874ed6cee569a73cd0e947605210822b251df7fR. David Murray make it current, do all setup, set path 1575874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1585874ed6cee569a73cd0e947605210822b251df7fR. David Murray #3 1595874ed6cee569a73cd0e947605210822b251df7fR. David Murray -- #2 without set path 1605874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1615874ed6cee569a73cd0e947605210822b251df7fR. David Murray #4 1625874ed6cee569a73cd0e947605210822b251df7fR. David Murray -- is there any point to #3 for caller-provided current interp+tstate? 1635874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1645874ed6cee569a73cd0e947605210822b251df7fR. David Murray*/ 1655874ed6cee569a73cd0e947605210822b251df7fR. David Murray 1665874ed6cee569a73cd0e947605210822b251df7fR. David Murray/* Create __main__ module */ 1670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 1680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonstatic void 1690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannoninitmain() 1700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{ 171af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *m, *d; 17212f8c4d2e3edf2717869c7578616f188ecd2daedBrett Cannon m = PyImport_AddModule("__main__"); 1730096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (m == NULL) 1740096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_FatalError("can't create __main__ module"); 1750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon d = PyModule_GetDict(m); 1764d0bddfee66383e746a79d60cd64e40fc1ab1df7Brett Cannon if (PyDict_GetItemString(d, "__builtins__") == NULL) { 1770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (PyDict_SetItemString(d, "__builtins__", 1780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyEval_GetBuiltins())) 1790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_FatalError("can't add __builtins__ to __main__"); 1801fb5ce0323926406e6b3db6879152e0dcc40f5ecFred Drake } 1810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 18245e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 183f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum/* Parse input from a file and execute it */ 18445e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van Rossum 185f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossumint 18645e2fbc2e70ef28b1f0327207f33dab3a4e825c5Guido van RossumPyRun_AnyFile(fp, filename) 187af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes FILE *fp; 188af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes char *filename; 189af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{ 190af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (filename == NULL) 1917f5296e7c06f5a6010960f34ae7db89d8902cddbFred Drake filename = "???"; 1920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (Py_FdIsInteractive(fp, filename)) 1930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return PyRun_InteractiveLoop(fp, filename); 1940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else 195af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return PyRun_SimpleFile(fp, filename); 196af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes} 197af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 198af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint 1995217d5d6784759eea18b6d49e2fcaa9503fa6b62Andrew M. KuchlingPyRun_InteractiveLoop(fp, filename) 200af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes FILE *fp; 201af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes char *filename; 202af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{ 203af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *v; 204af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes int ret; 205af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes v = PySys_GetObject("ps1"); 206c3939142e867f39210766f46a7d19564dd4e91feNan Zhang if (v == NULL) { 207c3939142e867f39210766f46a7d19564dd4e91feNan Zhang PySys_SetObject("ps1", v = PyString_FromString(">>> ")); 208c3939142e867f39210766f46a7d19564dd4e91feNan Zhang Py_XDECREF(v); 209c3939142e867f39210766f46a7d19564dd4e91feNan Zhang } 210af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes v = PySys_GetObject("ps2"); 211af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (v == NULL) { 212af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PySys_SetObject("ps2", v = PyString_FromString("... ")); 213af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes Py_XDECREF(v); 214af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes } 215af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes for (;;) { 216af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes ret = PyRun_InteractiveOne(fp, filename); 217af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes#ifdef Py_REF_DEBUG 218af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes fprintf(stderr, "[%ld refs]\n", _Py_RefTotal); 219af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes#endif 220af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (ret == E_EOF) 221af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return 0; 222af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes /* 223af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (ret == E_NOMEM) 224764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé return -1; 225764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé */ 226af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes } 227764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé} 228764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé 229764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadéint 230af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyRun_InteractiveOne(fp, filename) 231764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé FILE *fp; 232764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé char *filename; 233764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé{ 2345633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé PyObject *m, *d, *v, *w; 2355633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé node *n; 236764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé perrdetail err; 237764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé char *ps1, *ps2; 238764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé v = PySys_GetObject("ps1"); 239764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé w = PySys_GetObject("ps2"); 240764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (v != NULL && PyString_Check(v)) { 241764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé Py_INCREF(v); 242764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé ps1 = PyString_AsString(v); 243764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé } 244764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé else { 245764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé v = NULL; 246764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé ps1 = ""; 247764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé } 248764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (w != NULL && PyString_Check(w)) { 249764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé Py_INCREF(w); 2505633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé ps2 = PyString_AsString(w); 2515633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé } 2522f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren else { 2532f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren w = NULL; 2542f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren ps2 = ""; 2552f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren } 2562f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren Py_BEGIN_ALLOW_THREADS 2572f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, 2582f88bfdf9673a5e14669da375b4aad4a29815fa9Ronald Oussoren Py_single_input, ps1, ps2, &err); 2595633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadé Py_END_ALLOW_THREADS 260764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé Py_XDECREF(v); 261764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé Py_XDECREF(w); 262764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (n == NULL) { 263764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (err.error == E_EOF) { 264764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (err.text) 265764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé free(err.text); 266764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé return E_EOF; 267764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé } 268764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé err_input(&err); 269764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé PyErr_Print(); 270764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé return err.error; 271764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé } 272764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé m = PyImport_AddModule("__main__"); 273764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (m == NULL) 274af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return -1; 275af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes d = PyModule_GetDict(m); 276764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé v = run_node(n, filename, d, d); 277764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (v == NULL) { 278764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé PyErr_Print(); 279af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return -1; 280764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé } 281764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé Py_DECREF(v); 282764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (Py_FlushLine()) 283764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé PyErr_Clear(); 284764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé return 0; 2853b95934e0585762661269d41b5a5d79f1b9c2244Benjamin Peterson} 286af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 287af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesint 288af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyRun_SimpleFile(fp, filename) 289af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes FILE *fp; 2903b95934e0585762661269d41b5a5d79f1b9c2244Benjamin Peterson char *filename; 291af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{ 292af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *m, *d, *v; 293764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé char *ext; 294af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 295764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé m = PyImport_AddModule("__main__"); 296af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (m == NULL) 297af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return -1; 298764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé d = PyModule_GetDict(m); 299af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes ext = filename + strlen(filename) - 4; 300764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0 301764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé#ifdef macintosh 302764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */ 303af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes || getfiletype(filename) == 'PYC ' 304764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé || getfiletype(filename) == 'APPL' 305764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé#endif /* macintosh */ 306764fc235a6d6a8cf54ca47911e2237f2f17e38a7Tarek Ziadé ) { 307af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes /* Try to run a pyc file. First, re-open in binary */ 308af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes /* Don't close, done in main: fclose(fp); */ 309af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if( (fp = fopen(filename, "rb")) == NULL ) { 310af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes fprintf(stderr, "python: Can't reopen .pyc file\n"); 3110096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return -1; 3120096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 3130096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon /* Turn on optimization if a .pyo file is given */ 3140096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (strcmp(ext, ".pyo") == 0) 3150096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_OptimizeFlag = 1; 3160096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon v = run_pyc_file(fp, filename, d, d); 3170096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } else { 3184e0e1b6a540e664e89739456db4c706701bf062bTim Peters v = PyRun_File(fp, filename, Py_file_input, d, d); 3190096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 3202e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre if (v == NULL) { 3212e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre PyErr_Print(); 3222e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre return -1; 3232e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre } 3242e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre Py_DECREF(v); 3252e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre if (Py_FlushLine()) 3262e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre PyErr_Clear(); 3272e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre return 0; 3282e8a6e0ec6729ffb490130eff6bb33ea9375c75cAndrew MacIntyre} 3290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 330bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtinint 331bc96f3272d77f587da975eac0c753b7dc7a621aaBrian CurtinPyRun_SimpleString(command) 332bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtin char *command; 333bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtin{ 3340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyObject *m, *d, *v; 3350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon m = PyImport_AddModule("__main__"); 3360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (m == NULL) 33724cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl return -1; 3380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon d = PyModule_GetDict(m); 33924cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl v = PyRun_String(command, Py_file_input, d, d); 3400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (v == NULL) { 34124cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl PyErr_Print(); 34288ca467ca4b1f13a9fb172712cf25eeae94e3095Tim Peters return -1; 34324cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl } 34424cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl Py_DECREF(v); 34524cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl if (Py_FlushLine()) 34624cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl PyErr_Clear(); 34724cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl return 0; 34824cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl} 349d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser 350d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiservoid 351d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. KaiserPyErr_Print() 352d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser{ 353d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser int err = 0; 354d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser PyObject *exception, *v, *tb, *f; 35524cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl PyErr_Fetch(&exception, &v, &tb); 35624cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl if (exception == NULL) 35724cb053b158a3cd63f7be05ac27f47e45bb2f1b3Georg Brandl return; 3580096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (exception == PyExc_SystemExit) { 3590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = Py_FlushLine(); 3600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon fflush(stdout); 3610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (v == NULL || v == Py_None) 3620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_Exit(0); 363d89fa0c5761254c970af72e5abcea420fd23e893Guido van Rossum if (PyInt_Check(v)) 364d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum Py_Exit((int)PyInt_AsLong(v)); 365d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum else { 366f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum /* OK to use real stderr here */ 367f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyObject_Print(v, stderr, Py_PRINT_RAW); 368f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum fprintf(stderr, "\n"); 369f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum Py_Exit(1); 370f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum } 371f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum } 372f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PySys_SetObject("last_type", exception); 373f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PySys_SetObject("last_value", v); 374f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PySys_SetObject("last_traceback", tb); 375f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum f = PySys_GetObject("stderr"); 376f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum if (f == NULL) 377f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum fprintf(stderr, "lost sys.stderr\n"); 3780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else { 3790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = Py_FlushLine(); 380f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum fflush(stdout); 3810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (err == 0) 382f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum err = PyTraceBack_Print(tb, f); 383f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum if (err == 0 && exception == PyExc_SyntaxError) { 384f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyObject *message; 385f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum char *filename, *text; 386f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum int lineno, offset; 387f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum if (!PyArg_Parse(v, "(O(ziiz))", &message, 388f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum &filename, &lineno, &offset, &text)) 389f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyErr_Clear(); 390f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum else { 391f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum char buf[10]; 392d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum PyFile_WriteString(" File \"", f); 393d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum if (filename == NULL) 394d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum PyFile_WriteString("<string>", f); 395f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum else 396f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyFile_WriteString(filename, f); 397f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyFile_WriteString("\", line ", f); 398f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum sprintf(buf, "%d", lineno); 399f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyFile_WriteString(buf, f); 400f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum PyFile_WriteString("\n", f); 401f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum if (text != NULL) { 402f19a7ac220178bbe6bfdf88561dea355392aec24Guido van Rossum char *nl; 403d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum if (offset > 0 && 404d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum offset == (int)strlen(text)) 405d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum offset--; 406d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum for (;;) { 407d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum nl = strchr(text, '\n'); 408d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum if (nl == NULL || 409d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum nl-text >= offset) 410d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum break; 411d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum offset -= (nl+1-text); 412d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum text = nl+1; 413d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum } 414d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum while (*text == ' ' || *text == '\t') { 415d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum text++; 416d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum offset--; 417d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum } 418d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum PyFile_WriteString(" ", f); 419d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum PyFile_WriteString(text, f); 420d1252395bd697b2f2b2f461c1078fda22ab739b1Guido van Rossum if (*text == '\0' || 4210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon text[strlen(text)-1] != '\n') 4220096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyFile_WriteString("\n", f); 4230096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyFile_WriteString(" ", f); 4240096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon offset--; 4250096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon while (offset > 0) { 4260096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyFile_WriteString(" ", f); 4270096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon offset--; 4280096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyFile_WriteString("^\n", f); 4300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_INCREF(message); 4320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_DECREF(v); 4330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon v = message; 43475461e3e2ebefa4a6ef0f191658ce5599e1580a1Benjamin Peterson /* Can't be bothered to check all those 4350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyFile_WriteString() calls */ 4360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (PyErr_Occurred()) 4370096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = -1; 4380096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 440bc96f3272d77f587da975eac0c753b7dc7a621aaBrian Curtin if (err) { 4410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon /* Don't do anything else */ 4420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else if (PyClass_Check(exception)) { 4440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyObject* className = 44583213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum ((PyClassObject*)exception)->cl_name; 44683213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum if (className == NULL) 44783213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum err = PyFile_WriteString("<unknown>", f); 44883213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum else 44983213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum err = PyFile_WriteObject(className, f, 45083213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum Py_PRINT_RAW); 45183213cc0a0e052cb899f83a9848557db02528aa1Guido van Rossum } 4520096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon else 4530096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = PyFile_WriteObject(exception, f, Py_PRINT_RAW); 4540096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (err == 0) { 4550096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (v != NULL && v != Py_None) { 4560096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = PyFile_WriteString(": ", f); 4570096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (err == 0) 4580096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = PyFile_WriteObject(v, f, Py_PRINT_RAW); 4590096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4600096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4610096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (err == 0) 4620096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon err = PyFile_WriteString("\n", f); 4630096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon } 4640096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_XDECREF(exception); 4650096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_XDECREF(v); 4660096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_XDECREF(tb); 4670096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon /* If an error happened here, don't show it. 4680096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon XXX This is wrong, but too many callers rely on this behavior. */ 4690096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (err != 0) 4700096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyErr_Clear(); 4710096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 4720096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 4730096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyObject * 4740096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyRun_String(str, start, globals, locals) 4750096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon char *str; 4760096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon int start; 4770096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyObject *globals, *locals; 4780096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{ 4790096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return run_err_node(PyParser_SimpleParseString(str, start), 4800096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "<string>", globals, locals); 4810096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 4820096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 4830096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyObject * 4840096e262ffe836b4c7511158678f9e257cc3a020Brett CannonPyRun_File(fp, filename, start, globals, locals) 4850096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon FILE *fp; 4860096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon char *filename; 4870096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon int start; 4880096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyObject *globals, *locals; 4890096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon{ 4900096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return run_err_node(PyParser_SimpleParseFile(fp, filename, start), 4910096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon filename, globals, locals); 4920096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 4930096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 4940096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonstatic PyObject * 4950096e262ffe836b4c7511158678f9e257cc3a020Brett Cannonrun_err_node(n, filename, globals, locals) 4966664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner node *n; 4976664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner char *filename; 4986664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner PyObject *globals, *locals; 4996664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner{ 5006664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner if (n == NULL) 5016664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner return NULL; 5020096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon return run_node(n, filename, globals, locals); 5030096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon} 504af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 505af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject * 506af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesrun_node(n, filename, globals, locals) 507af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes node *n; 508af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes char *filename; 509af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyObject *globals, *locals; 5106664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner{ 5116664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner PyCodeObject *co; 5126664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner PyObject *v; 5136664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner co = PyNode_Compile(n, filename); 5146664426d7cdb63b88d973a731cc442ecba10047aVictor Stinner PyNode_Free(n); 5153ec32005e8fa40c2471e7869a6e49407241442abVictor Stinner if (co == NULL) 516af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return NULL; 517af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes v = PyEval_EvalCode(co, globals, locals); 5180096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_DECREF(co); 519af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return v; 520af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes} 5210096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 522af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesstatic PyObject * 523af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesrun_pyc_file(fp, filename, globals, locals) 524af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes FILE *fp; 525c3939142e867f39210766f46a7d19564dd4e91feNan Zhang char *filename; 526c3939142e867f39210766f46a7d19564dd4e91feNan Zhang PyObject *globals, *locals; 527c3939142e867f39210766f46a7d19564dd4e91feNan Zhang{ 528af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyCodeObject *co; 5290096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyObject *v; 5300096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon long magic; 5310096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon long PyImport_GetMagicNumber(); 5320096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon 5330096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon magic = PyMarshal_ReadLongFromFile(fp); 5340096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (magic != PyImport_GetMagicNumber()) { 5350096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyErr_SetString(PyExc_RuntimeError, 5360096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "Bad magic number in .pyc file"); 537af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return NULL; 538af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes } 5390096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon (void) PyMarshal_ReadLongFromFile(fp); 5400096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon v = PyMarshal_ReadObjectFromFile(fp); 5410096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon fclose(fp); 5420096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon if (v == NULL || !PyCode_Check(v)) { 5430096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon Py_XDECREF(v); 5440096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon PyErr_SetString(PyExc_RuntimeError, 5450096e262ffe836b4c7511158678f9e257cc3a020Brett Cannon "Bad code object in .pyc file"); 546f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum return NULL; 547af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes } 548af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes co = (PyCodeObject *)v; 549af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes v = PyEval_EvalCode(co, globals, locals); 550af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes Py_DECREF(co); 551af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return v; 552af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes} 553af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 554af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyObject * 555af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPy_CompileString(str, filename, start) 556af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes char *str; 55717433d206c1a705c8dad9a52d33c5546dc069e42Christian Heimes char *filename; 558af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes int start; 559af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{ 560af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes node *n; 561af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyCodeObject *co; 562af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes n = PyParser_SimpleParseString(str, start); 563af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (n == NULL) 564af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return NULL; 565af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes co = PyNode_Compile(n, filename); 566af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes PyNode_Free(n); 567af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return (PyObject *)co; 568af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes} 569af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 570af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes/* Simplified interface to parsefile -- return node or set exception */ 571af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 572af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesnode * 573af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyParser_SimpleParseFile(fp, filename, start) 574af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes FILE *fp; 575af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes char *filename; 576af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes int start; 577af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes{ 578af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes node *n; 579af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes perrdetail err; 580af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes Py_BEGIN_ALLOW_THREADS 581af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start, 582af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes (char *)0, (char *)0, &err); 583af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes Py_END_ALLOW_THREADS 584af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes if (n == NULL) 585af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes err_input(&err); 586af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes return n; 587af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes} 588af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 589af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes/* Simplified interface to parsestring -- return node or set exception */ 590af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes 591af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimesnode * 592af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian HeimesPyParser_SimpleParseString(str, start) 593af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes char *str; 594af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes int start; 595f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum{ 596f30bec7bb2d06da0543d435b1edcb983cbd2801bGuido van Rossum node *n; 597af748c3ab8f4274a01630bc5dd95ede7db5f115bChristian Heimes perrdetail err; 598 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err); 599 if (n == NULL) 600 err_input(&err); 601 return n; 602} 603 604/* Set the error appropriate to the given input error code (see errcode.h) */ 605 606static void 607err_input(err) 608 perrdetail *err; 609{ 610 PyObject *v, *w; 611 char *msg = NULL; 612 v = Py_BuildValue("(ziiz)", err->filename, 613 err->lineno, err->offset, err->text); 614 if (err->text != NULL) { 615 free(err->text); 616 err->text = NULL; 617 } 618 switch (err->error) { 619 case E_SYNTAX: 620 msg = "invalid syntax"; 621 break; 622 case E_TOKEN: 623 msg = "invalid token"; 624 625 break; 626 case E_INTR: 627 PyErr_SetNone(PyExc_KeyboardInterrupt); 628 return; 629 case E_NOMEM: 630 PyErr_NoMemory(); 631 return; 632 case E_EOF: 633 msg = "unexpected EOF while parsing"; 634 break; 635 default: 636 fprintf(stderr, "error=%d\n", err->error); 637 msg = "unknown parsing error"; 638 break; 639 } 640 w = Py_BuildValue("(sO)", msg, v); 641 Py_XDECREF(v); 642 PyErr_SetObject(PyExc_SyntaxError, w); 643 Py_XDECREF(w); 644} 645 646/* Print fatal error message and abort */ 647 648void 649Py_FatalError(msg) 650 char *msg; 651{ 652 fprintf(stderr, "Fatal Python error: %s\n", msg); 653#ifdef macintosh 654 for (;;); 655#endif 656#ifdef MS_WIN32 657 OutputDebugString("Fatal Python error: "); 658 OutputDebugString(msg); 659 OutputDebugString("\n"); 660#endif 661 abort(); 662} 663 664/* Clean up and exit */ 665 666#ifdef WITH_THREAD 667#include "thread.h" 668int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */ 669#endif 670 671#define NEXITFUNCS 32 672static void (*exitfuncs[NEXITFUNCS])(); 673static int nexitfuncs = 0; 674 675int Py_AtExit(func) 676 void (*func) Py_PROTO((void)); 677{ 678 if (nexitfuncs >= NEXITFUNCS) 679 return -1; 680 exitfuncs[nexitfuncs++] = func; 681 return 0; 682} 683 684void 685Py_Cleanup() 686{ 687 PyObject *exitfunc = PySys_GetObject("exitfunc"); 688 689 if (exitfunc) { 690 PyObject *res; 691 Py_INCREF(exitfunc); 692 PySys_SetObject("exitfunc", (PyObject *)NULL); 693 res = PyEval_CallObject(exitfunc, (PyObject *)NULL); 694 if (res == NULL) { 695 fprintf(stderr, "Error in sys.exitfunc:\n"); 696 PyErr_Print(); 697 } 698 Py_DECREF(exitfunc); 699 } 700 701 Py_FlushLine(); 702 703 while (nexitfuncs > 0) 704 (*exitfuncs[--nexitfuncs])(); 705} 706 707#ifdef COUNT_ALLOCS 708extern void dump_counts Py_PROTO((void)); 709#endif 710 711void 712Py_Exit(sts) 713 int sts; 714{ 715 Py_Cleanup(); 716 717#ifdef COUNT_ALLOCS 718 dump_counts(); 719#endif 720 721#ifdef WITH_THREAD 722 723 /* Other threads may still be active, so skip most of the 724 cleanup actions usually done (these are mostly for 725 debugging anyway). */ 726 727 (void) PyEval_SaveThread(); 728#ifndef NO_EXIT_PROG 729 if (_PyThread_Started) 730 _exit_prog(sts); 731 else 732 exit_prog(sts); 733#else /* !NO_EXIT_PROG */ 734 if (_PyThread_Started) 735 _exit(sts); 736 else 737 exit(sts); 738#endif /* !NO_EXIT_PROG */ 739 740#else /* WITH_THREAD */ 741 742 PyImport_Cleanup(); 743 744 PyErr_Clear(); 745 746#ifdef Py_REF_DEBUG 747 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal); 748#endif 749 750#ifdef Py_TRACE_REFS 751 if (_Py_AskYesNo("Print left references?")) { 752 _Py_PrintReferences(stderr); 753 } 754#endif /* Py_TRACE_REFS */ 755 756#ifdef macintosh 757 PyMac_Exit(sts); 758#else 759 exit(sts); 760#endif 761#endif /* WITH_THREAD */ 762 /*NOTREACHED*/ 763} 764 765#ifdef HAVE_SIGNAL_H 766static RETSIGTYPE 767sighandler(sig) 768 int sig; 769{ 770 signal(sig, SIG_DFL); /* Don't catch recursive signals */ 771 Py_Cleanup(); /* Do essential clean-up */ 772#ifdef HAVE_KILL 773 kill(getpid(), sig); /* Pretend the signal killed us */ 774#else 775 exit(1); 776#endif 777 /*NOTREACHED*/ 778} 779#endif 780 781static void 782initsigs() 783{ 784 RETSIGTYPE (*t)(); 785#ifdef HAVE_SIGNAL_H 786#ifdef SIGPIPE 787 signal(SIGPIPE, SIG_IGN); 788#endif 789#ifdef SIGHUP 790 t = signal(SIGHUP, SIG_IGN); 791 if (t == SIG_DFL) 792 signal(SIGHUP, sighandler); 793 else 794 signal(SIGHUP, t); 795#endif 796#ifdef SIGTERM 797 t = signal(SIGTERM, SIG_IGN); 798 if (t == SIG_DFL) 799 signal(SIGTERM, sighandler); 800 else 801 signal(SIGTERM, t); 802#endif 803#endif /* HAVE_SIGNAL_H */ 804 PyOS_InitInterrupts(); /* May imply initsignal() */ 805} 806 807#ifdef Py_TRACE_REFS 808/* Ask a yes/no question */ 809 810int 811_Py_AskYesNo(prompt) 812 char *prompt; 813{ 814 char buf[256]; 815 816 printf("%s [ny] ", prompt); 817 if (fgets(buf, sizeof buf, stdin) == NULL) 818 return 0; 819 return buf[0] == 'y' || buf[0] == 'Y'; 820} 821#endif 822 823#ifdef MPW 824 825/* Check for file descriptor connected to interactive device. 826 Pretend that stdin is always interactive, other files never. */ 827 828int 829isatty(fd) 830 int fd; 831{ 832 return fd == fileno(stdin); 833} 834 835#endif 836 837/* 838 * The file descriptor fd is considered ``interactive'' if either 839 * a) isatty(fd) is TRUE, or 840 * b) the -i flag was given, and the filename associated with 841 * the descriptor is NULL or "<stdin>" or "???". 842 */ 843int 844Py_FdIsInteractive(fp, filename) 845 FILE *fp; 846 char *filename; 847{ 848 if (isatty((int)fileno(fp))) 849 return 1; 850 if (!Py_InteractiveFlag) 851 return 0; 852 return (filename == NULL) || 853 (strcmp(filename, "<stdin>") == 0) || 854 (strcmp(filename, "???") == 0); 855} 856