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