blob: f203618c423791aa81eb57d402ff5c9ea9fb6cfd [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"
Kristján Valur Jónsson67387fb2007-04-25 00:17:39 +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"
Antoine Pitrouefb60c02009-10-20 21:29:37 +000020#include "abstract.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000021
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000022#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000023#include <signal.h>
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000024#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000025
Benjamin Peterson796798b2009-01-02 20:47:27 +000026#ifdef MS_WINDOWS
Martin v. Löwis5344c992009-01-02 20:32:55 +000027#include "malloc.h" /* for alloca */
Benjamin Peterson796798b2009-01-02 20:47:27 +000028#endif
Martin v. Löwis5344c992009-01-02 20:32:55 +000029
Martin v. Löwis73d538b2003-03-05 15:13:47 +000030#ifdef HAVE_LANGINFO_H
31#include <locale.h>
32#include <langinfo.h>
33#endif
34
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000035#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000036#undef BYTE
37#include "windows.h"
38#endif
39
Neal Norwitz4281cef2006-03-04 19:58:13 +000040#ifndef Py_REF_DEBUG
Tim Peters62e97f02006-03-28 21:44:32 +000041#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000042#else /* Py_REF_DEBUG */
Antoine Pitrouc83ea132010-05-09 14:46:46 +000043#define PRINT_TOTAL_REFS() fprintf(stderr, \
44 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
45 _Py_GetRefTotal())
Neal Norwitz4281cef2006-03-04 19:58:13 +000046#endif
47
Anthony Baxterac6bd462006-04-13 02:06:09 +000048#ifdef __cplusplus
49extern "C" {
50#endif
51
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000052extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000053
Guido van Rossum82598051997-03-05 00:20:32 +000054extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000055
Guido van Rossumb73cc041993-11-01 16:28:59 +000056/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static void initmain(void);
58static void initsite(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000059static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000060 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000061static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Antoine Pitrouc83ea132010-05-09 14:46:46 +000062 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void err_input(perrdetail *);
64static void initsigs(void);
Antoine Pitrouefb60c02009-10-20 21:29:37 +000065static void wait_for_thread_shutdown(void);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static void call_sys_exitfunc(void);
67static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068extern void _PyUnicode_Init(void);
69extern void _PyUnicode_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 */
Georg Brandl49aafc92007-03-07 00:34:46 +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' */
Christian Heimes1a6387e2008-03-26 12:49:49 +000081int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
Georg Brandl2da0fce2008-01-07 17:09:35 +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 */
Guido van Rossumb16d1972000-05-01 17:55:15 +000085int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000086int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Tim Peters3caca232001-12-06 06:23:26 +000087/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
88 on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
89 true divisions (which they will be in 2.3). */
90int _Py_QnewFlag = 0;
Christian Heimesaf748c32008-05-06 22:41:46 +000091int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092
Brett Cannone9746892008-04-12 23:44:07 +000093/* PyModule_GetWarningsModule is no longer necessary as of 2.6
94since _warnings is builtin. This API should not be used. */
95PyObject *
96PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000097{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000098 return PyImport_ImportModule("warnings");
Mark Hammondedd07732003-07-15 23:03:55 +000099}
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000100
Guido van Rossum25ce5661997-08-02 03:10:38 +0000101static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102
Thomas Wouters7e474022000-07-16 12:04:32 +0000103/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000104
105int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000106Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000107{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000108 return initialized;
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000109}
110
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111/* Global initializations. Can be undone by Py_Finalize(). Don't
112 call this twice without an intervening Py_Finalize() call. When
113 initializations fail, a fatal error is issued and the function does
114 not return. On return, the first thread and interpreter state have
115 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117 Locking: you must hold the interpreter lock while calling this.
118 (If the lock has not yet been initialized, that's equivalent to
119 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000120
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000122
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000123static int
124add_flag(int flag, const char *envs)
125{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000126 int env = atoi(envs);
127 if (flag < env)
128 flag = env;
129 if (flag < 1)
130 flag = 1;
131 return flag;
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000132}
133
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000135Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000137 PyInterpreterState *interp;
138 PyThreadState *tstate;
139 PyObject *bimod, *sysmod;
140 char *p;
141 char *icodeset = NULL; /* On Windows, input codeset may theoretically
142 differ from output codeset. */
143 char *codeset = NULL;
144 char *errors = NULL;
145 int free_codeset = 0;
146 int overridden = 0;
147 PyObject *sys_stream, *sys_isatty;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000148#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000149 char *saved_locale, *loc_codeset;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000150#endif
Martin v. Löwis99815892008-06-01 07:20:46 +0000151#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000152 char ibuf[128];
153 char buf[128];
Martin v. Löwis99815892008-06-01 07:20:46 +0000154#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000155 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000156
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000157 if (initialized)
158 return;
159 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000160
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000161 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
162 Py_DebugFlag = add_flag(Py_DebugFlag, p);
163 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
164 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
165 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
166 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
167 if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
168 Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000169
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000170 interp = PyInterpreterState_New();
171 if (interp == NULL)
172 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000173
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000174 tstate = PyThreadState_New(interp);
175 if (tstate == NULL)
176 Py_FatalError("Py_Initialize: can't make first thread");
177 (void) PyThreadState_Swap(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000178
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000179 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000180
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000181 if (!_PyFrame_Init())
182 Py_FatalError("Py_Initialize: can't init frames");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000183
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000184 if (!_PyInt_Init())
185 Py_FatalError("Py_Initialize: can't init ints");
Neal Norwitzc91ed402002-12-30 22:29:22 +0000186
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000187 if (!_PyLong_Init())
188 Py_FatalError("Py_Initialize: can't init longs");
Mark Dickinsonefc82f72009-03-20 15:51:55 +0000189
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000190 if (!PyByteArray_Init())
191 Py_FatalError("Py_Initialize: can't init bytearray");
Christian Heimes1a6387e2008-03-26 12:49:49 +0000192
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000193 _PyFloat_Init();
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000194
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000195 interp->modules = PyDict_New();
196 if (interp->modules == NULL)
197 Py_FatalError("Py_Initialize: can't make modules dictionary");
198 interp->modules_reloading = PyDict_New();
199 if (interp->modules_reloading == NULL)
200 Py_FatalError("Py_Initialize: can't make modules_reloading dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000201
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000202#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000203 /* Init Unicode implementation; relies on the codec registry */
204 _PyUnicode_Init();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000205#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000206
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000207 bimod = _PyBuiltin_Init();
208 if (bimod == NULL)
209 Py_FatalError("Py_Initialize: can't initialize __builtin__");
210 interp->builtins = PyModule_GetDict(bimod);
211 if (interp->builtins == NULL)
212 Py_FatalError("Py_Initialize: can't initialize builtins dict");
213 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000214
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000215 sysmod = _PySys_Init();
216 if (sysmod == NULL)
217 Py_FatalError("Py_Initialize: can't initialize sys");
218 interp->sysdict = PyModule_GetDict(sysmod);
219 if (interp->sysdict == NULL)
220 Py_FatalError("Py_Initialize: can't initialize sys dict");
221 Py_INCREF(interp->sysdict);
222 _PyImport_FixupExtension("sys", "sys");
223 PySys_SetPath(Py_GetPath());
224 PyDict_SetItemString(interp->sysdict, "modules",
225 interp->modules);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000227 _PyImport_Init();
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000228
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000229 /* initialize builtin exceptions */
230 _PyExc_Init();
231 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000232
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000233 /* phase 2 of builtins */
234 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000235
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000236 _PyImportHooks_Init();
Just van Rossum52e14d62002-12-30 22:08:05 +0000237
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000238 if (install_sigs)
239 initsigs(); /* Signal handling stuff, including initintr() */
Brett Cannonc33e82d2010-05-05 20:38:52 +0000240
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000241 /* Initialize warnings. */
242 _PyWarnings_Init();
243 if (PySys_HasWarnOptions()) {
244 PyObject *warnings_module = PyImport_ImportModule("warnings");
245 if (!warnings_module)
246 PyErr_Clear();
247 Py_XDECREF(warnings_module);
248 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000249
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000250 initmain(); /* Module __main__ */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000251
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000252 /* auto-thread-state API, if available */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000253#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000254 _PyGILState_Init(interp, tstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000255#endif /* WITH_THREAD */
256
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 if (!Py_NoSiteFlag)
258 initsite(); /* Module site */
Victor Stinner66644262010-03-10 22:30:19 +0000259
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000260 if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') {
261 p = icodeset = codeset = strdup(p);
262 free_codeset = 1;
263 errors = strchr(p, ':');
264 if (errors) {
265 *errors = '\0';
266 errors++;
267 }
268 overridden = 1;
269 }
Martin v. Löwis99815892008-06-01 07:20:46 +0000270
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000271#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000272 /* On Unix, set the file system encoding according to the
273 user's preference, if the CODESET names a well-known
274 Python codec, and Py_FileSystemDefaultEncoding isn't
275 initialized by other means. Also set the encoding of
276 stdin and stdout if these are terminals, unless overridden. */
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000277
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000278 if (!overridden || !Py_FileSystemDefaultEncoding) {
279 saved_locale = strdup(setlocale(LC_CTYPE, NULL));
280 setlocale(LC_CTYPE, "");
281 loc_codeset = nl_langinfo(CODESET);
282 if (loc_codeset && *loc_codeset) {
283 PyObject *enc = PyCodec_Encoder(loc_codeset);
284 if (enc) {
285 loc_codeset = strdup(loc_codeset);
286 Py_DECREF(enc);
287 } else {
288 if (PyErr_ExceptionMatches(PyExc_LookupError)) {
289 PyErr_Clear();
290 loc_codeset = NULL;
291 } else {
292 PyErr_Print();
293 exit(1);
294 }
295 }
296 } else
297 loc_codeset = NULL;
298 setlocale(LC_CTYPE, saved_locale);
299 free(saved_locale);
Martin v. Löwis99815892008-06-01 07:20:46 +0000300
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000301 if (!overridden) {
302 codeset = icodeset = loc_codeset;
303 free_codeset = 1;
304 }
Martin v. Löwis99815892008-06-01 07:20:46 +0000305
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000306 /* Initialize Py_FileSystemDefaultEncoding from
307 locale even if PYTHONIOENCODING is set. */
308 if (!Py_FileSystemDefaultEncoding) {
309 Py_FileSystemDefaultEncoding = loc_codeset;
310 if (!overridden)
311 free_codeset = 0;
312 }
313 }
Martin v. Löwis99815892008-06-01 07:20:46 +0000314#endif
315
316#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000317 if (!overridden) {
318 icodeset = ibuf;
319 codeset = buf;
320 sprintf(ibuf, "cp%d", GetConsoleCP());
321 sprintf(buf, "cp%d", GetConsoleOutputCP());
322 }
Martin v. Löwis99815892008-06-01 07:20:46 +0000323#endif
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000324
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000325 if (codeset) {
326 sys_stream = PySys_GetObject("stdin");
327 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
328 if (!sys_isatty)
329 PyErr_Clear();
330 if ((overridden ||
331 (sys_isatty && PyObject_IsTrue(sys_isatty))) &&
332 PyFile_Check(sys_stream)) {
333 if (!PyFile_SetEncodingAndErrors(sys_stream, icodeset, errors))
334 Py_FatalError("Cannot set codeset of stdin");
335 }
336 Py_XDECREF(sys_isatty);
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000337
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000338 sys_stream = PySys_GetObject("stdout");
339 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
340 if (!sys_isatty)
341 PyErr_Clear();
342 if ((overridden ||
343 (sys_isatty && PyObject_IsTrue(sys_isatty))) &&
344 PyFile_Check(sys_stream)) {
345 if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors))
346 Py_FatalError("Cannot set codeset of stdout");
347 }
348 Py_XDECREF(sys_isatty);
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000349
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000350 sys_stream = PySys_GetObject("stderr");
351 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
352 if (!sys_isatty)
353 PyErr_Clear();
354 if((overridden ||
355 (sys_isatty && PyObject_IsTrue(sys_isatty))) &&
356 PyFile_Check(sys_stream)) {
357 if (!PyFile_SetEncodingAndErrors(sys_stream, codeset, errors))
358 Py_FatalError("Cannot set codeset of stderr");
359 }
360 Py_XDECREF(sys_isatty);
Martin v. Löwisea62d252006-04-03 10:56:49 +0000361
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000362 if (free_codeset)
363 free(codeset);
364 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000365}
366
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000367void
368Py_Initialize(void)
369{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000370 Py_InitializeEx(1);
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000371}
372
373
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000374#ifdef COUNT_ALLOCS
Martin v. Löwis45294a92006-04-18 06:24:08 +0000375extern void dump_counts(FILE*);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000376#endif
377
Guido van Rossum25ce5661997-08-02 03:10:38 +0000378/* Undo the effect of Py_Initialize().
379
380 Beware: if multiple interpreter and/or thread states exist, these
381 are not wiped out; only the current thread and interpreter state
382 are deleted. But since everything else is deleted, those other
383 interpreter and thread states should no longer be used.
384
385 (XXX We should do better, e.g. wipe out all interpreters and
386 threads.)
387
388 Locking: as above.
389
390*/
391
392void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000393Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000394{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000395 PyInterpreterState *interp;
396 PyThreadState *tstate;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000397
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 if (!initialized)
399 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000400
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000401 wait_for_thread_shutdown();
Antoine Pitrouefb60c02009-10-20 21:29:37 +0000402
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000403 /* The interpreter is still entirely intact at this point, and the
404 * exit funcs may be relying on that. In particular, if some thread
405 * or exit func is still waiting to do an import, the import machinery
406 * expects Py_IsInitialized() to return true. So don't say the
407 * interpreter is uninitialized until after the exit funcs have run.
408 * Note that Threading.py uses an exit func to do a join on all the
409 * threads created thru it, so this also protects pending imports in
410 * the threads created via Threading.
411 */
412 call_sys_exitfunc();
413 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000414
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000415 /* Get current thread state and interpreter pointer */
416 tstate = PyThreadState_GET();
417 interp = tstate->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000419 /* Disable signal handling */
420 PyOS_FiniInterrupts();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000421
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000422 /* Clear type lookup cache */
423 PyType_ClearCache();
Christian Heimes908caac2008-01-27 23:34:59 +0000424
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000425 /* Collect garbage. This may call finalizers; it's nice to call these
426 * before all modules are destroyed.
427 * XXX If a __del__ or weakref callback is triggered here, and tries to
428 * XXX import a module, bad things can happen, because Python no
429 * XXX longer believes it's initialized.
430 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
431 * XXX is easy to provoke that way. I've also seen, e.g.,
432 * XXX Exception exceptions.ImportError: 'No module named sha'
433 * XXX in <function callback at 0x008F5718> ignored
434 * XXX but I'm unclear on exactly how that one happens. In any case,
435 * XXX I haven't seen a real-life report of either of these.
436 */
437 PyGC_Collect();
Martin v. Löwis45294a92006-04-18 06:24:08 +0000438#ifdef COUNT_ALLOCS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000439 /* With COUNT_ALLOCS, it helps to run GC multiple times:
440 each collection might release some types from the type
441 list, so they become garbage. */
442 while (PyGC_Collect() > 0)
443 /* nothing */;
Martin v. Löwis45294a92006-04-18 06:24:08 +0000444#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000445
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000446 /* Destroy all modules */
447 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000448
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000449 /* Collect final garbage. This disposes of cycles created by
450 * new-style class definitions, for example.
451 * XXX This is disabled because it caused too many problems. If
452 * XXX a __del__ or weakref callback triggers here, Python code has
453 * XXX a hard time running, because even the sys module has been
454 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
455 * XXX One symptom is a sequence of information-free messages
456 * XXX coming from threads (if a __del__ or callback is invoked,
457 * XXX other threads can execute too, and any exception they encounter
458 * XXX triggers a comedy of errors as subsystem after subsystem
459 * XXX fails to find what it *expects* to find in sys to help report
460 * XXX the exception and consequent unexpected failures). I've also
461 * XXX seen segfaults then, after adding print statements to the
462 * XXX Python code getting called.
463 */
Tim Peters1d7323e2003-12-01 21:35:27 +0000464#if 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000465 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000466#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000467
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000468 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
469 _PyImport_Fini();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000470
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000471 /* Debugging stuff */
Guido van Rossum1707aad1997-12-08 23:43:45 +0000472#ifdef COUNT_ALLOCS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000473 dump_counts(stdout);
Guido van Rossum1707aad1997-12-08 23:43:45 +0000474#endif
475
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000476 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000477
Tim Peters9cf25ce2003-04-17 15:21:01 +0000478#ifdef Py_TRACE_REFS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000479 /* Display all objects still alive -- this can invoke arbitrary
480 * __repr__ overrides, so requires a mostly-intact interpreter.
481 * Alas, a lot of stuff may still be alive now that will be cleaned
482 * up later.
483 */
484 if (Py_GETENV("PYTHONDUMPREFS"))
485 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000486#endif /* Py_TRACE_REFS */
487
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000488 /* Clear interpreter state */
489 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000490
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 /* Now we decref the exception classes. After this point nothing
492 can raise an exception. That's okay, because each Fini() method
493 below has been checked to make sure no exceptions are ever
494 raised.
495 */
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000496
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000497 _PyExc_Fini();
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000498
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000499 /* Cleanup auto-thread-state */
Amaury Forgeot d'Arc025c3472007-11-29 23:35:25 +0000500#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000501 _PyGILState_Fini();
Amaury Forgeot d'Arc025c3472007-11-29 23:35:25 +0000502#endif /* WITH_THREAD */
503
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000504 /* Delete current thread */
505 PyThreadState_Swap(NULL);
506 PyInterpreterState_Delete(interp);
Barry Warsawf242aa02000-05-25 23:09:49 +0000507
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000508 /* Sundry finalizers */
509 PyMethod_Fini();
510 PyFrame_Fini();
511 PyCFunction_Fini();
512 PyTuple_Fini();
513 PyList_Fini();
514 PySet_Fini();
515 PyString_Fini();
516 PyByteArray_Fini();
517 PyInt_Fini();
518 PyFloat_Fini();
519 PyDict_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000520
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000521#ifdef Py_USING_UNICODE
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000522 /* Cleanup Unicode implementation */
523 _PyUnicode_Fini();
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000524#endif
525
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000526 /* XXX Still allocated:
527 - various static ad-hoc pointers to interned strings
528 - int and float free list blocks
529 - whatever various modules and libraries allocate
530 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000531
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000533
Tim Peters269b2a62003-04-17 19:52:29 +0000534#ifdef Py_TRACE_REFS
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000535 /* Display addresses (& refcnts) of all objects still alive.
536 * An address can be used to find the repr of the object, printed
537 * above by _Py_PrintReferences.
538 */
539 if (Py_GETENV("PYTHONDUMPREFS"))
540 _Py_PrintReferenceAddresses(stderr);
Tim Peters269b2a62003-04-17 19:52:29 +0000541#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000542#ifdef PYMALLOC_DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000543 if (Py_GETENV("PYTHONMALLOCSTATS"))
544 _PyObject_DebugMallocStats();
Tim Peters0e871182002-04-13 08:29:14 +0000545#endif
546
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000547 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000548}
549
550/* Create and initialize a new interpreter and thread, and return the
551 new thread. This requires that Py_Initialize() has been called
552 first.
553
554 Unsuccessful initialization yields a NULL pointer. Note that *no*
555 exception information is available even in this case -- the
556 exception information is held in the thread, and there is no
557 thread.
558
559 Locking: as above.
560
561*/
562
563PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000564Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000565{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000566 PyInterpreterState *interp;
567 PyThreadState *tstate, *save_tstate;
568 PyObject *bimod, *sysmod;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000569
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000570 if (!initialized)
571 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000572
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000573 interp = PyInterpreterState_New();
574 if (interp == NULL)
575 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000576
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000577 tstate = PyThreadState_New(interp);
578 if (tstate == NULL) {
579 PyInterpreterState_Delete(interp);
580 return NULL;
581 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000582
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 save_tstate = PyThreadState_Swap(tstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000584
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000585 /* XXX The following is lax in error checking */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000586
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000587 interp->modules = PyDict_New();
588 interp->modules_reloading = PyDict_New();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000589
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000590 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
591 if (bimod != NULL) {
592 interp->builtins = PyModule_GetDict(bimod);
593 if (interp->builtins == NULL)
594 goto handle_error;
595 Py_INCREF(interp->builtins);
596 }
597 sysmod = _PyImport_FindExtension("sys", "sys");
598 if (bimod != NULL && sysmod != NULL) {
599 interp->sysdict = PyModule_GetDict(sysmod);
600 if (interp->sysdict == NULL)
601 goto handle_error;
602 Py_INCREF(interp->sysdict);
603 PySys_SetPath(Py_GetPath());
604 PyDict_SetItemString(interp->sysdict, "modules",
605 interp->modules);
606 _PyImportHooks_Init();
607 initmain();
608 if (!Py_NoSiteFlag)
609 initsite();
610 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000611
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 if (!PyErr_Occurred())
613 return tstate;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000614
Neal Norwitz0c6ae5b2006-08-21 20:16:24 +0000615handle_error:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000616 /* Oops, it didn't work. Undo it all. */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000617
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000618 PyErr_Print();
619 PyThreadState_Clear(tstate);
620 PyThreadState_Swap(save_tstate);
621 PyThreadState_Delete(tstate);
622 PyInterpreterState_Delete(interp);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000623
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000624 return NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000625}
626
627/* Delete an interpreter and its last thread. This requires that the
628 given thread state is current, that the thread has no remaining
629 frames, and that it is its interpreter's only remaining thread.
630 It is a fatal error to violate these constraints.
631
632 (Py_Finalize() doesn't have these constraints -- it zaps
633 everything, regardless.)
634
635 Locking: as above.
636
637*/
638
639void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000640Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000641{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000642 PyInterpreterState *interp = tstate->interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000643
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000644 if (tstate != PyThreadState_GET())
645 Py_FatalError("Py_EndInterpreter: thread is not current");
646 if (tstate->frame != NULL)
647 Py_FatalError("Py_EndInterpreter: thread still has a frame");
648 if (tstate != interp->tstate_head || tstate->next != NULL)
649 Py_FatalError("Py_EndInterpreter: not the last thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000650
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000651 PyImport_Cleanup();
652 PyInterpreterState_Clear(interp);
653 PyThreadState_Swap(NULL);
654 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000655}
656
657static char *progname = "python";
658
659void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000660Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000661{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000662 if (pn && *pn)
663 progname = pn;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000664}
665
666char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000668{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000669 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000670}
671
Guido van Rossuma61691e1998-02-06 22:27:24 +0000672static char *default_home = NULL;
673
674void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000675Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000676{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000677 default_home = home;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000678}
679
680char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000682{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000683 char *home = default_home;
684 if (home == NULL && !Py_IgnoreEnvironmentFlag)
685 home = Py_GETENV("PYTHONHOME");
686 return home;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000687}
688
Guido van Rossum6135a871995-01-09 17:53:26 +0000689/* Create __main__ module */
690
691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000692initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000693{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000694 PyObject *m, *d;
695 m = PyImport_AddModule("__main__");
696 if (m == NULL)
697 Py_FatalError("can't create __main__ module");
698 d = PyModule_GetDict(m);
699 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
700 PyObject *bimod = PyImport_ImportModule("__builtin__");
701 if (bimod == NULL ||
702 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
703 Py_FatalError("can't add __builtins__ to __main__");
704 Py_XDECREF(bimod);
705 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000706}
707
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000708/* Import the site module (not into __main__ though) */
709
710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000711initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000712{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000713 PyObject *m;
714 m = PyImport_ImportModule("site");
715 if (m == NULL) {
716 PyErr_Print();
717 Py_Finalize();
718 exit(1);
719 }
720 else {
721 Py_DECREF(m);
722 }
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000723}
724
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000725/* Parse input from a file and execute it */
726
727int
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000728PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000729 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000730{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000731 if (filename == NULL)
732 filename = "???";
733 if (Py_FdIsInteractive(fp, filename)) {
734 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
735 if (closeit)
736 fclose(fp);
737 return err;
738 }
739 else
740 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000741}
742
743int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000744PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000745{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000746 PyObject *v;
747 int ret;
748 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000749
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000750 if (flags == NULL) {
751 flags = &local_flags;
752 local_flags.cf_flags = 0;
753 }
754 v = PySys_GetObject("ps1");
755 if (v == NULL) {
756 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
757 Py_XDECREF(v);
758 }
759 v = PySys_GetObject("ps2");
760 if (v == NULL) {
761 PySys_SetObject("ps2", v = PyString_FromString("... "));
762 Py_XDECREF(v);
763 }
764 for (;;) {
765 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
766 PRINT_TOTAL_REFS();
767 if (ret == E_EOF)
768 return 0;
769 /*
770 if (ret == E_NOMEM)
771 return -1;
772 */
773 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000774}
775
Eric Smith7c478942008-03-18 23:45:49 +0000776#if 0
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000777/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000778#define PARSER_FLAGS(flags) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000779 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
780 PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0)
Eric Smith7c478942008-03-18 23:45:49 +0000781#endif
782#if 1
Neal Norwitzca460d92006-09-06 06:28:06 +0000783/* Keep an example of flags with future keyword support. */
784#define PARSER_FLAGS(flags) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000785 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
786 PyPARSE_DONT_IMPLY_DEDENT : 0) \
787 | (((flags)->cf_flags & CO_FUTURE_PRINT_FUNCTION) ? \
788 PyPARSE_PRINT_IS_FUNCTION : 0) \
789 | (((flags)->cf_flags & CO_FUTURE_UNICODE_LITERALS) ? \
790 PyPARSE_UNICODE_LITERALS : 0) \
791 ) : 0)
Neal Norwitzca460d92006-09-06 06:28:06 +0000792#endif
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000793
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000794int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000795PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000796{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000797 PyObject *m, *d, *v, *w;
798 mod_ty mod;
799 PyArena *arena;
800 char *ps1 = "", *ps2 = "";
801 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +0000802
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000803 v = PySys_GetObject("ps1");
804 if (v != NULL) {
805 v = PyObject_Str(v);
806 if (v == NULL)
807 PyErr_Clear();
808 else if (PyString_Check(v))
809 ps1 = PyString_AsString(v);
810 }
811 w = PySys_GetObject("ps2");
812 if (w != NULL) {
813 w = PyObject_Str(w);
814 if (w == NULL)
815 PyErr_Clear();
816 else if (PyString_Check(w))
817 ps2 = PyString_AsString(w);
818 }
819 arena = PyArena_New();
820 if (arena == NULL) {
821 Py_XDECREF(v);
822 Py_XDECREF(w);
823 return -1;
824 }
825 mod = PyParser_ASTFromFile(fp, filename,
826 Py_single_input, ps1, ps2,
827 flags, &errcode, arena);
828 Py_XDECREF(v);
829 Py_XDECREF(w);
830 if (mod == NULL) {
831 PyArena_Free(arena);
832 if (errcode == E_EOF) {
833 PyErr_Clear();
834 return E_EOF;
835 }
836 PyErr_Print();
837 return -1;
838 }
839 m = PyImport_AddModule("__main__");
840 if (m == NULL) {
841 PyArena_Free(arena);
842 return -1;
843 }
844 d = PyModule_GetDict(m);
845 v = run_mod(mod, filename, d, d, flags, arena);
846 PyArena_Free(arena);
847 if (v == NULL) {
848 PyErr_Print();
849 return -1;
850 }
851 Py_DECREF(v);
852 if (Py_FlushLine())
853 PyErr_Clear();
854 return 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855}
856
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000857/* Check whether a file maybe a pyc file: Look at the extension,
858 the file type, and, if we may close it, at the first few bytes. */
859
860static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000861maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000862{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000863 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
864 return 1;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000865
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000866 /* Only look into the file if we are allowed to close it, since
867 it then should also be seekable. */
868 if (closeit) {
869 /* Read only two bytes of the magic. If the file was opened in
870 text mode, the bytes 3 and 4 of the magic (\r\n) might not
871 be read as they are on disk. */
872 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
873 unsigned char buf[2];
874 /* Mess: In case of -x, the stream is NOT at its start now,
875 and ungetc() was used to push back the first newline,
876 which makes the current stream position formally undefined,
877 and a x-platform nightmare.
878 Unfortunately, we have no direct way to know whether -x
879 was specified. So we use a terrible hack: if the current
880 stream position is not 0, we assume -x was specified, and
881 give up. Bug 132850 on SourceForge spells out the
882 hopelessness of trying anything else (fseek and ftell
883 don't work predictably x-platform for text-mode files).
884 */
885 int ispyc = 0;
886 if (ftell(fp) == 0) {
887 if (fread(buf, 1, 2, fp) == 2 &&
888 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
889 ispyc = 1;
890 rewind(fp);
891 }
892 return ispyc;
893 }
894 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +0000895}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000896
Guido van Rossum0df002c2000-08-27 19:21:52 +0000897int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000898PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000899 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000900{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000901 PyObject *m, *d, *v;
902 const char *ext;
903 int set_file_name = 0, ret, len;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000904
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000905 m = PyImport_AddModule("__main__");
906 if (m == NULL)
907 return -1;
908 d = PyModule_GetDict(m);
909 if (PyDict_GetItemString(d, "__file__") == NULL) {
910 PyObject *f = PyString_FromString(filename);
911 if (f == NULL)
912 return -1;
913 if (PyDict_SetItemString(d, "__file__", f) < 0) {
914 Py_DECREF(f);
915 return -1;
916 }
917 set_file_name = 1;
918 Py_DECREF(f);
919 }
920 len = strlen(filename);
921 ext = filename + len - (len > 4 ? 4 : 0);
922 if (maybe_pyc_file(fp, filename, ext, closeit)) {
923 /* Try to run a pyc file. First, re-open in binary */
924 if (closeit)
925 fclose(fp);
926 if ((fp = fopen(filename, "rb")) == NULL) {
927 fprintf(stderr, "python: Can't reopen .pyc file\n");
928 ret = -1;
929 goto done;
930 }
931 /* Turn on optimization if a .pyo file is given */
932 if (strcmp(ext, ".pyo") == 0)
933 Py_OptimizeFlag = 1;
934 v = run_pyc_file(fp, filename, d, d, flags);
935 } else {
936 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
937 closeit, flags);
938 }
939 if (v == NULL) {
940 PyErr_Print();
941 ret = -1;
942 goto done;
943 }
944 Py_DECREF(v);
945 if (Py_FlushLine())
946 PyErr_Clear();
947 ret = 0;
Georg Brandlaa2321b2007-03-07 00:40:28 +0000948 done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 if (set_file_name && PyDict_DelItemString(d, "__file__"))
950 PyErr_Clear();
951 return ret;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000952}
953
954int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000955PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +0000956{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000957 PyObject *m, *d, *v;
958 m = PyImport_AddModule("__main__");
959 if (m == NULL)
960 return -1;
961 d = PyModule_GetDict(m);
962 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
963 if (v == NULL) {
964 PyErr_Print();
965 return -1;
966 }
967 Py_DECREF(v);
968 if (Py_FlushLine())
969 PyErr_Clear();
970 return 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000971}
972
Barry Warsaw035574d1997-08-29 22:07:17 +0000973static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000974parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000975 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000976{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000977 long hold;
978 PyObject *v;
Barry Warsaw035574d1997-08-29 22:07:17 +0000979
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000980 /* old style errors */
981 if (PyTuple_Check(err))
982 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
983 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +0000984
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000985 /* new style errors. `err' is an instance */
Barry Warsaw035574d1997-08-29 22:07:17 +0000986
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000987 if (! (v = PyObject_GetAttrString(err, "msg")))
988 goto finally;
989 *message = v;
Barry Warsaw035574d1997-08-29 22:07:17 +0000990
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000991 if (!(v = PyObject_GetAttrString(err, "filename")))
992 goto finally;
993 if (v == Py_None)
994 *filename = NULL;
995 else if (! (*filename = PyString_AsString(v)))
996 goto finally;
Barry Warsaw035574d1997-08-29 22:07:17 +0000997
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000998 Py_DECREF(v);
999 if (!(v = PyObject_GetAttrString(err, "lineno")))
1000 goto finally;
1001 hold = PyInt_AsLong(v);
1002 Py_DECREF(v);
1003 v = NULL;
1004 if (hold < 0 && PyErr_Occurred())
1005 goto finally;
1006 *lineno = (int)hold;
Barry Warsaw035574d1997-08-29 22:07:17 +00001007
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001008 if (!(v = PyObject_GetAttrString(err, "offset")))
1009 goto finally;
1010 if (v == Py_None) {
1011 *offset = -1;
1012 Py_DECREF(v);
1013 v = NULL;
1014 } else {
1015 hold = PyInt_AsLong(v);
1016 Py_DECREF(v);
1017 v = NULL;
1018 if (hold < 0 && PyErr_Occurred())
1019 goto finally;
1020 *offset = (int)hold;
1021 }
Barry Warsaw035574d1997-08-29 22:07:17 +00001022
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001023 if (!(v = PyObject_GetAttrString(err, "text")))
1024 goto finally;
1025 if (v == Py_None)
1026 *text = NULL;
1027 else if (! (*text = PyString_AsString(v)))
1028 goto finally;
1029 Py_DECREF(v);
1030 return 1;
Barry Warsaw035574d1997-08-29 22:07:17 +00001031
1032finally:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001033 Py_XDECREF(v);
1034 return 0;
Barry Warsaw035574d1997-08-29 22:07:17 +00001035}
1036
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001037void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001038PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001039{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001040 PyErr_PrintEx(1);
Guido van Rossuma61691e1998-02-06 22:27:24 +00001041}
1042
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001043static void
Martin v. Löwis95292d62002-12-11 14:04:59 +00001044print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001045{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001046 char *nl;
1047 if (offset >= 0) {
1048 if (offset > 0 && offset == (int)strlen(text))
1049 offset--;
1050 for (;;) {
1051 nl = strchr(text, '\n');
1052 if (nl == NULL || nl-text >= offset)
1053 break;
1054 offset -= (int)(nl+1-text);
1055 text = nl+1;
1056 }
1057 while (*text == ' ' || *text == '\t') {
1058 text++;
1059 offset--;
1060 }
1061 }
1062 PyFile_WriteString(" ", f);
1063 PyFile_WriteString(text, f);
1064 if (*text == '\0' || text[strlen(text)-1] != '\n')
1065 PyFile_WriteString("\n", f);
1066 if (offset == -1)
1067 return;
1068 PyFile_WriteString(" ", f);
1069 offset--;
1070 while (offset > 0) {
1071 PyFile_WriteString(" ", f);
1072 offset--;
1073 }
1074 PyFile_WriteString("^\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001075}
1076
Guido van Rossum66e8e862001-03-23 17:54:43 +00001077static void
1078handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001079{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001080 PyObject *exception, *value, *tb;
1081 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +00001082
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001083 if (Py_InspectFlag)
1084 /* Don't exit if -i flag was given. This flag is set to 0
1085 * when entering interactive mode for inspecting. */
1086 return;
Georg Brandl49aafc92007-03-07 00:34:46 +00001087
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001088 PyErr_Fetch(&exception, &value, &tb);
1089 if (Py_FlushLine())
1090 PyErr_Clear();
1091 fflush(stdout);
1092 if (value == NULL || value == Py_None)
1093 goto done;
1094 if (PyExceptionInstance_Check(value)) {
1095 /* The error code should be in the `code' attribute. */
1096 PyObject *code = PyObject_GetAttrString(value, "code");
1097 if (code) {
1098 Py_DECREF(value);
1099 value = code;
1100 if (value == Py_None)
1101 goto done;
1102 }
1103 /* If we failed to dig out the 'code' attribute,
1104 just let the else clause below print the error. */
1105 }
1106 if (PyInt_Check(value))
1107 exitcode = (int)PyInt_AsLong(value);
1108 else {
1109 PyObject_Print(value, stderr, Py_PRINT_RAW);
1110 PySys_WriteStderr("\n");
1111 exitcode = 1;
1112 }
Tim Peterscf615b52003-04-19 18:47:02 +00001113 done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001114 /* Restore and clear the exception info, in order to properly decref
1115 * the exception, value, and traceback. If we just exit instead,
1116 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1117 * some finalizers from running.
1118 */
1119 PyErr_Restore(exception, value, tb);
1120 PyErr_Clear();
1121 Py_Exit(exitcode);
1122 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001123}
1124
1125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001126PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001127{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001128 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001129
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001130 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1131 handle_system_exit();
1132 }
1133 PyErr_Fetch(&exception, &v, &tb);
1134 if (exception == NULL)
1135 return;
1136 PyErr_NormalizeException(&exception, &v, &tb);
1137 if (exception == NULL)
1138 return;
1139 /* Now we know v != NULL too */
1140 if (set_sys_last_vars) {
1141 PySys_SetObject("last_type", exception);
1142 PySys_SetObject("last_value", v);
1143 PySys_SetObject("last_traceback", tb);
1144 }
1145 hook = PySys_GetObject("excepthook");
1146 if (hook) {
1147 PyObject *args = PyTuple_Pack(3,
1148 exception, v, tb ? tb : Py_None);
1149 PyObject *result = PyEval_CallObject(hook, args);
1150 if (result == NULL) {
1151 PyObject *exception2, *v2, *tb2;
1152 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1153 handle_system_exit();
1154 }
1155 PyErr_Fetch(&exception2, &v2, &tb2);
1156 PyErr_NormalizeException(&exception2, &v2, &tb2);
1157 /* It should not be possible for exception2 or v2
1158 to be NULL. However PyErr_Display() can't
1159 tolerate NULLs, so just be safe. */
1160 if (exception2 == NULL) {
1161 exception2 = Py_None;
1162 Py_INCREF(exception2);
1163 }
1164 if (v2 == NULL) {
1165 v2 = Py_None;
1166 Py_INCREF(v2);
1167 }
1168 if (Py_FlushLine())
1169 PyErr_Clear();
1170 fflush(stdout);
1171 PySys_WriteStderr("Error in sys.excepthook:\n");
1172 PyErr_Display(exception2, v2, tb2);
1173 PySys_WriteStderr("\nOriginal exception was:\n");
1174 PyErr_Display(exception, v, tb);
1175 Py_DECREF(exception2);
1176 Py_DECREF(v2);
1177 Py_XDECREF(tb2);
1178 }
1179 Py_XDECREF(result);
1180 Py_XDECREF(args);
1181 } else {
1182 PySys_WriteStderr("sys.excepthook is missing\n");
1183 PyErr_Display(exception, v, tb);
1184 }
1185 Py_XDECREF(exception);
1186 Py_XDECREF(v);
1187 Py_XDECREF(tb);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001188}
1189
Richard Jones7b9558d2006-05-27 12:29:24 +00001190void
1191PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001192{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001193 int err = 0;
1194 PyObject *f = PySys_GetObject("stderr");
1195 Py_INCREF(value);
1196 if (f == NULL)
1197 fprintf(stderr, "lost sys.stderr\n");
1198 else {
1199 if (Py_FlushLine())
1200 PyErr_Clear();
1201 fflush(stdout);
1202 if (tb && tb != Py_None)
1203 err = PyTraceBack_Print(tb, f);
1204 if (err == 0 &&
1205 PyObject_HasAttrString(value, "print_file_and_line"))
1206 {
1207 PyObject *message;
1208 const char *filename, *text;
1209 int lineno, offset;
1210 if (!parse_syntax_error(value, &message, &filename,
1211 &lineno, &offset, &text))
1212 PyErr_Clear();
1213 else {
1214 char buf[10];
1215 PyFile_WriteString(" File \"", f);
1216 if (filename == NULL)
1217 PyFile_WriteString("<string>", f);
1218 else
1219 PyFile_WriteString(filename, f);
1220 PyFile_WriteString("\", line ", f);
1221 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
1222 PyFile_WriteString(buf, f);
1223 PyFile_WriteString("\n", f);
1224 if (text != NULL)
1225 print_error_text(f, offset, text);
1226 Py_DECREF(value);
1227 value = message;
1228 /* Can't be bothered to check all those
1229 PyFile_WriteString() calls */
1230 if (PyErr_Occurred())
1231 err = -1;
1232 }
1233 }
1234 if (err) {
1235 /* Don't do anything else */
1236 }
1237 else if (PyExceptionClass_Check(exception)) {
1238 PyObject* moduleName;
1239 char* className = PyExceptionClass_Name(exception);
1240 if (className != NULL) {
1241 char *dot = strrchr(className, '.');
1242 if (dot != NULL)
1243 className = dot+1;
1244 }
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001245
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001246 moduleName = PyObject_GetAttrString(exception, "__module__");
1247 if (moduleName == NULL)
1248 err = PyFile_WriteString("<unknown>", f);
1249 else {
1250 char* modstr = PyString_AsString(moduleName);
1251 if (modstr && strcmp(modstr, "exceptions"))
1252 {
1253 err = PyFile_WriteString(modstr, f);
1254 err += PyFile_WriteString(".", f);
1255 }
1256 Py_DECREF(moduleName);
1257 }
1258 if (err == 0) {
1259 if (className == NULL)
1260 err = PyFile_WriteString("<unknown>", f);
1261 else
1262 err = PyFile_WriteString(className, f);
1263 }
1264 }
1265 else
1266 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
1267 if (err == 0 && (value != Py_None)) {
1268 PyObject *s = PyObject_Str(value);
1269 /* only print colon if the str() of the
1270 object is not the empty string
1271 */
1272 if (s == NULL)
1273 err = -1;
1274 else if (!PyString_Check(s) ||
1275 PyString_GET_SIZE(s) != 0)
1276 err = PyFile_WriteString(": ", f);
1277 if (err == 0)
1278 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1279 Py_XDECREF(s);
1280 }
1281 /* try to write a newline in any case */
1282 err += PyFile_WriteString("\n", f);
1283 }
1284 Py_DECREF(value);
1285 /* If an error happened here, don't show it.
1286 XXX This is wrong, but too many callers rely on this behavior. */
1287 if (err != 0)
1288 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001289}
1290
Guido van Rossum82598051997-03-05 00:20:32 +00001291PyObject *
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001292PyRun_StringFlags(const char *str, int start, PyObject *globals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001293 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001294{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001295 PyObject *ret = NULL;
1296 mod_ty mod;
1297 PyArena *arena = PyArena_New();
1298 if (arena == NULL)
1299 return NULL;
Brett Cannonc33e82d2010-05-05 20:38:52 +00001300
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001301 mod = PyParser_ASTFromString(str, "<string>", start, flags, arena);
1302 if (mod != NULL)
1303 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
1304 PyArena_Free(arena);
1305 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001306}
1307
1308PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001309PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001310 PyObject *locals, int closeit, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001311{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001312 PyObject *ret;
1313 mod_ty mod;
1314 PyArena *arena = PyArena_New();
1315 if (arena == NULL)
1316 return NULL;
Brett Cannonc33e82d2010-05-05 20:38:52 +00001317
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001318 mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
1319 flags, NULL, arena);
1320 if (closeit)
1321 fclose(fp);
1322 if (mod == NULL) {
1323 PyArena_Free(arena);
1324 return NULL;
1325 }
1326 ret = run_mod(mod, filename, globals, locals, flags, arena);
1327 PyArena_Free(arena);
1328 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001329}
1330
Guido van Rossum82598051997-03-05 00:20:32 +00001331static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001332run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001333 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001334{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001335 PyCodeObject *co;
1336 PyObject *v;
1337 co = PyAST_Compile(mod, filename, flags, arena);
1338 if (co == NULL)
1339 return NULL;
1340 v = PyEval_EvalCode(co, globals, locals);
1341 Py_DECREF(co);
1342 return v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001343}
1344
Guido van Rossum82598051997-03-05 00:20:32 +00001345static PyObject *
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001346run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001347 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001348{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001349 PyCodeObject *co;
1350 PyObject *v;
1351 long magic;
1352 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001353
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001354 magic = PyMarshal_ReadLongFromFile(fp);
1355 if (magic != PyImport_GetMagicNumber()) {
1356 PyErr_SetString(PyExc_RuntimeError,
1357 "Bad magic number in .pyc file");
1358 return NULL;
1359 }
1360 (void) PyMarshal_ReadLongFromFile(fp);
1361 v = PyMarshal_ReadLastObjectFromFile(fp);
1362 fclose(fp);
1363 if (v == NULL || !PyCode_Check(v)) {
1364 Py_XDECREF(v);
1365 PyErr_SetString(PyExc_RuntimeError,
1366 "Bad code object in .pyc file");
1367 return NULL;
1368 }
1369 co = (PyCodeObject *)v;
1370 v = PyEval_EvalCode(co, globals, locals);
1371 if (v && flags)
1372 flags->cf_flags |= (co->co_flags & PyCF_MASK);
1373 Py_DECREF(co);
1374 return v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001375}
1376
Guido van Rossum82598051997-03-05 00:20:32 +00001377PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001378Py_CompileStringFlags(const char *str, const char *filename, int start,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001379 PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001380{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001381 PyCodeObject *co;
1382 mod_ty mod;
1383 PyArena *arena = PyArena_New();
1384 if (arena == NULL)
1385 return NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001386
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001387 mod = PyParser_ASTFromString(str, filename, start, flags, arena);
1388 if (mod == NULL) {
1389 PyArena_Free(arena);
1390 return NULL;
1391 }
1392 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
1393 PyObject *result = PyAST_mod2obj(mod);
1394 PyArena_Free(arena);
1395 return result;
1396 }
1397 co = PyAST_Compile(mod, filename, flags, arena);
1398 PyArena_Free(arena);
1399 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001400}
1401
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001402struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001403Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001404{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001405 struct symtable *st;
1406 mod_ty mod;
1407 PyCompilerFlags flags;
1408 PyArena *arena = PyArena_New();
1409 if (arena == NULL)
1410 return NULL;
Neal Norwitzb59d08c2006-07-22 16:20:49 +00001411
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001412 flags.cf_flags = 0;
Christian Heimes7f23d862008-03-26 22:51:58 +00001413
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001414 mod = PyParser_ASTFromString(str, filename, start, &flags, arena);
1415 if (mod == NULL) {
1416 PyArena_Free(arena);
1417 return NULL;
1418 }
1419 st = PySymtable_Build(mod, filename, 0);
1420 PyArena_Free(arena);
1421 return st;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001422}
1423
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001424/* Preferred access to parser is through AST. */
1425mod_ty
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001426PyParser_ASTFromString(const char *s, const char *filename, int start,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001427 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001428{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001429 mod_ty mod;
1430 PyCompilerFlags localflags;
1431 perrdetail err;
1432 int iflags = PARSER_FLAGS(flags);
Christian Heimes3c608332008-03-26 22:01:37 +00001433
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001434 node *n = PyParser_ParseStringFlagsFilenameEx(s, filename,
1435 &_PyParser_Grammar, start, &err,
1436 &iflags);
1437 if (flags == NULL) {
1438 localflags.cf_flags = 0;
1439 flags = &localflags;
1440 }
1441 if (n) {
1442 flags->cf_flags |= iflags & PyCF_MASK;
1443 mod = PyAST_FromNode(n, flags, filename, arena);
1444 PyNode_Free(n);
1445 return mod;
1446 }
1447 else {
1448 err_input(&err);
1449 return NULL;
1450 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001451}
1452
1453mod_ty
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001454PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001455 char *ps2, PyCompilerFlags *flags, int *errcode,
1456 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001457{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001458 mod_ty mod;
1459 PyCompilerFlags localflags;
1460 perrdetail err;
1461 int iflags = PARSER_FLAGS(flags);
Christian Heimes3c608332008-03-26 22:01:37 +00001462
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001463 node *n = PyParser_ParseFileFlagsEx(fp, filename, &_PyParser_Grammar,
1464 start, ps1, ps2, &err, &iflags);
1465 if (flags == NULL) {
1466 localflags.cf_flags = 0;
1467 flags = &localflags;
1468 }
1469 if (n) {
1470 flags->cf_flags |= iflags & PyCF_MASK;
1471 mod = PyAST_FromNode(n, flags, filename, arena);
1472 PyNode_Free(n);
1473 return mod;
1474 }
1475 else {
1476 err_input(&err);
1477 if (errcode)
1478 *errcode = err.error;
1479 return NULL;
1480 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481}
1482
Guido van Rossuma110aa61994-08-29 12:50:44 +00001483/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001484
Guido van Rossuma110aa61994-08-29 12:50:44 +00001485node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001486PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001487{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001488 perrdetail err;
1489 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1490 start, NULL, NULL, &err, flags);
1491 if (n == NULL)
1492 err_input(&err);
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001493
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001494 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001495}
1496
Guido van Rossuma110aa61994-08-29 12:50:44 +00001497/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001498
Guido van Rossuma110aa61994-08-29 12:50:44 +00001499node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001500PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001501{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001502 perrdetail err;
1503 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1504 start, &err, flags);
1505 if (n == NULL)
1506 err_input(&err);
1507 return n;
Tim Petersfe2127d2001-07-16 05:37:24 +00001508}
1509
1510node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001511PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001512 int start, int flags)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001513{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001514 perrdetail err;
1515 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1516 &_PyParser_Grammar, start, &err, flags);
1517 if (n == NULL)
1518 err_input(&err);
1519 return n;
Thomas Heller6b17abf2002-07-09 09:23:27 +00001520}
1521
1522node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001523PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001524{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001525 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001526}
1527
Guido van Rossum66ebd912003-04-17 16:02:26 +00001528/* May want to move a more generalized form of this to parsetok.c or
1529 even parser modules. */
1530
1531void
1532PyParser_SetError(perrdetail *err)
1533{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001534 err_input(err);
Guido van Rossum66ebd912003-04-17 16:02:26 +00001535}
1536
Guido van Rossuma110aa61994-08-29 12:50:44 +00001537/* Set the error appropriate to the given input error code (see errcode.h) */
1538
1539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001540err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001541{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001542 PyObject *v, *w, *errtype;
1543 PyObject* u = NULL;
1544 char *msg = NULL;
1545 errtype = PyExc_SyntaxError;
1546 switch (err->error) {
1547 case E_ERROR:
1548 return;
1549 case E_SYNTAX:
1550 errtype = PyExc_IndentationError;
1551 if (err->expected == INDENT)
1552 msg = "expected an indented block";
1553 else if (err->token == INDENT)
1554 msg = "unexpected indent";
1555 else if (err->token == DEDENT)
1556 msg = "unexpected unindent";
1557 else {
1558 errtype = PyExc_SyntaxError;
1559 msg = "invalid syntax";
1560 }
1561 break;
1562 case E_TOKEN:
1563 msg = "invalid token";
1564 break;
1565 case E_EOFS:
1566 msg = "EOF while scanning triple-quoted string literal";
1567 break;
1568 case E_EOLS:
1569 msg = "EOL while scanning string literal";
1570 break;
1571 case E_INTR:
1572 if (!PyErr_Occurred())
1573 PyErr_SetNone(PyExc_KeyboardInterrupt);
1574 goto cleanup;
1575 case E_NOMEM:
1576 PyErr_NoMemory();
1577 goto cleanup;
1578 case E_EOF:
1579 msg = "unexpected EOF while parsing";
1580 break;
1581 case E_TABSPACE:
1582 errtype = PyExc_TabError;
1583 msg = "inconsistent use of tabs and spaces in indentation";
1584 break;
1585 case E_OVERFLOW:
1586 msg = "expression too long";
1587 break;
1588 case E_DEDENT:
1589 errtype = PyExc_IndentationError;
1590 msg = "unindent does not match any outer indentation level";
1591 break;
1592 case E_TOODEEP:
1593 errtype = PyExc_IndentationError;
1594 msg = "too many levels of indentation";
1595 break;
1596 case E_DECODE: {
1597 PyObject *type, *value, *tb;
1598 PyErr_Fetch(&type, &value, &tb);
1599 if (value != NULL) {
1600 u = PyObject_Str(value);
1601 if (u != NULL) {
1602 msg = PyString_AsString(u);
1603 }
1604 }
1605 if (msg == NULL)
1606 msg = "unknown decode error";
1607 Py_XDECREF(type);
1608 Py_XDECREF(value);
1609 Py_XDECREF(tb);
1610 break;
1611 }
1612 case E_LINECONT:
1613 msg = "unexpected character after line continuation character";
1614 break;
1615 default:
1616 fprintf(stderr, "error=%d\n", err->error);
1617 msg = "unknown parsing error";
1618 break;
1619 }
1620 v = Py_BuildValue("(ziiz)", err->filename,
1621 err->lineno, err->offset, err->text);
1622 w = NULL;
1623 if (v != NULL)
1624 w = Py_BuildValue("(sO)", msg, v);
1625 Py_XDECREF(u);
1626 Py_XDECREF(v);
1627 PyErr_SetObject(errtype, w);
1628 Py_XDECREF(w);
Georg Brandl1ad108d2008-07-19 10:08:55 +00001629cleanup:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001630 if (err->text != NULL) {
1631 PyObject_FREE(err->text);
1632 err->text = NULL;
1633 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001634}
1635
1636/* Print fatal error message and abort */
1637
1638void
Tim Peters7c321a82002-07-09 02:57:01 +00001639Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001640{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001641 fprintf(stderr, "Fatal Python error: %s\n", msg);
1642 fflush(stderr); /* it helps in Windows debug build */
Jesse Noller42f9b4e2009-03-31 22:20:35 +00001643
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001644#ifdef MS_WINDOWS
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001645 {
1646 size_t len = strlen(msg);
1647 WCHAR* buffer;
1648 size_t i;
Martin v. Löwis5344c992009-01-02 20:32:55 +00001649
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001650 /* Convert the message to wchar_t. This uses a simple one-to-one
1651 conversion, assuming that the this error message actually uses ASCII
1652 only. If this ceases to be true, we will have to convert. */
1653 buffer = alloca( (len+1) * (sizeof *buffer));
1654 for( i=0; i<=len; ++i)
1655 buffer[i] = msg[i];
1656 OutputDebugStringW(L"Fatal Python error: ");
1657 OutputDebugStringW(buffer);
1658 OutputDebugStringW(L"\n");
1659 }
Guido van Rossum0ba35361998-08-13 13:33:16 +00001660#ifdef _DEBUG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001661 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001662#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001663#endif /* MS_WINDOWS */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001664 abort();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001665}
1666
1667/* Clean up and exit */
1668
Guido van Rossuma110aa61994-08-29 12:50:44 +00001669#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001670#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001671#endif
1672
Antoine Pitrouefb60c02009-10-20 21:29:37 +00001673/* Wait until threading._shutdown completes, provided
1674 the threading module was imported in the first place.
1675 The shutdown routine will wait until all non-daemon
1676 "threading" threads have completed. */
1677static void
1678wait_for_thread_shutdown(void)
1679{
1680#ifdef WITH_THREAD
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001681 PyObject *result;
1682 PyThreadState *tstate = PyThreadState_GET();
1683 PyObject *threading = PyMapping_GetItemString(tstate->interp->modules,
1684 "threading");
1685 if (threading == NULL) {
1686 /* threading not imported */
1687 PyErr_Clear();
1688 return;
1689 }
1690 result = PyObject_CallMethod(threading, "_shutdown", "");
1691 if (result == NULL)
1692 PyErr_WriteUnraisable(threading);
1693 else
1694 Py_DECREF(result);
1695 Py_DECREF(threading);
Antoine Pitrouefb60c02009-10-20 21:29:37 +00001696#endif
1697}
1698
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001699#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001700static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001701static int nexitfuncs = 0;
1702
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001703int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001704{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001705 if (nexitfuncs >= NEXITFUNCS)
1706 return -1;
1707 exitfuncs[nexitfuncs++] = func;
1708 return 0;
Guido van Rossum1662dd51994-09-07 14:38:28 +00001709}
1710
Guido van Rossumcc283f51997-08-05 02:22:03 +00001711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001712call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001713{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001715
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001716 if (exitfunc) {
1717 PyObject *res;
1718 Py_INCREF(exitfunc);
1719 PySys_SetObject("exitfunc", (PyObject *)NULL);
1720 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
1721 if (res == NULL) {
1722 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1723 PySys_WriteStderr("Error in sys.exitfunc:\n");
1724 }
1725 PyErr_Print();
1726 }
1727 Py_DECREF(exitfunc);
1728 }
Guido van Rossum59bff391992-09-03 20:28:00 +00001729
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001730 if (Py_FlushLine())
1731 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001732}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001733
Guido van Rossumcc283f51997-08-05 02:22:03 +00001734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001735call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001736{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001737 while (nexitfuncs > 0)
1738 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001739
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 fflush(stdout);
1741 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001742}
1743
1744void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001745Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001746{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001747 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001748
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001749 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001750}
1751
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001753initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001754{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001755#ifdef SIGPIPE
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001756 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001757#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001758#ifdef SIGXFZ
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001759 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001760#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001761#ifdef SIGXFSZ
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001762 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001763#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001764 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001765}
1766
Guido van Rossum7433b121997-02-14 19:45:36 +00001767
1768/*
1769 * The file descriptor fd is considered ``interactive'' if either
1770 * a) isatty(fd) is TRUE, or
1771 * b) the -i flag was given, and the filename associated with
1772 * the descriptor is NULL or "<stdin>" or "???".
1773 */
1774int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001775Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001776{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001777 if (isatty((int)fileno(fp)))
1778 return 1;
1779 if (!Py_InteractiveFlag)
1780 return 0;
1781 return (filename == NULL) ||
1782 (strcmp(filename, "<stdin>") == 0) ||
1783 (strcmp(filename, "???") == 0);
Guido van Rossum7433b121997-02-14 19:45:36 +00001784}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001785
1786
Tim Petersd08e3822003-04-17 15:24:21 +00001787#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001788#if defined(WIN32) && defined(_MSC_VER)
1789
1790/* Stack checking for Microsoft C */
1791
1792#include <malloc.h>
1793#include <excpt.h>
1794
Fred Drakee8de31c2000-08-31 05:38:39 +00001795/*
1796 * Return non-zero when we run out of memory on the stack; zero otherwise.
1797 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001798int
Fred Drake399739f2000-08-31 05:52:44 +00001799PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001800{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001801 __try {
1802 /* alloca throws a stack overflow exception if there's
1803 not enough space left on the stack */
1804 alloca(PYOS_STACK_MARGIN * sizeof(void*));
1805 return 0;
1806 } __except (GetExceptionCode() == STATUS_STACK_OVERFLOW ?
1807 EXCEPTION_EXECUTE_HANDLER :
1808 EXCEPTION_CONTINUE_SEARCH) {
1809 int errcode = _resetstkoflw();
1810 if (errcode == 0)
1811 {
1812 Py_FatalError("Could not reset the stack!");
1813 }
1814 }
1815 return 1;
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001816}
1817
1818#endif /* WIN32 && _MSC_VER */
1819
1820/* Alternate implementations can be added here... */
1821
1822#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001823
1824
1825/* Wrappers around sigaction() or signal(). */
1826
1827PyOS_sighandler_t
1828PyOS_getsig(int sig)
1829{
1830#ifdef HAVE_SIGACTION
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001831 struct sigaction context;
1832 if (sigaction(sig, NULL, &context) == -1)
1833 return SIG_ERR;
1834 return context.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001835#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001836 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001837/* Special signal handling for the secure CRT in Visual Studio 2005 */
1838#if defined(_MSC_VER) && _MSC_VER >= 1400
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001839 switch (sig) {
1840 /* Only these signals are valid */
1841 case SIGINT:
1842 case SIGILL:
1843 case SIGFPE:
1844 case SIGSEGV:
1845 case SIGTERM:
1846 case SIGBREAK:
1847 case SIGABRT:
1848 break;
1849 /* Don't call signal() with other values or it will assert */
1850 default:
1851 return SIG_ERR;
1852 }
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001853#endif /* _MSC_VER && _MSC_VER >= 1400 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001854 handler = signal(sig, SIG_IGN);
1855 if (handler != SIG_ERR)
1856 signal(sig, handler);
1857 return handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001858#endif
1859}
1860
1861PyOS_sighandler_t
1862PyOS_setsig(int sig, PyOS_sighandler_t handler)
1863{
1864#ifdef HAVE_SIGACTION
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001865 /* Some code in Modules/signalmodule.c depends on sigaction() being
1866 * used here if HAVE_SIGACTION is defined. Fix that if this code
1867 * changes to invalidate that assumption.
1868 */
1869 struct sigaction context, ocontext;
1870 context.sa_handler = handler;
1871 sigemptyset(&context.sa_mask);
1872 context.sa_flags = 0;
1873 if (sigaction(sig, &context, &ocontext) == -1)
1874 return SIG_ERR;
1875 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001876#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001877 PyOS_sighandler_t oldhandler;
1878 oldhandler = signal(sig, handler);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001879#ifdef HAVE_SIGINTERRUPT
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001880 siginterrupt(sig, 1);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001881#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001882 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001883#endif
1884}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001885
1886/* Deprecated C API functions still provided for binary compatiblity */
1887
1888#undef PyParser_SimpleParseFile
Thomas Heller1b046642006-04-18 18:51:06 +00001889PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001890PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1891{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001892 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001893}
1894
Thomas Heller1b046642006-04-18 18:51:06 +00001895#undef PyParser_SimpleParseString
1896PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001897PyParser_SimpleParseString(const char *str, int start)
1898{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001899 return PyParser_SimpleParseStringFlags(str, start, 0);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001900}
Anthony Baxterac6bd462006-04-13 02:06:09 +00001901
Thomas Heller1b046642006-04-18 18:51:06 +00001902#undef PyRun_AnyFile
1903PyAPI_FUNC(int)
1904PyRun_AnyFile(FILE *fp, const char *name)
1905{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001906 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001907}
1908
1909#undef PyRun_AnyFileEx
1910PyAPI_FUNC(int)
1911PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1912{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001913 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001914}
1915
1916#undef PyRun_AnyFileFlags
1917PyAPI_FUNC(int)
1918PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1919{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001920 return PyRun_AnyFileExFlags(fp, name, 0, flags);
Thomas Heller1b046642006-04-18 18:51:06 +00001921}
1922
1923#undef PyRun_File
1924PyAPI_FUNC(PyObject *)
1925PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1926{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001927 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001928}
1929
1930#undef PyRun_FileEx
1931PyAPI_FUNC(PyObject *)
1932PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1933{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001934 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001935}
1936
1937#undef PyRun_FileFlags
1938PyAPI_FUNC(PyObject *)
1939PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001940 PyCompilerFlags *flags)
Thomas Heller1b046642006-04-18 18:51:06 +00001941{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001942 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
Thomas Heller1b046642006-04-18 18:51:06 +00001943}
1944
1945#undef PyRun_SimpleFile
1946PyAPI_FUNC(int)
1947PyRun_SimpleFile(FILE *f, const char *p)
1948{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001949 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001950}
1951
1952#undef PyRun_SimpleFileEx
1953PyAPI_FUNC(int)
1954PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1955{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001956 return PyRun_SimpleFileExFlags(f, p, c, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001957}
1958
1959
1960#undef PyRun_String
1961PyAPI_FUNC(PyObject *)
1962PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
1963{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001964 return PyRun_StringFlags(str, s, g, l, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001965}
1966
1967#undef PyRun_SimpleString
1968PyAPI_FUNC(int)
1969PyRun_SimpleString(const char *s)
1970{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001971 return PyRun_SimpleStringFlags(s, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001972}
1973
1974#undef Py_CompileString
1975PyAPI_FUNC(PyObject *)
1976Py_CompileString(const char *str, const char *p, int s)
1977{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001978 return Py_CompileStringFlags(str, p, s, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001979}
1980
1981#undef PyRun_InteractiveOne
1982PyAPI_FUNC(int)
1983PyRun_InteractiveOne(FILE *f, const char *p)
1984{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001985 return PyRun_InteractiveOneFlags(f, p, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001986}
1987
1988#undef PyRun_InteractiveLoop
1989PyAPI_FUNC(int)
1990PyRun_InteractiveLoop(FILE *f, const char *p)
1991{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001992 return PyRun_InteractiveLoopFlags(f, p, NULL);
Thomas Heller1b046642006-04-18 18:51:06 +00001993}
1994
Anthony Baxterac6bd462006-04-13 02:06:09 +00001995#ifdef __cplusplus
1996}
1997#endif
1998