14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Python interpreter top-level routines, including init/exit */ 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python.h" 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "Python-ast.h" 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef Yield /* undefine macro conflicting with winbase.h */ 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "grammar.h" 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "node.h" 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "token.h" 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "parsetok.h" 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "errcode.h" 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "code.h" 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "compile.h" 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "symtable.h" 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "pyarena.h" 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "ast.h" 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "eval.h" 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "marshal.h" 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "abstract.h" 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SIGNAL_H 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <signal.h> 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "malloc.h" /* for alloca */ 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LANGINFO_H 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <locale.h> 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <langinfo.h> 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef BYTE 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "windows.h" 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_REF_DEBUG 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PRINT_TOTAL_REFS() 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* Py_REF_DEBUG */ 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PRINT_TOTAL_REFS() fprintf(stderr, \ 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "[%" PY_FORMAT_SIZE_T "d refs]\n", \ 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_GetRefTotal()) 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern "C" { 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern char *Py_GetPath(void); 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern grammar _PyParser_Grammar; /* From graminit.c */ 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Forward */ 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void initmain(void); 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void initsite(void); 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *, 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *, PyArena *); 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *, 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *); 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void err_input(perrdetail *); 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void initsigs(void); 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void wait_for_thread_shutdown(void); 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void call_sys_exitfunc(void); 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void call_ll_exitfuncs(void); 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void _PyUnicode_Init(void); 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void _PyUnicode_Fini(void); 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void _PyGILState_Fini(void); 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* WITH_THREAD */ 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_DebugFlag; /* Needed by parser.c */ 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_VerboseFlag; /* Needed by import.c */ 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */ 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_InspectFlag; /* Needed to determine whether to exit at SystemExit */ 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_NoSiteFlag; /* Suppress 'import site' */ 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */ 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */ 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_FrozenFlag; /* Needed by getpath.c */ 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_UnicodeFlag = 0; /* Needed by compile.c */ 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed, 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm on the command line, and is used in 2.2 by ceval.c to make all "/" divisions 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm true divisions (which they will be in 2.3). */ 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint _Py_QnewFlag = 0; 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_NoUserSiteDirectory = 0; /* for -s and site.py */ 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* PyModule_GetWarningsModule is no longer necessary as of 2.6 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmsince _warnings is builtin. This API should not be used. */ 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyModule_GetWarningsModule(void) 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyImport_ImportModule("warnings"); 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int initialized = 0; 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* API to access the initialized flag -- useful for esoteric use */ 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_IsInitialized(void) 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return initialized; 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Global initializations. Can be undone by Py_Finalize(). Don't 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm call this twice without an intervening Py_Finalize() call. When 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initializations fail, a fatal error is issued and the function does 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm not return. On return, the first thread and interpreter state have 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm been created. 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Locking: you must hold the interpreter lock while calling this. 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (If the lock has not yet been initialized, that's equivalent to 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm having the lock, but you cannot use multiple threads.) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmadd_flag(int flag, const char *envs) 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int env = atoi(envs); 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flag < env) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flag = env; 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flag < 1) 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flag = 1; 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return flag; 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_InitializeEx(int install_sigs) 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState *interp; 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate; 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *bimod, *sysmod; 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *p; 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *icodeset = NULL; /* On Windows, input codeset may theoretically 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm differ from output codeset. */ 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *codeset = NULL; 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *errors = NULL; 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int free_codeset = 0; 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int overridden = 0; 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sys_stream, *sys_isatty; 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *saved_locale, *loc_codeset; 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char ibuf[128]; 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char buf[128]; 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm extern void _Py_ReadyTypes(void); 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (initialized) 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initialized = 1; 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0') 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DebugFlag = add_flag(Py_DebugFlag, p); 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0') 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_VerboseFlag = add_flag(Py_VerboseFlag, p); 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0') 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp = PyInterpreterState_New(); 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp == NULL) 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't make first interpreter"); 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate = PyThreadState_New(interp); 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tstate == NULL) 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't make first thread"); 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (void) PyThreadState_Swap(tstate); 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_ReadyTypes(); 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!_PyFrame_Init()) 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't init frames"); 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!_PyInt_Init()) 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't init ints"); 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!_PyLong_Init()) 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't init longs"); 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyByteArray_Init()) 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't init bytearray"); 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyFloat_Init(); 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->modules = PyDict_New(); 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp->modules == NULL) 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't make modules dictionary"); 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->modules_reloading = PyDict_New(); 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp->modules_reloading == NULL) 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't make modules_reloading dictionary"); 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Init Unicode implementation; relies on the codec registry */ 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyUnicode_Init(); 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bimod = _PyBuiltin_Init(); 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bimod == NULL) 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't initialize __builtin__"); 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->builtins = PyModule_GetDict(bimod); 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp->builtins == NULL) 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't initialize builtins dict"); 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(interp->builtins); 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sysmod = _PySys_Init(); 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sysmod == NULL) 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't initialize sys"); 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->sysdict = PyModule_GetDict(sysmod); 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp->sysdict == NULL) 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_Initialize: can't initialize sys dict"); 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(interp->sysdict); 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImport_FixupExtension("sys", "sys"); 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetPath(Py_GetPath()); 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(interp->sysdict, "modules", 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->modules); 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImport_Init(); 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* initialize builtin exceptions */ 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyExc_Init(); 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImport_FixupExtension("exceptions", "exceptions"); 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* phase 2 of builtins */ 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImport_FixupExtension("__builtin__", "__builtin__"); 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImportHooks_Init(); 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (install_sigs) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initsigs(); /* Signal handling stuff, including initintr() */ 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Initialize warnings. */ 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyWarnings_Init(); 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PySys_HasWarnOptions()) { 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *warnings_module = PyImport_ImportModule("warnings"); 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!warnings_module) 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(warnings_module); 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initmain(); /* Module __main__ */ 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* auto-thread-state API, if available */ 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyGILState_Init(interp, tstate); 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* WITH_THREAD */ 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!Py_NoSiteFlag) 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initsite(); /* Module site */ 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') { 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = icodeset = codeset = strdup(p); 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free_codeset = 1; 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errors = strchr(p, ':'); 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errors) { 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *errors = '\0'; 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errors++; 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm overridden = 1; 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET) 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* On Unix, set the file system encoding according to the 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm user's preference, if the CODESET names a well-known 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Python codec, and Py_FileSystemDefaultEncoding isn't 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initialized by other means. Also set the encoding of 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stdin and stdout if these are terminals, unless overridden. */ 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!overridden || !Py_FileSystemDefaultEncoding) { 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm saved_locale = strdup(setlocale(LC_CTYPE, NULL)); 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setlocale(LC_CTYPE, ""); 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loc_codeset = nl_langinfo(CODESET); 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (loc_codeset && *loc_codeset) { 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *enc = PyCodec_Encoder(loc_codeset); 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (enc) { 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loc_codeset = strdup(loc_codeset); 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(enc); 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_LookupError)) { 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loc_codeset = NULL; 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exit(1); 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm loc_codeset = NULL; 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm setlocale(LC_CTYPE, saved_locale); 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(saved_locale); 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!overridden) { 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm codeset = icodeset = loc_codeset; 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free_codeset = 1; 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Initialize Py_FileSystemDefaultEncoding from 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm locale even if PYTHONIOENCODING is set. */ 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!Py_FileSystemDefaultEncoding) { 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FileSystemDefaultEncoding = loc_codeset; 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!overridden) 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free_codeset = 0; 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!overridden) { 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm icodeset = ibuf; 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm codeset = buf; 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(ibuf, "cp%d", GetConsoleCP()); 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sprintf(buf, "cp%d", GetConsoleOutputCP()); 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (codeset) { 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_stream = PySys_GetObject("stdin"); 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!sys_isatty) 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((overridden || 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (sys_isatty && PyObject_IsTrue(sys_isatty))) && 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_Check(sys_stream)) { 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyFile_SetEncodingAndErrors(sys_stream, icodeset, errors)) 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Cannot set codeset of stdin"); 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(sys_isatty); 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_stream = PySys_GetObject("stdout"); 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!sys_isatty) 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((overridden || 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (sys_isatty && PyObject_IsTrue(sys_isatty))) && 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_Check(sys_stream)) { 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Cannot set codeset of stdout"); 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(sys_isatty); 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_stream = PySys_GetObject("stderr"); 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys_isatty = PyObject_CallMethod(sys_stream, "isatty", ""); 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!sys_isatty) 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if((overridden || 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (sys_isatty && PyObject_IsTrue(sys_isatty))) && 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_Check(sys_stream)) { 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors)) 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Cannot set codeset of stderr"); 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(sys_isatty); 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (free_codeset) 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm free(codeset); 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_Initialize(void) 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_InitializeEx(1); 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern void dump_counts(FILE*); 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Undo the effect of Py_Initialize(). 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Beware: if multiple interpreter and/or thread states exist, these 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm are not wiped out; only the current thread and interpreter state 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm are deleted. But since everything else is deleted, those other 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interpreter and thread states should no longer be used. 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (XXX We should do better, e.g. wipe out all interpreters and 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm threads.) 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Locking: as above. 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_Finalize(void) 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState *interp; 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate; 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!initialized) 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm wait_for_thread_shutdown(); 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The interpreter is still entirely intact at this point, and the 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * exit funcs may be relying on that. In particular, if some thread 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * or exit func is still waiting to do an import, the import machinery 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * expects Py_IsInitialized() to return true. So don't say the 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * interpreter is uninitialized until after the exit funcs have run. 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Note that Threading.py uses an exit func to do a join on all the 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * threads created thru it, so this also protects pending imports in 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the threads created via Threading. 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm call_sys_exitfunc(); 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initialized = 0; 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Get current thread state and interpreter pointer */ 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate = PyThreadState_GET(); 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp = tstate->interp; 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Disable signal handling */ 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_FiniInterrupts(); 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Clear type lookup cache */ 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyType_ClearCache(); 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Collect garbage. This may call finalizers; it's nice to call these 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * before all modules are destroyed. 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX If a __del__ or weakref callback is triggered here, and tries to 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX import a module, bad things can happen, because Python no 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX longer believes it's initialized. 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX Fatal Python error: Interpreter not initialized (version mismatch?) 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX is easy to provoke that way. I've also seen, e.g., 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX Exception exceptions.ImportError: 'No module named sha' 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX in <function callback at 0x008F5718> ignored 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX but I'm unclear on exactly how that one happens. In any case, 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX I haven't seen a real-life report of either of these. 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyGC_Collect(); 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* With COUNT_ALLOCS, it helps to run GC multiple times: 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm each collection might release some types from the type 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm list, so they become garbage. */ 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (PyGC_Collect() > 0) 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* nothing */; 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Destroy all modules */ 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyImport_Cleanup(); 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Collect final garbage. This disposes of cycles created by 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * new-style class definitions, for example. 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX This is disabled because it caused too many problems. If 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX a __del__ or weakref callback triggers here, Python code has 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX a hard time running, because even the sys module has been 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc). 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX One symptom is a sequence of information-free messages 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX coming from threads (if a __del__ or callback is invoked, 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX other threads can execute too, and any exception they encounter 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX triggers a comedy of errors as subsystem after subsystem 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX fails to find what it *expects* to find in sys to help report 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX the exception and consequent unexpected failures). I've also 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX seen segfaults then, after adding print statements to the 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * XXX Python code getting called. 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if 0 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyGC_Collect(); 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Destroy the database used by _PyImport_{Fixup,Find}Extension */ 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImport_Fini(); 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Debugging stuff */ 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef COUNT_ALLOCS 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dump_counts(stdout); 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PRINT_TOTAL_REFS(); 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Display all objects still alive -- this can invoke arbitrary 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * __repr__ overrides, so requires a mostly-intact interpreter. 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Alas, a lot of stuff may still be alive now that will be cleaned 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * up later. 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_GETENV("PYTHONDUMPREFS")) 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_PrintReferences(stderr); 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_TRACE_REFS */ 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Clear interpreter state */ 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState_Clear(interp); 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Now we decref the exception classes. After this point nothing 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm can raise an exception. That's okay, because each Fini() method 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm below has been checked to make sure no exceptions are ever 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raised. 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyExc_Fini(); 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Cleanup auto-thread-state */ 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyGILState_Fini(); 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* WITH_THREAD */ 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Delete current thread */ 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState_Swap(NULL); 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState_Delete(interp); 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Sundry finalizers */ 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMethod_Fini(); 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFrame_Fini(); 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCFunction_Fini(); 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyTuple_Fini(); 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyList_Fini(); 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySet_Fini(); 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_Fini(); 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyByteArray_Fini(); 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInt_Fini(); 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFloat_Fini(); 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_Fini(); 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_USING_UNICODE 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Cleanup Unicode implementation */ 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyUnicode_Fini(); 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX Still allocated: 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm - various static ad-hoc pointers to interned strings 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm - int and float free list blocks 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm - whatever various modules and libraries allocate 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyGrammar_RemoveAccelerators(&_PyParser_Grammar); 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_TRACE_REFS 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Display addresses (& refcnts) of all objects still alive. 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * An address can be used to find the repr of the object, printed 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * above by _Py_PrintReferences. 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_GETENV("PYTHONDUMPREFS")) 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_PrintReferenceAddresses(stderr); 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_TRACE_REFS */ 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef PYMALLOC_DEBUG 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_GETENV("PYTHONMALLOCSTATS")) 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyObject_DebugMallocStats(); 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm call_ll_exitfuncs(); 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create and initialize a new interpreter and thread, and return the 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new thread. This requires that Py_Initialize() has been called 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm first. 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unsuccessful initialization yields a NULL pointer. Note that *no* 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exception information is available even in this case -- the 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exception information is held in the thread, and there is no 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm thread. 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Locking: as above. 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyThreadState * 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_NewInterpreter(void) 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState *interp; 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate, *save_tstate; 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *bimod, *sysmod; 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!initialized) 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_NewInterpreter: call Py_Initialize first"); 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp = PyInterpreterState_New(); 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp == NULL) 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tstate = PyThreadState_New(interp); 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tstate == NULL) { 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState_Delete(interp); 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm save_tstate = PyThreadState_Swap(tstate); 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* XXX The following is lax in error checking */ 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->modules = PyDict_New(); 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->modules_reloading = PyDict_New(); 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bimod = _PyImport_FindExtension("__builtin__", "__builtin__"); 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bimod != NULL) { 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->builtins = PyModule_GetDict(bimod); 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp->builtins == NULL) 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto handle_error; 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(interp->builtins); 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sysmod = _PyImport_FindExtension("sys", "sys"); 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bimod != NULL && sysmod != NULL) { 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->sysdict = PyModule_GetDict(sysmod); 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (interp->sysdict == NULL) 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto handle_error; 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(interp->sysdict); 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetPath(Py_GetPath()); 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(interp->sysdict, "modules", 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm interp->modules); 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _PyImportHooks_Init(); 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initmain(); 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!Py_NoSiteFlag) 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm initsite(); 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyErr_Occurred()) 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return tstate; 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhandle_error: 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Oops, it didn't work. Undo it all. */ 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState_Clear(tstate); 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState_Swap(save_tstate); 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState_Delete(tstate); 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState_Delete(interp); 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Delete an interpreter and its last thread. This requires that the 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm given thread state is current, that the thread has no remaining 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm frames, and that it is its interpreter's only remaining thread. 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm It is a fatal error to violate these constraints. 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Py_Finalize() doesn't have these constraints -- it zaps 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm everything, regardless.) 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Locking: as above. 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_EndInterpreter(PyThreadState *tstate) 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState *interp = tstate->interp; 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tstate != PyThreadState_GET()) 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_EndInterpreter: thread is not current"); 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tstate->frame != NULL) 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_EndInterpreter: thread still has a frame"); 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tstate != interp->tstate_head || tstate->next != NULL) 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Py_EndInterpreter: not the last thread"); 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyImport_Cleanup(); 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState_Clear(interp); 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState_Swap(NULL); 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyInterpreterState_Delete(interp); 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char *progname = "python"; 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SetProgramName(char *pn) 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (pn && *pn) 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm progname = pn; 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmchar * 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_GetProgramName(void) 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return progname; 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic char *default_home = NULL; 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SetPythonHome(char *home) 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default_home = home; 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmchar * 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_GetPythonHome(void) 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *home = default_home; 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (home == NULL && !Py_IgnoreEnvironmentFlag) 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm home = Py_GETENV("PYTHONHOME"); 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return home; 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Create __main__ module */ 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitmain(void) 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m, *d; 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = PyImport_AddModule("__main__"); 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("can't create __main__ module"); 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = PyModule_GetDict(m); 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItemString(d, "__builtins__") == NULL) { 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *bimod = PyImport_ImportModule("__builtin__"); 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (bimod == NULL || 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyDict_SetItemString(d, "__builtins__", bimod) != 0) 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("can't add __builtins__ to __main__"); 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(bimod); 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Import the site module (not into __main__ though) */ 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitsite(void) 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m; 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = PyImport_ImportModule("site"); 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) { 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_Finalize(); 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exit(1); 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(m); 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Parse input from a file and execute it */ 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *flags) 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (filename == NULL) 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm filename = "???"; 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FdIsInteractive(fp, filename)) { 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int err = PyRun_InteractiveLoopFlags(fp, filename, flags); 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (closeit) 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fclose(fp); 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return err; 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_SimpleFileExFlags(fp, filename, closeit, flags); 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int ret; 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags local_flags; 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags == NULL) { 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = &local_flags; 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm local_flags.cf_flags = 0; 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PySys_GetObject("ps1"); 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("ps1", v = PyString_FromString(">>> ")); 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PySys_GetObject("ps2"); 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("ps2", v = PyString_FromString("... ")); 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (;;) { 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = PyRun_InteractiveOneFlags(fp, filename, flags); 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PRINT_TOTAL_REFS(); 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ret == E_EOF) 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ret == E_NOMEM) 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if 0 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* compute parser flags based on compiler flags */ 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PARSER_FLAGS(flags) \ 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0) 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if 1 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Keep an example of flags with future keyword support. */ 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PARSER_FLAGS(flags) \ 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \ 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyPARSE_DONT_IMPLY_DEDENT : 0) \ 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm | (((flags)->cf_flags & CO_FUTURE_PRINT_FUNCTION) ? \ 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyPARSE_PRINT_IS_FUNCTION : 0) \ 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm | (((flags)->cf_flags & CO_FUTURE_UNICODE_LITERALS) ? \ 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyPARSE_UNICODE_LITERALS : 0) \ 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) : 0) 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m, *d, *v, *w; 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena *arena; 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *ps1 = "", *ps2 = ""; 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int errcode = 0; 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PySys_GetObject("ps1"); 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v != NULL) { 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyObject_Str(v); 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyString_Check(v)) 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ps1 = PyString_AsString(v); 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = PySys_GetObject("ps2"); 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (w != NULL) { 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = PyObject_Str(w); 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (w == NULL) 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyString_Check(w)) 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ps2 = PyString_AsString(w); 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arena = PyArena_New(); 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arena == NULL) { 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(w); 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyParser_ASTFromFile(fp, filename, 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_single_input, ps1, ps2, 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags, &errcode, arena); 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(w); 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mod == NULL) { 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errcode == E_EOF) { 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return E_EOF; 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = PyImport_AddModule("__main__"); 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) { 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = PyModule_GetDict(m); 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = run_mod(mod, filename, d, d, flags, arena); 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Check whether a file maybe a pyc file: Look at the extension, 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the file type, and, if we may close it, at the first few bytes. */ 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit) 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0) 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Only look into the file if we are allowed to close it, since 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm it then should also be seekable. */ 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (closeit) { 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Read only two bytes of the magic. If the file was opened in 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm text mode, the bytes 3 and 4 of the magic (\r\n) might not 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm be read as they are on disk. */ 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned char buf[2]; 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Mess: In case of -x, the stream is NOT at its start now, 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and ungetc() was used to push back the first newline, 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm which makes the current stream position formally undefined, 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm and a x-platform nightmare. 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Unfortunately, we have no direct way to know whether -x 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm was specified. So we use a terrible hack: if the current 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stream position is not 0, we assume -x was specified, and 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm give up. Bug 132850 on SourceForge spells out the 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hopelessness of trying anything else (fseek and ftell 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm don't work predictably x-platform for text-mode files). 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int ispyc = 0; 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (ftell(fp) == 0) { 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (fread(buf, 1, 2, fp) == 2 && 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ispyc = 1; 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rewind(fp); 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ispyc; 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *flags) 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m, *d, *v; 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *ext; 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int set_file_name = 0, ret, len; 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = PyImport_AddModule("__main__"); 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = PyModule_GetDict(m); 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_GetItemString(d, "__file__") == NULL) { 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *f = PyString_FromString(filename); 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (f == NULL) 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyDict_SetItemString(d, "__file__", f) < 0) { 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(f); 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm set_file_name = 1; 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(f); 9194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm len = strlen(filename); 9214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ext = filename + len - (len > 4 ? 4 : 0); 9224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (maybe_pyc_file(fp, filename, ext, closeit)) { 9234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Try to run a pyc file. First, re-open in binary */ 9244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (closeit) 9254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fclose(fp); 9264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((fp = fopen(filename, "rb")) == NULL) { 9274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(stderr, "python: Can't reopen .pyc file\n"); 9284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = -1; 9294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 9304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Turn on optimization if a .pyo file is given */ 9324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (strcmp(ext, ".pyo") == 0) 9334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_OptimizeFlag = 1; 9344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = run_pyc_file(fp, filename, d, d, flags); 9354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 9364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d, 9374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm closeit, flags); 9384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 9404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 9414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = -1; 9424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 9434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 9454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 9464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 9474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = 0; 9484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm done: 9494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (set_file_name && PyDict_DelItemString(d, "__file__")) 9504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 9514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ret; 9524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 9554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags) 9564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *m, *d, *v; 9584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m = PyImport_AddModule("__main__"); 9594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (m == NULL) 9604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = PyModule_GetDict(m); 9624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyRun_StringFlags(command, Py_file_input, d, d, flags); 9634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL) { 9644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 9654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 9664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 9674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 9684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 9694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 9704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 9714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 9724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int 9744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmparse_syntax_error(PyObject *err, PyObject **message, const char **filename, 9754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int *lineno, int *offset, const char **text) 9764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 9774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long hold; 9784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 9794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* old style errors */ 9814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyTuple_Check(err)) 9824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyArg_ParseTuple(err, "O(ziiz)", message, filename, 9834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm lineno, offset, text); 9844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* new style errors. `err' is an instance */ 9864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (! (v = PyObject_GetAttrString(err, "msg"))) 9884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 9894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *message = v; 9904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(v = PyObject_GetAttrString(err, "filename"))) 9924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 9934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == Py_None) 9944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *filename = NULL; 9954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (! (*filename = PyString_AsString(v))) 9964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 9974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 9994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(v = PyObject_GetAttrString(err, "lineno"))) 10004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hold = PyInt_AsLong(v); 10024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 10034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = NULL; 10044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (hold < 0 && PyErr_Occurred()) 10054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *lineno = (int)hold; 10074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(v = PyObject_GetAttrString(err, "offset"))) 10094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == Py_None) { 10114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *offset = -1; 10124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 10134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = NULL; 10144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 10154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hold = PyInt_AsLong(v); 10164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 10174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = NULL; 10184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (hold < 0 && PyErr_Occurred()) 10194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *offset = (int)hold; 10214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!(v = PyObject_GetAttrString(err, "text"))) 10244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == Py_None) 10264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *text = NULL; 10274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (! (*text = PyString_AsString(v))) 10284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto finally; 10294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v); 10304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 10314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfinally: 10334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 10344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 10354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 10384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyErr_Print(void) 10394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_PrintEx(1); 10414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 10444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmprint_error_text(PyObject *f, int offset, const char *text) 10454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *nl; 10474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset >= 0) { 10484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset > 0 && offset == strlen(text) && text[offset - 1] == '\n') 10494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset--; 10504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (;;) { 10514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm nl = strchr(text, '\n'); 10524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nl == NULL || nl-text >= offset) 10534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 10544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset -= (int)(nl+1-text); 10554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm text = nl+1; 10564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (*text == ' ' || *text == '\t') { 10584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm text++; 10594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset--; 10604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(" ", f); 10634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(text, f); 10644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (*text == '\0' || text[strlen(text)-1] != '\n') 10654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString("\n", f); 10664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (offset == -1) 10674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 10684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(" ", f); 10694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset--; 10704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (offset > 0) { 10714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(" ", f); 10724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm offset--; 10734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 10744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString("^\n", f); 10754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 10764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 10784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmhandle_system_exit(void) 10794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 10804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *exception, *value, *tb; 10814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int exitcode = 0; 10824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_InspectFlag) 10844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Don't exit if -i flag was given. This flag is set to 0 10854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * when entering interactive mode for inspecting. */ 10864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 10874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 10884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Fetch(&exception, &value, &tb); 10894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 10904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 10914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stdout); 10924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (value == NULL || value == Py_None) 10934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 10944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyExceptionInstance_Check(value)) { 10954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* The error code should be in the `code' attribute. */ 10964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *code = PyObject_GetAttrString(value, "code"); 10974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (code) { 10984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(value); 10994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = code; 11004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (value == Py_None) 11014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto done; 11024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If we failed to dig out the 'code' attribute, 11044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm just let the else clause below print the error. */ 11054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyInt_Check(value)) 11074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exitcode = (int)PyInt_AsLong(value); 11084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 11094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *sys_stderr = PySys_GetObject("stderr"); 11104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sys_stderr != NULL && sys_stderr != Py_None) { 11114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW); 11124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 11134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_Print(value, stderr, Py_PRINT_RAW); 11144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stderr); 11154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr("\n"); 11174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exitcode = 1; 11184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm done: 11204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Restore and clear the exception info, in order to properly decref 11214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the exception, value, and traceback. If we just exit instead, 11224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * these leak, which confuses PYTHONDUMPREFS output, and may prevent 11234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * some finalizers from running. 11244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 11254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Restore(exception, value, tb); 11264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 11274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_Exit(exitcode); 11284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* NOTREACHED */ 11294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 11324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyErr_PrintEx(int set_sys_last_vars) 11334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *exception, *v, *tb, *hook; 11354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 11374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm handle_system_exit(); 11384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Fetch(&exception, &v, &tb); 11404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (exception == NULL) 11414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 11424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NormalizeException(&exception, &v, &tb); 11434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (exception == NULL) 11444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 11454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Now we know v != NULL too */ 11464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (set_sys_last_vars) { 11474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("last_type", exception); 11484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("last_value", v); 11494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("last_traceback", tb); 11504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hook = PySys_GetObject("excepthook"); 11524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (hook && hook != Py_None) { 11534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *args = PyTuple_Pack(3, 11544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exception, v, tb ? tb : Py_None); 11554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result = PyEval_CallObject(hook, args); 11564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) { 11574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *exception2, *v2, *tb2; 11584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_ExceptionMatches(PyExc_SystemExit)) { 11594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm handle_system_exit(); 11604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Fetch(&exception2, &v2, &tb2); 11624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NormalizeException(&exception2, &v2, &tb2); 11634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* It should not be possible for exception2 or v2 11644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm to be NULL. However PyErr_Display() can't 11654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tolerate NULLs, so just be safe. */ 11664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (exception2 == NULL) { 11674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exception2 = Py_None; 11684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(exception2); 11694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v2 == NULL) { 11714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v2 = Py_None; 11724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(v2); 11734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 11754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 11764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stdout); 11774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr("Error in sys.excepthook:\n"); 11784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Display(exception2, v2, tb2); 11794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr("\nOriginal exception was:\n"); 11804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Display(exception, v, tb); 11814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(exception2); 11824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(v2); 11834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tb2); 11844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(result); 11864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(args); 11874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } else { 11884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr("sys.excepthook is missing\n"); 11894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Display(exception, v, tb); 11904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 11914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(exception); 11924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 11934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tb); 11944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 11954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 11964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 11974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) 11984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 11994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int err = 0; 12004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *f = PySys_GetObject("stderr"); 12014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(value); 12024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (f == NULL || f == Py_None) 12034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(stderr, "lost sys.stderr\n"); 12044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 12054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 12064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 12074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stdout); 12084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (tb && tb != Py_None) 12094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyTraceBack_Print(tb, f); 12104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err == 0 && 12114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_HasAttrString(value, "print_file_and_line")) 12124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 12134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *message; 12144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *filename, *text; 12154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int lineno, offset; 12164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!parse_syntax_error(value, &message, &filename, 12174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &lineno, &offset, &text)) 12184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 12194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 12204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char buf[10]; 12214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(" File \"", f); 12224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (filename == NULL) 12234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString("<string>", f); 12244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 12254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(filename, f); 12264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString("\", line ", f); 12274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_snprintf(buf, sizeof(buf), "%d", lineno); 12284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString(buf, f); 12294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString("\n", f); 12304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (text != NULL) 12314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm print_error_text(f, offset, text); 12324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(value); 12334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm value = message; 12344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Can't be bothered to check all those 12354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyFile_WriteString() calls */ 12364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (PyErr_Occurred()) 12374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = -1; 12384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err) { 12414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Don't do anything else */ 12424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (PyExceptionClass_Check(exception)) { 12444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* moduleName; 12454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char* className = PyExceptionClass_Name(exception); 12464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (className != NULL) { 12474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *dot = strrchr(className, '.'); 12484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (dot != NULL) 12494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm className = dot+1; 12504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm moduleName = PyObject_GetAttrString(exception, "__module__"); 12534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (moduleName == NULL) 12544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteString("<unknown>", f); 12554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 12564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char* modstr = PyString_AsString(moduleName); 12574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (modstr && strcmp(modstr, "exceptions")) 12584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 12594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteString(modstr, f); 12604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err += PyFile_WriteString(".", f); 12614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(moduleName); 12634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err == 0) { 12654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (className == NULL) 12664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteString("<unknown>", f); 12674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 12684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteString(className, f); 12694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 12724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteObject(exception, f, Py_PRINT_RAW); 12734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err == 0 && (value != Py_None)) { 12744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *s = PyObject_Str(value); 12754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* only print colon if the str() of the 12764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm object is not the empty string 12774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 12784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (s == NULL) 12794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = -1; 12804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (!PyString_Check(s) || 12814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyString_GET_SIZE(s) != 0) 12824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteString(": ", f); 12834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err == 0) 12844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err = PyFile_WriteObject(s, f, Py_PRINT_RAW); 12854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(s); 12864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* try to write a newline in any case */ 12884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err += PyFile_WriteString("\n", f); 12894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 12904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(value); 12914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* If an error happened here, don't show it. 12924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm XXX This is wrong, but too many callers rely on this behavior. */ 12934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err != 0) 12944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 12954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 12964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 12974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 12984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_StringFlags(const char *str, int start, PyObject *globals, 12994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *locals, PyCompilerFlags *flags) 13004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ret = NULL; 13024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 13034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena *arena = PyArena_New(); 13044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arena == NULL) 13054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyParser_ASTFromString(str, "<string>", start, flags, arena); 13084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mod != NULL) 13094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = run_mod(mod, "<string>", globals, locals, flags, arena); 13104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 13114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ret; 13124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 13154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, 13164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *locals, int closeit, PyCompilerFlags *flags) 13174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *ret; 13194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 13204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena *arena = PyArena_New(); 13214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arena == NULL) 13224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, 13254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags, NULL, arena); 13264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (closeit) 13274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fclose(fp); 13284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mod == NULL) { 13294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 13304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ret = run_mod(mod, filename, globals, locals, flags, arena); 13334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 13344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ret; 13354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 13384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrun_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals, 13394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *flags, PyArena *arena) 13404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCodeObject *co; 13424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 13434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm co = PyAST_Compile(mod, filename, flags, arena); 13444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (co == NULL) 13454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyEval_EvalCode(co, globals, locals); 13474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(co); 13484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 13494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic PyObject * 13524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrun_pyc_file(FILE *fp, const char *filename, PyObject *globals, 13534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *locals, PyCompilerFlags *flags) 13544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCodeObject *co; 13564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v; 13574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long magic; 13584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm long PyImport_GetMagicNumber(void); 13594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm magic = PyMarshal_ReadLongFromFile(fp); 13614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (magic != PyImport_GetMagicNumber()) { 13624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_RuntimeError, 13634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Bad magic number in .pyc file"); 13644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (void) PyMarshal_ReadLongFromFile(fp); 13674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyMarshal_ReadLastObjectFromFile(fp); 13684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fclose(fp); 13694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v == NULL || !PyCode_Check(v)) { 13704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 13714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetString(PyExc_RuntimeError, 13724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Bad code object in .pyc file"); 13734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm co = (PyCodeObject *)v; 13764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = PyEval_EvalCode(co, globals, locals); 13774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v && flags) 13784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags->cf_flags |= (co->co_flags & PyCF_MASK); 13794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(co); 13804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return v; 13814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 13824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyObject * 13844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_CompileStringFlags(const char *str, const char *filename, int start, 13854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *flags) 13864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 13874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCodeObject *co; 13884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 13894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena *arena = PyArena_New(); 13904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arena == NULL) 13914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 13934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyParser_ASTFromString(str, filename, start, flags, arena); 13944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mod == NULL) { 13954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 13964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 13974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 13984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags && (flags->cf_flags & PyCF_ONLY_AST)) { 13994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result = PyAST_mod2obj(mod); 14004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 14014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return result; 14024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm co = PyAST_Compile(mod, filename, flags, arena); 14044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 14054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (PyObject *)co; 14064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstruct symtable * 14094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_SymtableString(const char *str, const char *filename, int start) 14104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm struct symtable *st; 14124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 14134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags flags; 14144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena *arena = PyArena_New(); 14154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (arena == NULL) 14164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags.cf_flags = 0; 14194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyParser_ASTFromString(str, filename, start, &flags, arena); 14214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (mod == NULL) { 14224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 14234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm st = PySymtable_Build(mod, filename, 0); 14264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena_Free(arena); 14274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return st; 14284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Preferred access to parser is through AST. */ 14314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmod_ty 14324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_ASTFromString(const char *s, const char *filename, int start, 14334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *flags, PyArena *arena) 14344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 14364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags localflags; 14374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm perrdetail err; 14384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int iflags = PARSER_FLAGS(flags); 14394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node *n = PyParser_ParseStringFlagsFilenameEx(s, filename, 14414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &_PyParser_Grammar, start, &err, 14424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &iflags); 14434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags == NULL) { 14444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm localflags.cf_flags = 0; 14454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = &localflags; 14464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n) { 14484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags->cf_flags |= iflags & PyCF_MASK; 14494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyAST_FromNode(n, flags, filename, arena); 14504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyNode_Free(n); 14514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return mod; 14524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 14544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err_input(&err); 14554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmod_ty 14604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, 14614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *ps2, PyCompilerFlags *flags, int *errcode, 14624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyArena *arena) 14634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod_ty mod; 14654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags localflags; 14664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm perrdetail err; 14674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int iflags = PARSER_FLAGS(flags); 14684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node *n = PyParser_ParseFileFlagsEx(fp, filename, &_PyParser_Grammar, 14704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start, ps1, ps2, &err, &iflags); 14714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (flags == NULL) { 14724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm localflags.cf_flags = 0; 14734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags = &localflags; 14744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n) { 14764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm flags->cf_flags |= iflags & PyCF_MASK; 14774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm mod = PyAST_FromNode(n, flags, filename, arena); 14784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyNode_Free(n); 14794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return mod; 14804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 14824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err_input(&err); 14834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errcode) 14844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *errcode = err.error; 14854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return NULL; 14864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 14874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 14884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Simplified interface to parsefile -- return node or set exception */ 14904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 14914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnode * 14924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) 14934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 14944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm perrdetail err; 14954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, 14964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start, NULL, NULL, &err, flags); 14974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n == NULL) 14984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err_input(&err); 14994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 15014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Simplified interface to parsestring -- return node or set exception */ 15044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnode * 15064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SimpleParseStringFlags(const char *str, int start, int flags) 15074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm perrdetail err; 15094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, 15104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm start, &err, flags); 15114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n == NULL) 15124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err_input(&err); 15134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 15144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnode * 15174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename, 15184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int start, int flags) 15194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm perrdetail err; 15214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node *n = PyParser_ParseStringFlagsFilename(str, filename, 15224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm &_PyParser_Grammar, start, &err, flags); 15234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n == NULL) 15244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err_input(&err); 15254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return n; 15264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmnode * 15294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SimpleParseStringFilename(const char *str, const char *filename, int start) 15304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0); 15324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* May want to move a more generalized form of this to parsetok.c or 15354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm even parser modules. */ 15364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 15384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SetError(perrdetail *err) 15394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err_input(err); 15414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 15424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Set the error appropriate to the given input error code (see errcode.h) */ 15444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 15454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 15464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmerr_input(perrdetail *err) 15474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 15484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *v, *w, *errtype; 15494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject* u = NULL; 15504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *msg = NULL; 15514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errtype = PyExc_SyntaxError; 15524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (err->error) { 15534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_ERROR: 15544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 15554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_SYNTAX: 15564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errtype = PyExc_IndentationError; 15574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err->expected == INDENT) 15584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "expected an indented block"; 15594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (err->token == INDENT) 15604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unexpected indent"; 15614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (err->token == DEDENT) 15624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unexpected unindent"; 15634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else { 15644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errtype = PyExc_SyntaxError; 15654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "invalid syntax"; 15664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 15674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_TOKEN: 15694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "invalid token"; 15704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_EOFS: 15724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "EOF while scanning triple-quoted string literal"; 15734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_EOLS: 15754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "EOL while scanning string literal"; 15764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_INTR: 15784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyErr_Occurred()) 15794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetNone(PyExc_KeyboardInterrupt); 15804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto cleanup; 15814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_NOMEM: 15824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_NoMemory(); 15834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm goto cleanup; 15844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_EOF: 15854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unexpected EOF while parsing"; 15864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_TABSPACE: 15884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errtype = PyExc_TabError; 15894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "inconsistent use of tabs and spaces in indentation"; 15904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_OVERFLOW: 15924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "expression too long"; 15934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_DEDENT: 15954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errtype = PyExc_IndentationError; 15964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unindent does not match any outer indentation level"; 15974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 15984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_TOODEEP: 15994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errtype = PyExc_IndentationError; 16004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "too many levels of indentation"; 16014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_DECODE: { 16034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *type, *value, *tb; 16044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Fetch(&type, &value, &tb); 16054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (value != NULL) { 16064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm u = PyObject_Str(value); 16074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (u != NULL) { 16084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = PyString_AsString(u); 16094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (msg == NULL) 16124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unknown decode error"; 16134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(type); 16144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(value); 16154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(tb); 16164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case E_LINECONT: 16194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unexpected character after line continuation character"; 16204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 16224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(stderr, "error=%d\n", err->error); 16234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm msg = "unknown parsing error"; 16244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 16254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm v = Py_BuildValue("(ziiz)", err->filename, 16274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err->lineno, err->offset, err->text); 16284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = NULL; 16294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (v != NULL) 16304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm w = Py_BuildValue("(sO)", msg, v); 16314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(u); 16324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(v); 16334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_SetObject(errtype, w); 16344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_XDECREF(w); 16354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcleanup: 16364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (err->text != NULL) { 16374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject_FREE(err->text); 16384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm err->text = NULL; 16394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 16414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Print fatal error message and abort */ 16434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 16454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_FatalError(const char *msg) 16464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 16474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fprintf(stderr, "Fatal Python error: %s\n", msg); 16484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stderr); /* it helps in Windows debug build */ 16494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef MS_WINDOWS 16514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 16524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t len = strlen(msg); 16534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm WCHAR* buffer; 16544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t i; 16554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Convert the message to wchar_t. This uses a simple one-to-one 16574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm conversion, assuming that the this error message actually uses ASCII 16584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm only. If this ceases to be true, we will have to convert. */ 16594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buffer = alloca( (len+1) * (sizeof *buffer)); 16604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for( i=0; i<=len; ++i) 16614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm buffer[i] = msg[i]; 16624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OutputDebugStringW(L"Fatal Python error: "); 16634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OutputDebugStringW(buffer); 16644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm OutputDebugStringW(L"\n"); 16654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef _DEBUG 16674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm DebugBreak(); 16684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 16694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* MS_WINDOWS */ 16704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm abort(); 16714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 16724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Clean up and exit */ 16744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD 16764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "pythread.h" 16774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 16784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 16794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Wait until threading._shutdown completes, provided 16804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the threading module was imported in the first place. 16814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The shutdown routine will wait until all non-daemon 16824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "threading" threads have completed. */ 16834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 16844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwait_for_thread_shutdown(void) 16854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 16864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef WITH_THREAD 16874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *result; 16884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyThreadState *tstate = PyThreadState_GET(); 16894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *threading = PyMapping_GetItemString(tstate->interp->modules, 16904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "threading"); 16914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (threading == NULL) { 16924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* threading not imported */ 16934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 16944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return; 16954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 16964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm result = PyObject_CallMethod(threading, "_shutdown", ""); 16974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (result == NULL) 16984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_WriteUnraisable(threading); 16994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else 17004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(result); 17014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(threading); 17024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 17034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NEXITFUNCS 32 17064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void (*exitfuncs[NEXITFUNCS])(void); 17074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic int nexitfuncs = 0; 17084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint Py_AtExit(void (*func)(void)) 17104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (nexitfuncs >= NEXITFUNCS) 17124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return -1; 17134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exitfuncs[nexitfuncs++] = func; 17144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 17154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 17184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcall_sys_exitfunc(void) 17194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *exitfunc = PySys_GetObject("exitfunc"); 17214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (exitfunc) { 17234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyObject *res; 17244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_INCREF(exitfunc); 17254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_SetObject("exitfunc", (PyObject *)NULL); 17264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm res = PyEval_CallObject(exitfunc, (PyObject *)NULL); 17274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (res == NULL) { 17284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { 17294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PySys_WriteStderr("Error in sys.exitfunc:\n"); 17304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Print(); 17324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_DECREF(exitfunc); 17344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 17354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (Py_FlushLine()) 17374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyErr_Clear(); 17384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 17414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmcall_ll_exitfuncs(void) 17424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while (nexitfuncs > 0) 17444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (*exitfuncs[--nexitfuncs])(); 17454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stdout); 17474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fflush(stderr); 17484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmvoid 17514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_Exit(int sts) 17524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_Finalize(); 17544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exit(sts); 17564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmstatic void 17594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylminitsigs(void) 17604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SIGPIPE 17624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_setsig(SIGPIPE, SIG_IGN); 17634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 17644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SIGXFZ 17654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_setsig(SIGXFZ, SIG_IGN); 17664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 17674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SIGXFSZ 17684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_setsig(SIGXFSZ, SIG_IGN); 17694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 17704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_InitInterrupts(); /* May imply initsignal() */ 17714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 17754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The file descriptor fd is considered ``interactive'' if either 17764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * a) isatty(fd) is TRUE, or 17774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * b) the -i flag was given, and the filename associated with 17784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the descriptor is NULL or "<stdin>" or "???". 17794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 17804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 17814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_FdIsInteractive(FILE *fp, const char *filename) 17824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 17834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (isatty((int)fileno(fp))) 17844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 17854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (!Py_InteractiveFlag) 17864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 17874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return (filename == NULL) || 17884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (strcmp(filename, "<stdin>") == 0) || 17894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (strcmp(filename, "???") == 0); 17904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 17914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(USE_STACKCHECK) 17944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(WIN32) && defined(_MSC_VER) 17954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Stack checking for Microsoft C */ 17974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 17984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <malloc.h> 17994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <excpt.h> 18004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 18024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Return non-zero when we run out of memory on the stack; zero otherwise. 18034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 18044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint 18054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyOS_CheckStack(void) 18064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm __try { 18084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* alloca throws a stack overflow exception if there's 18094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm not enough space left on the stack */ 18104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm alloca(PYOS_STACK_MARGIN * sizeof(void*)); 18114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 0; 18124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ? 18134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm EXCEPTION_EXECUTE_HANDLER : 18144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm EXCEPTION_CONTINUE_SEARCH) { 18154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm int errcode = _resetstkoflw(); 18164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errcode == 0) 18174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm { 18184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Py_FatalError("Could not reset the stack!"); 18194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1; 18224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* WIN32 && _MSC_VER */ 18254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Alternate implementations can be added here... */ 18274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* USE_STACKCHECK */ 18294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Wrappers around sigaction() or signal(). */ 18324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyOS_sighandler_t 18344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyOS_getsig(int sig) 18354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SIGACTION 18374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm struct sigaction context; 18384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sigaction(sig, NULL, &context) == -1) 18394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return SIG_ERR; 18404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return context.sa_handler; 18414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 18424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_sighandler_t handler; 18434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Special signal handling for the secure CRT in Visual Studio 2005 */ 18444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(_MSC_VER) && _MSC_VER >= 1400 18454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm switch (sig) { 18464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Only these signals are valid */ 18474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGINT: 18484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGILL: 18494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGFPE: 18504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGSEGV: 18514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGTERM: 18524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGBREAK: 18534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm case SIGABRT: 18544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break; 18554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Don't call signal() with other values or it will assert */ 18564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default: 18574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return SIG_ERR; 18584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } 18594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* _MSC_VER && _MSC_VER >= 1400 */ 18604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm handler = signal(sig, SIG_IGN); 18614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (handler != SIG_ERR) 18624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm signal(sig, handler); 18634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return handler; 18644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 18654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyOS_sighandler_t 18684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyOS_setsig(int sig, PyOS_sighandler_t handler) 18694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SIGACTION 18714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Some code in Modules/signalmodule.c depends on sigaction() being 18724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * used here if HAVE_SIGACTION is defined. Fix that if this code 18734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * changes to invalidate that assumption. 18744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 18754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm struct sigaction context, ocontext; 18764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm context.sa_handler = handler; 18774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sigemptyset(&context.sa_mask); 18784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm context.sa_flags = 0; 18794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (sigaction(sig, &context, &ocontext) == -1) 18804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return SIG_ERR; 18814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return ocontext.sa_handler; 18824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 18834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyOS_sighandler_t oldhandler; 18844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm oldhandler = signal(sig, handler); 18854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SIGINTERRUPT 18864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm siginterrupt(sig, 1); 18874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 18884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return oldhandler; 18894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 18904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 18914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Deprecated C API functions still provided for binary compatiblity */ 18934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 18944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyParser_SimpleParseFile 18954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(node *) 18964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SimpleParseFile(FILE *fp, const char *filename, int start) 18974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 18984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyParser_SimpleParseFileFlags(fp, filename, start, 0); 18994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyParser_SimpleParseString 19024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(node *) 19034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyParser_SimpleParseString(const char *str, int start) 19044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyParser_SimpleParseStringFlags(str, start, 0); 19064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_AnyFile 19094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_AnyFile(FILE *fp, const char *name) 19114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_AnyFileExFlags(fp, name, 0, NULL); 19134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_AnyFileEx 19164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_AnyFileEx(FILE *fp, const char *name, int closeit) 19184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_AnyFileExFlags(fp, name, closeit, NULL); 19204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_AnyFileFlags 19234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags) 19254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_AnyFileExFlags(fp, name, 0, flags); 19274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_File 19304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) 19314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l) 19324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL); 19344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_FileEx 19374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) 19384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c) 19394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_FileExFlags(fp, p, s, g, l, c, NULL); 19414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_FileFlags 19444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) 19454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, 19464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyCompilerFlags *flags) 19474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_FileExFlags(fp, p, s, g, l, 0, flags); 19494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_SimpleFile 19524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_SimpleFile(FILE *f, const char *p) 19544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_SimpleFileExFlags(f, p, 0, NULL); 19564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_SimpleFileEx 19594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_SimpleFileEx(FILE *f, const char *p, int c) 19614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_SimpleFileExFlags(f, p, c, NULL); 19634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_String 19674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) 19684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_String(const char *str, int s, PyObject *g, PyObject *l) 19694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_StringFlags(str, s, g, l, NULL); 19714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_SimpleString 19744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_SimpleString(const char *s) 19764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_SimpleStringFlags(s, NULL); 19784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef Py_CompileString 19814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(PyObject *) 19824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_CompileString(const char *str, const char *p, int s) 19834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return Py_CompileStringFlags(str, p, s, NULL); 19854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_InteractiveOne 19884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_InteractiveOne(FILE *f, const char *p) 19904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_InteractiveOneFlags(f, p, NULL); 19924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 19934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 19944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef PyRun_InteractiveLoop 19954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyAPI_FUNC(int) 19964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPyRun_InteractiveLoop(FILE *f, const char *p) 19974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm{ 19984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return PyRun_InteractiveLoopFlags(f, p, NULL); 19994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 20004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 20014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus 20024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 20034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 20044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2005