blob: 05a980085dd598ba26a147455e332d60c777b7c3 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
2/* Python interpreter top-level routines, including init/exit */
3
Guido van Rossum82598051997-03-05 00:20:32 +00004#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00005
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00006#include "Python-ast.h"
Guido van Rossumd8faa362007-04-27 19:54:29 +00007#undef Yield /* undefine macro conflicting with winbase.h */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00008#include "grammar.h"
9#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +000010#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000012#include "errcode.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000013#include "code.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000015#include "symtable.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000016#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000017#include "ast.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000018#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000019#include "marshal.h"
Martin v. Löwis790465f2008-04-05 20:41:37 +000020#include "osdefs.h"
Antoine Pitrou011bd622009-10-20 21:52:47 +000021#include "abstract.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000022
Thomas Wouters0e3f5912006-08-11 14:57:12 +000023#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000024#include <signal.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000025#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000026
Benjamin Peterson80a50ac2009-01-02 21:24:04 +000027#ifdef MS_WINDOWS
Martin v. Löwis5c88d812009-01-02 20:47:48 +000028#include "malloc.h" /* for alloca */
Benjamin Peterson80a50ac2009-01-02 21:24:04 +000029#endif
Martin v. Löwis5c88d812009-01-02 20:47:48 +000030
Martin v. Löwis73d538b2003-03-05 15:13:47 +000031#ifdef HAVE_LANGINFO_H
32#include <locale.h>
33#include <langinfo.h>
34#endif
35
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000036#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000037#undef BYTE
38#include "windows.h"
Martin v. Löwis790465f2008-04-05 20:41:37 +000039#define PATH_MAX MAXPATHLEN
Guido van Rossuma44823b1995-03-14 15:01:17 +000040#endif
41
Neal Norwitz4281cef2006-03-04 19:58:13 +000042#ifndef Py_REF_DEBUG
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000043#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000044#else /* Py_REF_DEBUG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045#define PRINT_TOTAL_REFS() fprintf(stderr, \
46 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
47 _Py_GetRefTotal())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000048#endif
49
50#ifdef __cplusplus
51extern "C" {
Neal Norwitz4281cef2006-03-04 19:58:13 +000052#endif
53
Martin v. Löwis790465f2008-04-05 20:41:37 +000054extern wchar_t *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000055
Guido van Rossum82598051997-03-05 00:20:32 +000056extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000057
Guido van Rossumb73cc041993-11-01 16:28:59 +000058/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void initmain(void);
Victor Stinnerb744ba12010-05-15 12:27:16 +000060static void initfsencoding(void);
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static void initsite(void);
Guido van Rossumce3a72a2007-10-19 23:16:50 +000062static int initstdio(void);
Amaury Forgeot d'Arc7fedbe52008-04-10 21:03:09 +000063static void flush_io(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000064static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000066static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000068static void err_input(perrdetail *);
69static void initsigs(void);
Collin Winter670e6922007-03-21 02:57:17 +000070static void call_py_exitfuncs(void);
Antoine Pitrou011bd622009-10-20 21:52:47 +000071static void wait_for_thread_shutdown(void);
Tim Petersdbd9ba62000-07-09 03:09:57 +000072static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000073extern void _PyUnicode_Init(void);
74extern void _PyUnicode_Fini(void);
Guido van Rossumddefaf32007-01-14 03:31:43 +000075extern int _PyLong_Init(void);
76extern void PyLong_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000077
Mark Hammond8d98d2c2003-04-19 15:41:53 +000078#ifdef WITH_THREAD
79extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
80extern void _PyGILState_Fini(void);
81#endif /* WITH_THREAD */
82
Guido van Rossum82598051997-03-05 00:20:32 +000083int Py_DebugFlag; /* Needed by parser.c */
84int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000085int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumd8faa362007-04-27 19:54:29 +000086int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000087int Py_NoSiteFlag; /* Suppress 'import site' */
Guido van Rossum98297ee2007-11-06 21:34:58 +000088int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
Christian Heimes790c8232008-01-07 21:14:23 +000089int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */
Barry Warsaw3ce09642000-05-02 19:18:59 +000090int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000091int Py_FrozenFlag; /* Needed by getpath.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000092int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Christian Heimes8dc226f2008-05-06 23:45:46 +000093int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
Antoine Pitrou05608432009-01-09 18:53:14 +000094int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000095
Christian Heimes33fe8092008-04-13 13:53:33 +000096/* PyModule_GetWarningsModule is no longer necessary as of 2.6
97since _warnings is builtin. This API should not be used. */
98PyObject *
99PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +0000100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 return PyImport_ImportModule("warnings");
Mark Hammondedd07732003-07-15 23:03:55 +0000102}
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000103
Guido van Rossum25ce5661997-08-02 03:10:38 +0000104static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105
Thomas Wouters7e474022000-07-16 12:04:32 +0000106/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000107
108int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000109Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 return initialized;
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000112}
113
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114/* Global initializations. Can be undone by Py_Finalize(). Don't
115 call this twice without an intervening Py_Finalize() call. When
116 initializations fail, a fatal error is issued and the function does
117 not return. On return, the first thread and interpreter state have
118 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120 Locking: you must hold the interpreter lock while calling this.
121 (If the lock has not yet been initialized, that's equivalent to
122 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000123
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000126static int
127add_flag(int flag, const char *envs)
128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 int env = atoi(envs);
130 if (flag < env)
131 flag = env;
132 if (flag < 1)
133 flag = 1;
134 return flag;
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000135}
136
Christian Heimes5833a2f2008-10-30 21:40:04 +0000137#if defined(HAVE_LANGINFO_H) && defined(CODESET)
138static char*
139get_codeset(void)
140{
Victor Stinner386fe712010-05-19 00:34:15 +0000141 char* codeset, *name_str;
142 PyObject *codec, *name = NULL;
Christian Heimes5833a2f2008-10-30 21:40:04 +0000143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 codeset = nl_langinfo(CODESET);
145 if (!codeset || codeset[0] == '\0')
146 return NULL;
Christian Heimes5833a2f2008-10-30 21:40:04 +0000147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 codec = _PyCodec_Lookup(codeset);
149 if (!codec)
150 goto error;
Christian Heimes5833a2f2008-10-30 21:40:04 +0000151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 name = PyObject_GetAttrString(codec, "name");
153 Py_CLEAR(codec);
154 if (!name)
155 goto error;
Christian Heimes5833a2f2008-10-30 21:40:04 +0000156
Victor Stinner386fe712010-05-19 00:34:15 +0000157 name_str = _PyUnicode_AsString(name);
158 if (name == NULL)
159 goto error;
160 codeset = strdup(name_str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 Py_DECREF(name);
162 return codeset;
Christian Heimes5833a2f2008-10-30 21:40:04 +0000163
164error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 Py_XDECREF(codec);
Victor Stinner386fe712010-05-19 00:34:15 +0000166 Py_XDECREF(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 return NULL;
Christian Heimes5833a2f2008-10-30 21:40:04 +0000168}
169#endif
170
Guido van Rossuma027efa1997-05-05 20:56:21 +0000171void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000172Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 PyInterpreterState *interp;
175 PyThreadState *tstate;
176 PyObject *bimod, *sysmod, *pstderr;
177 char *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 if (initialized)
181 return;
182 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000183
Andrew M. Kuchlingb2ceb3a2010-02-22 23:26:10 +0000184#if defined(HAVE_LANGINFO_H) && defined(HAVE_SETLOCALE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 /* Set up the LC_CTYPE locale, so we can obtain
186 the locale's charset without having to switch
187 locales. */
188 setlocale(LC_CTYPE, "");
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +0000189#endif
190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
192 Py_DebugFlag = add_flag(Py_DebugFlag, p);
193 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
194 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
195 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
196 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
197 if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
198 Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 interp = PyInterpreterState_New();
201 if (interp == NULL)
202 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 tstate = PyThreadState_New(interp);
205 if (tstate == NULL)
206 Py_FatalError("Py_Initialize: can't make first thread");
207 (void) PyThreadState_Swap(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 if (!_PyFrame_Init())
212 Py_FatalError("Py_Initialize: can't init frames");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 if (!_PyLong_Init())
215 Py_FatalError("Py_Initialize: can't init longs");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 if (!PyByteArray_Init())
218 Py_FatalError("Py_Initialize: can't init bytearray");
Neal Norwitz6968b052007-02-27 19:02:19 +0000219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 _PyFloat_Init();
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 interp->modules = PyDict_New();
223 if (interp->modules == NULL)
224 Py_FatalError("Py_Initialize: can't make modules dictionary");
225 interp->modules_reloading = PyDict_New();
226 if (interp->modules_reloading == NULL)
227 Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 /* Init Unicode implementation; relies on the codec registry */
230 _PyUnicode_Init();
Guido van Rossumc94044c2000-03-10 23:03:54 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 bimod = _PyBuiltin_Init();
233 if (bimod == NULL)
234 Py_FatalError("Py_Initialize: can't initialize builtins modules");
235 _PyImport_FixupExtension(bimod, "builtins", "builtins");
236 interp->builtins = PyModule_GetDict(bimod);
237 if (interp->builtins == NULL)
238 Py_FatalError("Py_Initialize: can't initialize builtins dict");
239 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 /* initialize builtin exceptions */
242 _PyExc_Init();
Christian Heimes9a68f8c2007-11-14 00:16:07 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 sysmod = _PySys_Init();
245 if (sysmod == NULL)
246 Py_FatalError("Py_Initialize: can't initialize sys");
247 interp->sysdict = PyModule_GetDict(sysmod);
248 if (interp->sysdict == NULL)
249 Py_FatalError("Py_Initialize: can't initialize sys dict");
250 Py_INCREF(interp->sysdict);
251 _PyImport_FixupExtension(sysmod, "sys", "sys");
252 PySys_SetPath(Py_GetPath());
253 PyDict_SetItemString(interp->sysdict, "modules",
254 interp->modules);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 /* Set up a preliminary stderr printer until we have enough
257 infrastructure for the io module in place. */
258 pstderr = PyFile_NewStdPrinter(fileno(stderr));
259 if (pstderr == NULL)
260 Py_FatalError("Py_Initialize: can't set preliminary stderr");
261 PySys_SetObject("stderr", pstderr);
262 PySys_SetObject("__stderr__", pstderr);
Guido van Rossum826d8972007-10-30 18:34:07 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 _PyImport_Init();
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 _PyImportHooks_Init();
Just van Rossum52e14d62002-12-30 22:08:05 +0000267
Victor Stinner7d79b8b2010-05-19 20:40:50 +0000268 /* Initialize _warnings. */
269 _PyWarnings_Init();
270
Victor Stinnerb744ba12010-05-15 12:27:16 +0000271 initfsencoding();
Martin v. Löwis011e8422009-05-05 04:43:17 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 if (install_sigs)
274 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 /* Initialize warnings. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 if (PySys_HasWarnOptions()) {
278 PyObject *warnings_module = PyImport_ImportModule("warnings");
279 if (!warnings_module)
280 PyErr_Clear();
281 Py_XDECREF(warnings_module);
282 }
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 initmain(); /* Module __main__ */
285 if (initstdio() < 0)
286 Py_FatalError(
287 "Py_Initialize: can't initialize sys standard streams");
288
289 /* auto-thread-state API, if available */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000290#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 _PyGILState_Init(interp, tstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000292#endif /* WITH_THREAD */
Victor Stinner52f6dd72010-03-12 14:45:56 +0000293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 if (!Py_NoSiteFlag)
295 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000296}
297
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000298void
299Py_Initialize(void)
300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 Py_InitializeEx(1);
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000302}
303
304
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000305#ifdef COUNT_ALLOCS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000306extern void dump_counts(FILE*);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000307#endif
308
Guido van Rossume8432ac2007-07-09 15:04:50 +0000309/* Flush stdout and stderr */
310
Neal Norwitz2bad9702007-08-27 06:19:22 +0000311static void
Guido van Rossum1bd21222007-07-10 20:14:13 +0000312flush_std_files(void)
Guido van Rossume8432ac2007-07-09 15:04:50 +0000313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 PyObject *fout = PySys_GetObject("stdout");
315 PyObject *ferr = PySys_GetObject("stderr");
316 PyObject *tmp;
Guido van Rossume8432ac2007-07-09 15:04:50 +0000317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 if (fout != NULL && fout != Py_None) {
319 tmp = PyObject_CallMethod(fout, "flush", "");
320 if (tmp == NULL)
321 PyErr_Clear();
322 else
323 Py_DECREF(tmp);
324 }
Guido van Rossume8432ac2007-07-09 15:04:50 +0000325
Victor Stinner9467b212010-05-14 00:59:09 +0000326 if (ferr != NULL && ferr != Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 tmp = PyObject_CallMethod(ferr, "flush", "");
328 if (tmp == NULL)
329 PyErr_Clear();
330 else
331 Py_DECREF(tmp);
332 }
Guido van Rossume8432ac2007-07-09 15:04:50 +0000333}
334
Guido van Rossum25ce5661997-08-02 03:10:38 +0000335/* Undo the effect of Py_Initialize().
336
337 Beware: if multiple interpreter and/or thread states exist, these
338 are not wiped out; only the current thread and interpreter state
339 are deleted. But since everything else is deleted, those other
340 interpreter and thread states should no longer be used.
341
342 (XXX We should do better, e.g. wipe out all interpreters and
343 threads.)
344
345 Locking: as above.
346
347*/
348
349void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000350Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 PyInterpreterState *interp;
353 PyThreadState *tstate;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (!initialized)
356 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 wait_for_thread_shutdown();
Antoine Pitrou011bd622009-10-20 21:52:47 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 /* The interpreter is still entirely intact at this point, and the
361 * exit funcs may be relying on that. In particular, if some thread
362 * or exit func is still waiting to do an import, the import machinery
363 * expects Py_IsInitialized() to return true. So don't say the
364 * interpreter is uninitialized until after the exit funcs have run.
365 * Note that Threading.py uses an exit func to do a join on all the
366 * threads created thru it, so this also protects pending imports in
367 * the threads created via Threading.
368 */
369 call_py_exitfuncs();
370 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 /* Flush stdout+stderr */
373 flush_std_files();
Guido van Rossume8432ac2007-07-09 15:04:50 +0000374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 /* Get current thread state and interpreter pointer */
376 tstate = PyThreadState_GET();
377 interp = tstate->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 /* Disable signal handling */
380 PyOS_FiniInterrupts();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 /* Clear type lookup cache */
383 PyType_ClearCache();
Christian Heimes26855632008-01-27 23:50:43 +0000384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 /* Collect garbage. This may call finalizers; it's nice to call these
386 * before all modules are destroyed.
387 * XXX If a __del__ or weakref callback is triggered here, and tries to
388 * XXX import a module, bad things can happen, because Python no
389 * XXX longer believes it's initialized.
390 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
391 * XXX is easy to provoke that way. I've also seen, e.g.,
392 * XXX Exception exceptions.ImportError: 'No module named sha'
393 * XXX in <function callback at 0x008F5718> ignored
394 * XXX but I'm unclear on exactly how that one happens. In any case,
395 * XXX I haven't seen a real-life report of either of these.
396 */
397 PyGC_Collect();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000398#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 /* With COUNT_ALLOCS, it helps to run GC multiple times:
400 each collection might release some types from the type
401 list, so they become garbage. */
402 while (PyGC_Collect() > 0)
403 /* nothing */;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000404#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 /* Destroy all modules */
407 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 /* Flush stdout+stderr (again, in case more was printed) */
410 flush_std_files();
Guido van Rossume8432ac2007-07-09 15:04:50 +0000411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 /* Collect final garbage. This disposes of cycles created by
413 * new-style class definitions, for example.
414 * XXX This is disabled because it caused too many problems. If
415 * XXX a __del__ or weakref callback triggers here, Python code has
416 * XXX a hard time running, because even the sys module has been
417 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
418 * XXX One symptom is a sequence of information-free messages
419 * XXX coming from threads (if a __del__ or callback is invoked,
420 * XXX other threads can execute too, and any exception they encounter
421 * XXX triggers a comedy of errors as subsystem after subsystem
422 * XXX fails to find what it *expects* to find in sys to help report
423 * XXX the exception and consequent unexpected failures). I've also
424 * XXX seen segfaults then, after adding print statements to the
425 * XXX Python code getting called.
426 */
Tim Peters1d7323e2003-12-01 21:35:27 +0000427#if 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000429#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
432 _PyImport_Fini();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 /* Debugging stuff */
Guido van Rossum1707aad1997-12-08 23:43:45 +0000435#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 dump_counts(stdout);
Guido van Rossum1707aad1997-12-08 23:43:45 +0000437#endif
438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000440
Tim Peters9cf25ce2003-04-17 15:21:01 +0000441#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 /* Display all objects still alive -- this can invoke arbitrary
443 * __repr__ overrides, so requires a mostly-intact interpreter.
444 * Alas, a lot of stuff may still be alive now that will be cleaned
445 * up later.
446 */
447 if (Py_GETENV("PYTHONDUMPREFS"))
448 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000449#endif /* Py_TRACE_REFS */
450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 /* Clear interpreter state */
452 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 /* Now we decref the exception classes. After this point nothing
455 can raise an exception. That's okay, because each Fini() method
456 below has been checked to make sure no exceptions are ever
457 raised.
458 */
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 _PyExc_Fini();
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 /* Cleanup auto-thread-state */
Christian Heimes7d2ff882007-11-30 14:35:04 +0000463#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 _PyGILState_Fini();
Christian Heimes7d2ff882007-11-30 14:35:04 +0000465#endif /* WITH_THREAD */
466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 /* Delete current thread */
468 PyThreadState_Swap(NULL);
469 PyInterpreterState_Delete(interp);
Barry Warsawf242aa02000-05-25 23:09:49 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 /* Sundry finalizers */
472 PyMethod_Fini();
473 PyFrame_Fini();
474 PyCFunction_Fini();
475 PyTuple_Fini();
476 PyList_Fini();
477 PySet_Fini();
478 PyBytes_Fini();
479 PyByteArray_Fini();
480 PyLong_Fini();
481 PyFloat_Fini();
482 PyDict_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 /* Cleanup Unicode implementation */
485 _PyUnicode_Fini();
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 /* reset file system default encoding */
Victor Stinnerb744ba12010-05-15 12:27:16 +0000488 if (!Py_HasFileSystemDefaultEncoding && Py_FileSystemDefaultEncoding) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 free((char*)Py_FileSystemDefaultEncoding);
490 Py_FileSystemDefaultEncoding = NULL;
491 }
Christian Heimesc8967002007-11-30 10:18:26 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 /* XXX Still allocated:
494 - various static ad-hoc pointers to interned strings
495 - int and float free list blocks
496 - whatever various modules and libraries allocate
497 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000500
Tim Peters269b2a62003-04-17 19:52:29 +0000501#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 /* Display addresses (& refcnts) of all objects still alive.
503 * An address can be used to find the repr of the object, printed
504 * above by _Py_PrintReferences.
505 */
506 if (Py_GETENV("PYTHONDUMPREFS"))
507 _Py_PrintReferenceAddresses(stderr);
Tim Peters269b2a62003-04-17 19:52:29 +0000508#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000509#ifdef PYMALLOC_DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 if (Py_GETENV("PYTHONMALLOCSTATS"))
511 _PyObject_DebugMallocStats();
Tim Peters0e871182002-04-13 08:29:14 +0000512#endif
513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000515}
516
517/* Create and initialize a new interpreter and thread, and return the
518 new thread. This requires that Py_Initialize() has been called
519 first.
520
521 Unsuccessful initialization yields a NULL pointer. Note that *no*
522 exception information is available even in this case -- the
523 exception information is held in the thread, and there is no
524 thread.
525
526 Locking: as above.
527
528*/
529
530PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 PyInterpreterState *interp;
534 PyThreadState *tstate, *save_tstate;
535 PyObject *bimod, *sysmod;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (!initialized)
538 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 interp = PyInterpreterState_New();
541 if (interp == NULL)
542 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 tstate = PyThreadState_New(interp);
545 if (tstate == NULL) {
546 PyInterpreterState_Delete(interp);
547 return NULL;
548 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 save_tstate = PyThreadState_Swap(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 /* XXX The following is lax in error checking */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 interp->modules = PyDict_New();
555 interp->modules_reloading = PyDict_New();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 bimod = _PyImport_FindExtension("builtins", "builtins");
558 if (bimod != NULL) {
559 interp->builtins = PyModule_GetDict(bimod);
560 if (interp->builtins == NULL)
561 goto handle_error;
562 Py_INCREF(interp->builtins);
563 }
Christian Heimes6a27efa2008-10-30 21:48:26 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 /* initialize builtin exceptions */
566 _PyExc_Init();
Christian Heimes6a27efa2008-10-30 21:48:26 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 sysmod = _PyImport_FindExtension("sys", "sys");
569 if (bimod != NULL && sysmod != NULL) {
570 PyObject *pstderr;
571 interp->sysdict = PyModule_GetDict(sysmod);
572 if (interp->sysdict == NULL)
573 goto handle_error;
574 Py_INCREF(interp->sysdict);
575 PySys_SetPath(Py_GetPath());
576 PyDict_SetItemString(interp->sysdict, "modules",
577 interp->modules);
578 /* Set up a preliminary stderr printer until we have enough
579 infrastructure for the io module in place. */
580 pstderr = PyFile_NewStdPrinter(fileno(stderr));
581 if (pstderr == NULL)
582 Py_FatalError("Py_Initialize: can't set preliminary stderr");
583 PySys_SetObject("stderr", pstderr);
584 PySys_SetObject("__stderr__", pstderr);
Christian Heimes6a27efa2008-10-30 21:48:26 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 _PyImportHooks_Init();
587 if (initstdio() < 0)
588 Py_FatalError(
589 "Py_Initialize: can't initialize sys standard streams");
590 initmain();
591 if (!Py_NoSiteFlag)
592 initsite();
593 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 if (!PyErr_Occurred())
596 return tstate;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000597
Thomas Wouters89f507f2006-12-13 04:49:30 +0000598handle_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 /* Oops, it didn't work. Undo it all. */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 PyErr_Print();
602 PyThreadState_Clear(tstate);
603 PyThreadState_Swap(save_tstate);
604 PyThreadState_Delete(tstate);
605 PyInterpreterState_Delete(interp);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000608}
609
610/* Delete an interpreter and its last thread. This requires that the
611 given thread state is current, that the thread has no remaining
612 frames, and that it is its interpreter's only remaining thread.
613 It is a fatal error to violate these constraints.
614
615 (Py_Finalize() doesn't have these constraints -- it zaps
616 everything, regardless.)
617
618 Locking: as above.
619
620*/
621
622void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000623Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000624{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 PyInterpreterState *interp = tstate->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 if (tstate != PyThreadState_GET())
628 Py_FatalError("Py_EndInterpreter: thread is not current");
629 if (tstate->frame != NULL)
630 Py_FatalError("Py_EndInterpreter: thread still has a frame");
631 if (tstate != interp->tstate_head || tstate->next != NULL)
632 Py_FatalError("Py_EndInterpreter: not the last thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 PyImport_Cleanup();
635 PyInterpreterState_Clear(interp);
636 PyThreadState_Swap(NULL);
637 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000638}
639
Martin v. Löwis790465f2008-04-05 20:41:37 +0000640static wchar_t *progname = L"python";
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000641
642void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000643Py_SetProgramName(wchar_t *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 if (pn && *pn)
646 progname = pn;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000647}
648
Martin v. Löwis790465f2008-04-05 20:41:37 +0000649wchar_t *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653}
654
Martin v. Löwis790465f2008-04-05 20:41:37 +0000655static wchar_t *default_home = NULL;
656static wchar_t env_home[PATH_MAX+1];
Guido van Rossuma61691e1998-02-06 22:27:24 +0000657
658void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000659Py_SetPythonHome(wchar_t *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 default_home = home;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000662}
663
Martin v. Löwis790465f2008-04-05 20:41:37 +0000664wchar_t *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000665Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 wchar_t *home = default_home;
668 if (home == NULL && !Py_IgnoreEnvironmentFlag) {
669 char* chome = Py_GETENV("PYTHONHOME");
670 if (chome) {
671 size_t r = mbstowcs(env_home, chome, PATH_MAX+1);
672 if (r != (size_t)-1 && r <= PATH_MAX)
673 home = env_home;
674 }
Martin v. Löwis790465f2008-04-05 20:41:37 +0000675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 }
677 return home;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000678}
679
Guido van Rossum6135a871995-01-09 17:53:26 +0000680/* Create __main__ module */
681
682static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000683initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 PyObject *m, *d;
686 m = PyImport_AddModule("__main__");
687 if (m == NULL)
688 Py_FatalError("can't create __main__ module");
689 d = PyModule_GetDict(m);
690 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
691 PyObject *bimod = PyImport_ImportModule("builtins");
692 if (bimod == NULL ||
693 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
694 Py_FatalError("can't add __builtins__ to __main__");
695 Py_DECREF(bimod);
696 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000697}
698
Victor Stinnerb744ba12010-05-15 12:27:16 +0000699static void
700initfsencoding(void)
701{
702 PyObject *codec;
703#if defined(HAVE_LANGINFO_H) && defined(CODESET)
704 char *codeset;
705
706 /* On Unix, set the file system encoding according to the
707 user's preference, if the CODESET names a well-known
708 Python codec, and Py_FileSystemDefaultEncoding isn't
709 initialized by other means. Also set the encoding of
710 stdin and stdout if these are terminals. */
711 codeset = get_codeset();
712 if (codeset != NULL) {
713 Py_FileSystemDefaultEncoding = codeset;
714 Py_HasFileSystemDefaultEncoding = 0;
715 return;
716 }
717
718 PyErr_Clear();
719 fprintf(stderr,
720 "Unable to get the locale encoding: "
721 "fallback to utf-8\n");
722 Py_FileSystemDefaultEncoding = "utf-8";
723 Py_HasFileSystemDefaultEncoding = 1;
724#endif
725
726 /* the encoding is mbcs, utf-8 or ascii */
727 codec = _PyCodec_Lookup(Py_FileSystemDefaultEncoding);
728 if (!codec) {
729 /* Such error can only occurs in critical situations: no more
730 * memory, import a module of the standard library failed,
731 * etc. */
732 Py_FatalError("Py_Initialize: unable to load the file system codec");
733 } else {
734 Py_DECREF(codec);
735 }
736}
737
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000738/* Import the site module (not into __main__ though) */
739
740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000741initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 PyObject *m;
744 m = PyImport_ImportModule("site");
745 if (m == NULL) {
746 PyErr_Print();
747 Py_Finalize();
748 exit(1);
749 }
750 else {
751 Py_DECREF(m);
752 }
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000753}
754
Antoine Pitrou05608432009-01-09 18:53:14 +0000755static PyObject*
756create_stdio(PyObject* io,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 int fd, int write_mode, char* name,
758 char* encoding, char* errors)
Antoine Pitrou05608432009-01-09 18:53:14 +0000759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
761 const char* mode;
762 PyObject *line_buffering;
763 int buffering, isatty;
Antoine Pitrou05608432009-01-09 18:53:14 +0000764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 /* stdin is always opened in buffered mode, first because it shouldn't
766 make a difference in common use cases, second because TextIOWrapper
767 depends on the presence of a read1() method which only exists on
768 buffered streams.
769 */
770 if (Py_UnbufferedStdioFlag && write_mode)
771 buffering = 0;
772 else
773 buffering = -1;
774 if (write_mode)
775 mode = "wb";
776 else
777 mode = "rb";
778 buf = PyObject_CallMethod(io, "open", "isiOOOi",
779 fd, mode, buffering,
780 Py_None, Py_None, Py_None, 0);
781 if (buf == NULL)
782 goto error;
Antoine Pitrou05608432009-01-09 18:53:14 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 if (buffering) {
785 raw = PyObject_GetAttrString(buf, "raw");
786 if (raw == NULL)
787 goto error;
788 }
789 else {
790 raw = buf;
791 Py_INCREF(raw);
792 }
Antoine Pitrou05608432009-01-09 18:53:14 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 text = PyUnicode_FromString(name);
795 if (text == NULL || PyObject_SetAttrString(raw, "name", text) < 0)
796 goto error;
797 res = PyObject_CallMethod(raw, "isatty", "");
798 if (res == NULL)
799 goto error;
800 isatty = PyObject_IsTrue(res);
801 Py_DECREF(res);
802 if (isatty == -1)
803 goto error;
804 if (isatty || Py_UnbufferedStdioFlag)
805 line_buffering = Py_True;
806 else
807 line_buffering = Py_False;
Antoine Pitrou91696412009-01-09 22:12:30 +0000808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 Py_CLEAR(raw);
810 Py_CLEAR(text);
Antoine Pitrou91696412009-01-09 22:12:30 +0000811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 stream = PyObject_CallMethod(io, "TextIOWrapper", "OsssO",
813 buf, encoding, errors,
814 "\n", line_buffering);
815 Py_CLEAR(buf);
816 if (stream == NULL)
817 goto error;
Antoine Pitrou05608432009-01-09 18:53:14 +0000818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 if (write_mode)
820 mode = "w";
821 else
822 mode = "r";
823 text = PyUnicode_FromString(mode);
824 if (!text || PyObject_SetAttrString(stream, "mode", text) < 0)
825 goto error;
826 Py_CLEAR(text);
827 return stream;
Antoine Pitrou05608432009-01-09 18:53:14 +0000828
829error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 Py_XDECREF(buf);
831 Py_XDECREF(stream);
832 Py_XDECREF(text);
833 Py_XDECREF(raw);
834 return NULL;
Antoine Pitrou05608432009-01-09 18:53:14 +0000835}
836
Georg Brandl1a3284e2007-12-02 09:40:06 +0000837/* Initialize sys.stdin, stdout, stderr and builtins.open */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000838static int
839initstdio(void)
840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 PyObject *iomod = NULL, *wrapper;
842 PyObject *bimod = NULL;
843 PyObject *m;
844 PyObject *std = NULL;
845 int status = 0, fd;
846 PyObject * encoding_attr;
847 char *encoding = NULL, *errors;
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 /* Hack to avoid a nasty recursion issue when Python is invoked
850 in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
851 if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) {
852 goto error;
853 }
854 Py_DECREF(m);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 if (!(m = PyImport_ImportModule("encodings.latin_1"))) {
857 goto error;
858 }
859 Py_DECREF(m);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 if (!(bimod = PyImport_ImportModule("builtins"))) {
862 goto error;
863 }
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 if (!(iomod = PyImport_ImportModule("io"))) {
866 goto error;
867 }
868 if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
869 goto error;
870 }
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 /* Set builtins.open */
873 if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
874 goto error;
875 }
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 encoding = Py_GETENV("PYTHONIOENCODING");
878 errors = NULL;
879 if (encoding) {
880 encoding = strdup(encoding);
881 errors = strchr(encoding, ':');
882 if (errors) {
883 *errors = '\0';
884 errors++;
885 }
886 }
Martin v. Löwis0f599892008-06-02 11:13:03 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 /* Set sys.stdin */
889 fd = fileno(stdin);
890 /* Under some conditions stdin, stdout and stderr may not be connected
891 * and fileno() may point to an invalid file descriptor. For example
892 * GUI apps don't have valid standard streams by default.
893 */
894 if (fd < 0) {
Christian Heimes58cb1b82007-11-13 02:19:40 +0000895#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 std = Py_None;
897 Py_INCREF(std);
Christian Heimes58cb1b82007-11-13 02:19:40 +0000898#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 goto error;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000900#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 }
902 else {
903 std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
904 if (std == NULL)
905 goto error;
906 } /* if (fd < 0) */
907 PySys_SetObject("__stdin__", std);
908 PySys_SetObject("stdin", std);
909 Py_DECREF(std);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 /* Set sys.stdout */
912 fd = fileno(stdout);
913 if (fd < 0) {
Christian Heimes58cb1b82007-11-13 02:19:40 +0000914#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 std = Py_None;
916 Py_INCREF(std);
Christian Heimes58cb1b82007-11-13 02:19:40 +0000917#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 goto error;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 }
921 else {
922 std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors);
923 if (std == NULL)
924 goto error;
925 } /* if (fd < 0) */
926 PySys_SetObject("__stdout__", std);
927 PySys_SetObject("stdout", std);
928 Py_DECREF(std);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000929
Guido van Rossum98297ee2007-11-06 21:34:58 +0000930#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 /* Set sys.stderr, replaces the preliminary stderr */
932 fd = fileno(stderr);
933 if (fd < 0) {
Christian Heimes58cb1b82007-11-13 02:19:40 +0000934#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 std = Py_None;
936 Py_INCREF(std);
Christian Heimes58cb1b82007-11-13 02:19:40 +0000937#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 goto error;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 }
941 else {
942 std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace");
943 if (std == NULL)
944 goto error;
945 } /* if (fd < 0) */
Trent Nelson39e307e2008-03-19 06:45:48 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 /* Same as hack above, pre-import stderr's codec to avoid recursion
948 when import.c tries to write to stderr in verbose mode. */
949 encoding_attr = PyObject_GetAttrString(std, "encoding");
950 if (encoding_attr != NULL) {
951 const char * encoding;
952 encoding = _PyUnicode_AsString(encoding_attr);
953 if (encoding != NULL) {
954 _PyCodec_Lookup(encoding);
955 }
956 }
957 PyErr_Clear(); /* Not a fatal error if codec isn't available */
Trent Nelson39e307e2008-03-19 06:45:48 +0000958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 PySys_SetObject("__stderr__", std);
960 PySys_SetObject("stderr", std);
961 Py_DECREF(std);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000962#endif
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 if (0) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000965 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 status = -1;
967 }
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 if (encoding)
970 free(encoding);
971 Py_XDECREF(bimod);
972 Py_XDECREF(iomod);
973 return status;
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000974}
975
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000976/* Parse input from a file and execute it */
977
978int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000979PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 if (filename == NULL)
983 filename = "???";
984 if (Py_FdIsInteractive(fp, filename)) {
985 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
986 if (closeit)
987 fclose(fp);
988 return err;
989 }
990 else
991 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000992}
993
994int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000995PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 PyObject *v;
998 int ret;
999 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 if (flags == NULL) {
1002 flags = &local_flags;
1003 local_flags.cf_flags = 0;
1004 }
1005 v = PySys_GetObject("ps1");
1006 if (v == NULL) {
1007 PySys_SetObject("ps1", v = PyUnicode_FromString(">>> "));
1008 Py_XDECREF(v);
1009 }
1010 v = PySys_GetObject("ps2");
1011 if (v == NULL) {
1012 PySys_SetObject("ps2", v = PyUnicode_FromString("... "));
1013 Py_XDECREF(v);
1014 }
1015 for (;;) {
1016 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
1017 PRINT_TOTAL_REFS();
1018 if (ret == E_EOF)
1019 return 0;
1020 /*
1021 if (ret == E_NOMEM)
1022 return -1;
1023 */
1024 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001025}
1026
Neil Schemenauerc24ea082002-03-22 23:53:36 +00001027/* compute parser flags based on compiler flags */
Benjamin Petersonf5b52242009-03-02 23:31:26 +00001028static int PARSER_FLAGS(PyCompilerFlags *flags)
1029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 int parser_flags = 0;
1031 if (!flags)
1032 return 0;
1033 if (flags->cf_flags & PyCF_DONT_IMPLY_DEDENT)
1034 parser_flags |= PyPARSE_DONT_IMPLY_DEDENT;
1035 if (flags->cf_flags & PyCF_IGNORE_COOKIE)
1036 parser_flags |= PyPARSE_IGNORE_COOKIE;
1037 if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL)
1038 parser_flags |= PyPARSE_BARRY_AS_BDFL;
1039 return parser_flags;
Benjamin Petersonf5b52242009-03-02 23:31:26 +00001040}
Neil Schemenauerc24ea082002-03-22 23:53:36 +00001041
Thomas Wouters89f507f2006-12-13 04:49:30 +00001042#if 0
1043/* Keep an example of flags with future keyword support. */
1044#define PARSER_FLAGS(flags) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
1046 PyPARSE_DONT_IMPLY_DEDENT : 0) \
1047 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
1048 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
Thomas Wouters89f507f2006-12-13 04:49:30 +00001049#endif
1050
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001051int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001052PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 PyObject *m, *d, *v, *w, *oenc = NULL;
1055 mod_ty mod;
1056 PyArena *arena;
1057 char *ps1 = "", *ps2 = "", *enc = NULL;
1058 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +00001059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 if (fp == stdin) {
1061 /* Fetch encoding from sys.stdin */
1062 v = PySys_GetObject("stdin");
1063 if (v == NULL || v == Py_None)
1064 return -1;
1065 oenc = PyObject_GetAttrString(v, "encoding");
1066 if (!oenc)
1067 return -1;
1068 enc = _PyUnicode_AsString(oenc);
Victor Stinner386fe712010-05-19 00:34:15 +00001069 if (enc == NULL)
1070 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 }
1072 v = PySys_GetObject("ps1");
1073 if (v != NULL) {
1074 v = PyObject_Str(v);
1075 if (v == NULL)
1076 PyErr_Clear();
Victor Stinner386fe712010-05-19 00:34:15 +00001077 else if (PyUnicode_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 ps1 = _PyUnicode_AsString(v);
Victor Stinner386fe712010-05-19 00:34:15 +00001079 if (ps1 == NULL) {
1080 PyErr_Clear();
1081 ps1 = "";
1082 }
1083 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 }
1085 w = PySys_GetObject("ps2");
1086 if (w != NULL) {
1087 w = PyObject_Str(w);
1088 if (w == NULL)
1089 PyErr_Clear();
Victor Stinner386fe712010-05-19 00:34:15 +00001090 else if (PyUnicode_Check(w)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 ps2 = _PyUnicode_AsString(w);
Victor Stinner386fe712010-05-19 00:34:15 +00001092 if (ps2 == NULL) {
1093 PyErr_Clear();
1094 ps2 = "";
1095 }
1096 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 }
1098 arena = PyArena_New();
1099 if (arena == NULL) {
1100 Py_XDECREF(v);
1101 Py_XDECREF(w);
1102 Py_XDECREF(oenc);
1103 return -1;
1104 }
1105 mod = PyParser_ASTFromFile(fp, filename, enc,
1106 Py_single_input, ps1, ps2,
1107 flags, &errcode, arena);
1108 Py_XDECREF(v);
1109 Py_XDECREF(w);
1110 Py_XDECREF(oenc);
1111 if (mod == NULL) {
1112 PyArena_Free(arena);
1113 if (errcode == E_EOF) {
1114 PyErr_Clear();
1115 return E_EOF;
1116 }
1117 PyErr_Print();
1118 return -1;
1119 }
1120 m = PyImport_AddModule("__main__");
1121 if (m == NULL) {
1122 PyArena_Free(arena);
1123 return -1;
1124 }
1125 d = PyModule_GetDict(m);
1126 v = run_mod(mod, filename, d, d, flags, arena);
1127 PyArena_Free(arena);
1128 flush_io();
1129 if (v == NULL) {
1130 PyErr_Print();
1131 return -1;
1132 }
1133 Py_DECREF(v);
1134 return 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001135}
1136
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001137/* Check whether a file maybe a pyc file: Look at the extension,
1138 the file type, and, if we may close it, at the first few bytes. */
1139
1140static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001141maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
1144 return 1;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 /* Only look into the file if we are allowed to close it, since
1147 it then should also be seekable. */
1148 if (closeit) {
1149 /* Read only two bytes of the magic. If the file was opened in
1150 text mode, the bytes 3 and 4 of the magic (\r\n) might not
1151 be read as they are on disk. */
1152 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
1153 unsigned char buf[2];
1154 /* Mess: In case of -x, the stream is NOT at its start now,
1155 and ungetc() was used to push back the first newline,
1156 which makes the current stream position formally undefined,
1157 and a x-platform nightmare.
1158 Unfortunately, we have no direct way to know whether -x
1159 was specified. So we use a terrible hack: if the current
1160 stream position is not 0, we assume -x was specified, and
1161 give up. Bug 132850 on SourceForge spells out the
1162 hopelessness of trying anything else (fseek and ftell
1163 don't work predictably x-platform for text-mode files).
1164 */
1165 int ispyc = 0;
1166 if (ftell(fp) == 0) {
1167 if (fread(buf, 1, 2, fp) == 2 &&
1168 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
1169 ispyc = 1;
1170 rewind(fp);
1171 }
1172 return ispyc;
1173 }
1174 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +00001175}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001176
Guido van Rossum0df002c2000-08-27 19:21:52 +00001177int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001178PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 PyObject *m, *d, *v;
1182 const char *ext;
1183 int set_file_name = 0, ret, len;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 m = PyImport_AddModule("__main__");
1186 if (m == NULL)
1187 return -1;
1188 d = PyModule_GetDict(m);
1189 if (PyDict_GetItemString(d, "__file__") == NULL) {
1190 PyObject *f;
1191 f = PyUnicode_DecodeFSDefault(filename);
1192 if (f == NULL)
1193 return -1;
1194 if (PyDict_SetItemString(d, "__file__", f) < 0) {
1195 Py_DECREF(f);
1196 return -1;
1197 }
1198 if (PyDict_SetItemString(d, "__cached__", Py_None) < 0)
1199 return -1;
1200 set_file_name = 1;
1201 Py_DECREF(f);
1202 }
1203 len = strlen(filename);
1204 ext = filename + len - (len > 4 ? 4 : 0);
1205 if (maybe_pyc_file(fp, filename, ext, closeit)) {
1206 /* Try to run a pyc file. First, re-open in binary */
1207 if (closeit)
1208 fclose(fp);
1209 if ((fp = fopen(filename, "rb")) == NULL) {
1210 fprintf(stderr, "python: Can't reopen .pyc file\n");
1211 ret = -1;
1212 goto done;
1213 }
1214 /* Turn on optimization if a .pyo file is given */
1215 if (strcmp(ext, ".pyo") == 0)
1216 Py_OptimizeFlag = 1;
1217 v = run_pyc_file(fp, filename, d, d, flags);
1218 } else {
1219 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
1220 closeit, flags);
1221 }
1222 flush_io();
1223 if (v == NULL) {
1224 PyErr_Print();
1225 ret = -1;
1226 goto done;
1227 }
1228 Py_DECREF(v);
1229 ret = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001230 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 if (set_file_name && PyDict_DelItemString(d, "__file__"))
1232 PyErr_Clear();
1233 return ret;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001234}
1235
1236int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001237PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +00001238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 PyObject *m, *d, *v;
1240 m = PyImport_AddModule("__main__");
1241 if (m == NULL)
1242 return -1;
1243 d = PyModule_GetDict(m);
1244 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
1245 if (v == NULL) {
1246 PyErr_Print();
1247 return -1;
1248 }
1249 Py_DECREF(v);
1250 return 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001251}
1252
Barry Warsaw035574d1997-08-29 22:07:17 +00001253static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001254parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +00001256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 long hold;
1258 PyObject *v;
Barry Warsaw035574d1997-08-29 22:07:17 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 /* old style errors */
1261 if (PyTuple_Check(err))
1262 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
1263 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +00001264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 /* new style errors. `err' is an instance */
Barry Warsaw035574d1997-08-29 22:07:17 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 if (! (v = PyObject_GetAttrString(err, "msg")))
1268 goto finally;
1269 *message = v;
Barry Warsaw035574d1997-08-29 22:07:17 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 if (!(v = PyObject_GetAttrString(err, "filename")))
1272 goto finally;
1273 if (v == Py_None)
1274 *filename = NULL;
1275 else if (! (*filename = _PyUnicode_AsString(v)))
1276 goto finally;
Barry Warsaw035574d1997-08-29 22:07:17 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 Py_DECREF(v);
1279 if (!(v = PyObject_GetAttrString(err, "lineno")))
1280 goto finally;
1281 hold = PyLong_AsLong(v);
1282 Py_DECREF(v);
1283 v = NULL;
1284 if (hold < 0 && PyErr_Occurred())
1285 goto finally;
1286 *lineno = (int)hold;
Barry Warsaw035574d1997-08-29 22:07:17 +00001287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 if (!(v = PyObject_GetAttrString(err, "offset")))
1289 goto finally;
1290 if (v == Py_None) {
1291 *offset = -1;
1292 Py_DECREF(v);
1293 v = NULL;
1294 } else {
1295 hold = PyLong_AsLong(v);
1296 Py_DECREF(v);
1297 v = NULL;
1298 if (hold < 0 && PyErr_Occurred())
1299 goto finally;
1300 *offset = (int)hold;
1301 }
Barry Warsaw035574d1997-08-29 22:07:17 +00001302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 if (!(v = PyObject_GetAttrString(err, "text")))
1304 goto finally;
1305 if (v == Py_None)
1306 *text = NULL;
1307 else if (!PyUnicode_Check(v) ||
1308 !(*text = _PyUnicode_AsString(v)))
1309 goto finally;
1310 Py_DECREF(v);
1311 return 1;
Barry Warsaw035574d1997-08-29 22:07:17 +00001312
1313finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 Py_XDECREF(v);
1315 return 0;
Barry Warsaw035574d1997-08-29 22:07:17 +00001316}
1317
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001318void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001319PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001320{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 PyErr_PrintEx(1);
Guido van Rossuma61691e1998-02-06 22:27:24 +00001322}
1323
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001324static void
Martin v. Löwis95292d62002-12-11 14:04:59 +00001325print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 char *nl;
1328 if (offset >= 0) {
1329 if (offset > 0 && offset == (int)strlen(text))
1330 offset--;
1331 for (;;) {
1332 nl = strchr(text, '\n');
1333 if (nl == NULL || nl-text >= offset)
1334 break;
1335 offset -= (int)(nl+1-text);
1336 text = nl+1;
1337 }
1338 while (*text == ' ' || *text == '\t') {
1339 text++;
1340 offset--;
1341 }
1342 }
1343 PyFile_WriteString(" ", f);
1344 PyFile_WriteString(text, f);
1345 if (*text == '\0' || text[strlen(text)-1] != '\n')
1346 PyFile_WriteString("\n", f);
1347 if (offset == -1)
1348 return;
1349 PyFile_WriteString(" ", f);
1350 offset--;
1351 while (offset > 0) {
1352 PyFile_WriteString(" ", f);
1353 offset--;
1354 }
1355 PyFile_WriteString("^\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001356}
1357
Guido van Rossum66e8e862001-03-23 17:54:43 +00001358static void
1359handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001360{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 PyObject *exception, *value, *tb;
1362 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +00001363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 if (Py_InspectFlag)
1365 /* Don't exit if -i flag was given. This flag is set to 0
1366 * when entering interactive mode for inspecting. */
1367 return;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001369 PyErr_Fetch(&exception, &value, &tb);
1370 fflush(stdout);
1371 if (value == NULL || value == Py_None)
1372 goto done;
1373 if (PyExceptionInstance_Check(value)) {
1374 /* The error code should be in the `code' attribute. */
1375 PyObject *code = PyObject_GetAttrString(value, "code");
1376 if (code) {
1377 Py_DECREF(value);
1378 value = code;
1379 if (value == Py_None)
1380 goto done;
1381 }
1382 /* If we failed to dig out the 'code' attribute,
1383 just let the else clause below print the error. */
1384 }
1385 if (PyLong_Check(value))
1386 exitcode = (int)PyLong_AsLong(value);
1387 else {
Victor Stinnere9fb3192010-05-17 08:58:51 +00001388 PyObject *sys_stderr = PySys_GetObject("stderr");
Victor Stinner7126dbc2010-05-21 23:45:42 +00001389 if (sys_stderr != NULL && sys_stderr != Py_None) {
1390 PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW);
1391 } else {
1392 PyObject_Print(value, stderr, Py_PRINT_RAW);
1393 fflush(stderr);
1394 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 PySys_WriteStderr("\n");
1396 exitcode = 1;
1397 }
Tim Peterscf615b52003-04-19 18:47:02 +00001398 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 /* Restore and clear the exception info, in order to properly decref
1400 * the exception, value, and traceback. If we just exit instead,
1401 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1402 * some finalizers from running.
1403 */
1404 PyErr_Restore(exception, value, tb);
1405 PyErr_Clear();
1406 Py_Exit(exitcode);
1407 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001408}
1409
1410void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001411PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1416 handle_system_exit();
1417 }
1418 PyErr_Fetch(&exception, &v, &tb);
1419 if (exception == NULL)
1420 return;
1421 PyErr_NormalizeException(&exception, &v, &tb);
1422 if (tb == NULL) {
1423 tb = Py_None;
1424 Py_INCREF(tb);
1425 }
1426 PyException_SetTraceback(v, tb);
1427 if (exception == NULL)
1428 return;
1429 /* Now we know v != NULL too */
1430 if (set_sys_last_vars) {
1431 PySys_SetObject("last_type", exception);
1432 PySys_SetObject("last_value", v);
1433 PySys_SetObject("last_traceback", tb);
1434 }
1435 hook = PySys_GetObject("excepthook");
1436 if (hook) {
1437 PyObject *args = PyTuple_Pack(3, exception, v, tb);
1438 PyObject *result = PyEval_CallObject(hook, args);
1439 if (result == NULL) {
1440 PyObject *exception2, *v2, *tb2;
1441 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1442 handle_system_exit();
1443 }
1444 PyErr_Fetch(&exception2, &v2, &tb2);
1445 PyErr_NormalizeException(&exception2, &v2, &tb2);
1446 /* It should not be possible for exception2 or v2
1447 to be NULL. However PyErr_Display() can't
1448 tolerate NULLs, so just be safe. */
1449 if (exception2 == NULL) {
1450 exception2 = Py_None;
1451 Py_INCREF(exception2);
1452 }
1453 if (v2 == NULL) {
1454 v2 = Py_None;
1455 Py_INCREF(v2);
1456 }
1457 fflush(stdout);
1458 PySys_WriteStderr("Error in sys.excepthook:\n");
1459 PyErr_Display(exception2, v2, tb2);
1460 PySys_WriteStderr("\nOriginal exception was:\n");
1461 PyErr_Display(exception, v, tb);
1462 Py_DECREF(exception2);
1463 Py_DECREF(v2);
1464 Py_XDECREF(tb2);
1465 }
1466 Py_XDECREF(result);
1467 Py_XDECREF(args);
1468 } else {
1469 PySys_WriteStderr("sys.excepthook is missing\n");
1470 PyErr_Display(exception, v, tb);
1471 }
1472 Py_XDECREF(exception);
1473 Py_XDECREF(v);
1474 Py_XDECREF(tb);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001475}
1476
Benjamin Petersone6528212008-07-15 15:32:09 +00001477static void
1478print_exception(PyObject *f, PyObject *value)
1479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 int err = 0;
1481 PyObject *type, *tb;
Benjamin Petersone6528212008-07-15 15:32:09 +00001482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 if (!PyExceptionInstance_Check(value)) {
1484 PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
1485 PyFile_WriteString(Py_TYPE(value)->tp_name, f);
1486 PyFile_WriteString(" found\n", f);
1487 return;
1488 }
Benjamin Peterson26582602008-08-23 20:08:07 +00001489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 Py_INCREF(value);
1491 fflush(stdout);
1492 type = (PyObject *) Py_TYPE(value);
1493 tb = PyException_GetTraceback(value);
1494 if (tb && tb != Py_None)
1495 err = PyTraceBack_Print(tb, f);
1496 if (err == 0 &&
1497 PyObject_HasAttrString(value, "print_file_and_line"))
1498 {
1499 PyObject *message;
1500 const char *filename, *text;
1501 int lineno, offset;
1502 if (!parse_syntax_error(value, &message, &filename,
1503 &lineno, &offset, &text))
1504 PyErr_Clear();
1505 else {
1506 char buf[10];
1507 PyFile_WriteString(" File \"", f);
1508 if (filename == NULL)
1509 PyFile_WriteString("<string>", f);
1510 else
1511 PyFile_WriteString(filename, f);
1512 PyFile_WriteString("\", line ", f);
1513 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
1514 PyFile_WriteString(buf, f);
1515 PyFile_WriteString("\n", f);
1516 if (text != NULL)
1517 print_error_text(f, offset, text);
1518 Py_DECREF(value);
1519 value = message;
1520 /* Can't be bothered to check all those
1521 PyFile_WriteString() calls */
1522 if (PyErr_Occurred())
1523 err = -1;
1524 }
1525 }
1526 if (err) {
1527 /* Don't do anything else */
1528 }
1529 else {
1530 PyObject* moduleName;
1531 char* className;
1532 assert(PyExceptionClass_Check(type));
1533 className = PyExceptionClass_Name(type);
1534 if (className != NULL) {
1535 char *dot = strrchr(className, '.');
1536 if (dot != NULL)
1537 className = dot+1;
1538 }
Benjamin Petersone6528212008-07-15 15:32:09 +00001539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 moduleName = PyObject_GetAttrString(type, "__module__");
1541 if (moduleName == NULL || !PyUnicode_Check(moduleName))
1542 {
1543 Py_DECREF(moduleName);
1544 err = PyFile_WriteString("<unknown>", f);
1545 }
1546 else {
1547 char* modstr = _PyUnicode_AsString(moduleName);
1548 if (modstr && strcmp(modstr, "builtins"))
1549 {
1550 err = PyFile_WriteString(modstr, f);
1551 err += PyFile_WriteString(".", f);
1552 }
1553 Py_DECREF(moduleName);
1554 }
1555 if (err == 0) {
1556 if (className == NULL)
1557 err = PyFile_WriteString("<unknown>", f);
1558 else
1559 err = PyFile_WriteString(className, f);
1560 }
1561 }
1562 if (err == 0 && (value != Py_None)) {
1563 PyObject *s = PyObject_Str(value);
1564 /* only print colon if the str() of the
1565 object is not the empty string
1566 */
1567 if (s == NULL)
1568 err = -1;
1569 else if (!PyUnicode_Check(s) ||
1570 PyUnicode_GetSize(s) != 0)
1571 err = PyFile_WriteString(": ", f);
1572 if (err == 0)
1573 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1574 Py_XDECREF(s);
1575 }
1576 /* try to write a newline in any case */
1577 err += PyFile_WriteString("\n", f);
1578 Py_XDECREF(tb);
1579 Py_DECREF(value);
1580 /* If an error happened here, don't show it.
1581 XXX This is wrong, but too many callers rely on this behavior. */
1582 if (err != 0)
1583 PyErr_Clear();
Benjamin Petersone6528212008-07-15 15:32:09 +00001584}
1585
1586static const char *cause_message =
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 "\nThe above exception was the direct cause "
1588 "of the following exception:\n\n";
Benjamin Petersone6528212008-07-15 15:32:09 +00001589
1590static const char *context_message =
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 "\nDuring handling of the above exception, "
1592 "another exception occurred:\n\n";
Benjamin Petersone6528212008-07-15 15:32:09 +00001593
1594static void
1595print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
1596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 int err = 0, res;
1598 PyObject *cause, *context;
Benjamin Petersone6528212008-07-15 15:32:09 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 if (seen != NULL) {
1601 /* Exception chaining */
1602 if (PySet_Add(seen, value) == -1)
1603 PyErr_Clear();
1604 else if (PyExceptionInstance_Check(value)) {
1605 cause = PyException_GetCause(value);
1606 context = PyException_GetContext(value);
1607 if (cause) {
1608 res = PySet_Contains(seen, cause);
1609 if (res == -1)
1610 PyErr_Clear();
1611 if (res == 0) {
1612 print_exception_recursive(
1613 f, cause, seen);
1614 err |= PyFile_WriteString(
1615 cause_message, f);
1616 }
1617 }
1618 else if (context) {
1619 res = PySet_Contains(seen, context);
1620 if (res == -1)
1621 PyErr_Clear();
1622 if (res == 0) {
1623 print_exception_recursive(
1624 f, context, seen);
1625 err |= PyFile_WriteString(
1626 context_message, f);
1627 }
1628 }
1629 Py_XDECREF(context);
1630 Py_XDECREF(cause);
1631 }
1632 }
1633 print_exception(f, value);
1634 if (err != 0)
1635 PyErr_Clear();
Benjamin Petersone6528212008-07-15 15:32:09 +00001636}
1637
Thomas Wouters477c8d52006-05-27 19:21:47 +00001638void
1639PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 PyObject *seen;
1642 PyObject *f = PySys_GetObject("stderr");
1643 if (f == Py_None) {
1644 /* pass */
1645 }
1646 else if (f == NULL) {
1647 _PyObject_Dump(value);
1648 fprintf(stderr, "lost sys.stderr\n");
1649 }
1650 else {
1651 /* We choose to ignore seen being possibly NULL, and report
1652 at least the main exception (it could be a MemoryError).
1653 */
1654 seen = PySet_New(NULL);
1655 if (seen == NULL)
1656 PyErr_Clear();
1657 print_exception_recursive(f, value, seen);
1658 Py_XDECREF(seen);
1659 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001660}
1661
Guido van Rossum82598051997-03-05 00:20:32 +00001662PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001663PyRun_StringFlags(const char *str, int start, PyObject *globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 PyObject *ret = NULL;
1667 mod_ty mod;
1668 PyArena *arena = PyArena_New();
1669 if (arena == NULL)
1670 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 mod = PyParser_ASTFromString(str, "<string>", start, flags, arena);
1673 if (mod != NULL)
1674 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
1675 PyArena_Free(arena);
1676 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001677}
1678
1679PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001680PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 PyObject *locals, int closeit, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 PyObject *ret;
1684 mod_ty mod;
1685 PyArena *arena = PyArena_New();
1686 if (arena == NULL)
1687 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0,
1690 flags, NULL, arena);
1691 if (closeit)
1692 fclose(fp);
1693 if (mod == NULL) {
1694 PyArena_Free(arena);
1695 return NULL;
1696 }
1697 ret = run_mod(mod, filename, globals, locals, flags, arena);
1698 PyArena_Free(arena);
1699 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001700}
1701
Guido van Rossum6c193fa2007-12-05 05:14:58 +00001702static void
1703flush_io(void)
1704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 PyObject *f, *r;
1706 PyObject *type, *value, *traceback;
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 /* Save the current exception */
1709 PyErr_Fetch(&type, &value, &traceback);
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 f = PySys_GetObject("stderr");
1712 if (f != NULL) {
1713 r = PyObject_CallMethod(f, "flush", "");
1714 if (r)
1715 Py_DECREF(r);
1716 else
1717 PyErr_Clear();
1718 }
1719 f = PySys_GetObject("stdout");
1720 if (f != NULL) {
1721 r = PyObject_CallMethod(f, "flush", "");
1722 if (r)
1723 Py_DECREF(r);
1724 else
1725 PyErr_Clear();
1726 }
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 PyErr_Restore(type, value, traceback);
Guido van Rossum6c193fa2007-12-05 05:14:58 +00001729}
1730
Guido van Rossum82598051997-03-05 00:20:32 +00001731static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001732run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 PyCodeObject *co;
1736 PyObject *v;
1737 co = PyAST_Compile(mod, filename, flags, arena);
1738 if (co == NULL)
1739 return NULL;
1740 v = PyEval_EvalCode(co, globals, locals);
1741 Py_DECREF(co);
1742 return v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001743}
1744
Guido van Rossum82598051997-03-05 00:20:32 +00001745static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001746run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 PyCodeObject *co;
1750 PyObject *v;
1751 long magic;
1752 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 magic = PyMarshal_ReadLongFromFile(fp);
1755 if (magic != PyImport_GetMagicNumber()) {
1756 PyErr_SetString(PyExc_RuntimeError,
1757 "Bad magic number in .pyc file");
1758 return NULL;
1759 }
1760 (void) PyMarshal_ReadLongFromFile(fp);
1761 v = PyMarshal_ReadLastObjectFromFile(fp);
1762 fclose(fp);
1763 if (v == NULL || !PyCode_Check(v)) {
1764 Py_XDECREF(v);
1765 PyErr_SetString(PyExc_RuntimeError,
1766 "Bad code object in .pyc file");
1767 return NULL;
1768 }
1769 co = (PyCodeObject *)v;
1770 v = PyEval_EvalCode(co, globals, locals);
1771 if (v && flags)
1772 flags->cf_flags |= (co->co_flags & PyCF_MASK);
1773 Py_DECREF(co);
1774 return v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001775}
1776
Guido van Rossum82598051997-03-05 00:20:32 +00001777PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001778Py_CompileStringFlags(const char *str, const char *filename, int start,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 PyCodeObject *co;
1782 mod_ty mod;
1783 PyArena *arena = PyArena_New();
1784 if (arena == NULL)
1785 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 mod = PyParser_ASTFromString(str, filename, start, flags, arena);
1788 if (mod == NULL) {
1789 PyArena_Free(arena);
1790 return NULL;
1791 }
1792 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
1793 PyObject *result = PyAST_mod2obj(mod);
1794 PyArena_Free(arena);
1795 return result;
1796 }
1797 co = PyAST_Compile(mod, filename, flags, arena);
1798 PyArena_Free(arena);
1799 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001800}
1801
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001802struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001803Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 struct symtable *st;
1806 mod_ty mod;
1807 PyCompilerFlags flags;
1808 PyArena *arena = PyArena_New();
1809 if (arena == NULL)
1810 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 flags.cf_flags = 0;
1813 mod = PyParser_ASTFromString(str, filename, start, &flags, arena);
1814 if (mod == NULL) {
1815 PyArena_Free(arena);
1816 return NULL;
1817 }
1818 st = PySymtable_Build(mod, filename, 0);
1819 PyArena_Free(arena);
1820 return st;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001821}
1822
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001823/* Preferred access to parser is through AST. */
1824mod_ty
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001825PyParser_ASTFromString(const char *s, const char *filename, int start,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 mod_ty mod;
1829 PyCompilerFlags localflags;
1830 perrdetail err;
1831 int iflags = PARSER_FLAGS(flags);
Christian Heimes4d6ec852008-03-26 22:34:47 +00001832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 node *n = PyParser_ParseStringFlagsFilenameEx(s, filename,
1834 &_PyParser_Grammar, start, &err,
1835 &iflags);
1836 if (flags == NULL) {
1837 localflags.cf_flags = 0;
1838 flags = &localflags;
1839 }
1840 if (n) {
1841 flags->cf_flags |= iflags & PyCF_MASK;
1842 mod = PyAST_FromNode(n, flags, filename, arena);
1843 PyNode_Free(n);
1844 return mod;
1845 }
1846 else {
1847 err_input(&err);
1848 return NULL;
1849 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001850}
1851
1852mod_ty
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001853PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 int start, char *ps1,
1855 char *ps2, PyCompilerFlags *flags, int *errcode,
1856 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 mod_ty mod;
1859 PyCompilerFlags localflags;
1860 perrdetail err;
1861 int iflags = PARSER_FLAGS(flags);
Christian Heimes4d6ec852008-03-26 22:34:47 +00001862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001863 node *n = PyParser_ParseFileFlagsEx(fp, filename, enc,
1864 &_PyParser_Grammar,
1865 start, ps1, ps2, &err, &iflags);
1866 if (flags == NULL) {
1867 localflags.cf_flags = 0;
1868 flags = &localflags;
1869 }
1870 if (n) {
1871 flags->cf_flags |= iflags & PyCF_MASK;
1872 mod = PyAST_FromNode(n, flags, filename, arena);
1873 PyNode_Free(n);
1874 return mod;
1875 }
1876 else {
1877 err_input(&err);
1878 if (errcode)
1879 *errcode = err.error;
1880 return NULL;
1881 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001882}
1883
Guido van Rossuma110aa61994-08-29 12:50:44 +00001884/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001885
Guido van Rossuma110aa61994-08-29 12:50:44 +00001886node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001887PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 perrdetail err;
1890 node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1891 &_PyParser_Grammar,
1892 start, NULL, NULL, &err, flags);
1893 if (n == NULL)
1894 err_input(&err);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001897}
1898
Guido van Rossuma110aa61994-08-29 12:50:44 +00001899/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001900
Guido van Rossuma110aa61994-08-29 12:50:44 +00001901node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001902PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 perrdetail err;
1905 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1906 start, &err, flags);
1907 if (n == NULL)
1908 err_input(&err);
1909 return n;
Tim Petersfe2127d2001-07-16 05:37:24 +00001910}
1911
1912node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001913PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 int start, int flags)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 perrdetail err;
1917 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1918 &_PyParser_Grammar, start, &err, flags);
1919 if (n == NULL)
1920 err_input(&err);
1921 return n;
Thomas Heller6b17abf2002-07-09 09:23:27 +00001922}
1923
1924node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001925PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001928}
1929
Guido van Rossum66ebd912003-04-17 16:02:26 +00001930/* May want to move a more generalized form of this to parsetok.c or
1931 even parser modules. */
1932
1933void
1934PyParser_SetError(perrdetail *err)
1935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 err_input(err);
Guido van Rossum66ebd912003-04-17 16:02:26 +00001937}
1938
Guido van Rossuma110aa61994-08-29 12:50:44 +00001939/* Set the error appropriate to the given input error code (see errcode.h) */
1940
1941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001942err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 PyObject *v, *w, *errtype, *errtext;
1945 PyObject *msg_obj = NULL;
1946 char *msg = NULL;
1947 errtype = PyExc_SyntaxError;
1948 switch (err->error) {
1949 case E_ERROR:
1950 return;
1951 case E_SYNTAX:
1952 errtype = PyExc_IndentationError;
1953 if (err->expected == INDENT)
1954 msg = "expected an indented block";
1955 else if (err->token == INDENT)
1956 msg = "unexpected indent";
1957 else if (err->token == DEDENT)
1958 msg = "unexpected unindent";
1959 else {
1960 errtype = PyExc_SyntaxError;
1961 msg = "invalid syntax";
1962 }
1963 break;
1964 case E_TOKEN:
1965 msg = "invalid token";
1966 break;
1967 case E_EOFS:
1968 msg = "EOF while scanning triple-quoted string literal";
1969 break;
1970 case E_EOLS:
1971 msg = "EOL while scanning string literal";
1972 break;
1973 case E_INTR:
1974 if (!PyErr_Occurred())
1975 PyErr_SetNone(PyExc_KeyboardInterrupt);
1976 goto cleanup;
1977 case E_NOMEM:
1978 PyErr_NoMemory();
1979 goto cleanup;
1980 case E_EOF:
1981 msg = "unexpected EOF while parsing";
1982 break;
1983 case E_TABSPACE:
1984 errtype = PyExc_TabError;
1985 msg = "inconsistent use of tabs and spaces in indentation";
1986 break;
1987 case E_OVERFLOW:
1988 msg = "expression too long";
1989 break;
1990 case E_DEDENT:
1991 errtype = PyExc_IndentationError;
1992 msg = "unindent does not match any outer indentation level";
1993 break;
1994 case E_TOODEEP:
1995 errtype = PyExc_IndentationError;
1996 msg = "too many levels of indentation";
1997 break;
1998 case E_DECODE: {
1999 PyObject *type, *value, *tb;
2000 PyErr_Fetch(&type, &value, &tb);
2001 msg = "unknown decode error";
2002 if (value != NULL)
2003 msg_obj = PyObject_Str(value);
2004 Py_XDECREF(type);
2005 Py_XDECREF(value);
2006 Py_XDECREF(tb);
2007 break;
2008 }
2009 case E_LINECONT:
2010 msg = "unexpected character after line continuation character";
2011 break;
Martin v. Löwis47383402007-08-15 07:32:56 +00002012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 case E_IDENTIFIER:
2014 msg = "invalid character in identifier";
2015 break;
2016 default:
2017 fprintf(stderr, "error=%d\n", err->error);
2018 msg = "unknown parsing error";
2019 break;
2020 }
2021 /* err->text may not be UTF-8 in case of decoding errors.
2022 Explicitly convert to an object. */
2023 if (!err->text) {
2024 errtext = Py_None;
2025 Py_INCREF(Py_None);
2026 } else {
2027 errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text),
2028 "replace");
2029 }
2030 v = Py_BuildValue("(ziiN)", err->filename,
2031 err->lineno, err->offset, errtext);
2032 if (v != NULL) {
2033 if (msg_obj)
2034 w = Py_BuildValue("(OO)", msg_obj, v);
2035 else
2036 w = Py_BuildValue("(sO)", msg, v);
2037 } else
2038 w = NULL;
2039 Py_XDECREF(v);
2040 PyErr_SetObject(errtype, w);
2041 Py_XDECREF(w);
Georg Brandl3dbca812008-07-23 16:10:53 +00002042cleanup:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 Py_XDECREF(msg_obj);
2044 if (err->text != NULL) {
2045 PyObject_FREE(err->text);
2046 err->text = NULL;
2047 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00002048}
2049
2050/* Print fatal error message and abort */
2051
2052void
Tim Peters7c321a82002-07-09 02:57:01 +00002053Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00002054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 fprintf(stderr, "Fatal Python error: %s\n", msg);
2056 fflush(stderr); /* it helps in Windows debug build */
2057 if (PyErr_Occurred()) {
Victor Stinner55a5c782010-06-08 21:00:13 +00002058 PyErr_PrintEx(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002060#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 {
2062 size_t len = strlen(msg);
2063 WCHAR* buffer;
2064 size_t i;
Martin v. Löwis5c88d812009-01-02 20:47:48 +00002065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 /* Convert the message to wchar_t. This uses a simple one-to-one
2067 conversion, assuming that the this error message actually uses ASCII
2068 only. If this ceases to be true, we will have to convert. */
2069 buffer = alloca( (len+1) * (sizeof *buffer));
2070 for( i=0; i<=len; ++i)
2071 buffer[i] = msg[i];
2072 OutputDebugStringW(L"Fatal Python error: ");
2073 OutputDebugStringW(buffer);
2074 OutputDebugStringW(L"\n");
2075 }
Guido van Rossum0ba35361998-08-13 13:33:16 +00002076#ifdef _DEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00002078#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002079#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 abort();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00002081}
2082
2083/* Clean up and exit */
2084
Guido van Rossuma110aa61994-08-29 12:50:44 +00002085#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00002086#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00002087#endif
2088
Collin Winter670e6922007-03-21 02:57:17 +00002089static void (*pyexitfunc)(void) = NULL;
2090/* For the atexit module. */
2091void _Py_PyAtExit(void (*func)(void))
2092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 pyexitfunc = func;
Collin Winter670e6922007-03-21 02:57:17 +00002094}
2095
2096static void
2097call_py_exitfuncs(void)
2098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (pyexitfunc == NULL)
2100 return;
Collin Winter670e6922007-03-21 02:57:17 +00002101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 (*pyexitfunc)();
2103 PyErr_Clear();
Collin Winter670e6922007-03-21 02:57:17 +00002104}
2105
Antoine Pitrou011bd622009-10-20 21:52:47 +00002106/* Wait until threading._shutdown completes, provided
2107 the threading module was imported in the first place.
2108 The shutdown routine will wait until all non-daemon
2109 "threading" threads have completed. */
2110static void
2111wait_for_thread_shutdown(void)
2112{
2113#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 PyObject *result;
2115 PyThreadState *tstate = PyThreadState_GET();
2116 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
2117 "threading");
2118 if (threading == NULL) {
2119 /* threading not imported */
2120 PyErr_Clear();
2121 return;
2122 }
2123 result = PyObject_CallMethod(threading, "_shutdown", "");
2124 if (result == NULL) {
2125 PyErr_WriteUnraisable(threading);
2126 }
2127 else {
2128 Py_DECREF(result);
2129 }
2130 Py_DECREF(threading);
Antoine Pitrou011bd622009-10-20 21:52:47 +00002131#endif
2132}
2133
Guido van Rossum2dcfc961998-10-01 16:01:57 +00002134#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002135static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00002136static int nexitfuncs = 0;
2137
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002138int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00002139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 if (nexitfuncs >= NEXITFUNCS)
2141 return -1;
2142 exitfuncs[nexitfuncs++] = func;
2143 return 0;
Guido van Rossum1662dd51994-09-07 14:38:28 +00002144}
2145
Guido van Rossumcc283f51997-08-05 02:22:03 +00002146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002147call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00002148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 while (nexitfuncs > 0)
2150 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 fflush(stdout);
2153 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002154}
2155
2156void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00002162}
2163
Guido van Rossumf1dc5661993-07-05 10:31:29 +00002164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002165initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002166{
Guido van Rossuma110aa61994-08-29 12:50:44 +00002167#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002169#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00002170#ifdef SIGXFZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00002172#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00002173#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00002175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00002177}
2178
Guido van Rossum7433b121997-02-14 19:45:36 +00002179
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002180/* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
2181 *
2182 * All of the code in this function must only use async-signal-safe functions,
2183 * listed at `man 7 signal` or
2184 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2185 */
2186void
2187_Py_RestoreSignals(void)
2188{
2189#ifdef SIGPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 PyOS_setsig(SIGPIPE, SIG_DFL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002191#endif
2192#ifdef SIGXFZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 PyOS_setsig(SIGXFZ, SIG_DFL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002194#endif
2195#ifdef SIGXFSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 PyOS_setsig(SIGXFSZ, SIG_DFL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002197#endif
2198}
2199
2200
Guido van Rossum7433b121997-02-14 19:45:36 +00002201/*
2202 * The file descriptor fd is considered ``interactive'' if either
2203 * a) isatty(fd) is TRUE, or
2204 * b) the -i flag was given, and the filename associated with
2205 * the descriptor is NULL or "<stdin>" or "???".
2206 */
2207int
Martin v. Löwis95292d62002-12-11 14:04:59 +00002208Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00002209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (isatty((int)fileno(fp)))
2211 return 1;
2212 if (!Py_InteractiveFlag)
2213 return 0;
2214 return (filename == NULL) ||
2215 (strcmp(filename, "<stdin>") == 0) ||
2216 (strcmp(filename, "???") == 0);
Guido van Rossum7433b121997-02-14 19:45:36 +00002217}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002218
2219
Tim Petersd08e3822003-04-17 15:24:21 +00002220#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002221#if defined(WIN32) && defined(_MSC_VER)
2222
2223/* Stack checking for Microsoft C */
2224
2225#include <malloc.h>
2226#include <excpt.h>
2227
Fred Drakee8de31c2000-08-31 05:38:39 +00002228/*
2229 * Return non-zero when we run out of memory on the stack; zero otherwise.
2230 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002231int
Fred Drake399739f2000-08-31 05:52:44 +00002232PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 __try {
2235 /* alloca throws a stack overflow exception if there's
2236 not enough space left on the stack */
2237 alloca(PYOS_STACK_MARGIN * sizeof(void*));
2238 return 0;
2239 } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
2240 EXCEPTION_EXECUTE_HANDLER :
2241 EXCEPTION_CONTINUE_SEARCH) {
2242 int errcode = _resetstkoflw();
2243 if (errcode == 0)
2244 {
2245 Py_FatalError("Could not reset the stack!");
2246 }
2247 }
2248 return 1;
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002249}
2250
2251#endif /* WIN32 && _MSC_VER */
2252
2253/* Alternate implementations can be added here... */
2254
2255#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00002256
2257
2258/* Wrappers around sigaction() or signal(). */
2259
2260PyOS_sighandler_t
2261PyOS_getsig(int sig)
2262{
2263#ifdef HAVE_SIGACTION
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 struct sigaction context;
2265 if (sigaction(sig, NULL, &context) == -1)
2266 return SIG_ERR;
2267 return context.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00002268#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00002270/* Special signal handling for the secure CRT in Visual Studio 2005 */
2271#if defined(_MSC_VER) && _MSC_VER >= 1400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 switch (sig) {
2273 /* Only these signals are valid */
2274 case SIGINT:
2275 case SIGILL:
2276 case SIGFPE:
2277 case SIGSEGV:
2278 case SIGTERM:
2279 case SIGBREAK:
2280 case SIGABRT:
2281 break;
2282 /* Don't call signal() with other values or it will assert */
2283 default:
2284 return SIG_ERR;
2285 }
Martin v. Löwisb45b3152005-11-28 17:34:23 +00002286#endif /* _MSC_VER && _MSC_VER >= 1400 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 handler = signal(sig, SIG_IGN);
2288 if (handler != SIG_ERR)
2289 signal(sig, handler);
2290 return handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00002291#endif
2292}
2293
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002294/*
2295 * All of the code in this function must only use async-signal-safe functions,
2296 * listed at `man 7 signal` or
2297 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
2298 */
Guido van Rossum6f256182000-09-16 16:32:19 +00002299PyOS_sighandler_t
2300PyOS_setsig(int sig, PyOS_sighandler_t handler)
2301{
2302#ifdef HAVE_SIGACTION
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 /* Some code in Modules/signalmodule.c depends on sigaction() being
2304 * used here if HAVE_SIGACTION is defined. Fix that if this code
2305 * changes to invalidate that assumption.
2306 */
2307 struct sigaction context, ocontext;
2308 context.sa_handler = handler;
2309 sigemptyset(&context.sa_mask);
2310 context.sa_flags = 0;
2311 if (sigaction(sig, &context, &ocontext) == -1)
2312 return SIG_ERR;
2313 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00002314#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 PyOS_sighandler_t oldhandler;
2316 oldhandler = signal(sig, handler);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002317#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 siginterrupt(sig, 1);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00002321#endif
2322}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002323
2324/* Deprecated C API functions still provided for binary compatiblity */
2325
2326#undef PyParser_SimpleParseFile
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002327PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002328PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
2329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002331}
2332
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002333#undef PyParser_SimpleParseString
2334PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002335PyParser_SimpleParseString(const char *str, int start)
2336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 return PyParser_SimpleParseStringFlags(str, start, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002338}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002339
2340#undef PyRun_AnyFile
2341PyAPI_FUNC(int)
2342PyRun_AnyFile(FILE *fp, const char *name)
2343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345}
2346
2347#undef PyRun_AnyFileEx
2348PyAPI_FUNC(int)
2349PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
2350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002352}
2353
2354#undef PyRun_AnyFileFlags
2355PyAPI_FUNC(int)
2356PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
2357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 return PyRun_AnyFileExFlags(fp, name, 0, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002359}
2360
2361#undef PyRun_File
2362PyAPI_FUNC(PyObject *)
2363PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
2364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002366}
2367
2368#undef PyRun_FileEx
2369PyAPI_FUNC(PyObject *)
2370PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
2371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002373}
2374
2375#undef PyRun_FileFlags
2376PyAPI_FUNC(PyObject *)
2377PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 PyCompilerFlags *flags)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002381}
2382
2383#undef PyRun_SimpleFile
2384PyAPI_FUNC(int)
2385PyRun_SimpleFile(FILE *f, const char *p)
2386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002388}
2389
2390#undef PyRun_SimpleFileEx
2391PyAPI_FUNC(int)
2392PyRun_SimpleFileEx(FILE *f, const char *p, int c)
2393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 return PyRun_SimpleFileExFlags(f, p, c, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002395}
2396
2397
2398#undef PyRun_String
2399PyAPI_FUNC(PyObject *)
2400PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
2401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 return PyRun_StringFlags(str, s, g, l, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002403}
2404
2405#undef PyRun_SimpleString
2406PyAPI_FUNC(int)
2407PyRun_SimpleString(const char *s)
2408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 return PyRun_SimpleStringFlags(s, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002410}
2411
2412#undef Py_CompileString
2413PyAPI_FUNC(PyObject *)
2414Py_CompileString(const char *str, const char *p, int s)
2415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 return Py_CompileStringFlags(str, p, s, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002417}
2418
2419#undef PyRun_InteractiveOne
2420PyAPI_FUNC(int)
2421PyRun_InteractiveOne(FILE *f, const char *p)
2422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 return PyRun_InteractiveOneFlags(f, p, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002424}
2425
2426#undef PyRun_InteractiveLoop
2427PyAPI_FUNC(int)
2428PyRun_InteractiveLoop(FILE *f, const char *p)
2429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 return PyRun_InteractiveLoopFlags(f, p, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002431}
2432
2433#ifdef __cplusplus
2434}
2435#endif