blob: 0a8180901589f59e30a80d922833e258066cc3a8 [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
Martin v. Löwis056a69c2006-03-01 16:55:42 +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();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000747 mod = PyParser_ASTFromFile(fp, filename,
748 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
1087void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
1088{
1089 int err = 0;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001090 PyObject *f = PySys_GetObject("stderr");
Armin Rigo5d2c6832004-03-22 20:16:58 +00001091 Py_INCREF(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001092 if (f == NULL)
1093 fprintf(stderr, "lost sys.stderr\n");
1094 else {
Guido van Rossum0829c751998-02-28 04:31:39 +00001095 if (Py_FlushLine())
1096 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001097 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001098 if (tb && tb != Py_None)
1099 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +00001100 if (err == 0 &&
Armin Rigo5d2c6832004-03-22 20:16:58 +00001101 PyObject_HasAttrString(value, "print_file_and_line"))
Barry Warsaw36b8f941997-08-26 18:09:48 +00001102 {
Guido van Rossum82598051997-03-05 00:20:32 +00001103 PyObject *message;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001104 const char *filename, *text;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001105 int lineno, offset;
Armin Rigo5d2c6832004-03-22 20:16:58 +00001106 if (!parse_syntax_error(value, &message, &filename,
Barry Warsaw035574d1997-08-29 22:07:17 +00001107 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +00001108 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001109 else {
1110 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +00001111 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001112 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +00001113 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001114 else
Guido van Rossum82598051997-03-05 00:20:32 +00001115 PyFile_WriteString(filename, f);
1116 PyFile_WriteString("\", line ", f);
Jeremy Hylton518ab1c2001-11-28 20:42:20 +00001117 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +00001118 PyFile_WriteString(buf, f);
1119 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001120 if (text != NULL)
1121 print_error_text(f, offset, text);
Armin Rigo5d2c6832004-03-22 20:16:58 +00001122 Py_DECREF(value);
1123 value = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001124 /* Can't be bothered to check all those
1125 PyFile_WriteString() calls */
1126 if (PyErr_Occurred())
1127 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001128 }
1129 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001130 if (err) {
1131 /* Don't do anything else */
1132 }
Brett Cannonbf364092006-03-01 04:25:17 +00001133 else if (PyExceptionClass_Check(exception)) {
1134 char* className = PyExceptionClass_Name(exception);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001135 PyObject* moduleName =
Brett Cannonbf364092006-03-01 04:25:17 +00001136 PyObject_GetAttrString(exception, "__module__");
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001137
1138 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001139 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001140 else {
1141 char* modstr = PyString_AsString(moduleName);
Brett Cannon2e63b732006-03-02 18:34:57 +00001142 Py_DECREF(moduleName);
Tim Petersd08e3822003-04-17 15:24:21 +00001143 if (modstr && strcmp(modstr, "exceptions"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001144 {
1145 err = PyFile_WriteString(modstr, f);
1146 err += PyFile_WriteString(".", f);
1147 }
1148 }
1149 if (err == 0) {
1150 if (className == NULL)
1151 err = PyFile_WriteString("<unknown>", f);
1152 else
Brett Cannonbf364092006-03-01 04:25:17 +00001153 err = PyFile_WriteString(className, f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001154 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001155 }
1156 else
1157 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
Brett Cannon2e63b732006-03-02 18:34:57 +00001158 if (err == 0 && (value != Py_None)) {
1159 PyObject *s = PyObject_Str(value);
1160 /* only print colon if the str() of the
1161 object is not the empty string
1162 */
1163 if (s == NULL)
1164 err = -1;
1165 else if (!PyString_Check(s) ||
1166 PyString_GET_SIZE(s) != 0)
1167 err = PyFile_WriteString(": ", f);
1168 if (err == 0)
1169 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1170 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001171 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001172 if (err == 0)
1173 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001174 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001175 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001176 /* If an error happened here, don't show it.
1177 XXX This is wrong, but too many callers rely on this behavior. */
1178 if (err != 0)
1179 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001180}
1181
Guido van Rossum82598051997-03-05 00:20:32 +00001182PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001183PyRun_StringFlags(const char *str, int start, PyObject *globals,
1184 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001185{
Neal Norwitze92fba02006-03-04 18:52:26 +00001186 PyObject *ret = NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001187 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001188 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001189 arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001190 if (mod != NULL)
1191 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001192 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001193 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001194}
1195
1196PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001197PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001198 PyObject *locals, int closeit, PyCompilerFlags *flags)
1199{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001200 PyObject *ret;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001201 PyArena *arena = PyArena_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001202 mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001203 flags, NULL, arena);
1204 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001205 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001207 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001208 if (closeit)
1209 fclose(fp);
Neal Norwitze92fba02006-03-04 18:52:26 +00001210 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001211 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001212 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001213}
1214
Guido van Rossum82598051997-03-05 00:20:32 +00001215static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001217 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001218{
Guido van Rossum82598051997-03-05 00:20:32 +00001219 PyCodeObject *co;
1220 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001221 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001222 if (co == NULL)
1223 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001224 v = PyEval_EvalCode(co, globals, locals);
1225 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001226 return v;
1227}
1228
Guido van Rossum82598051997-03-05 00:20:32 +00001229static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001230run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
1231 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001232{
Guido van Rossum82598051997-03-05 00:20:32 +00001233 PyCodeObject *co;
1234 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001235 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001236 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001237
Guido van Rossum82598051997-03-05 00:20:32 +00001238 magic = PyMarshal_ReadLongFromFile(fp);
1239 if (magic != PyImport_GetMagicNumber()) {
1240 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001241 "Bad magic number in .pyc file");
1242 return NULL;
1243 }
Guido van Rossum82598051997-03-05 00:20:32 +00001244 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001245 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001246 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001247 if (v == NULL || !PyCode_Check(v)) {
1248 Py_XDECREF(v);
1249 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001250 "Bad code object in .pyc file");
1251 return NULL;
1252 }
Guido van Rossum82598051997-03-05 00:20:32 +00001253 co = (PyCodeObject *)v;
1254 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001255 if (v && flags)
1256 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001257 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001258 return v;
1259}
1260
Guido van Rossum82598051997-03-05 00:20:32 +00001261PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001262Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001263 PyCompilerFlags *flags)
1264{
Guido van Rossum82598051997-03-05 00:20:32 +00001265 PyCodeObject *co;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001266 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001267 mod_ty mod = PyParser_ASTFromString(str, filename, start, flags, arena);
1268 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001269 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001270 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001271 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001272 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001273 PyObject *result = PyAST_mod2obj(mod);
1274 PyArena_Free(arena);
1275 return result;
1276 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001277 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001278 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001279 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001280}
1281
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001282struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001283Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001284{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001285 struct symtable *st;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001286 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001287 mod_ty mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
1288 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001289 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001290 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001291 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001292 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001293 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001294 return st;
1295}
1296
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001297/* Preferred access to parser is through AST. */
1298mod_ty
1299PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001300 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001302 mod_ty mod;
1303 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001304 node *n = PyParser_ParseStringFlagsFilename(s, filename,
1305 &_PyParser_Grammar, start, &err,
1306 PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001307 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001308 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001309 PyNode_Free(n);
1310 return mod;
1311 }
1312 else {
1313 err_input(&err);
1314 return NULL;
1315 }
1316}
1317
1318mod_ty
1319PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001320 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001321 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001322{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001323 mod_ty mod;
1324 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001325 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1326 start, ps1, ps2, &err, PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001328 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001329 PyNode_Free(n);
1330 return mod;
1331 }
1332 else {
1333 err_input(&err);
1334 if (errcode)
1335 *errcode = err.error;
1336 return NULL;
1337 }
1338}
1339
Guido van Rossuma110aa61994-08-29 12:50:44 +00001340/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001341
Guido van Rossuma110aa61994-08-29 12:50:44 +00001342node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001343PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001344{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001345 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001346 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1347 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001348 if (n == NULL)
1349 err_input(&err);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001350
Guido van Rossuma110aa61994-08-29 12:50:44 +00001351 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001352}
1353
Guido van Rossuma110aa61994-08-29 12:50:44 +00001354/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001355
Guido van Rossuma110aa61994-08-29 12:50:44 +00001356node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001357PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001358{
Tim Petersfe2127d2001-07-16 05:37:24 +00001359 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001360 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1361 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001362 if (n == NULL)
1363 err_input(&err);
1364 return n;
1365}
1366
1367node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001368PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001369 int start, int flags)
1370{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001371 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001372 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1373 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001374 if (n == NULL)
1375 err_input(&err);
1376 return n;
1377}
1378
1379node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001380PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001381{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001382 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001383}
1384
Guido van Rossum66ebd912003-04-17 16:02:26 +00001385/* May want to move a more generalized form of this to parsetok.c or
1386 even parser modules. */
1387
1388void
1389PyParser_SetError(perrdetail *err)
1390{
1391 err_input(err);
1392}
1393
Guido van Rossuma110aa61994-08-29 12:50:44 +00001394/* Set the error appropriate to the given input error code (see errcode.h) */
1395
1396static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001397err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001398{
Fred Drake85f36392000-07-11 17:53:00 +00001399 PyObject *v, *w, *errtype;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001400 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001401 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001402 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001403 switch (err->error) {
1404 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001405 errtype = PyExc_IndentationError;
1406 if (err->expected == INDENT)
1407 msg = "expected an indented block";
1408 else if (err->token == INDENT)
1409 msg = "unexpected indent";
1410 else if (err->token == DEDENT)
1411 msg = "unexpected unindent";
1412 else {
1413 errtype = PyExc_SyntaxError;
1414 msg = "invalid syntax";
1415 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001416 break;
1417 case E_TOKEN:
1418 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001419 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001420 case E_EOFS:
1421 msg = "EOF while scanning triple-quoted string";
1422 break;
1423 case E_EOLS:
1424 msg = "EOL while scanning single-quoted string";
1425 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001426 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001427 if (!PyErr_Occurred())
1428 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001429 return;
1430 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001431 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001432 return;
1433 case E_EOF:
1434 msg = "unexpected EOF while parsing";
1435 break;
Fred Drake85f36392000-07-11 17:53:00 +00001436 case E_TABSPACE:
1437 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001438 msg = "inconsistent use of tabs and spaces in indentation";
1439 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001440 case E_OVERFLOW:
1441 msg = "expression too long";
1442 break;
Fred Drake85f36392000-07-11 17:53:00 +00001443 case E_DEDENT:
1444 errtype = PyExc_IndentationError;
1445 msg = "unindent does not match any outer indentation level";
1446 break;
1447 case E_TOODEEP:
1448 errtype = PyExc_IndentationError;
1449 msg = "too many levels of indentation";
1450 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001451 case E_DECODE: {
1452 PyObject *type, *value, *tb;
1453 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001454 if (value != NULL) {
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001455 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001456 if (u != NULL) {
1457 msg = PyString_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001458 }
1459 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001460 if (msg == NULL)
1461 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001462 Py_XDECREF(type);
1463 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001464 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001465 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001466 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001467 case E_LINECONT:
1468 msg = "unexpected character after line continuation character";
1469 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001470 default:
1471 fprintf(stderr, "error=%d\n", err->error);
1472 msg = "unknown parsing error";
1473 break;
1474 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001475 v = Py_BuildValue("(ziiz)", err->filename,
1476 err->lineno, err->offset, err->text);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001477 if (err->text != NULL) {
Tim Petersc9d78aa2006-03-26 23:27:58 +00001478 PyObject_FREE(err->text);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 err->text = NULL;
1480 }
1481 w = NULL;
1482 if (v != NULL)
1483 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001484 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001485 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001486 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001487 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001488}
1489
1490/* Print fatal error message and abort */
1491
1492void
Tim Peters7c321a82002-07-09 02:57:01 +00001493Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001494{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001495 fprintf(stderr, "Fatal Python error: %s\n", msg);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001496#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001497 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001498 OutputDebugString(msg);
1499 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001500#ifdef _DEBUG
1501 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001502#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001503#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001504 abort();
1505}
1506
1507/* Clean up and exit */
1508
Guido van Rossuma110aa61994-08-29 12:50:44 +00001509#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001510#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001511#endif
1512
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001513#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001515static int nexitfuncs = 0;
1516
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001517int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001518{
1519 if (nexitfuncs >= NEXITFUNCS)
1520 return -1;
1521 exitfuncs[nexitfuncs++] = func;
1522 return 0;
1523}
1524
Guido van Rossumcc283f51997-08-05 02:22:03 +00001525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001526call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001527{
Guido van Rossum82598051997-03-05 00:20:32 +00001528 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001529
1530 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001531 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001532 Py_INCREF(exitfunc);
1533 PySys_SetObject("exitfunc", (PyObject *)NULL);
1534 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001535 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001536 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1537 PySys_WriteStderr("Error in sys.exitfunc:\n");
1538 }
Guido van Rossum82598051997-03-05 00:20:32 +00001539 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001540 }
Guido van Rossum82598051997-03-05 00:20:32 +00001541 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001542 }
1543
Guido van Rossum0829c751998-02-28 04:31:39 +00001544 if (Py_FlushLine())
1545 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001546}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001547
Guido van Rossumcc283f51997-08-05 02:22:03 +00001548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001549call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001550{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001551 while (nexitfuncs > 0)
1552 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001553
1554 fflush(stdout);
1555 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001556}
1557
1558void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001559Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001560{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001561 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001562
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001563 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001564}
1565
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001566static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001567initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001568{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001569#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001570 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001571#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001572#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001573 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001574#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001575#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001576 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001577#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001578 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001579}
1580
Guido van Rossum7433b121997-02-14 19:45:36 +00001581
1582/*
1583 * The file descriptor fd is considered ``interactive'' if either
1584 * a) isatty(fd) is TRUE, or
1585 * b) the -i flag was given, and the filename associated with
1586 * the descriptor is NULL or "<stdin>" or "???".
1587 */
1588int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001589Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001590{
1591 if (isatty((int)fileno(fp)))
1592 return 1;
1593 if (!Py_InteractiveFlag)
1594 return 0;
1595 return (filename == NULL) ||
1596 (strcmp(filename, "<stdin>") == 0) ||
1597 (strcmp(filename, "???") == 0);
1598}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001599
1600
Tim Petersd08e3822003-04-17 15:24:21 +00001601#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001602#if defined(WIN32) && defined(_MSC_VER)
1603
1604/* Stack checking for Microsoft C */
1605
1606#include <malloc.h>
1607#include <excpt.h>
1608
Fred Drakee8de31c2000-08-31 05:38:39 +00001609/*
1610 * Return non-zero when we run out of memory on the stack; zero otherwise.
1611 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001612int
Fred Drake399739f2000-08-31 05:52:44 +00001613PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001614{
1615 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001616 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001617 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001618 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001619 return 0;
1620 } __except (EXCEPTION_EXECUTE_HANDLER) {
1621 /* just ignore all errors */
1622 }
1623 return 1;
1624}
1625
1626#endif /* WIN32 && _MSC_VER */
1627
1628/* Alternate implementations can be added here... */
1629
1630#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001631
1632
1633/* Wrappers around sigaction() or signal(). */
1634
1635PyOS_sighandler_t
1636PyOS_getsig(int sig)
1637{
1638#ifdef HAVE_SIGACTION
1639 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001640 if (sigaction(sig, NULL, &context) == -1)
1641 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001642 return context.sa_handler;
1643#else
1644 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001645/* Special signal handling for the secure CRT in Visual Studio 2005 */
1646#if defined(_MSC_VER) && _MSC_VER >= 1400
1647 switch (sig) {
1648 /* Only these signals are valid */
1649 case SIGINT:
1650 case SIGILL:
1651 case SIGFPE:
1652 case SIGSEGV:
1653 case SIGTERM:
1654 case SIGBREAK:
1655 case SIGABRT:
1656 break;
1657 /* Don't call signal() with other values or it will assert */
1658 default:
1659 return SIG_ERR;
1660 }
1661#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00001662 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001663 if (handler != SIG_ERR)
1664 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001665 return handler;
1666#endif
1667}
1668
1669PyOS_sighandler_t
1670PyOS_setsig(int sig, PyOS_sighandler_t handler)
1671{
1672#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001673 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001674 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001675 sigemptyset(&context.sa_mask);
1676 context.sa_flags = 0;
1677 if (sigaction(sig, &context, &ocontext) == -1)
1678 return SIG_ERR;
1679 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001680#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001681 PyOS_sighandler_t oldhandler;
1682 oldhandler = signal(sig, handler);
1683#ifdef HAVE_SIGINTERRUPT
1684 siginterrupt(sig, 1);
1685#endif
1686 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001687#endif
1688}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001689
1690/* Deprecated C API functions still provided for binary compatiblity */
1691
1692#undef PyParser_SimpleParseFile
1693#undef PyParser_SimpleParseString
1694
1695node *
1696PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1697{
1698 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1699}
1700
1701node *
1702PyParser_SimpleParseString(const char *str, int start)
1703{
1704 return PyParser_SimpleParseStringFlags(str, start, 0);
1705}
Anthony Baxterac6bd462006-04-13 02:06:09 +00001706
1707#ifdef __cplusplus
1708}
1709#endif
1710