blob: 3a282e7867e3ebd814836560066398e76f173f23 [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 Rossum1984f1e1992-08-04 12:41:02 +00007#include "grammar.h"
8#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +00009#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "errcode.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000012#include "code.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000013#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000014#include "symtable.h"
Neal Norwitzadb69fc2005-12-17 20:54:49 +000015#include "pyarena.h"
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000016#include "ast.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000017#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000018#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000019
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000020#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021
Martin v. Löwis73d538b2003-03-05 15:13:47 +000022#ifdef HAVE_LANGINFO_H
23#include <locale.h>
24#include <langinfo.h>
25#endif
26
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000027#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000028#undef BYTE
29#include "windows.h"
30#endif
31
Neal Norwitz4281cef2006-03-04 19:58:13 +000032#ifndef Py_REF_DEBUG
Tim Peters62e97f02006-03-28 21:44:32 +000033#define PRINT_TOTAL_REFS()
Neal Norwitz4281cef2006-03-04 19:58:13 +000034#else /* Py_REF_DEBUG */
Tim Peters62e97f02006-03-28 21:44:32 +000035#define PRINT_TOTAL_REFS() fprintf(stderr, \
36 "[%" PY_FORMAT_SIZE_T "d refs]\n", \
Armin Rigoe1709372006-04-12 17:06:05 +000037 _Py_GetRefTotal())
Neal Norwitz4281cef2006-03-04 19:58:13 +000038#endif
39
Anthony Baxterac6bd462006-04-13 02:06:09 +000040#ifdef __cplusplus
41extern "C" {
42#endif
43
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000044extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000045
Guido van Rossum82598051997-03-05 00:20:32 +000046extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000047
Guido van Rossumb73cc041993-11-01 16:28:59 +000048/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000049static void initmain(void);
50static void initsite(void);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +000051static PyObject *run_mod(mod_ty, const char *, PyObject *, PyObject *,
Neal Norwitzadb69fc2005-12-17 20:54:49 +000052 PyCompilerFlags *, PyArena *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000053static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Jeremy Hyltonbc320242001-03-22 02:47:58 +000054 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000055static void err_input(perrdetail *);
56static void initsigs(void);
57static void call_sys_exitfunc(void);
58static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000059extern void _PyUnicode_Init(void);
60extern void _PyUnicode_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000061
Mark Hammond8d98d2c2003-04-19 15:41:53 +000062#ifdef WITH_THREAD
63extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
64extern void _PyGILState_Fini(void);
65#endif /* WITH_THREAD */
66
Guido van Rossum82598051997-03-05 00:20:32 +000067int Py_DebugFlag; /* Needed by parser.c */
68int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000069int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000070int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000071int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000072int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000073int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000074int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Tim Peters3caca232001-12-06 06:23:26 +000075/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
76 on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
77 true divisions (which they will be in 2.3). */
78int _Py_QnewFlag = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079
Mark Hammonda43fd0c2003-02-19 00:33:33 +000080/* Reference to 'warnings' module, to avoid importing it
Mark Hammondedd07732003-07-15 23:03:55 +000081 on the fly when the import lock may be held. See 683658/771097
Mark Hammonda43fd0c2003-02-19 00:33:33 +000082*/
Mark Hammondedd07732003-07-15 23:03:55 +000083static PyObject *warnings_module = NULL;
84
85/* Returns a borrowed reference to the 'warnings' module, or NULL.
86 If the module is returned, it is guaranteed to have been obtained
87 without acquiring the import lock
88*/
Martin v. Löwisa2c17c52003-08-09 09:47:11 +000089PyObject *PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000090{
91 PyObject *typ, *val, *tb;
92 PyObject *all_modules;
93 /* If we managed to get the module at init time, just use it */
94 if (warnings_module)
95 return warnings_module;
96 /* If it wasn't available at init time, it may be available
97 now in sys.modules (common scenario is frozen apps: import
98 at init time fails, but the frozen init code sets up sys.path
99 correctly, then does an implicit import of warnings for us
100 */
101 /* Save and restore any exceptions */
102 PyErr_Fetch(&typ, &val, &tb);
103
Mark Hammond5f4e8ca2003-07-16 01:54:38 +0000104 all_modules = PySys_GetObject("modules");
Mark Hammondedd07732003-07-15 23:03:55 +0000105 if (all_modules) {
106 warnings_module = PyDict_GetItemString(all_modules, "warnings");
107 /* We keep a ref in the global */
108 Py_XINCREF(warnings_module);
109 }
110 PyErr_Restore(typ, val, tb);
111 return warnings_module;
112}
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000113
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115
Thomas Wouters7e474022000-07-16 12:04:32 +0000116/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000117
118int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000120{
121 return initialized;
122}
123
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124/* Global initializations. Can be undone by Py_Finalize(). Don't
125 call this twice without an intervening Py_Finalize() call. When
126 initializations fail, a fatal error is issued and the function does
127 not return. On return, the first thread and interpreter state have
128 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130 Locking: you must hold the interpreter lock while calling this.
131 (If the lock has not yet been initialized, that's equivalent to
132 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000133
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000136static int
137add_flag(int flag, const char *envs)
138{
139 int env = atoi(envs);
140 if (flag < env)
141 flag = env;
142 if (flag < 1)
143 flag = 1;
144 return flag;
145}
146
Guido van Rossuma027efa1997-05-05 20:56:21 +0000147void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000148Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000149{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151 PyThreadState *tstate;
152 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000153 char *p;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000154#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
155 char *codeset;
156 char *saved_locale;
157 PyObject *sys_stream, *sys_isatty;
158#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +0000159 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000160
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000161 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000162 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000163 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000164
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000165 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000166 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000167 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000168 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000169 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000170 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000171
Guido van Rossuma027efa1997-05-05 20:56:21 +0000172 interp = PyInterpreterState_New();
173 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000174 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000175
Guido van Rossuma027efa1997-05-05 20:56:21 +0000176 tstate = PyThreadState_New(interp);
177 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000178 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000179 (void) PyThreadState_Swap(tstate);
180
Guido van Rossum70d893a2001-08-16 08:21:42 +0000181 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000182
Neal Norwitzb2501f42002-12-31 03:42:13 +0000183 if (!_PyFrame_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000184 Py_FatalError("Py_Initialize: can't init frames");
185
Neal Norwitzb2501f42002-12-31 03:42:13 +0000186 if (!_PyInt_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000187 Py_FatalError("Py_Initialize: can't init ints");
188
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000189 _PyFloat_Init();
190
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191 interp->modules = PyDict_New();
192 if (interp->modules == NULL)
193 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000194
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000195#ifdef Py_USING_UNICODE
Guido van Rossumc94044c2000-03-10 23:03:54 +0000196 /* Init Unicode implementation; relies on the codec registry */
197 _PyUnicode_Init();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000198#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000199
Barry Warsawf242aa02000-05-25 23:09:49 +0000200 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000201 if (bimod == NULL)
202 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000203 interp->builtins = PyModule_GetDict(bimod);
204 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000205
206 sysmod = _PySys_Init();
207 if (sysmod == NULL)
208 Py_FatalError("Py_Initialize: can't initialize sys");
209 interp->sysdict = PyModule_GetDict(sysmod);
210 Py_INCREF(interp->sysdict);
211 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000212 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213 PyDict_SetItemString(interp->sysdict, "modules",
214 interp->modules);
215
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000216 _PyImport_Init();
217
Barry Warsawf242aa02000-05-25 23:09:49 +0000218 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000219 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000220 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000221
Barry Warsaw035574d1997-08-29 22:07:17 +0000222 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000223 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000224
Just van Rossum52e14d62002-12-30 22:08:05 +0000225 _PyImportHooks_Init();
226
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000227 if (install_sigs)
228 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000229
230 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000231 if (!Py_NoSiteFlag)
232 initsite(); /* Module site */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000233
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000234 /* auto-thread-state API, if available */
235#ifdef WITH_THREAD
236 _PyGILState_Init(interp, tstate);
237#endif /* WITH_THREAD */
238
Mark Hammondedd07732003-07-15 23:03:55 +0000239 warnings_module = PyImport_ImportModule("warnings");
240 if (!warnings_module)
241 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000242
243#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
244 /* On Unix, set the file system encoding according to the
245 user's preference, if the CODESET names a well-known
246 Python codec, and Py_FileSystemDefaultEncoding isn't
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000247 initialized by other means. Also set the encoding of
248 stdin and stdout if these are terminals. */
249
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000250 saved_locale = strdup(setlocale(LC_CTYPE, NULL));
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000251 setlocale(LC_CTYPE, "");
252 codeset = nl_langinfo(CODESET);
253 if (codeset && *codeset) {
254 PyObject *enc = PyCodec_Encoder(codeset);
255 if (enc) {
256 codeset = strdup(codeset);
257 Py_DECREF(enc);
258 } else {
259 codeset = NULL;
260 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000261 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000262 } else
263 codeset = NULL;
264 setlocale(LC_CTYPE, saved_locale);
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000265 free(saved_locale);
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000266
267 if (codeset) {
Michael W. Hudson68debc92003-08-11 12:20:24 +0000268 sys_stream = PySys_GetObject("stdin");
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000269 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
270 if (!sys_isatty)
271 PyErr_Clear();
272 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
273 if (!PyFile_SetEncoding(sys_stream, codeset))
274 Py_FatalError("Cannot set codeset of stdin");
275 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000276 Py_XDECREF(sys_isatty);
277
278 sys_stream = PySys_GetObject("stdout");
279 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
280 if (!sys_isatty)
281 PyErr_Clear();
282 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
283 if (!PyFile_SetEncoding(sys_stream, codeset))
284 Py_FatalError("Cannot set codeset of stdout");
285 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000286 Py_XDECREF(sys_isatty);
287
Martin v. Löwisea62d252006-04-03 10:56:49 +0000288 sys_stream = PySys_GetObject("stderr");
289 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
290 if (!sys_isatty)
291 PyErr_Clear();
292 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
293 if (!PyFile_SetEncoding(sys_stream, codeset))
294 Py_FatalError("Cannot set codeset of stderr");
295 }
296 Py_XDECREF(sys_isatty);
297
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000298 if (!Py_FileSystemDefaultEncoding)
299 Py_FileSystemDefaultEncoding = codeset;
300 else
301 free(codeset);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000302 }
303#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000304}
305
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000306void
307Py_Initialize(void)
308{
309 Py_InitializeEx(1);
310}
311
312
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000313#ifdef COUNT_ALLOCS
Martin v. Löwis45294a92006-04-18 06:24:08 +0000314extern void dump_counts(FILE*);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000315#endif
316
Guido van Rossum25ce5661997-08-02 03:10:38 +0000317/* Undo the effect of Py_Initialize().
318
319 Beware: if multiple interpreter and/or thread states exist, these
320 are not wiped out; only the current thread and interpreter state
321 are deleted. But since everything else is deleted, those other
322 interpreter and thread states should no longer be used.
323
324 (XXX We should do better, e.g. wipe out all interpreters and
325 threads.)
326
327 Locking: as above.
328
329*/
330
331void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000333{
334 PyInterpreterState *interp;
335 PyThreadState *tstate;
336
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000337 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000338 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000339
Tim Peters384fd102001-01-21 03:40:37 +0000340 /* The interpreter is still entirely intact at this point, and the
341 * exit funcs may be relying on that. In particular, if some thread
342 * or exit func is still waiting to do an import, the import machinery
343 * expects Py_IsInitialized() to return true. So don't say the
344 * interpreter is uninitialized until after the exit funcs have run.
345 * Note that Threading.py uses an exit func to do a join on all the
346 * threads created thru it, so this also protects pending imports in
347 * the threads created via Threading.
348 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000349 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000350 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000351
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000352 /* Get current thread state and interpreter pointer */
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000353 tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000354 interp = tstate->interp;
355
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000356 /* Disable signal handling */
357 PyOS_FiniInterrupts();
358
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000359 /* drop module references we saved */
Mark Hammondedd07732003-07-15 23:03:55 +0000360 Py_XDECREF(warnings_module);
361 warnings_module = NULL;
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000362
Guido van Rossume13ddc92003-04-17 17:29:22 +0000363 /* Collect garbage. This may call finalizers; it's nice to call these
Tim Peters1d7323e2003-12-01 21:35:27 +0000364 * before all modules are destroyed.
365 * XXX If a __del__ or weakref callback is triggered here, and tries to
366 * XXX import a module, bad things can happen, because Python no
367 * XXX longer believes it's initialized.
368 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
369 * XXX is easy to provoke that way. I've also seen, e.g.,
370 * XXX Exception exceptions.ImportError: 'No module named sha'
371 * XXX in <function callback at 0x008F5718> ignored
372 * XXX but I'm unclear on exactly how that one happens. In any case,
373 * XXX I haven't seen a real-life report of either of these.
Neal Norwitz9589ee22006-03-04 19:01:22 +0000374 */
Guido van Rossume13ddc92003-04-17 17:29:22 +0000375 PyGC_Collect();
Martin v. Löwis45294a92006-04-18 06:24:08 +0000376#ifdef COUNT_ALLOCS
377 /* With COUNT_ALLOCS, it helps to run GC multiple times:
378 each collection might release some types from the type
379 list, so they become garbage. */
380 while (PyGC_Collect() > 0)
381 /* nothing */;
382#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000383
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000384 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000385 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000386
Guido van Rossume13ddc92003-04-17 17:29:22 +0000387 /* Collect final garbage. This disposes of cycles created by
Tim Peters1d7323e2003-12-01 21:35:27 +0000388 * new-style class definitions, for example.
389 * XXX This is disabled because it caused too many problems. If
390 * XXX a __del__ or weakref callback triggers here, Python code has
391 * XXX a hard time running, because even the sys module has been
392 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
393 * XXX One symptom is a sequence of information-free messages
394 * XXX coming from threads (if a __del__ or callback is invoked,
395 * XXX other threads can execute too, and any exception they encounter
396 * XXX triggers a comedy of errors as subsystem after subsystem
397 * XXX fails to find what it *expects* to find in sys to help report
398 * XXX the exception and consequent unexpected failures). I've also
399 * XXX seen segfaults then, after adding print statements to the
400 * XXX Python code getting called.
401 */
402#if 0
Guido van Rossume13ddc92003-04-17 17:29:22 +0000403 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000404#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000405
Guido van Rossum1707aad1997-12-08 23:43:45 +0000406 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
407 _PyImport_Fini();
408
409 /* Debugging stuff */
410#ifdef COUNT_ALLOCS
Martin v. Löwis45294a92006-04-18 06:24:08 +0000411 dump_counts(stdout);
Guido van Rossum1707aad1997-12-08 23:43:45 +0000412#endif
413
Tim Peters62e97f02006-03-28 21:44:32 +0000414 PRINT_TOTAL_REFS();
Guido van Rossum1707aad1997-12-08 23:43:45 +0000415
Tim Peters9cf25ce2003-04-17 15:21:01 +0000416#ifdef Py_TRACE_REFS
417 /* Display all objects still alive -- this can invoke arbitrary
418 * __repr__ overrides, so requires a mostly-intact interpreter.
419 * Alas, a lot of stuff may still be alive now that will be cleaned
420 * up later.
421 */
Tim Peters269b2a62003-04-17 19:52:29 +0000422 if (Py_GETENV("PYTHONDUMPREFS"))
Tim Peters9cf25ce2003-04-17 15:21:01 +0000423 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000424#endif /* Py_TRACE_REFS */
425
Mark Hammond6cb90292003-04-22 11:18:00 +0000426 /* Cleanup auto-thread-state */
427#ifdef WITH_THREAD
428 _PyGILState_Fini();
429#endif /* WITH_THREAD */
430
Guido van Rossumd922fa42003-04-15 14:10:09 +0000431 /* Clear interpreter state */
Barry Warsawf242aa02000-05-25 23:09:49 +0000432 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000433
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000434 /* Now we decref the exception classes. After this point nothing
435 can raise an exception. That's okay, because each Fini() method
436 below has been checked to make sure no exceptions are ever
437 raised.
438 */
439
440 _PyExc_Fini();
441
Guido van Rossumd922fa42003-04-15 14:10:09 +0000442 /* Delete current thread */
Barry Warsawf242aa02000-05-25 23:09:49 +0000443 PyThreadState_Swap(NULL);
444 PyInterpreterState_Delete(interp);
445
Guido van Rossumd922fa42003-04-15 14:10:09 +0000446 /* Sundry finalizers */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000447 PyMethod_Fini();
448 PyFrame_Fini();
449 PyCFunction_Fini();
450 PyTuple_Fini();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000451 PyList_Fini();
Raymond Hettingerd7946662005-08-01 21:39:29 +0000452 PySet_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000453 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000454 PyInt_Fini();
455 PyFloat_Fini();
456
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000457#ifdef Py_USING_UNICODE
458 /* Cleanup Unicode implementation */
459 _PyUnicode_Fini();
460#endif
461
Guido van Rossumcc283f51997-08-05 02:22:03 +0000462 /* XXX Still allocated:
463 - various static ad-hoc pointers to interned strings
464 - int and float free list blocks
465 - whatever various modules and libraries allocate
466 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000467
468 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000469
Tim Peters269b2a62003-04-17 19:52:29 +0000470#ifdef Py_TRACE_REFS
471 /* Display addresses (& refcnts) of all objects still alive.
472 * An address can be used to find the repr of the object, printed
473 * above by _Py_PrintReferences.
474 */
475 if (Py_GETENV("PYTHONDUMPREFS"))
476 _Py_PrintReferenceAddresses(stderr);
477#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000478#ifdef PYMALLOC_DEBUG
479 if (Py_GETENV("PYTHONMALLOCSTATS"))
480 _PyObject_DebugMallocStats();
481#endif
482
Guido van Rossumcc283f51997-08-05 02:22:03 +0000483 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000484}
485
486/* Create and initialize a new interpreter and thread, and return the
487 new thread. This requires that Py_Initialize() has been called
488 first.
489
490 Unsuccessful initialization yields a NULL pointer. Note that *no*
491 exception information is available even in this case -- the
492 exception information is held in the thread, and there is no
493 thread.
494
495 Locking: as above.
496
497*/
498
499PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000500Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000501{
502 PyInterpreterState *interp;
503 PyThreadState *tstate, *save_tstate;
504 PyObject *bimod, *sysmod;
505
506 if (!initialized)
507 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
508
509 interp = PyInterpreterState_New();
510 if (interp == NULL)
511 return NULL;
512
513 tstate = PyThreadState_New(interp);
514 if (tstate == NULL) {
515 PyInterpreterState_Delete(interp);
516 return NULL;
517 }
518
519 save_tstate = PyThreadState_Swap(tstate);
520
521 /* XXX The following is lax in error checking */
522
523 interp->modules = PyDict_New();
524
525 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
526 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000527 interp->builtins = PyModule_GetDict(bimod);
528 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000529 }
530 sysmod = _PyImport_FindExtension("sys", "sys");
531 if (bimod != NULL && sysmod != NULL) {
532 interp->sysdict = PyModule_GetDict(sysmod);
533 Py_INCREF(interp->sysdict);
534 PySys_SetPath(Py_GetPath());
535 PyDict_SetItemString(interp->sysdict, "modules",
536 interp->modules);
Martin v. Löwisd7ceb222003-01-22 09:00:38 +0000537 _PyImportHooks_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000538 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000539 if (!Py_NoSiteFlag)
540 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000541 }
542
543 if (!PyErr_Occurred())
544 return tstate;
545
546 /* Oops, it didn't work. Undo it all. */
547
548 PyErr_Print();
549 PyThreadState_Clear(tstate);
550 PyThreadState_Swap(save_tstate);
551 PyThreadState_Delete(tstate);
552 PyInterpreterState_Delete(interp);
553
554 return NULL;
555}
556
557/* Delete an interpreter and its last thread. This requires that the
558 given thread state is current, that the thread has no remaining
559 frames, and that it is its interpreter's only remaining thread.
560 It is a fatal error to violate these constraints.
561
562 (Py_Finalize() doesn't have these constraints -- it zaps
563 everything, regardless.)
564
565 Locking: as above.
566
567*/
568
569void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000570Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000571{
572 PyInterpreterState *interp = tstate->interp;
573
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000574 if (tstate != PyThreadState_GET())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000575 Py_FatalError("Py_EndInterpreter: thread is not current");
576 if (tstate->frame != NULL)
577 Py_FatalError("Py_EndInterpreter: thread still has a frame");
578 if (tstate != interp->tstate_head || tstate->next != NULL)
579 Py_FatalError("Py_EndInterpreter: not the last thread");
580
581 PyImport_Cleanup();
582 PyInterpreterState_Clear(interp);
583 PyThreadState_Swap(NULL);
584 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000585}
586
587static char *progname = "python";
588
589void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000590Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000591{
592 if (pn && *pn)
593 progname = pn;
594}
595
596char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000597Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000598{
599 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600}
601
Guido van Rossuma61691e1998-02-06 22:27:24 +0000602static char *default_home = NULL;
603
604void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000605Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000606{
607 default_home = home;
608}
609
610char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000612{
613 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000614 if (home == NULL && !Py_IgnoreEnvironmentFlag)
615 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000616 return home;
617}
618
Guido van Rossum6135a871995-01-09 17:53:26 +0000619/* Create __main__ module */
620
621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000622initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000623{
Guido van Rossum82598051997-03-05 00:20:32 +0000624 PyObject *m, *d;
625 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000626 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000627 Py_FatalError("can't create __main__ module");
628 d = PyModule_GetDict(m);
629 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000630 PyObject *bimod = PyImport_ImportModule("__builtin__");
631 if (bimod == NULL ||
632 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000633 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000634 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000635 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636}
637
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000638/* Import the site module (not into __main__ though) */
639
640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000641initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000642{
643 PyObject *m, *f;
644 m = PyImport_ImportModule("site");
645 if (m == NULL) {
646 f = PySys_GetObject("stderr");
647 if (Py_VerboseFlag) {
648 PyFile_WriteString(
649 "'import site' failed; traceback:\n", f);
650 PyErr_Print();
651 }
652 else {
653 PyFile_WriteString(
654 "'import site' failed; use -v for traceback\n", f);
655 PyErr_Clear();
656 }
657 }
658 else {
659 Py_DECREF(m);
660 }
661}
662
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663/* Parse input from a file and execute it */
664
665int
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000666PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000667 PyCompilerFlags *flags)
668{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669 if (filename == NULL)
670 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000671 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000672 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000673 if (closeit)
674 fclose(fp);
675 return err;
676 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000678 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679}
680
681int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000682PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000683{
Guido van Rossum82598051997-03-05 00:20:32 +0000684 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000685 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000686 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000687
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000688 if (flags == NULL) {
689 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000690 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000691 }
Guido van Rossum82598051997-03-05 00:20:32 +0000692 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000693 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000694 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
695 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696 }
Guido van Rossum82598051997-03-05 00:20:32 +0000697 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000698 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000699 PySys_SetObject("ps2", v = PyString_FromString("... "));
700 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000701 }
702 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000703 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Tim Peters62e97f02006-03-28 21:44:32 +0000704 PRINT_TOTAL_REFS();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705 if (ret == E_EOF)
706 return 0;
707 /*
708 if (ret == E_NOMEM)
709 return -1;
710 */
711 }
712}
713
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000714/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000715#define PARSER_FLAGS(flags) \
Thomas Wouters34aa7ba2006-02-28 19:02:24 +0000716 ((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
717 PyPARSE_DONT_IMPLY_DEDENT : 0) \
Neal Norwitz9589ee22006-03-04 19:01:22 +0000718 | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
719 PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000720
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000721int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000722PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000723{
Guido van Rossum82598051997-03-05 00:20:32 +0000724 PyObject *m, *d, *v, *w;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000725 mod_ty mod;
Neal Norwitz9589ee22006-03-04 19:01:22 +0000726 PyArena *arena;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000727 char *ps1 = "", *ps2 = "";
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000728 int errcode = 0;
Tim Petersfe2127d2001-07-16 05:37:24 +0000729
Guido van Rossum82598051997-03-05 00:20:32 +0000730 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000731 if (v != NULL) {
732 v = PyObject_Str(v);
733 if (v == NULL)
734 PyErr_Clear();
735 else if (PyString_Check(v))
736 ps1 = PyString_AsString(v);
737 }
Guido van Rossum82598051997-03-05 00:20:32 +0000738 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000739 if (w != NULL) {
740 w = PyObject_Str(w);
741 if (w == NULL)
742 PyErr_Clear();
743 else if (PyString_Check(w))
744 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000745 }
Neal Norwitz9589ee22006-03-04 19:01:22 +0000746 arena = PyArena_New();
Tim Peters5e9d6cf2006-05-28 10:41:29 +0000747 mod = PyParser_ASTFromFile(fp, filename,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000748 Py_single_input, ps1, ps2,
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000749 flags, &errcode, arena);
Guido van Rossum82598051997-03-05 00:20:32 +0000750 Py_XDECREF(v);
751 Py_XDECREF(w);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000752 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000753 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000754 if (errcode == E_EOF) {
755 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000756 return E_EOF;
757 }
Guido van Rossum82598051997-03-05 00:20:32 +0000758 PyErr_Print();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000759 return -1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000760 }
Guido van Rossum82598051997-03-05 00:20:32 +0000761 m = PyImport_AddModule("__main__");
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000762 if (m == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +0000763 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000764 return -1;
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000765 }
Guido van Rossum82598051997-03-05 00:20:32 +0000766 d = PyModule_GetDict(m);
Neal Norwitzadb69fc2005-12-17 20:54:49 +0000767 v = run_mod(mod, filename, d, d, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +0000768 PyArena_Free(arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000769 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000770 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000771 return -1;
772 }
Guido van Rossum82598051997-03-05 00:20:32 +0000773 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000774 if (Py_FlushLine())
775 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000776 return 0;
777}
778
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000779/* Check whether a file maybe a pyc file: Look at the extension,
780 the file type, and, if we may close it, at the first few bytes. */
781
782static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000783maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000784{
785 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
786 return 1;
787
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000788 /* Only look into the file if we are allowed to close it, since
789 it then should also be seekable. */
790 if (closeit) {
791 /* Read only two bytes of the magic. If the file was opened in
792 text mode, the bytes 3 and 4 of the magic (\r\n) might not
793 be read as they are on disk. */
794 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
795 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000796 /* Mess: In case of -x, the stream is NOT at its start now,
797 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000798 which makes the current stream position formally undefined,
799 and a x-platform nightmare.
800 Unfortunately, we have no direct way to know whether -x
801 was specified. So we use a terrible hack: if the current
802 stream position is not 0, we assume -x was specified, and
803 give up. Bug 132850 on SourceForge spells out the
804 hopelessness of trying anything else (fseek and ftell
805 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000806 */
Tim Peters3e876562001-02-11 04:35:39 +0000807 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000808 if (ftell(fp) == 0) {
809 if (fread(buf, 1, 2, fp) == 2 &&
Tim Petersd08e3822003-04-17 15:24:21 +0000810 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000811 ispyc = 1;
812 rewind(fp);
813 }
Tim Peters3e876562001-02-11 04:35:39 +0000814 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000815 }
816 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +0000817}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000818
Guido van Rossum0df002c2000-08-27 19:21:52 +0000819int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000820PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000821 PyCompilerFlags *flags)
822{
Guido van Rossum82598051997-03-05 00:20:32 +0000823 PyObject *m, *d, *v;
Martin v. Löwis95292d62002-12-11 14:04:59 +0000824 const char *ext;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000825
Guido van Rossum82598051997-03-05 00:20:32 +0000826 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000827 if (m == NULL)
828 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000829 d = PyModule_GetDict(m);
Fred Drake8ed02042002-10-17 21:24:58 +0000830 if (PyDict_GetItemString(d, "__file__") == NULL) {
831 PyObject *f = PyString_FromString(filename);
832 if (f == NULL)
833 return -1;
834 if (PyDict_SetItemString(d, "__file__", f) < 0) {
835 Py_DECREF(f);
836 return -1;
837 }
838 Py_DECREF(f);
839 }
Guido van Rossumfdef2711994-09-14 13:31:04 +0000840 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000841 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000842 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000843 if (closeit)
844 fclose(fp);
Fred Drake8ed02042002-10-17 21:24:58 +0000845 if ((fp = fopen(filename, "rb")) == NULL) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000846 fprintf(stderr, "python: Can't reopen .pyc file\n");
847 return -1;
848 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000849 /* Turn on optimization if a .pyo file is given */
850 if (strcmp(ext, ".pyo") == 0)
851 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000852 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000853 } else {
Tim Petersd08e3822003-04-17 15:24:21 +0000854 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000855 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000856 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000858 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 return -1;
860 }
Guido van Rossum82598051997-03-05 00:20:32 +0000861 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000862 if (Py_FlushLine())
863 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000864 return 0;
865}
866
867int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000868PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +0000869{
Guido van Rossum82598051997-03-05 00:20:32 +0000870 PyObject *m, *d, *v;
871 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000872 if (m == NULL)
873 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000874 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +0000875 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000876 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000877 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000878 return -1;
879 }
Guido van Rossum82598051997-03-05 00:20:32 +0000880 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000881 if (Py_FlushLine())
882 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883 return 0;
884}
885
Barry Warsaw035574d1997-08-29 22:07:17 +0000886static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000887parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
888 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000889{
890 long hold;
891 PyObject *v;
892
893 /* old style errors */
894 if (PyTuple_Check(err))
Neal Norwitz78293352002-04-01 01:41:20 +0000895 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
Neal Norwitz9589ee22006-03-04 19:01:22 +0000896 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +0000897
898 /* new style errors. `err' is an instance */
899
900 if (! (v = PyObject_GetAttrString(err, "msg")))
901 goto finally;
902 *message = v;
903
904 if (!(v = PyObject_GetAttrString(err, "filename")))
905 goto finally;
906 if (v == Py_None)
907 *filename = NULL;
908 else if (! (*filename = PyString_AsString(v)))
909 goto finally;
910
911 Py_DECREF(v);
912 if (!(v = PyObject_GetAttrString(err, "lineno")))
913 goto finally;
914 hold = PyInt_AsLong(v);
915 Py_DECREF(v);
916 v = NULL;
917 if (hold < 0 && PyErr_Occurred())
918 goto finally;
919 *lineno = (int)hold;
920
921 if (!(v = PyObject_GetAttrString(err, "offset")))
922 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000923 if (v == Py_None) {
924 *offset = -1;
925 Py_DECREF(v);
926 v = NULL;
927 } else {
928 hold = PyInt_AsLong(v);
929 Py_DECREF(v);
930 v = NULL;
931 if (hold < 0 && PyErr_Occurred())
932 goto finally;
933 *offset = (int)hold;
934 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000935
936 if (!(v = PyObject_GetAttrString(err, "text")))
937 goto finally;
938 if (v == Py_None)
939 *text = NULL;
940 else if (! (*text = PyString_AsString(v)))
941 goto finally;
942 Py_DECREF(v);
943 return 1;
944
945finally:
946 Py_XDECREF(v);
947 return 0;
948}
949
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000950void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000951PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000952{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000953 PyErr_PrintEx(1);
954}
955
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000956static void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000957print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000958{
959 char *nl;
960 if (offset >= 0) {
961 if (offset > 0 && offset == (int)strlen(text))
962 offset--;
963 for (;;) {
964 nl = strchr(text, '\n');
965 if (nl == NULL || nl-text >= offset)
966 break;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000967 offset -= (int)(nl+1-text);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000968 text = nl+1;
969 }
970 while (*text == ' ' || *text == '\t') {
971 text++;
972 offset--;
973 }
974 }
975 PyFile_WriteString(" ", f);
976 PyFile_WriteString(text, f);
977 if (*text == '\0' || text[strlen(text)-1] != '\n')
978 PyFile_WriteString("\n", f);
979 if (offset == -1)
980 return;
981 PyFile_WriteString(" ", f);
982 offset--;
983 while (offset > 0) {
984 PyFile_WriteString(" ", f);
985 offset--;
986 }
987 PyFile_WriteString("^\n", f);
988}
989
Guido van Rossum66e8e862001-03-23 17:54:43 +0000990static void
991handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000992{
Neal Norwitz9589ee22006-03-04 19:01:22 +0000993 PyObject *exception, *value, *tb;
994 int exitcode = 0;
Tim Peterscf615b52003-04-19 18:47:02 +0000995
Guido van Rossum66e8e862001-03-23 17:54:43 +0000996 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000997 if (Py_FlushLine())
998 PyErr_Clear();
999 fflush(stdout);
1000 if (value == NULL || value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001001 goto done;
Brett Cannonbf364092006-03-01 04:25:17 +00001002 if (PyExceptionInstance_Check(value)) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001003 /* The error code should be in the `code' attribute. */
1004 PyObject *code = PyObject_GetAttrString(value, "code");
1005 if (code) {
1006 Py_DECREF(value);
1007 value = code;
1008 if (value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001009 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001010 }
1011 /* If we failed to dig out the 'code' attribute,
1012 just let the else clause below print the error. */
1013 }
1014 if (PyInt_Check(value))
Tim Peterscf615b52003-04-19 18:47:02 +00001015 exitcode = (int)PyInt_AsLong(value);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001016 else {
1017 PyObject_Print(value, stderr, Py_PRINT_RAW);
1018 PySys_WriteStderr("\n");
Tim Peterscf615b52003-04-19 18:47:02 +00001019 exitcode = 1;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001020 }
Tim Peterscf615b52003-04-19 18:47:02 +00001021 done:
Neal Norwitz9589ee22006-03-04 19:01:22 +00001022 /* Restore and clear the exception info, in order to properly decref
1023 * the exception, value, and traceback. If we just exit instead,
1024 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1025 * some finalizers from running.
1026 */
Tim Peterscf615b52003-04-19 18:47:02 +00001027 PyErr_Restore(exception, value, tb);
1028 PyErr_Clear();
1029 Py_Exit(exitcode);
1030 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001031}
1032
1033void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001034PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001035{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001036 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001037
1038 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1039 handle_system_exit();
1040 }
Guido van Rossum82598051997-03-05 00:20:32 +00001041 PyErr_Fetch(&exception, &v, &tb);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001042 if (exception == NULL)
1043 return;
Barry Warsaw035574d1997-08-29 22:07:17 +00001044 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001045 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +00001046 return;
Guido van Rossum9d785502006-03-07 18:31:44 +00001047 /* Now we know v != NULL too */
Guido van Rossuma61691e1998-02-06 22:27:24 +00001048 if (set_sys_last_vars) {
1049 PySys_SetObject("last_type", exception);
1050 PySys_SetObject("last_value", v);
1051 PySys_SetObject("last_traceback", tb);
1052 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001053 hook = PySys_GetObject("excepthook");
1054 if (hook) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001055 PyObject *args = PyTuple_Pack(3,
Guido van Rossum9d785502006-03-07 18:31:44 +00001056 exception, v, tb ? tb : Py_None);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001057 PyObject *result = PyEval_CallObject(hook, args);
1058 if (result == NULL) {
1059 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001060 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1061 handle_system_exit();
1062 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001063 PyErr_Fetch(&exception2, &v2, &tb2);
1064 PyErr_NormalizeException(&exception2, &v2, &tb2);
1065 if (Py_FlushLine())
1066 PyErr_Clear();
1067 fflush(stdout);
1068 PySys_WriteStderr("Error in sys.excepthook:\n");
1069 PyErr_Display(exception2, v2, tb2);
1070 PySys_WriteStderr("\nOriginal exception was:\n");
1071 PyErr_Display(exception, v, tb);
Jeremy Hylton07028582001-12-07 15:35:35 +00001072 Py_XDECREF(exception2);
1073 Py_XDECREF(v2);
1074 Py_XDECREF(tb2);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001075 }
1076 Py_XDECREF(result);
1077 Py_XDECREF(args);
1078 } else {
1079 PySys_WriteStderr("sys.excepthook is missing\n");
1080 PyErr_Display(exception, v, tb);
1081 }
1082 Py_XDECREF(exception);
1083 Py_XDECREF(v);
1084 Py_XDECREF(tb);
1085}
1086
Richard Jones7b9558d2006-05-27 12:29:24 +00001087void
1088PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001089{
1090 int err = 0;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001091 PyObject *f = PySys_GetObject("stderr");
Armin Rigo5d2c6832004-03-22 20:16:58 +00001092 Py_INCREF(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001093 if (f == NULL)
1094 fprintf(stderr, "lost sys.stderr\n");
1095 else {
Guido van Rossum0829c751998-02-28 04:31:39 +00001096 if (Py_FlushLine())
1097 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001098 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001099 if (tb && tb != Py_None)
1100 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +00001101 if (err == 0 &&
Armin Rigo5d2c6832004-03-22 20:16:58 +00001102 PyObject_HasAttrString(value, "print_file_and_line"))
Barry Warsaw36b8f941997-08-26 18:09:48 +00001103 {
Guido van Rossum82598051997-03-05 00:20:32 +00001104 PyObject *message;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001105 const char *filename, *text;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001106 int lineno, offset;
Armin Rigo5d2c6832004-03-22 20:16:58 +00001107 if (!parse_syntax_error(value, &message, &filename,
Barry Warsaw035574d1997-08-29 22:07:17 +00001108 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +00001109 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001110 else {
1111 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +00001112 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001113 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +00001114 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001115 else
Guido van Rossum82598051997-03-05 00:20:32 +00001116 PyFile_WriteString(filename, f);
1117 PyFile_WriteString("\", line ", f);
Jeremy Hylton518ab1c2001-11-28 20:42:20 +00001118 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +00001119 PyFile_WriteString(buf, f);
1120 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001121 if (text != NULL)
1122 print_error_text(f, offset, text);
Armin Rigo5d2c6832004-03-22 20:16:58 +00001123 Py_DECREF(value);
1124 value = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001125 /* Can't be bothered to check all those
1126 PyFile_WriteString() calls */
1127 if (PyErr_Occurred())
1128 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001129 }
1130 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001131 if (err) {
1132 /* Don't do anything else */
1133 }
Brett Cannonbf364092006-03-01 04:25:17 +00001134 else if (PyExceptionClass_Check(exception)) {
Richard Jones7b9558d2006-05-27 12:29:24 +00001135 PyObject* moduleName;
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001136 char* className = PyExceptionClass_Name(exception);
1137 if (className != NULL) {
1138 char *dot = strrchr(className, '.');
1139 if (dot != NULL)
1140 className = dot+1;
1141 }
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001142
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001143 moduleName = PyObject_GetAttrString(exception, "__module__");
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001144 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001145 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001146 else {
1147 char* modstr = PyString_AsString(moduleName);
Tim Petersd08e3822003-04-17 15:24:21 +00001148 if (modstr && strcmp(modstr, "exceptions"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001149 {
1150 err = PyFile_WriteString(modstr, f);
1151 err += PyFile_WriteString(".", f);
1152 }
Richard Jones7b9558d2006-05-27 12:29:24 +00001153 Py_DECREF(moduleName);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001154 }
1155 if (err == 0) {
1156 if (className == NULL)
1157 err = PyFile_WriteString("<unknown>", f);
1158 else
Brett Cannonbf364092006-03-01 04:25:17 +00001159 err = PyFile_WriteString(className, f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001160 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001161 }
1162 else
1163 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
Brett Cannon2e63b732006-03-02 18:34:57 +00001164 if (err == 0 && (value != Py_None)) {
1165 PyObject *s = PyObject_Str(value);
1166 /* only print colon if the str() of the
1167 object is not the empty string
1168 */
1169 if (s == NULL)
1170 err = -1;
1171 else if (!PyString_Check(s) ||
1172 PyString_GET_SIZE(s) != 0)
1173 err = PyFile_WriteString(": ", f);
1174 if (err == 0)
1175 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1176 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001177 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001178 if (err == 0)
1179 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001180 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001181 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001182 /* If an error happened here, don't show it.
1183 XXX This is wrong, but too many callers rely on this behavior. */
1184 if (err != 0)
1185 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001186}
1187
Guido van Rossum82598051997-03-05 00:20:32 +00001188PyObject *
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001189PyRun_StringFlags(const char *str, int start, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001190 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001191{
Neal Norwitze92fba02006-03-04 18:52:26 +00001192 PyObject *ret = NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001193 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001194 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001195 arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001196 if (mod != NULL)
1197 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001198 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001199 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001200}
1201
1202PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001203PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001204 PyObject *locals, int closeit, PyCompilerFlags *flags)
1205{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 PyObject *ret;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001207 PyArena *arena = PyArena_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001208 mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001209 flags, NULL, arena);
1210 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001211 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001213 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001214 if (closeit)
1215 fclose(fp);
Neal Norwitze92fba02006-03-04 18:52:26 +00001216 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001217 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001218 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001219}
1220
Guido van Rossum82598051997-03-05 00:20:32 +00001221static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001222run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001223 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001224{
Guido van Rossum82598051997-03-05 00:20:32 +00001225 PyCodeObject *co;
1226 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001227 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001228 if (co == NULL)
1229 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001230 v = PyEval_EvalCode(co, globals, locals);
1231 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001232 return v;
1233}
1234
Guido van Rossum82598051997-03-05 00:20:32 +00001235static PyObject *
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001236run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001237 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001238{
Guido van Rossum82598051997-03-05 00:20:32 +00001239 PyCodeObject *co;
1240 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001241 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001242 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001243
Guido van Rossum82598051997-03-05 00:20:32 +00001244 magic = PyMarshal_ReadLongFromFile(fp);
1245 if (magic != PyImport_GetMagicNumber()) {
1246 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001247 "Bad magic number in .pyc file");
1248 return NULL;
1249 }
Guido van Rossum82598051997-03-05 00:20:32 +00001250 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001251 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001252 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001253 if (v == NULL || !PyCode_Check(v)) {
1254 Py_XDECREF(v);
1255 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001256 "Bad code object in .pyc file");
1257 return NULL;
1258 }
Guido van Rossum82598051997-03-05 00:20:32 +00001259 co = (PyCodeObject *)v;
1260 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001261 if (v && flags)
1262 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001263 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001264 return v;
1265}
1266
Guido van Rossum82598051997-03-05 00:20:32 +00001267PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001268Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001269 PyCompilerFlags *flags)
1270{
Guido van Rossum82598051997-03-05 00:20:32 +00001271 PyCodeObject *co;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001272 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001273 mod_ty mod = PyParser_ASTFromString(str, filename, start, flags, arena);
1274 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001275 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001276 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001277 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001278 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001279 PyObject *result = PyAST_mod2obj(mod);
1280 PyArena_Free(arena);
1281 return result;
1282 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001283 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001284 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001285 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001286}
1287
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001288struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001289Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001290{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001291 struct symtable *st;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001292 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001293 mod_ty mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
1294 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001295 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001296 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001297 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001298 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001299 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001300 return st;
1301}
1302
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001303/* Preferred access to parser is through AST. */
1304mod_ty
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001305PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001306 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001308 mod_ty mod;
1309 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001310 node *n = PyParser_ParseStringFlagsFilename(s, filename,
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001311 &_PyParser_Grammar, start, &err,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001312 PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001314 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001315 PyNode_Free(n);
1316 return mod;
1317 }
1318 else {
1319 err_input(&err);
1320 return NULL;
1321 }
1322}
1323
1324mod_ty
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001325PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001326 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001327 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001328{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 mod_ty mod;
1330 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001331 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1332 start, ps1, ps2, &err, PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001334 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001335 PyNode_Free(n);
1336 return mod;
1337 }
1338 else {
1339 err_input(&err);
1340 if (errcode)
1341 *errcode = err.error;
1342 return NULL;
1343 }
1344}
1345
Guido van Rossuma110aa61994-08-29 12:50:44 +00001346/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001347
Guido van Rossuma110aa61994-08-29 12:50:44 +00001348node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001349PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001350{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001351 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001352 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1353 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001354 if (n == NULL)
1355 err_input(&err);
Tim Peters5e9d6cf2006-05-28 10:41:29 +00001356
Guido van Rossuma110aa61994-08-29 12:50:44 +00001357 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001358}
1359
Guido van Rossuma110aa61994-08-29 12:50:44 +00001360/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001361
Guido van Rossuma110aa61994-08-29 12:50:44 +00001362node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001363PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001364{
Tim Petersfe2127d2001-07-16 05:37:24 +00001365 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001366 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1367 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001368 if (n == NULL)
1369 err_input(&err);
1370 return n;
1371}
1372
1373node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001374PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001375 int start, int flags)
1376{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001377 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001378 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1379 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001380 if (n == NULL)
1381 err_input(&err);
1382 return n;
1383}
1384
1385node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001386PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001387{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001388 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001389}
1390
Guido van Rossum66ebd912003-04-17 16:02:26 +00001391/* May want to move a more generalized form of this to parsetok.c or
1392 even parser modules. */
1393
1394void
1395PyParser_SetError(perrdetail *err)
1396{
1397 err_input(err);
1398}
1399
Guido van Rossuma110aa61994-08-29 12:50:44 +00001400/* Set the error appropriate to the given input error code (see errcode.h) */
1401
1402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001403err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001404{
Fred Drake85f36392000-07-11 17:53:00 +00001405 PyObject *v, *w, *errtype;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001406 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001407 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001408 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001409 switch (err->error) {
1410 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001411 errtype = PyExc_IndentationError;
1412 if (err->expected == INDENT)
1413 msg = "expected an indented block";
1414 else if (err->token == INDENT)
1415 msg = "unexpected indent";
1416 else if (err->token == DEDENT)
1417 msg = "unexpected unindent";
1418 else {
1419 errtype = PyExc_SyntaxError;
1420 msg = "invalid syntax";
1421 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001422 break;
1423 case E_TOKEN:
1424 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001425 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001426 case E_EOFS:
1427 msg = "EOF while scanning triple-quoted string";
1428 break;
1429 case E_EOLS:
1430 msg = "EOL while scanning single-quoted string";
1431 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001432 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001433 if (!PyErr_Occurred())
1434 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001435 return;
1436 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001437 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001438 return;
1439 case E_EOF:
1440 msg = "unexpected EOF while parsing";
1441 break;
Fred Drake85f36392000-07-11 17:53:00 +00001442 case E_TABSPACE:
1443 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001444 msg = "inconsistent use of tabs and spaces in indentation";
1445 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001446 case E_OVERFLOW:
1447 msg = "expression too long";
1448 break;
Fred Drake85f36392000-07-11 17:53:00 +00001449 case E_DEDENT:
1450 errtype = PyExc_IndentationError;
1451 msg = "unindent does not match any outer indentation level";
1452 break;
1453 case E_TOODEEP:
1454 errtype = PyExc_IndentationError;
1455 msg = "too many levels of indentation";
1456 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001457 case E_DECODE: {
1458 PyObject *type, *value, *tb;
1459 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001460 if (value != NULL) {
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001461 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001462 if (u != NULL) {
1463 msg = PyString_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001464 }
1465 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001466 if (msg == NULL)
1467 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001468 Py_XDECREF(type);
1469 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001470 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001471 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001472 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001473 case E_LINECONT:
1474 msg = "unexpected character after line continuation character";
1475 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001476 default:
1477 fprintf(stderr, "error=%d\n", err->error);
1478 msg = "unknown parsing error";
1479 break;
1480 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001481 v = Py_BuildValue("(ziiz)", err->filename,
1482 err->lineno, err->offset, err->text);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001483 if (err->text != NULL) {
Tim Petersc9d78aa2006-03-26 23:27:58 +00001484 PyObject_FREE(err->text);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001485 err->text = NULL;
1486 }
1487 w = NULL;
1488 if (v != NULL)
1489 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001490 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001491 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001492 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001493 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001494}
1495
1496/* Print fatal error message and abort */
1497
1498void
Tim Peters7c321a82002-07-09 02:57:01 +00001499Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001500{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001501 fprintf(stderr, "Fatal Python error: %s\n", msg);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001502#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001503 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001504 OutputDebugString(msg);
1505 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001506#ifdef _DEBUG
1507 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001508#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001509#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001510 abort();
1511}
1512
1513/* Clean up and exit */
1514
Guido van Rossuma110aa61994-08-29 12:50:44 +00001515#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001516#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001517#endif
1518
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001519#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001520static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001521static int nexitfuncs = 0;
1522
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001523int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001524{
1525 if (nexitfuncs >= NEXITFUNCS)
1526 return -1;
1527 exitfuncs[nexitfuncs++] = func;
1528 return 0;
1529}
1530
Guido van Rossumcc283f51997-08-05 02:22:03 +00001531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001532call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001533{
Guido van Rossum82598051997-03-05 00:20:32 +00001534 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001535
1536 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001537 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001538 Py_INCREF(exitfunc);
1539 PySys_SetObject("exitfunc", (PyObject *)NULL);
1540 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001541 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001542 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1543 PySys_WriteStderr("Error in sys.exitfunc:\n");
1544 }
Guido van Rossum82598051997-03-05 00:20:32 +00001545 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001546 }
Guido van Rossum82598051997-03-05 00:20:32 +00001547 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001548 }
1549
Guido van Rossum0829c751998-02-28 04:31:39 +00001550 if (Py_FlushLine())
1551 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001552}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001553
Guido van Rossumcc283f51997-08-05 02:22:03 +00001554static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001555call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001556{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001557 while (nexitfuncs > 0)
1558 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001559
1560 fflush(stdout);
1561 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001562}
1563
1564void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001565Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001566{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001567 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001568
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001569 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001570}
1571
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001572static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001573initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001574{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001575#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001576 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001577#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001578#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001579 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001580#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001581#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001582 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001583#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001584 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001585}
1586
Guido van Rossum7433b121997-02-14 19:45:36 +00001587
1588/*
1589 * The file descriptor fd is considered ``interactive'' if either
1590 * a) isatty(fd) is TRUE, or
1591 * b) the -i flag was given, and the filename associated with
1592 * the descriptor is NULL or "<stdin>" or "???".
1593 */
1594int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001595Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001596{
1597 if (isatty((int)fileno(fp)))
1598 return 1;
1599 if (!Py_InteractiveFlag)
1600 return 0;
1601 return (filename == NULL) ||
1602 (strcmp(filename, "<stdin>") == 0) ||
1603 (strcmp(filename, "???") == 0);
1604}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001605
1606
Tim Petersd08e3822003-04-17 15:24:21 +00001607#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001608#if defined(WIN32) && defined(_MSC_VER)
1609
1610/* Stack checking for Microsoft C */
1611
1612#include <malloc.h>
1613#include <excpt.h>
1614
Fred Drakee8de31c2000-08-31 05:38:39 +00001615/*
1616 * Return non-zero when we run out of memory on the stack; zero otherwise.
1617 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001618int
Fred Drake399739f2000-08-31 05:52:44 +00001619PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001620{
1621 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001622 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001623 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001624 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001625 return 0;
1626 } __except (EXCEPTION_EXECUTE_HANDLER) {
1627 /* just ignore all errors */
1628 }
1629 return 1;
1630}
1631
1632#endif /* WIN32 && _MSC_VER */
1633
1634/* Alternate implementations can be added here... */
1635
1636#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001637
1638
1639/* Wrappers around sigaction() or signal(). */
1640
1641PyOS_sighandler_t
1642PyOS_getsig(int sig)
1643{
1644#ifdef HAVE_SIGACTION
1645 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001646 if (sigaction(sig, NULL, &context) == -1)
1647 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001648 return context.sa_handler;
1649#else
1650 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001651/* Special signal handling for the secure CRT in Visual Studio 2005 */
1652#if defined(_MSC_VER) && _MSC_VER >= 1400
1653 switch (sig) {
1654 /* Only these signals are valid */
1655 case SIGINT:
1656 case SIGILL:
1657 case SIGFPE:
1658 case SIGSEGV:
1659 case SIGTERM:
1660 case SIGBREAK:
1661 case SIGABRT:
1662 break;
1663 /* Don't call signal() with other values or it will assert */
1664 default:
1665 return SIG_ERR;
1666 }
1667#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00001668 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001669 if (handler != SIG_ERR)
1670 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001671 return handler;
1672#endif
1673}
1674
1675PyOS_sighandler_t
1676PyOS_setsig(int sig, PyOS_sighandler_t handler)
1677{
1678#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001679 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001680 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001681 sigemptyset(&context.sa_mask);
1682 context.sa_flags = 0;
1683 if (sigaction(sig, &context, &ocontext) == -1)
1684 return SIG_ERR;
1685 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001686#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001687 PyOS_sighandler_t oldhandler;
1688 oldhandler = signal(sig, handler);
1689#ifdef HAVE_SIGINTERRUPT
1690 siginterrupt(sig, 1);
1691#endif
1692 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001693#endif
1694}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001695
1696/* Deprecated C API functions still provided for binary compatiblity */
1697
1698#undef PyParser_SimpleParseFile
Thomas Heller1b046642006-04-18 18:51:06 +00001699PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001700PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1701{
1702 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1703}
1704
Thomas Heller1b046642006-04-18 18:51:06 +00001705#undef PyParser_SimpleParseString
1706PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001707PyParser_SimpleParseString(const char *str, int start)
1708{
1709 return PyParser_SimpleParseStringFlags(str, start, 0);
1710}
Anthony Baxterac6bd462006-04-13 02:06:09 +00001711
Thomas Heller1b046642006-04-18 18:51:06 +00001712#undef PyRun_AnyFile
1713PyAPI_FUNC(int)
1714PyRun_AnyFile(FILE *fp, const char *name)
1715{
1716 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
1717}
1718
1719#undef PyRun_AnyFileEx
1720PyAPI_FUNC(int)
1721PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1722{
1723 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
1724}
1725
1726#undef PyRun_AnyFileFlags
1727PyAPI_FUNC(int)
1728PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1729{
1730 return PyRun_AnyFileExFlags(fp, name, 0, flags);
1731}
1732
1733#undef PyRun_File
1734PyAPI_FUNC(PyObject *)
1735PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1736{
1737 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
1738}
1739
1740#undef PyRun_FileEx
1741PyAPI_FUNC(PyObject *)
1742PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1743{
1744 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
1745}
1746
1747#undef PyRun_FileFlags
1748PyAPI_FUNC(PyObject *)
1749PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
1750 PyCompilerFlags *flags)
1751{
1752 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
1753}
1754
1755#undef PyRun_SimpleFile
1756PyAPI_FUNC(int)
1757PyRun_SimpleFile(FILE *f, const char *p)
1758{
1759 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
1760}
1761
1762#undef PyRun_SimpleFileEx
1763PyAPI_FUNC(int)
1764PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1765{
1766 return PyRun_SimpleFileExFlags(f, p, c, NULL);
1767}
1768
1769
1770#undef PyRun_String
1771PyAPI_FUNC(PyObject *)
1772PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
1773{
1774 return PyRun_StringFlags(str, s, g, l, NULL);
1775}
1776
1777#undef PyRun_SimpleString
1778PyAPI_FUNC(int)
1779PyRun_SimpleString(const char *s)
1780{
1781 return PyRun_SimpleStringFlags(s, NULL);
1782}
1783
1784#undef Py_CompileString
1785PyAPI_FUNC(PyObject *)
1786Py_CompileString(const char *str, const char *p, int s)
1787{
1788 return Py_CompileStringFlags(str, p, s, NULL);
1789}
1790
1791#undef PyRun_InteractiveOne
1792PyAPI_FUNC(int)
1793PyRun_InteractiveOne(FILE *f, const char *p)
1794{
1795 return PyRun_InteractiveOneFlags(f, p, NULL);
1796}
1797
1798#undef PyRun_InteractiveLoop
1799PyAPI_FUNC(int)
1800PyRun_InteractiveLoop(FILE *f, const char *p)
1801{
1802 return PyRun_InteractiveLoopFlags(f, p, NULL);
1803}
1804
Anthony Baxterac6bd462006-04-13 02:06:09 +00001805#ifdef __cplusplus
1806}
1807#endif
1808