blob: 4fb2b3e40d29067fa753f9ae8d48b8d54bf41ab8 [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"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000021
Thomas Wouters0e3f5912006-08-11 14:57:12 +000022#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000023#include <signal.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000025
Martin v. Löwis73d538b2003-03-05 15:13:47 +000026#ifdef HAVE_LANGINFO_H
27#include <locale.h>
28#include <langinfo.h>
29#endif
30
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000031#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000032#undef BYTE
33#include "windows.h"
Martin v. Löwis790465f2008-04-05 20:41:37 +000034#define PATH_MAX MAXPATHLEN
Guido van Rossuma44823b1995-03-14 15:01:17 +000035#endif
36
Neal Norwitz4281cef2006-03-04 19:58:13 +000037#ifndef Py_REF_DEBUG
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000038#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000039#else /* Py_REF_DEBUG */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000040#define PRINT_TOTAL_REFS() fprintf(stderr, \
41 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
42 _Py_GetRefTotal())
43#endif
44
45#ifdef __cplusplus
46extern "C" {
Neal Norwitz4281cef2006-03-04 19:58:13 +000047#endif
48
Martin v. Löwis790465f2008-04-05 20:41:37 +000049extern wchar_t *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000050
Guido van Rossum82598051997-03-05 00:20:32 +000051extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000052
Guido van Rossumb73cc041993-11-01 16:28:59 +000053/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000054static void initmain(void);
55static void initsite(void);
Guido van Rossumce3a72a2007-10-19 23:16:50 +000056static int initstdio(void);
Amaury Forgeot d'Arc7fedbe52008-04-10 21:03:09 +000057static void flush_io(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000058static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Neal Norwitzadb69fc2005-12-17 20:54:49 +000059 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000060static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Jeremy Hyltonbc320242001-03-22 02:47:58 +000061 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static void err_input(perrdetail *);
63static void initsigs(void);
Collin Winter670e6922007-03-21 02:57:17 +000064static void call_py_exitfuncs(void);
Tim Petersdbd9ba62000-07-09 03:09:57 +000065static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000066extern void _PyUnicode_Init(void);
67extern void _PyUnicode_Fini(void);
Guido van Rossumddefaf32007-01-14 03:31:43 +000068extern int _PyLong_Init(void);
69extern void PyLong_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000070
Mark Hammond8d98d2c2003-04-19 15:41:53 +000071#ifdef WITH_THREAD
72extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
73extern void _PyGILState_Fini(void);
74#endif /* WITH_THREAD */
75
Guido van Rossum82598051997-03-05 00:20:32 +000076int Py_DebugFlag; /* Needed by parser.c */
77int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000078int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumd8faa362007-04-27 19:54:29 +000079int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000080int Py_NoSiteFlag; /* Suppress 'import site' */
Guido van Rossum98297ee2007-11-06 21:34:58 +000081int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
Christian Heimes790c8232008-01-07 21:14:23 +000082int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */
Barry Warsaw3ce09642000-05-02 19:18:59 +000083int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000084int Py_FrozenFlag; /* Needed by getpath.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000085int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Christian Heimes8dc226f2008-05-06 23:45:46 +000086int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087
Christian Heimes33fe8092008-04-13 13:53:33 +000088/* PyModule_GetWarningsModule is no longer necessary as of 2.6
89since _warnings is builtin. This API should not be used. */
90PyObject *
91PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000092{
Christian Heimes33fe8092008-04-13 13:53:33 +000093 return PyImport_ImportModule("warnings");
Mark Hammondedd07732003-07-15 23:03:55 +000094}
Mark Hammonda43fd0c2003-02-19 00:33:33 +000095
Guido van Rossum25ce5661997-08-02 03:10:38 +000096static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097
Thomas Wouters7e474022000-07-16 12:04:32 +000098/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000099
100int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000102{
103 return initialized;
104}
105
Guido van Rossum25ce5661997-08-02 03:10:38 +0000106/* Global initializations. Can be undone by Py_Finalize(). Don't
107 call this twice without an intervening Py_Finalize() call. When
108 initializations fail, a fatal error is issued and the function does
109 not return. On return, the first thread and interpreter state have
110 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112 Locking: you must hold the interpreter lock while calling this.
113 (If the lock has not yet been initialized, that's equivalent to
114 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000115
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000118static int
119add_flag(int flag, const char *envs)
120{
121 int env = atoi(envs);
122 if (flag < env)
123 flag = env;
124 if (flag < 1)
125 flag = 1;
126 return flag;
127}
128
Christian Heimes5833a2f2008-10-30 21:40:04 +0000129#if defined(HAVE_LANGINFO_H) && defined(CODESET)
130static char*
131get_codeset(void)
132{
133 char* codeset;
134 PyObject *codec, *name;
135
136 codeset = nl_langinfo(CODESET);
137 if (!codeset || codeset[0] == '\0')
138 return NULL;
139
140 codec = _PyCodec_Lookup(codeset);
141 if (!codec)
142 goto error;
143
144 name = PyObject_GetAttrString(codec, "name");
145 Py_CLEAR(codec);
146 if (!name)
147 goto error;
148
149 codeset = strdup(_PyUnicode_AsString(name));
150 Py_DECREF(name);
151 return codeset;
152
153error:
154 Py_XDECREF(codec);
155 PyErr_Clear();
156 return NULL;
157}
158#endif
159
Guido van Rossuma027efa1997-05-05 20:56:21 +0000160void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000161Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000162{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000163 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164 PyThreadState *tstate;
Guido van Rossum826d8972007-10-30 18:34:07 +0000165 PyObject *bimod, *sysmod, *pstderr;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000166 char *p;
Guido van Rossum8d30cc02007-05-03 17:49:24 +0000167#if defined(HAVE_LANGINFO_H) && defined(CODESET)
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000168 char *codeset;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000169#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +0000170 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000171
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000172 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000173 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000174 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000175
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +0000176#ifdef HAVE_SETLOCALE
177 /* Set up the LC_CTYPE locale, so we can obtain
178 the locale's charset without having to switch
179 locales. */
180 setlocale(LC_CTYPE, "");
181#endif
182
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000183 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000184 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000185 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000186 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000187 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000188 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Christian Heimes790c8232008-01-07 21:14:23 +0000189 if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
190 Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000191
Guido van Rossuma027efa1997-05-05 20:56:21 +0000192 interp = PyInterpreterState_New();
193 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000194 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000195
Guido van Rossuma027efa1997-05-05 20:56:21 +0000196 tstate = PyThreadState_New(interp);
197 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000198 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000199 (void) PyThreadState_Swap(tstate);
200
Guido van Rossum70d893a2001-08-16 08:21:42 +0000201 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000202
Neal Norwitzb2501f42002-12-31 03:42:13 +0000203 if (!_PyFrame_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000204 Py_FatalError("Py_Initialize: can't init frames");
205
Guido van Rossumddefaf32007-01-14 03:31:43 +0000206 if (!_PyLong_Init())
207 Py_FatalError("Py_Initialize: can't init longs");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000208
Christian Heimes9c4756e2008-05-26 13:22:05 +0000209 if (!PyByteArray_Init())
Neal Norwitz6968b052007-02-27 19:02:19 +0000210 Py_FatalError("Py_Initialize: can't init bytes");
211
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000212 _PyFloat_Init();
213
Guido van Rossum25ce5661997-08-02 03:10:38 +0000214 interp->modules = PyDict_New();
215 if (interp->modules == NULL)
216 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossumd8faa362007-04-27 19:54:29 +0000217 interp->modules_reloading = PyDict_New();
218 if (interp->modules_reloading == NULL)
219 Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000220
Guido van Rossumc94044c2000-03-10 23:03:54 +0000221 /* Init Unicode implementation; relies on the codec registry */
222 _PyUnicode_Init();
223
Barry Warsawf242aa02000-05-25 23:09:49 +0000224 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000225 if (bimod == NULL)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000226 Py_FatalError("Py_Initialize: can't initialize builtins modules");
Martin v. Löwis1a214512008-06-11 05:26:20 +0000227 _PyImport_FixupExtension(bimod, "builtins", "builtins");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000228 interp->builtins = PyModule_GetDict(bimod);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000229 if (interp->builtins == NULL)
230 Py_FatalError("Py_Initialize: can't initialize builtins dict");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000231 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000232
Christian Heimes9a68f8c2007-11-14 00:16:07 +0000233 /* initialize builtin exceptions */
234 _PyExc_Init();
235
Guido van Rossum25ce5661997-08-02 03:10:38 +0000236 sysmod = _PySys_Init();
237 if (sysmod == NULL)
238 Py_FatalError("Py_Initialize: can't initialize sys");
239 interp->sysdict = PyModule_GetDict(sysmod);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000240 if (interp->sysdict == NULL)
241 Py_FatalError("Py_Initialize: can't initialize sys dict");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000242 Py_INCREF(interp->sysdict);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000243 _PyImport_FixupExtension(sysmod, "sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000244 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000245 PyDict_SetItemString(interp->sysdict, "modules",
246 interp->modules);
247
Guido van Rossum826d8972007-10-30 18:34:07 +0000248 /* Set up a preliminary stderr printer until we have enough
249 infrastructure for the io module in place. */
250 pstderr = PyFile_NewStdPrinter(fileno(stderr));
251 if (pstderr == NULL)
252 Py_FatalError("Py_Initialize: can't set preliminary stderr");
253 PySys_SetObject("stderr", pstderr);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000254 PySys_SetObject("__stderr__", pstderr);
Guido van Rossum826d8972007-10-30 18:34:07 +0000255
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000256 _PyImport_Init();
257
Just van Rossum52e14d62002-12-30 22:08:05 +0000258 _PyImportHooks_Init();
259
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000260 if (install_sigs)
261 initsigs(); /* Signal handling stuff, including initintr() */
Christian Heimes33fe8092008-04-13 13:53:33 +0000262
Georg Brandl86b2fb92008-07-16 03:43:04 +0000263 /* Initialize warnings. */
264 _PyWarnings_Init();
265 if (PySys_HasWarnOptions()) {
266 PyObject *warnings_module = PyImport_ImportModule("warnings");
267 if (!warnings_module)
268 PyErr_Clear();
269 Py_XDECREF(warnings_module);
270 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271
272 initmain(); /* Module __main__ */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000273 if (initstdio() < 0)
274 Py_FatalError(
275 "Py_Initialize: can't initialize sys standard streams");
Benjamin Peterson791dc2f2008-09-05 23:27:15 +0000276 if (!Py_NoSiteFlag)
277 initsite(); /* Module site */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000278
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000279 /* auto-thread-state API, if available */
280#ifdef WITH_THREAD
281 _PyGILState_Init(interp, tstate);
282#endif /* WITH_THREAD */
283
Guido van Rossum8d30cc02007-05-03 17:49:24 +0000284#if defined(HAVE_LANGINFO_H) && defined(CODESET)
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000285 /* On Unix, set the file system encoding according to the
286 user's preference, if the CODESET names a well-known
287 Python codec, and Py_FileSystemDefaultEncoding isn't
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000288 initialized by other means. Also set the encoding of
289 stdin and stdout if these are terminals. */
290
Christian Heimes5833a2f2008-10-30 21:40:04 +0000291 codeset = get_codeset();
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000292 if (codeset) {
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000293 if (!Py_FileSystemDefaultEncoding)
294 Py_FileSystemDefaultEncoding = codeset;
295 else
296 free(codeset);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000297 }
298#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000299}
300
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000301void
302Py_Initialize(void)
303{
304 Py_InitializeEx(1);
305}
306
307
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000308#ifdef COUNT_ALLOCS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000309extern void dump_counts(FILE*);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000310#endif
311
Guido van Rossume8432ac2007-07-09 15:04:50 +0000312/* Flush stdout and stderr */
313
Neal Norwitz2bad9702007-08-27 06:19:22 +0000314static void
Guido van Rossum1bd21222007-07-10 20:14:13 +0000315flush_std_files(void)
Guido van Rossume8432ac2007-07-09 15:04:50 +0000316{
317 PyObject *fout = PySys_GetObject("stdout");
318 PyObject *ferr = PySys_GetObject("stderr");
319 PyObject *tmp;
320
Christian Heimes2be03732007-11-15 02:26:46 +0000321 if (fout != NULL && fout != Py_None) {
Guido van Rossume8432ac2007-07-09 15:04:50 +0000322 tmp = PyObject_CallMethod(fout, "flush", "");
323 if (tmp == NULL)
324 PyErr_Clear();
325 else
326 Py_DECREF(tmp);
327 }
328
Christian Heimes2be03732007-11-15 02:26:46 +0000329 if (ferr != NULL || ferr != Py_None) {
Guido van Rossume8432ac2007-07-09 15:04:50 +0000330 tmp = PyObject_CallMethod(ferr, "flush", "");
331 if (tmp == NULL)
332 PyErr_Clear();
333 else
334 Py_DECREF(tmp);
335 }
336}
337
Guido van Rossum25ce5661997-08-02 03:10:38 +0000338/* Undo the effect of Py_Initialize().
339
340 Beware: if multiple interpreter and/or thread states exist, these
341 are not wiped out; only the current thread and interpreter state
342 are deleted. But since everything else is deleted, those other
343 interpreter and thread states should no longer be used.
344
345 (XXX We should do better, e.g. wipe out all interpreters and
346 threads.)
347
348 Locking: as above.
349
350*/
351
352void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000353Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000354{
355 PyInterpreterState *interp;
356 PyThreadState *tstate;
357
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000358 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000359 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000360
Tim Peters384fd102001-01-21 03:40:37 +0000361 /* The interpreter is still entirely intact at this point, and the
362 * exit funcs may be relying on that. In particular, if some thread
363 * or exit func is still waiting to do an import, the import machinery
364 * expects Py_IsInitialized() to return true. So don't say the
365 * interpreter is uninitialized until after the exit funcs have run.
366 * Note that Threading.py uses an exit func to do a join on all the
367 * threads created thru it, so this also protects pending imports in
368 * the threads created via Threading.
369 */
Collin Winter670e6922007-03-21 02:57:17 +0000370 call_py_exitfuncs();
Tim Peters384fd102001-01-21 03:40:37 +0000371 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000372
Guido van Rossume8432ac2007-07-09 15:04:50 +0000373 /* Flush stdout+stderr */
374 flush_std_files();
375
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000376 /* Get current thread state and interpreter pointer */
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000377 tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000378 interp = tstate->interp;
379
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000380 /* Disable signal handling */
381 PyOS_FiniInterrupts();
382
Christian Heimes26855632008-01-27 23:50:43 +0000383 /* Clear type lookup cache */
384 PyType_ClearCache();
385
Guido van Rossume13ddc92003-04-17 17:29:22 +0000386 /* Collect garbage. This may call finalizers; it's nice to call these
Tim Peters1d7323e2003-12-01 21:35:27 +0000387 * before all modules are destroyed.
388 * XXX If a __del__ or weakref callback is triggered here, and tries to
389 * XXX import a module, bad things can happen, because Python no
390 * XXX longer believes it's initialized.
391 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
392 * XXX is easy to provoke that way. I've also seen, e.g.,
393 * XXX Exception exceptions.ImportError: 'No module named sha'
394 * XXX in <function callback at 0x008F5718> ignored
395 * XXX but I'm unclear on exactly how that one happens. In any case,
396 * XXX I haven't seen a real-life report of either of these.
Neal Norwitz9589ee22006-03-04 19:01:22 +0000397 */
Guido van Rossume13ddc92003-04-17 17:29:22 +0000398 PyGC_Collect();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000399#ifdef COUNT_ALLOCS
400 /* With COUNT_ALLOCS, it helps to run GC multiple times:
401 each collection might release some types from the type
402 list, so they become garbage. */
403 while (PyGC_Collect() > 0)
404 /* nothing */;
405#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000406
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000407 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000408 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000409
Guido van Rossume8432ac2007-07-09 15:04:50 +0000410 /* Flush stdout+stderr (again, in case more was printed) */
411 flush_std_files();
412
Guido van Rossume13ddc92003-04-17 17:29:22 +0000413 /* Collect final garbage. This disposes of cycles created by
Tim Peters1d7323e2003-12-01 21:35:27 +0000414 * new-style class definitions, for example.
415 * XXX This is disabled because it caused too many problems. If
416 * XXX a __del__ or weakref callback triggers here, Python code has
417 * XXX a hard time running, because even the sys module has been
418 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
419 * XXX One symptom is a sequence of information-free messages
420 * XXX coming from threads (if a __del__ or callback is invoked,
421 * XXX other threads can execute too, and any exception they encounter
422 * XXX triggers a comedy of errors as subsystem after subsystem
423 * XXX fails to find what it *expects* to find in sys to help report
424 * XXX the exception and consequent unexpected failures). I've also
425 * XXX seen segfaults then, after adding print statements to the
426 * XXX Python code getting called.
427 */
428#if 0
Guido van Rossume13ddc92003-04-17 17:29:22 +0000429 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000430#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000431
Guido van Rossum1707aad1997-12-08 23:43:45 +0000432 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
433 _PyImport_Fini();
434
435 /* Debugging stuff */
436#ifdef COUNT_ALLOCS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000437 dump_counts(stdout);
Guido van Rossum1707aad1997-12-08 23:43:45 +0000438#endif
439
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000440 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000441
Tim Peters9cf25ce2003-04-17 15:21:01 +0000442#ifdef Py_TRACE_REFS
443 /* Display all objects still alive -- this can invoke arbitrary
444 * __repr__ overrides, so requires a mostly-intact interpreter.
445 * Alas, a lot of stuff may still be alive now that will be cleaned
446 * up later.
447 */
Tim Peters269b2a62003-04-17 19:52:29 +0000448 if (Py_GETENV("PYTHONDUMPREFS"))
Tim Peters9cf25ce2003-04-17 15:21:01 +0000449 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000450#endif /* Py_TRACE_REFS */
451
Guido van Rossumd922fa42003-04-15 14:10:09 +0000452 /* Clear interpreter state */
Barry Warsawf242aa02000-05-25 23:09:49 +0000453 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000454
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000455 /* Now we decref the exception classes. After this point nothing
456 can raise an exception. That's okay, because each Fini() method
457 below has been checked to make sure no exceptions are ever
458 raised.
459 */
460
461 _PyExc_Fini();
462
Christian Heimes7d2ff882007-11-30 14:35:04 +0000463 /* Cleanup auto-thread-state */
464#ifdef WITH_THREAD
465 _PyGILState_Fini();
466#endif /* WITH_THREAD */
467
Guido van Rossumd922fa42003-04-15 14:10:09 +0000468 /* Delete current thread */
Barry Warsawf242aa02000-05-25 23:09:49 +0000469 PyThreadState_Swap(NULL);
470 PyInterpreterState_Delete(interp);
471
Guido van Rossumd922fa42003-04-15 14:10:09 +0000472 /* Sundry finalizers */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000473 PyMethod_Fini();
474 PyFrame_Fini();
475 PyCFunction_Fini();
476 PyTuple_Fini();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000477 PyList_Fini();
Raymond Hettingerd7946662005-08-01 21:39:29 +0000478 PySet_Fini();
Christian Heimes72b710a2008-05-26 13:28:38 +0000479 PyBytes_Fini();
Christian Heimes9c4756e2008-05-26 13:22:05 +0000480 PyByteArray_Fini();
Guido van Rossumddefaf32007-01-14 03:31:43 +0000481 PyLong_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000482 PyFloat_Fini();
Christian Heimes77c02eb2008-02-09 02:18:51 +0000483 PyDict_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000484
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000485 /* Cleanup Unicode implementation */
486 _PyUnicode_Fini();
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000487
Christian Heimesc8967002007-11-30 10:18:26 +0000488 /* reset file system default encoding */
489 if (!Py_HasFileSystemDefaultEncoding) {
490 free((char*)Py_FileSystemDefaultEncoding);
Trent Nelson39e307e2008-03-19 06:45:48 +0000491 Py_FileSystemDefaultEncoding = NULL;
Christian Heimesc8967002007-11-30 10:18:26 +0000492 }
493
Guido van Rossumcc283f51997-08-05 02:22:03 +0000494 /* XXX Still allocated:
495 - various static ad-hoc pointers to interned strings
496 - int and float free list blocks
497 - whatever various modules and libraries allocate
498 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000499
500 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000501
Tim Peters269b2a62003-04-17 19:52:29 +0000502#ifdef Py_TRACE_REFS
503 /* Display addresses (& refcnts) of all objects still alive.
504 * An address can be used to find the repr of the object, printed
505 * above by _Py_PrintReferences.
506 */
507 if (Py_GETENV("PYTHONDUMPREFS"))
508 _Py_PrintReferenceAddresses(stderr);
509#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000510#ifdef PYMALLOC_DEBUG
511 if (Py_GETENV("PYTHONMALLOCSTATS"))
512 _PyObject_DebugMallocStats();
513#endif
514
Guido van Rossumcc283f51997-08-05 02:22:03 +0000515 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000516}
517
518/* Create and initialize a new interpreter and thread, and return the
519 new thread. This requires that Py_Initialize() has been called
520 first.
521
522 Unsuccessful initialization yields a NULL pointer. Note that *no*
523 exception information is available even in this case -- the
524 exception information is held in the thread, and there is no
525 thread.
526
527 Locking: as above.
528
529*/
530
531PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000532Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000533{
534 PyInterpreterState *interp;
535 PyThreadState *tstate, *save_tstate;
536 PyObject *bimod, *sysmod;
537
538 if (!initialized)
539 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
540
541 interp = PyInterpreterState_New();
542 if (interp == NULL)
543 return NULL;
544
545 tstate = PyThreadState_New(interp);
546 if (tstate == NULL) {
547 PyInterpreterState_Delete(interp);
548 return NULL;
549 }
550
551 save_tstate = PyThreadState_Swap(tstate);
552
553 /* XXX The following is lax in error checking */
554
555 interp->modules = PyDict_New();
Guido van Rossumd8faa362007-04-27 19:54:29 +0000556 interp->modules_reloading = PyDict_New();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000557
Georg Brandl1a3284e2007-12-02 09:40:06 +0000558 bimod = _PyImport_FindExtension("builtins", "builtins");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000559 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000560 interp->builtins = PyModule_GetDict(bimod);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000561 if (interp->builtins == NULL)
562 goto handle_error;
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000563 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000564 }
565 sysmod = _PyImport_FindExtension("sys", "sys");
566 if (bimod != NULL && sysmod != NULL) {
567 interp->sysdict = PyModule_GetDict(sysmod);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000568 if (interp->sysdict == NULL)
569 goto handle_error;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000570 Py_INCREF(interp->sysdict);
571 PySys_SetPath(Py_GetPath());
572 PyDict_SetItemString(interp->sysdict, "modules",
573 interp->modules);
Martin v. Löwisd7ceb222003-01-22 09:00:38 +0000574 _PyImportHooks_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000575 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000576 if (!Py_NoSiteFlag)
577 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000578 }
579
580 if (!PyErr_Occurred())
581 return tstate;
582
Thomas Wouters89f507f2006-12-13 04:49:30 +0000583handle_error:
Guido van Rossum25ce5661997-08-02 03:10:38 +0000584 /* Oops, it didn't work. Undo it all. */
585
586 PyErr_Print();
587 PyThreadState_Clear(tstate);
588 PyThreadState_Swap(save_tstate);
589 PyThreadState_Delete(tstate);
590 PyInterpreterState_Delete(interp);
591
592 return NULL;
593}
594
595/* Delete an interpreter and its last thread. This requires that the
596 given thread state is current, that the thread has no remaining
597 frames, and that it is its interpreter's only remaining thread.
598 It is a fatal error to violate these constraints.
599
600 (Py_Finalize() doesn't have these constraints -- it zaps
601 everything, regardless.)
602
603 Locking: as above.
604
605*/
606
607void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000608Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000609{
610 PyInterpreterState *interp = tstate->interp;
611
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000612 if (tstate != PyThreadState_GET())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000613 Py_FatalError("Py_EndInterpreter: thread is not current");
614 if (tstate->frame != NULL)
615 Py_FatalError("Py_EndInterpreter: thread still has a frame");
616 if (tstate != interp->tstate_head || tstate->next != NULL)
617 Py_FatalError("Py_EndInterpreter: not the last thread");
618
619 PyImport_Cleanup();
620 PyInterpreterState_Clear(interp);
621 PyThreadState_Swap(NULL);
622 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000623}
624
Martin v. Löwis790465f2008-04-05 20:41:37 +0000625static wchar_t *progname = L"python";
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000626
627void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000628Py_SetProgramName(wchar_t *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000629{
630 if (pn && *pn)
631 progname = pn;
632}
633
Martin v. Löwis790465f2008-04-05 20:41:37 +0000634wchar_t *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000636{
637 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000638}
639
Martin v. Löwis790465f2008-04-05 20:41:37 +0000640static wchar_t *default_home = NULL;
641static wchar_t env_home[PATH_MAX+1];
Guido van Rossuma61691e1998-02-06 22:27:24 +0000642
643void
Martin v. Löwis790465f2008-04-05 20:41:37 +0000644Py_SetPythonHome(wchar_t *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000645{
646 default_home = home;
647}
648
Martin v. Löwis790465f2008-04-05 20:41:37 +0000649wchar_t *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000651{
Martin v. Löwis790465f2008-04-05 20:41:37 +0000652 wchar_t *home = default_home;
653 if (home == NULL && !Py_IgnoreEnvironmentFlag) {
654 char* chome = Py_GETENV("PYTHONHOME");
655 if (chome) {
656 size_t r = mbstowcs(env_home, chome, PATH_MAX+1);
657 if (r != (size_t)-1 && r <= PATH_MAX)
658 home = env_home;
659 }
660
661 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000662 return home;
663}
664
Guido van Rossum6135a871995-01-09 17:53:26 +0000665/* Create __main__ module */
666
667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000668initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000669{
Guido van Rossum82598051997-03-05 00:20:32 +0000670 PyObject *m, *d;
671 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000672 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000673 Py_FatalError("can't create __main__ module");
674 d = PyModule_GetDict(m);
675 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Georg Brandl1a3284e2007-12-02 09:40:06 +0000676 PyObject *bimod = PyImport_ImportModule("builtins");
Guido van Rossum858cb731997-11-19 16:15:37 +0000677 if (bimod == NULL ||
678 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000679 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000680 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000681 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682}
683
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000684/* Import the site module (not into __main__ though) */
685
686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000687initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000688{
689 PyObject *m, *f;
690 m = PyImport_ImportModule("site");
691 if (m == NULL) {
692 f = PySys_GetObject("stderr");
Christian Heimes2be03732007-11-15 02:26:46 +0000693 if (f == NULL || f == Py_None)
694 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000695 if (Py_VerboseFlag) {
696 PyFile_WriteString(
697 "'import site' failed; traceback:\n", f);
698 PyErr_Print();
699 }
700 else {
701 PyFile_WriteString(
702 "'import site' failed; use -v for traceback\n", f);
703 PyErr_Clear();
704 }
705 }
706 else {
707 Py_DECREF(m);
708 }
709}
710
Georg Brandl1a3284e2007-12-02 09:40:06 +0000711/* Initialize sys.stdin, stdout, stderr and builtins.open */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000712static int
713initstdio(void)
714{
715 PyObject *iomod = NULL, *wrapper;
716 PyObject *bimod = NULL;
717 PyObject *m;
718 PyObject *std = NULL;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000719 int status = 0, fd;
Trent Nelson39e307e2008-03-19 06:45:48 +0000720 PyObject * encoding_attr;
Amaury Forgeot d'Arcf1ca0b12008-06-11 17:40:47 +0000721 char *encoding = NULL, *errors;
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000722
723 /* Hack to avoid a nasty recursion issue when Python is invoked
724 in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
725 if ((m = PyImport_ImportModule("encodings.utf_8")) == NULL) {
726 goto error;
727 }
728 Py_DECREF(m);
729
730 if (!(m = PyImport_ImportModule("encodings.latin_1"))) {
731 goto error;
732 }
733 Py_DECREF(m);
734
Georg Brandl1a3284e2007-12-02 09:40:06 +0000735 if (!(bimod = PyImport_ImportModule("builtins"))) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000736 goto error;
737 }
738
739 if (!(iomod = PyImport_ImportModule("io"))) {
740 goto error;
741 }
742 if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) {
743 goto error;
744 }
745
Georg Brandl1a3284e2007-12-02 09:40:06 +0000746 /* Set builtins.open */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000747 if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
748 goto error;
749 }
750
Martin v. Löwis0f599892008-06-02 11:13:03 +0000751 encoding = Py_GETENV("PYTHONIOENCODING");
Martin v. Löwis7cd068b2008-06-02 12:33:47 +0000752 errors = NULL;
Martin v. Löwis0f599892008-06-02 11:13:03 +0000753 if (encoding) {
754 encoding = strdup(encoding);
755 errors = strchr(encoding, ':');
756 if (errors) {
757 *errors = '\0';
758 errors++;
759 }
760 }
761
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000762 /* Set sys.stdin */
Christian Heimes58cb1b82007-11-13 02:19:40 +0000763 fd = fileno(stdin);
764 /* Under some conditions stdin, stdout and stderr may not be connected
765 * and fileno() may point to an invalid file descriptor. For example
766 * GUI apps don't have valid standard streams by default.
767 */
768 if (fd < 0) {
769#ifdef MS_WINDOWS
770 std = Py_None;
771 Py_INCREF(std);
772#else
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000773 goto error;
Christian Heimes58cb1b82007-11-13 02:19:40 +0000774#endif
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000775 }
Christian Heimes58cb1b82007-11-13 02:19:40 +0000776 else {
Martin v. Löwis0f599892008-06-02 11:13:03 +0000777 if (!(std = PyFile_FromFd(fd, "<stdin>", "r", -1, encoding,
778 errors, "\n", 0))) {
Christian Heimes58cb1b82007-11-13 02:19:40 +0000779 goto error;
780 }
781 } /* if (fd < 0) */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000782 PySys_SetObject("__stdin__", std);
783 PySys_SetObject("stdin", std);
784 Py_DECREF(std);
785
786 /* Set sys.stdout */
Christian Heimes58cb1b82007-11-13 02:19:40 +0000787 fd = fileno(stdout);
788 if (fd < 0) {
789#ifdef MS_WINDOWS
790 std = Py_None;
791 Py_INCREF(std);
792#else
793 goto error;
794#endif
795 }
796 else {
Martin v. Löwis0f599892008-06-02 11:13:03 +0000797 if (!(std = PyFile_FromFd(fd, "<stdout>", "w", -1, encoding,
798 errors, "\n", 0))) {
Christian Heimes58cb1b82007-11-13 02:19:40 +0000799 goto error;
800 }
801 } /* if (fd < 0) */
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000802 PySys_SetObject("__stdout__", std);
803 PySys_SetObject("stdout", std);
804 Py_DECREF(std);
805
Guido van Rossum98297ee2007-11-06 21:34:58 +0000806#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
Guido van Rossum2dced8b2007-10-30 17:27:30 +0000807 /* Set sys.stderr, replaces the preliminary stderr */
Christian Heimes58cb1b82007-11-13 02:19:40 +0000808 fd = fileno(stderr);
809 if (fd < 0) {
810#ifdef MS_WINDOWS
811 std = Py_None;
812 Py_INCREF(std);
813#else
814 goto error;
815#endif
816 }
817 else {
Martin v. Löwis0f599892008-06-02 11:13:03 +0000818 if (!(std = PyFile_FromFd(fd, "<stderr>", "w", -1, encoding,
Georg Brandl559e5d72008-06-11 18:37:52 +0000819 "backslashreplace", "\n", 0))) {
Christian Heimes58cb1b82007-11-13 02:19:40 +0000820 goto error;
821 }
822 } /* if (fd < 0) */
Trent Nelson39e307e2008-03-19 06:45:48 +0000823
824 /* Same as hack above, pre-import stderr's codec to avoid recursion
825 when import.c tries to write to stderr in verbose mode. */
826 encoding_attr = PyObject_GetAttrString(std, "encoding");
827 if (encoding_attr != NULL) {
828 const char * encoding;
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000829 encoding = _PyUnicode_AsString(encoding_attr);
Trent Nelson39e307e2008-03-19 06:45:48 +0000830 if (encoding != NULL) {
831 _PyCodec_Lookup(encoding);
832 }
833 }
834 PyErr_Clear(); /* Not a fatal error if codec isn't available */
835
Christian Heimesdb233082007-11-13 02:34:21 +0000836 PySys_SetObject("__stderr__", std);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000837 PySys_SetObject("stderr", std);
838 Py_DECREF(std);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000839#endif
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000840
Christian Heimes58cb1b82007-11-13 02:19:40 +0000841 if (0) {
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000842 error:
Christian Heimesdb233082007-11-13 02:34:21 +0000843 status = -1;
844 }
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000845
Martin v. Löwis7cd068b2008-06-02 12:33:47 +0000846 if (encoding)
847 free(encoding);
Guido van Rossumce3a72a2007-10-19 23:16:50 +0000848 Py_XDECREF(bimod);
849 Py_XDECREF(iomod);
850 return status;
851}
852
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000853/* Parse input from a file and execute it */
854
855int
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000856PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000857 PyCompilerFlags *flags)
858{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 if (filename == NULL)
860 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000861 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000862 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000863 if (closeit)
864 fclose(fp);
865 return err;
866 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000868 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000869}
870
871int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000872PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000873{
Guido van Rossum82598051997-03-05 00:20:32 +0000874 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000875 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000876 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000877
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000878 if (flags == NULL) {
879 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000880 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000881 }
Guido van Rossum82598051997-03-05 00:20:32 +0000882 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883 if (v == NULL) {
Neal Norwitza369c5a2007-08-25 07:41:59 +0000884 PySys_SetObject("ps1", v = PyUnicode_FromString(">>> "));
Guido van Rossum82598051997-03-05 00:20:32 +0000885 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000886 }
Guido van Rossum82598051997-03-05 00:20:32 +0000887 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000888 if (v == NULL) {
Neal Norwitza369c5a2007-08-25 07:41:59 +0000889 PySys_SetObject("ps2", v = PyUnicode_FromString("... "));
Guido van Rossum82598051997-03-05 00:20:32 +0000890 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000891 }
892 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000893 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000894 PRINT_TOTAL_REFS();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000895 if (ret == E_EOF)
896 return 0;
897 /*
898 if (ret == E_NOMEM)
899 return -1;
900 */
901 }
902}
903
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000904/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000905#define PARSER_FLAGS(flags) \
Thomas Wouters34aa7ba2006-02-28 19:02:24 +0000906 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
Guido van Rossum45aecf42006-03-15 04:58:47 +0000907 PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0)
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000908
Thomas Wouters89f507f2006-12-13 04:49:30 +0000909#if 0
910/* Keep an example of flags with future keyword support. */
911#define PARSER_FLAGS(flags) \
912 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
913 PyPARSE_DONT_IMPLY_DEDENT : 0) \
914 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
915 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
916#endif
917
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000918int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000919PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000920{
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000921 PyObject *m, *d, *v, *w, *oenc = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000922 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +0000923 PyArena *arena;
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000924 char *ps1 = "", *ps2 = "", *enc = NULL;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000925 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +0000926
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000927 if (fp == stdin) {
928 /* Fetch encoding from sys.stdin */
929 v = PySys_GetObject("stdin");
Christian Heimes2be03732007-11-15 02:26:46 +0000930 if (v == NULL || v == Py_None)
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000931 return -1;
932 oenc = PyObject_GetAttrString(v, "encoding");
933 if (!oenc)
934 return -1;
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000935 enc = _PyUnicode_AsString(oenc);
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000936 }
Guido van Rossum82598051997-03-05 00:20:32 +0000937 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000938 if (v != NULL) {
Thomas Heller519a0422007-11-15 20:48:54 +0000939 v = PyObject_Str(v);
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000940 if (v == NULL)
941 PyErr_Clear();
Guido van Rossumc5724de2007-10-10 21:38:59 +0000942 else if (PyUnicode_Check(v))
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000943 ps1 = _PyUnicode_AsString(v);
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000944 }
Guido van Rossum82598051997-03-05 00:20:32 +0000945 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000946 if (w != NULL) {
Thomas Heller519a0422007-11-15 20:48:54 +0000947 w = PyObject_Str(w);
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000948 if (w == NULL)
949 PyErr_Clear();
Guido van Rossumc5724de2007-10-10 21:38:59 +0000950 else if (PyUnicode_Check(w))
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000951 ps2 = _PyUnicode_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000952 }
Neal Norwitz9589ee22006-03-04 19:01:22 +0000953 arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000954 if (arena == NULL) {
955 Py_XDECREF(v);
956 Py_XDECREF(w);
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000957 Py_XDECREF(oenc);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000958 return -1;
959 }
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000960 mod = PyParser_ASTFromFile(fp, filename, enc,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000961 Py_single_input, ps1, ps2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000962 flags, &errcode, arena);
Guido van Rossum82598051997-03-05 00:20:32 +0000963 Py_XDECREF(v);
964 Py_XDECREF(w);
Martin v. Löwis85bcc662007-09-04 09:18:06 +0000965 Py_XDECREF(oenc);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000966 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000967 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000968 if (errcode == E_EOF) {
969 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000970 return E_EOF;
971 }
Guido van Rossum82598051997-03-05 00:20:32 +0000972 PyErr_Print();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000973 return -1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000974 }
Guido van Rossum82598051997-03-05 00:20:32 +0000975 m = PyImport_AddModule("__main__");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000976 if (m == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000977 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000978 return -1;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000979 }
Guido van Rossum82598051997-03-05 00:20:32 +0000980 d = PyModule_GetDict(m);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000981 v = run_mod(mod, filename, d, d, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +0000982 PyArena_Free(arena);
Amaury Forgeot d'Arc7fedbe52008-04-10 21:03:09 +0000983 flush_io();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000984 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000985 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000986 return -1;
987 }
Guido van Rossum82598051997-03-05 00:20:32 +0000988 Py_DECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000989 return 0;
990}
991
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000992/* Check whether a file maybe a pyc file: Look at the extension,
993 the file type, and, if we may close it, at the first few bytes. */
994
995static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000996maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000997{
998 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
999 return 1;
1000
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001001 /* Only look into the file if we are allowed to close it, since
1002 it then should also be seekable. */
1003 if (closeit) {
1004 /* Read only two bytes of the magic. If the file was opened in
1005 text mode, the bytes 3 and 4 of the magic (\r\n) might not
1006 be read as they are on disk. */
1007 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
1008 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +00001009 /* Mess: In case of -x, the stream is NOT at its start now,
1010 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +00001011 which makes the current stream position formally undefined,
1012 and a x-platform nightmare.
1013 Unfortunately, we have no direct way to know whether -x
1014 was specified. So we use a terrible hack: if the current
1015 stream position is not 0, we assume -x was specified, and
1016 give up. Bug 132850 on SourceForge spells out the
1017 hopelessness of trying anything else (fseek and ftell
1018 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +00001019 */
Tim Peters3e876562001-02-11 04:35:39 +00001020 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +00001021 if (ftell(fp) == 0) {
1022 if (fread(buf, 1, 2, fp) == 2 &&
Tim Petersd08e3822003-04-17 15:24:21 +00001023 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Tim Peters6f5a4ef2001-02-17 22:02:34 +00001024 ispyc = 1;
1025 rewind(fp);
1026 }
Tim Peters3e876562001-02-11 04:35:39 +00001027 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001028 }
1029 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +00001030}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001031
Guido van Rossum0df002c2000-08-27 19:21:52 +00001032int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001033PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001034 PyCompilerFlags *flags)
1035{
Guido van Rossum82598051997-03-05 00:20:32 +00001036 PyObject *m, *d, *v;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001037 const char *ext;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001038 int set_file_name = 0, ret;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001039
Guido van Rossum82598051997-03-05 00:20:32 +00001040 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001041 if (m == NULL)
1042 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +00001043 d = PyModule_GetDict(m);
Fred Drake8ed02042002-10-17 21:24:58 +00001044 if (PyDict_GetItemString(d, "__file__") == NULL) {
Guido van Rossum00bc0e02007-10-15 02:52:41 +00001045 PyObject *f;
1046 f = PyUnicode_DecodeFSDefault(filename);
Fred Drake8ed02042002-10-17 21:24:58 +00001047 if (f == NULL)
1048 return -1;
1049 if (PyDict_SetItemString(d, "__file__", f) < 0) {
1050 Py_DECREF(f);
1051 return -1;
1052 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001053 set_file_name = 1;
Fred Drake8ed02042002-10-17 21:24:58 +00001054 Py_DECREF(f);
1055 }
Guido van Rossumfdef2711994-09-14 13:31:04 +00001056 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +00001057 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +00001058 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +00001059 if (closeit)
1060 fclose(fp);
Fred Drake8ed02042002-10-17 21:24:58 +00001061 if ((fp = fopen(filename, "rb")) == NULL) {
Guido van Rossumfdef2711994-09-14 13:31:04 +00001062 fprintf(stderr, "python: Can't reopen .pyc file\n");
Guido van Rossumd8faa362007-04-27 19:54:29 +00001063 ret = -1;
1064 goto done;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001065 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +00001066 /* Turn on optimization if a .pyo file is given */
1067 if (strcmp(ext, ".pyo") == 0)
1068 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001069 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001070 } else {
Tim Petersd08e3822003-04-17 15:24:21 +00001071 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001072 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001073 }
Amaury Forgeot d'Arc7fedbe52008-04-10 21:03:09 +00001074 flush_io();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001075 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +00001076 PyErr_Print();
Guido van Rossumd8faa362007-04-27 19:54:29 +00001077 ret = -1;
1078 goto done;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001079 }
Guido van Rossum82598051997-03-05 00:20:32 +00001080 Py_DECREF(v);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001081 ret = 0;
1082 done:
1083 if (set_file_name && PyDict_DelItemString(d, "__file__"))
1084 PyErr_Clear();
1085 return ret;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001086}
1087
1088int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001089PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +00001090{
Guido van Rossum82598051997-03-05 00:20:32 +00001091 PyObject *m, *d, *v;
1092 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001093 if (m == NULL)
1094 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +00001095 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +00001096 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001097 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +00001098 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001099 return -1;
1100 }
Guido van Rossum82598051997-03-05 00:20:32 +00001101 Py_DECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001102 return 0;
1103}
1104
Barry Warsaw035574d1997-08-29 22:07:17 +00001105static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001106parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
1107 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +00001108{
1109 long hold;
1110 PyObject *v;
1111
1112 /* old style errors */
1113 if (PyTuple_Check(err))
Neal Norwitz78293352002-04-01 01:41:20 +00001114 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001115 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +00001116
1117 /* new style errors. `err' is an instance */
1118
1119 if (! (v = PyObject_GetAttrString(err, "msg")))
1120 goto finally;
1121 *message = v;
1122
1123 if (!(v = PyObject_GetAttrString(err, "filename")))
1124 goto finally;
1125 if (v == Py_None)
1126 *filename = NULL;
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001127 else if (! (*filename = _PyUnicode_AsString(v)))
Barry Warsaw035574d1997-08-29 22:07:17 +00001128 goto finally;
1129
1130 Py_DECREF(v);
1131 if (!(v = PyObject_GetAttrString(err, "lineno")))
1132 goto finally;
Christian Heimes217cfd12007-12-02 14:31:20 +00001133 hold = PyLong_AsLong(v);
Barry Warsaw035574d1997-08-29 22:07:17 +00001134 Py_DECREF(v);
1135 v = NULL;
1136 if (hold < 0 && PyErr_Occurred())
1137 goto finally;
1138 *lineno = (int)hold;
1139
1140 if (!(v = PyObject_GetAttrString(err, "offset")))
1141 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001142 if (v == Py_None) {
1143 *offset = -1;
1144 Py_DECREF(v);
1145 v = NULL;
1146 } else {
Christian Heimes217cfd12007-12-02 14:31:20 +00001147 hold = PyLong_AsLong(v);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001148 Py_DECREF(v);
1149 v = NULL;
1150 if (hold < 0 && PyErr_Occurred())
1151 goto finally;
1152 *offset = (int)hold;
1153 }
Barry Warsaw035574d1997-08-29 22:07:17 +00001154
1155 if (!(v = PyObject_GetAttrString(err, "text")))
1156 goto finally;
1157 if (v == Py_None)
1158 *text = NULL;
Guido van Rossumc5724de2007-10-10 21:38:59 +00001159 else if (!PyUnicode_Check(v) ||
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001160 !(*text = _PyUnicode_AsString(v)))
Barry Warsaw035574d1997-08-29 22:07:17 +00001161 goto finally;
1162 Py_DECREF(v);
1163 return 1;
1164
1165finally:
1166 Py_XDECREF(v);
1167 return 0;
1168}
1169
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001170void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001171PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001172{
Guido van Rossuma61691e1998-02-06 22:27:24 +00001173 PyErr_PrintEx(1);
1174}
1175
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001176static void
Martin v. Löwis95292d62002-12-11 14:04:59 +00001177print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001178{
1179 char *nl;
1180 if (offset >= 0) {
1181 if (offset > 0 && offset == (int)strlen(text))
1182 offset--;
1183 for (;;) {
1184 nl = strchr(text, '\n');
1185 if (nl == NULL || nl-text >= offset)
1186 break;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001187 offset -= (int)(nl+1-text);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001188 text = nl+1;
1189 }
1190 while (*text == ' ' || *text == '\t') {
1191 text++;
1192 offset--;
1193 }
1194 }
1195 PyFile_WriteString(" ", f);
1196 PyFile_WriteString(text, f);
1197 if (*text == '\0' || text[strlen(text)-1] != '\n')
1198 PyFile_WriteString("\n", f);
1199 if (offset == -1)
1200 return;
1201 PyFile_WriteString(" ", f);
1202 offset--;
1203 while (offset > 0) {
1204 PyFile_WriteString(" ", f);
1205 offset--;
1206 }
1207 PyFile_WriteString("^\n", f);
1208}
1209
Guido van Rossum66e8e862001-03-23 17:54:43 +00001210static void
1211handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001212{
Neal Norwitz9589ee22006-03-04 19:01:22 +00001213 PyObject *exception, *value, *tb;
1214 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +00001215
Guido van Rossumd8faa362007-04-27 19:54:29 +00001216 if (Py_InspectFlag)
1217 /* Don't exit if -i flag was given. This flag is set to 0
1218 * when entering interactive mode for inspecting. */
1219 return;
1220
Guido van Rossum66e8e862001-03-23 17:54:43 +00001221 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001222 fflush(stdout);
1223 if (value == NULL || value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001224 goto done;
Brett Cannonbf364092006-03-01 04:25:17 +00001225 if (PyExceptionInstance_Check(value)) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001226 /* The error code should be in the `code' attribute. */
1227 PyObject *code = PyObject_GetAttrString(value, "code");
1228 if (code) {
1229 Py_DECREF(value);
1230 value = code;
1231 if (value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001232 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001233 }
1234 /* If we failed to dig out the 'code' attribute,
1235 just let the else clause below print the error. */
1236 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001237 if (PyLong_Check(value))
1238 exitcode = (int)PyLong_AsLong(value);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001239 else {
1240 PyObject_Print(value, stderr, Py_PRINT_RAW);
1241 PySys_WriteStderr("\n");
Tim Peterscf615b52003-04-19 18:47:02 +00001242 exitcode = 1;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001243 }
Tim Peterscf615b52003-04-19 18:47:02 +00001244 done:
Neal Norwitz9589ee22006-03-04 19:01:22 +00001245 /* Restore and clear the exception info, in order to properly decref
1246 * the exception, value, and traceback. If we just exit instead,
1247 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1248 * some finalizers from running.
1249 */
Tim Peterscf615b52003-04-19 18:47:02 +00001250 PyErr_Restore(exception, value, tb);
1251 PyErr_Clear();
1252 Py_Exit(exitcode);
1253 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001254}
1255
1256void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001257PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001258{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001259 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001260
1261 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1262 handle_system_exit();
1263 }
Guido van Rossum82598051997-03-05 00:20:32 +00001264 PyErr_Fetch(&exception, &v, &tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001265 if (exception == NULL)
1266 return;
Barry Warsaw035574d1997-08-29 22:07:17 +00001267 PyErr_NormalizeException(&exception, &v, &tb);
Antoine Pitroue2dffc02008-08-26 22:02:58 +00001268 if (tb == NULL) {
1269 tb = Py_None;
1270 Py_INCREF(tb);
1271 }
Benjamin Petersone6528212008-07-15 15:32:09 +00001272 PyException_SetTraceback(v, tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +00001274 return;
Georg Brandl86b2fb92008-07-16 03:43:04 +00001275 /* Now we know v != NULL too */
Guido van Rossuma61691e1998-02-06 22:27:24 +00001276 if (set_sys_last_vars) {
1277 PySys_SetObject("last_type", exception);
1278 PySys_SetObject("last_value", v);
Benjamin Petersone6528212008-07-15 15:32:09 +00001279 PySys_SetObject("last_traceback", tb);
Guido van Rossuma61691e1998-02-06 22:27:24 +00001280 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001281 hook = PySys_GetObject("excepthook");
1282 if (hook) {
Benjamin Petersone6528212008-07-15 15:32:09 +00001283 PyObject *args = PyTuple_Pack(3, exception, v, tb);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001284 PyObject *result = PyEval_CallObject(hook, args);
1285 if (result == NULL) {
1286 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001287 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1288 handle_system_exit();
1289 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001290 PyErr_Fetch(&exception2, &v2, &tb2);
1291 PyErr_NormalizeException(&exception2, &v2, &tb2);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001292 /* It should not be possible for exception2 or v2
1293 to be NULL. However PyErr_Display() can't
1294 tolerate NULLs, so just be safe. */
1295 if (exception2 == NULL) {
1296 exception2 = Py_None;
1297 Py_INCREF(exception2);
1298 }
1299 if (v2 == NULL) {
1300 v2 = Py_None;
1301 Py_INCREF(v2);
1302 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001303 fflush(stdout);
1304 PySys_WriteStderr("Error in sys.excepthook:\n");
1305 PyErr_Display(exception2, v2, tb2);
1306 PySys_WriteStderr("\nOriginal exception was:\n");
1307 PyErr_Display(exception, v, tb);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001308 Py_DECREF(exception2);
1309 Py_DECREF(v2);
Jeremy Hylton07028582001-12-07 15:35:35 +00001310 Py_XDECREF(tb2);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001311 }
1312 Py_XDECREF(result);
1313 Py_XDECREF(args);
1314 } else {
1315 PySys_WriteStderr("sys.excepthook is missing\n");
1316 PyErr_Display(exception, v, tb);
1317 }
1318 Py_XDECREF(exception);
1319 Py_XDECREF(v);
1320 Py_XDECREF(tb);
1321}
1322
Benjamin Petersone6528212008-07-15 15:32:09 +00001323static void
1324print_exception(PyObject *f, PyObject *value)
1325{
1326 int err = 0;
1327 PyObject *type, *tb;
1328
Benjamin Peterson26582602008-08-23 20:08:07 +00001329 if (!PyExceptionInstance_Check(value)) {
1330 PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f);
1331 PyFile_WriteString(Py_TYPE(value)->tp_name, f);
1332 PyFile_WriteString(" found\n", f);
1333 return;
1334 }
1335
Benjamin Petersone6528212008-07-15 15:32:09 +00001336 Py_INCREF(value);
1337 fflush(stdout);
1338 type = (PyObject *) Py_TYPE(value);
1339 tb = PyException_GetTraceback(value);
1340 if (tb && tb != Py_None)
1341 err = PyTraceBack_Print(tb, f);
1342 if (err == 0 &&
1343 PyObject_HasAttrString(value, "print_file_and_line"))
1344 {
1345 PyObject *message;
1346 const char *filename, *text;
1347 int lineno, offset;
1348 if (!parse_syntax_error(value, &message, &filename,
1349 &lineno, &offset, &text))
1350 PyErr_Clear();
1351 else {
1352 char buf[10];
1353 PyFile_WriteString(" File \"", f);
1354 if (filename == NULL)
1355 PyFile_WriteString("<string>", f);
1356 else
1357 PyFile_WriteString(filename, f);
1358 PyFile_WriteString("\", line ", f);
1359 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
1360 PyFile_WriteString(buf, f);
1361 PyFile_WriteString("\n", f);
1362 if (text != NULL)
1363 print_error_text(f, offset, text);
1364 Py_DECREF(value);
1365 value = message;
1366 /* Can't be bothered to check all those
1367 PyFile_WriteString() calls */
1368 if (PyErr_Occurred())
1369 err = -1;
1370 }
1371 }
1372 if (err) {
1373 /* Don't do anything else */
1374 }
1375 else {
Benjamin Petersone6528212008-07-15 15:32:09 +00001376 PyObject* moduleName;
Thomas Hellerd88ddfa2008-07-15 17:14:51 +00001377 char* className;
1378 assert(PyExceptionClass_Check(type));
1379 className = PyExceptionClass_Name(type);
Benjamin Petersone6528212008-07-15 15:32:09 +00001380 if (className != NULL) {
1381 char *dot = strrchr(className, '.');
1382 if (dot != NULL)
1383 className = dot+1;
1384 }
1385
1386 moduleName = PyObject_GetAttrString(type, "__module__");
1387 if (moduleName == NULL || !PyUnicode_Check(moduleName))
1388 {
1389 Py_DECREF(moduleName);
1390 err = PyFile_WriteString("<unknown>", f);
1391 }
1392 else {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001393 char* modstr = _PyUnicode_AsString(moduleName);
Benjamin Petersone6528212008-07-15 15:32:09 +00001394 if (modstr && strcmp(modstr, "builtins"))
1395 {
1396 err = PyFile_WriteString(modstr, f);
1397 err += PyFile_WriteString(".", f);
1398 }
1399 Py_DECREF(moduleName);
1400 }
1401 if (err == 0) {
1402 if (className == NULL)
1403 err = PyFile_WriteString("<unknown>", f);
1404 else
1405 err = PyFile_WriteString(className, f);
1406 }
1407 }
1408 if (err == 0 && (value != Py_None)) {
1409 PyObject *s = PyObject_Str(value);
1410 /* only print colon if the str() of the
1411 object is not the empty string
1412 */
1413 if (s == NULL)
1414 err = -1;
1415 else if (!PyUnicode_Check(s) ||
1416 PyUnicode_GetSize(s) != 0)
1417 err = PyFile_WriteString(": ", f);
1418 if (err == 0)
1419 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1420 Py_XDECREF(s);
1421 }
1422 /* try to write a newline in any case */
1423 err += PyFile_WriteString("\n", f);
1424 Py_XDECREF(tb);
1425 Py_DECREF(value);
1426 /* If an error happened here, don't show it.
1427 XXX This is wrong, but too many callers rely on this behavior. */
1428 if (err != 0)
1429 PyErr_Clear();
1430}
1431
1432static const char *cause_message =
1433 "\nThe above exception was the direct cause "
1434 "of the following exception:\n\n";
1435
1436static const char *context_message =
1437 "\nDuring handling of the above exception, "
1438 "another exception occurred:\n\n";
1439
1440static void
1441print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen)
1442{
1443 int err = 0, res;
1444 PyObject *cause, *context;
1445
1446 if (seen != NULL) {
1447 /* Exception chaining */
1448 if (PySet_Add(seen, value) == -1)
1449 PyErr_Clear();
1450 else if (PyExceptionInstance_Check(value)) {
1451 cause = PyException_GetCause(value);
1452 context = PyException_GetContext(value);
1453 if (cause) {
1454 res = PySet_Contains(seen, cause);
1455 if (res == -1)
1456 PyErr_Clear();
1457 if (res == 0) {
1458 print_exception_recursive(
1459 f, cause, seen);
1460 err |= PyFile_WriteString(
1461 cause_message, f);
1462 }
1463 }
1464 if (context) {
1465 res = PySet_Contains(seen, context);
1466 if (res == -1)
1467 PyErr_Clear();
1468 if (res == 0) {
1469 print_exception_recursive(
1470 f, context, seen);
1471 err |= PyFile_WriteString(
1472 context_message, f);
1473 }
1474 }
1475 Py_XDECREF(context);
1476 Py_XDECREF(cause);
1477 }
1478 }
1479 print_exception(f, value);
1480 if (err != 0)
1481 PyErr_Clear();
1482}
1483
Thomas Wouters477c8d52006-05-27 19:21:47 +00001484void
1485PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001486{
Benjamin Petersone6528212008-07-15 15:32:09 +00001487 PyObject *seen;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001488 PyObject *f = PySys_GetObject("stderr");
Christian Heimes2be03732007-11-15 02:26:46 +00001489 if (f == Py_None) {
1490 /* pass */
1491 }
1492 else if (f == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +00001493 _PyObject_Dump(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001494 fprintf(stderr, "lost sys.stderr\n");
Guido van Rossumce3a72a2007-10-19 23:16:50 +00001495 }
Guido van Rossum3165fe61992-09-25 21:59:05 +00001496 else {
Benjamin Petersone6528212008-07-15 15:32:09 +00001497 /* We choose to ignore seen being possibly NULL, and report
1498 at least the main exception (it could be a MemoryError).
1499 */
1500 seen = PySet_New(NULL);
1501 if (seen == NULL)
1502 PyErr_Clear();
1503 print_exception_recursive(f, value, seen);
1504 Py_XDECREF(seen);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001505 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001506}
1507
Guido van Rossum82598051997-03-05 00:20:32 +00001508PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001509PyRun_StringFlags(const char *str, int start, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001510 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001511{
Neal Norwitze92fba02006-03-04 18:52:26 +00001512 PyObject *ret = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001513 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001514 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001515 if (arena == NULL)
1516 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001517
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001518 mod = PyParser_ASTFromString(str, "<string>", start, flags, arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001519 if (mod != NULL)
1520 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001521 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001522 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001523}
1524
1525PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001526PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001527 PyObject *locals, int closeit, PyCompilerFlags *flags)
1528{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001529 PyObject *ret;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001530 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001531 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001532 if (arena == NULL)
1533 return NULL;
Guido van Rossum98297ee2007-11-06 21:34:58 +00001534
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001535 mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001536 flags, NULL, arena);
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537 if (closeit)
1538 fclose(fp);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001539 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001540 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001541 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001542 }
Neal Norwitze92fba02006-03-04 18:52:26 +00001543 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001544 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001545 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001546}
1547
Guido van Rossum6c193fa2007-12-05 05:14:58 +00001548static void
1549flush_io(void)
1550{
1551 PyObject *f, *r;
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001552 PyObject *type, *value, *traceback;
1553
1554 /* Save the current exception */
1555 PyErr_Fetch(&type, &value, &traceback);
1556
Guido van Rossum6c193fa2007-12-05 05:14:58 +00001557 f = PySys_GetObject("stderr");
1558 if (f != NULL) {
1559 r = PyObject_CallMethod(f, "flush", "");
1560 if (r)
1561 Py_DECREF(r);
1562 else
1563 PyErr_Clear();
1564 }
1565 f = PySys_GetObject("stdout");
1566 if (f != NULL) {
1567 r = PyObject_CallMethod(f, "flush", "");
1568 if (r)
1569 Py_DECREF(r);
1570 else
1571 PyErr_Clear();
1572 }
Amaury Forgeot d'Arc9ed77352008-04-04 23:25:27 +00001573
1574 PyErr_Restore(type, value, traceback);
Guido van Rossum6c193fa2007-12-05 05:14:58 +00001575}
1576
Guido van Rossum82598051997-03-05 00:20:32 +00001577static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001578run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001579 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001580{
Guido van Rossum82598051997-03-05 00:20:32 +00001581 PyCodeObject *co;
1582 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001583 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001584 if (co == NULL)
1585 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001586 v = PyEval_EvalCode(co, globals, locals);
1587 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001588 return v;
1589}
1590
Guido van Rossum82598051997-03-05 00:20:32 +00001591static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001592run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001593 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001594{
Guido van Rossum82598051997-03-05 00:20:32 +00001595 PyCodeObject *co;
1596 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001597 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001598 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001599
Guido van Rossum82598051997-03-05 00:20:32 +00001600 magic = PyMarshal_ReadLongFromFile(fp);
1601 if (magic != PyImport_GetMagicNumber()) {
1602 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001603 "Bad magic number in .pyc file");
1604 return NULL;
1605 }
Guido van Rossum82598051997-03-05 00:20:32 +00001606 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001607 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001608 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001609 if (v == NULL || !PyCode_Check(v)) {
1610 Py_XDECREF(v);
1611 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001612 "Bad code object in .pyc file");
1613 return NULL;
1614 }
Guido van Rossum82598051997-03-05 00:20:32 +00001615 co = (PyCodeObject *)v;
1616 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001617 if (v && flags)
1618 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001619 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001620 return v;
1621}
1622
Guido van Rossum82598051997-03-05 00:20:32 +00001623PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001624Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001625 PyCompilerFlags *flags)
1626{
Guido van Rossum82598051997-03-05 00:20:32 +00001627 PyCodeObject *co;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001628 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001629 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001630 if (arena == NULL)
1631 return NULL;
1632
1633 mod = PyParser_ASTFromString(str, filename, start, flags, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001634 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001635 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001636 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001637 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001638 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001639 PyObject *result = PyAST_mod2obj(mod);
1640 PyArena_Free(arena);
1641 return result;
1642 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001643 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001644 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001645 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001646}
1647
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001648struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001649Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001650{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001651 struct symtable *st;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001652 mod_ty mod;
Christian Heimes4d6ec852008-03-26 22:34:47 +00001653 PyCompilerFlags flags;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001654 PyArena *arena = PyArena_New();
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001655 if (arena == NULL)
1656 return NULL;
1657
Christian Heimesb1b3efc2008-03-26 23:24:27 +00001658 flags.cf_flags = 0;
Christian Heimes4d6ec852008-03-26 22:34:47 +00001659 mod = PyParser_ASTFromString(str, filename, start, &flags, arena);
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001660 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001661 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001662 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001663 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001664 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001665 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001666 return st;
1667}
1668
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001669/* Preferred access to parser is through AST. */
1670mod_ty
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001671PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001672 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001673{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001674 mod_ty mod;
1675 perrdetail err;
Christian Heimes3a932122008-03-26 23:25:24 +00001676 int iflags = PARSER_FLAGS(flags);
Christian Heimes4d6ec852008-03-26 22:34:47 +00001677
1678 node *n = PyParser_ParseStringFlagsFilenameEx(s, filename,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001679 &_PyParser_Grammar, start, &err,
Christian Heimes4d6ec852008-03-26 22:34:47 +00001680 &iflags);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001681 if (n) {
Christian Heimes4d6ec852008-03-26 22:34:47 +00001682 if (flags) {
1683 flags->cf_flags |= iflags & PyCF_MASK;
1684 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001685 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001686 PyNode_Free(n);
1687 return mod;
1688 }
1689 else {
1690 err_input(&err);
1691 return NULL;
1692 }
1693}
1694
1695mod_ty
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001696PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc,
1697 int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001698 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001699 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001701 mod_ty mod;
1702 perrdetail err;
Christian Heimes3a932122008-03-26 23:25:24 +00001703 int iflags = PARSER_FLAGS(flags);
Christian Heimes4d6ec852008-03-26 22:34:47 +00001704
Christian Heimes4d6ec852008-03-26 22:34:47 +00001705 node *n = PyParser_ParseFileFlagsEx(fp, filename, enc,
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001706 &_PyParser_Grammar,
Christian Heimes4d6ec852008-03-26 22:34:47 +00001707 start, ps1, ps2, &err, &iflags);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001708 if (n) {
Christian Heimes4d6ec852008-03-26 22:34:47 +00001709 if (flags) {
1710 flags->cf_flags |= iflags & PyCF_MASK;
1711 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001712 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001713 PyNode_Free(n);
1714 return mod;
1715 }
1716 else {
1717 err_input(&err);
1718 if (errcode)
1719 *errcode = err.error;
1720 return NULL;
1721 }
1722}
1723
Guido van Rossuma110aa61994-08-29 12:50:44 +00001724/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001725
Guido van Rossuma110aa61994-08-29 12:50:44 +00001726node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001727PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001728{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001729 perrdetail err;
Martin v. Löwis85bcc662007-09-04 09:18:06 +00001730 node *n = PyParser_ParseFileFlags(fp, filename, NULL,
1731 &_PyParser_Grammar,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001732 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001733 if (n == NULL)
1734 err_input(&err);
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001735
Guido van Rossuma110aa61994-08-29 12:50:44 +00001736 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001737}
1738
Guido van Rossuma110aa61994-08-29 12:50:44 +00001739/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001740
Guido van Rossuma110aa61994-08-29 12:50:44 +00001741node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001742PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001743{
Tim Petersfe2127d2001-07-16 05:37:24 +00001744 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001745 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1746 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001747 if (n == NULL)
1748 err_input(&err);
1749 return n;
1750}
1751
1752node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001753PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001754 int start, int flags)
1755{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001756 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001757 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1758 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001759 if (n == NULL)
1760 err_input(&err);
1761 return n;
1762}
1763
1764node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001765PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001766{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001767 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001768}
1769
Guido van Rossum66ebd912003-04-17 16:02:26 +00001770/* May want to move a more generalized form of this to parsetok.c or
1771 even parser modules. */
1772
1773void
1774PyParser_SetError(perrdetail *err)
1775{
1776 err_input(err);
1777}
1778
Guido van Rossuma110aa61994-08-29 12:50:44 +00001779/* Set the error appropriate to the given input error code (see errcode.h) */
1780
1781static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001782err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001783{
Martin v. Löwis5deb2102007-08-31 11:17:42 +00001784 PyObject *v, *w, *errtype, *errtext;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001785 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001786 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001787 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001788 switch (err->error) {
1789 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001790 errtype = PyExc_IndentationError;
1791 if (err->expected == INDENT)
1792 msg = "expected an indented block";
1793 else if (err->token == INDENT)
1794 msg = "unexpected indent";
1795 else if (err->token == DEDENT)
1796 msg = "unexpected unindent";
1797 else {
1798 errtype = PyExc_SyntaxError;
1799 msg = "invalid syntax";
1800 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001801 break;
1802 case E_TOKEN:
1803 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001804 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001805 case E_EOFS:
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +00001806 msg = "EOF while scanning triple-quoted string literal";
Skip Montanaro118ec702002-08-15 01:20:16 +00001807 break;
1808 case E_EOLS:
Alexandre Vassalotti8ae3e052008-05-16 00:41:41 +00001809 msg = "EOL while scanning string literal";
Skip Montanaro118ec702002-08-15 01:20:16 +00001810 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001811 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001812 if (!PyErr_Occurred())
1813 PyErr_SetNone(PyExc_KeyboardInterrupt);
Georg Brandl3dbca812008-07-23 16:10:53 +00001814 goto cleanup;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001815 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001816 PyErr_NoMemory();
Georg Brandl3dbca812008-07-23 16:10:53 +00001817 goto cleanup;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001818 case E_EOF:
1819 msg = "unexpected EOF while parsing";
1820 break;
Fred Drake85f36392000-07-11 17:53:00 +00001821 case E_TABSPACE:
1822 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001823 msg = "inconsistent use of tabs and spaces in indentation";
1824 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001825 case E_OVERFLOW:
1826 msg = "expression too long";
1827 break;
Fred Drake85f36392000-07-11 17:53:00 +00001828 case E_DEDENT:
1829 errtype = PyExc_IndentationError;
1830 msg = "unindent does not match any outer indentation level";
1831 break;
1832 case E_TOODEEP:
1833 errtype = PyExc_IndentationError;
1834 msg = "too many levels of indentation";
1835 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001836 case E_DECODE: {
1837 PyObject *type, *value, *tb;
1838 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001839 if (value != NULL) {
Thomas Heller519a0422007-11-15 20:48:54 +00001840 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001841 if (u != NULL) {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001842 msg = _PyUnicode_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001843 }
1844 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001845 if (msg == NULL)
1846 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001847 Py_XDECREF(type);
1848 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001849 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001850 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001851 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001852 case E_LINECONT:
1853 msg = "unexpected character after line continuation character";
1854 break;
Martin v. Löwis47383402007-08-15 07:32:56 +00001855
1856 case E_IDENTIFIER:
1857 msg = "invalid character in identifier";
1858 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001859 default:
1860 fprintf(stderr, "error=%d\n", err->error);
1861 msg = "unknown parsing error";
1862 break;
1863 }
Martin v. Löwis5deb2102007-08-31 11:17:42 +00001864 /* err->text may not be UTF-8 in case of decoding errors.
1865 Explicitly convert to an object. */
1866 if (!err->text) {
1867 errtext = Py_None;
1868 Py_INCREF(Py_None);
1869 } else {
1870 errtext = PyUnicode_DecodeUTF8(err->text, strlen(err->text),
1871 "replace");
1872 }
1873 v = Py_BuildValue("(ziiN)", err->filename,
1874 err->lineno, err->offset, errtext);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001875 w = NULL;
1876 if (v != NULL)
1877 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001878 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001879 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001880 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001881 Py_XDECREF(w);
Georg Brandl3dbca812008-07-23 16:10:53 +00001882cleanup:
1883 if (err->text != NULL) {
1884 PyObject_FREE(err->text);
1885 err->text = NULL;
1886 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001887}
1888
1889/* Print fatal error message and abort */
1890
1891void
Tim Peters7c321a82002-07-09 02:57:01 +00001892Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001893{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001894 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossumce3a72a2007-10-19 23:16:50 +00001895 if (PyErr_Occurred()) {
1896 PyErr_Print();
1897 }
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001898#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001899 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001900 OutputDebugString(msg);
1901 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001902#ifdef _DEBUG
1903 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001904#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001905#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001906 abort();
1907}
1908
1909/* Clean up and exit */
1910
Guido van Rossuma110aa61994-08-29 12:50:44 +00001911#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001912#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001913#endif
1914
Collin Winter670e6922007-03-21 02:57:17 +00001915static void (*pyexitfunc)(void) = NULL;
1916/* For the atexit module. */
1917void _Py_PyAtExit(void (*func)(void))
1918{
1919 pyexitfunc = func;
1920}
1921
1922static void
1923call_py_exitfuncs(void)
1924{
Guido van Rossum98297ee2007-11-06 21:34:58 +00001925 if (pyexitfunc == NULL)
Collin Winter670e6922007-03-21 02:57:17 +00001926 return;
1927
1928 (*pyexitfunc)();
1929 PyErr_Clear();
1930}
1931
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001932#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001933static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001934static int nexitfuncs = 0;
1935
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001936int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001937{
1938 if (nexitfuncs >= NEXITFUNCS)
1939 return -1;
1940 exitfuncs[nexitfuncs++] = func;
1941 return 0;
1942}
1943
Guido van Rossumcc283f51997-08-05 02:22:03 +00001944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001946{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001947 while (nexitfuncs > 0)
1948 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001949
1950 fflush(stdout);
1951 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001952}
1953
1954void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001955Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001956{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001957 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001958
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001959 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001960}
1961
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001963initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001964{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001965#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001966 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001967#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001968#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001969 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001970#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001971#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001972 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001973#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001974 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001975}
1976
Guido van Rossum7433b121997-02-14 19:45:36 +00001977
1978/*
1979 * The file descriptor fd is considered ``interactive'' if either
1980 * a) isatty(fd) is TRUE, or
1981 * b) the -i flag was given, and the filename associated with
1982 * the descriptor is NULL or "<stdin>" or "???".
1983 */
1984int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001985Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001986{
1987 if (isatty((int)fileno(fp)))
1988 return 1;
1989 if (!Py_InteractiveFlag)
1990 return 0;
1991 return (filename == NULL) ||
1992 (strcmp(filename, "<stdin>") == 0) ||
1993 (strcmp(filename, "???") == 0);
1994}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001995
1996
Tim Petersd08e3822003-04-17 15:24:21 +00001997#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001998#if defined(WIN32) && defined(_MSC_VER)
1999
2000/* Stack checking for Microsoft C */
2001
2002#include <malloc.h>
2003#include <excpt.h>
2004
Fred Drakee8de31c2000-08-31 05:38:39 +00002005/*
2006 * Return non-zero when we run out of memory on the stack; zero otherwise.
2007 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002008int
Fred Drake399739f2000-08-31 05:52:44 +00002009PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002010{
2011 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00002012 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002013 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00002014 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002015 return 0;
Christian Heimes7131fd92008-02-19 14:21:46 +00002016 } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
Trent Nelson39e307e2008-03-19 06:45:48 +00002017 EXCEPTION_EXECUTE_HANDLER :
2018 EXCEPTION_CONTINUE_SEARCH) {
Christian Heimes7131fd92008-02-19 14:21:46 +00002019 int errcode = _resetstkoflw();
2020 if (errcode)
2021 {
2022 Py_FatalError("Could not reset the stack!");
2023 }
Fredrik Lundh2f15b252000-08-27 19:15:31 +00002024 }
2025 return 1;
2026}
2027
2028#endif /* WIN32 && _MSC_VER */
2029
2030/* Alternate implementations can be added here... */
2031
2032#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00002033
2034
2035/* Wrappers around sigaction() or signal(). */
2036
2037PyOS_sighandler_t
2038PyOS_getsig(int sig)
2039{
2040#ifdef HAVE_SIGACTION
2041 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002042 if (sigaction(sig, NULL, &context) == -1)
2043 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00002044 return context.sa_handler;
2045#else
2046 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00002047/* Special signal handling for the secure CRT in Visual Studio 2005 */
2048#if defined(_MSC_VER) && _MSC_VER >= 1400
2049 switch (sig) {
2050 /* Only these signals are valid */
2051 case SIGINT:
2052 case SIGILL:
2053 case SIGFPE:
2054 case SIGSEGV:
2055 case SIGTERM:
2056 case SIGBREAK:
2057 case SIGABRT:
2058 break;
2059 /* Don't call signal() with other values or it will assert */
2060 default:
2061 return SIG_ERR;
2062 }
2063#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00002064 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002065 if (handler != SIG_ERR)
2066 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00002067 return handler;
2068#endif
2069}
2070
2071PyOS_sighandler_t
2072PyOS_setsig(int sig, PyOS_sighandler_t handler)
2073{
2074#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002075 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00002076 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002077 sigemptyset(&context.sa_mask);
2078 context.sa_flags = 0;
2079 if (sigaction(sig, &context, &ocontext) == -1)
2080 return SIG_ERR;
2081 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00002082#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00002083 PyOS_sighandler_t oldhandler;
2084 oldhandler = signal(sig, handler);
2085#ifdef HAVE_SIGINTERRUPT
2086 siginterrupt(sig, 1);
2087#endif
2088 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00002089#endif
2090}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002091
2092/* Deprecated C API functions still provided for binary compatiblity */
2093
2094#undef PyParser_SimpleParseFile
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002095PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002096PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
2097{
2098 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
2099}
2100
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002101#undef PyParser_SimpleParseString
2102PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00002103PyParser_SimpleParseString(const char *str, int start)
2104{
2105 return PyParser_SimpleParseStringFlags(str, start, 0);
2106}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002107
2108#undef PyRun_AnyFile
2109PyAPI_FUNC(int)
2110PyRun_AnyFile(FILE *fp, const char *name)
2111{
2112 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
2113}
2114
2115#undef PyRun_AnyFileEx
2116PyAPI_FUNC(int)
2117PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
2118{
2119 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
2120}
2121
2122#undef PyRun_AnyFileFlags
2123PyAPI_FUNC(int)
2124PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
2125{
2126 return PyRun_AnyFileExFlags(fp, name, 0, flags);
2127}
2128
2129#undef PyRun_File
2130PyAPI_FUNC(PyObject *)
2131PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
2132{
Georg Brandl86b2fb92008-07-16 03:43:04 +00002133 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002134}
2135
2136#undef PyRun_FileEx
2137PyAPI_FUNC(PyObject *)
2138PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
2139{
Georg Brandl86b2fb92008-07-16 03:43:04 +00002140 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002141}
2142
2143#undef PyRun_FileFlags
2144PyAPI_FUNC(PyObject *)
2145PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
2146 PyCompilerFlags *flags)
2147{
Georg Brandl86b2fb92008-07-16 03:43:04 +00002148 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002149}
2150
2151#undef PyRun_SimpleFile
2152PyAPI_FUNC(int)
2153PyRun_SimpleFile(FILE *f, const char *p)
2154{
2155 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
2156}
2157
2158#undef PyRun_SimpleFileEx
2159PyAPI_FUNC(int)
2160PyRun_SimpleFileEx(FILE *f, const char *p, int c)
2161{
2162 return PyRun_SimpleFileExFlags(f, p, c, NULL);
2163}
2164
2165
2166#undef PyRun_String
2167PyAPI_FUNC(PyObject *)
2168PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
2169{
2170 return PyRun_StringFlags(str, s, g, l, NULL);
2171}
2172
2173#undef PyRun_SimpleString
2174PyAPI_FUNC(int)
2175PyRun_SimpleString(const char *s)
2176{
2177 return PyRun_SimpleStringFlags(s, NULL);
2178}
2179
2180#undef Py_CompileString
2181PyAPI_FUNC(PyObject *)
2182Py_CompileString(const char *str, const char *p, int s)
2183{
2184 return Py_CompileStringFlags(str, p, s, NULL);
2185}
2186
2187#undef PyRun_InteractiveOne
2188PyAPI_FUNC(int)
2189PyRun_InteractiveOne(FILE *f, const char *p)
2190{
2191 return PyRun_InteractiveOneFlags(f, p, NULL);
2192}
2193
2194#undef PyRun_InteractiveLoop
2195PyAPI_FUNC(int)
2196PyRun_InteractiveLoop(FILE *f, const char *p)
2197{
2198 return PyRun_InteractiveLoopFlags(f, p, NULL);
2199}
2200
2201#ifdef __cplusplus
2202}
2203#endif