blob: 6f3ff6fe033aa592ce9c569aa207f1a14212022f [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
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)) {
1135 char* className = PyExceptionClass_Name(exception);
Richard Jones7b9558d2006-05-27 12:29:24 +00001136 char *dot = strrchr(className, '.');
1137 PyObject* moduleName;
1138 if (dot != NULL)
1139 className = dot+1;
1140 moduleName = PyObject_GetAttrString(exception, "__module__");
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001141
1142 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001143 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001144 else {
1145 char* modstr = PyString_AsString(moduleName);
Tim Petersd08e3822003-04-17 15:24:21 +00001146 if (modstr && strcmp(modstr, "exceptions"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001147 {
1148 err = PyFile_WriteString(modstr, f);
1149 err += PyFile_WriteString(".", f);
1150 }
Richard Jones7b9558d2006-05-27 12:29:24 +00001151 Py_DECREF(moduleName);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001152 }
1153 if (err == 0) {
1154 if (className == NULL)
1155 err = PyFile_WriteString("<unknown>", f);
1156 else
Brett Cannonbf364092006-03-01 04:25:17 +00001157 err = PyFile_WriteString(className, f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001158 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001159 }
1160 else
1161 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
Brett Cannon2e63b732006-03-02 18:34:57 +00001162 if (err == 0 && (value != Py_None)) {
1163 PyObject *s = PyObject_Str(value);
1164 /* only print colon if the str() of the
1165 object is not the empty string
1166 */
1167 if (s == NULL)
1168 err = -1;
1169 else if (!PyString_Check(s) ||
1170 PyString_GET_SIZE(s) != 0)
1171 err = PyFile_WriteString(": ", f);
1172 if (err == 0)
1173 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1174 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001175 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001176 if (err == 0)
1177 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001178 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001179 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001180 /* If an error happened here, don't show it.
1181 XXX This is wrong, but too many callers rely on this behavior. */
1182 if (err != 0)
1183 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001184}
1185
Guido van Rossum82598051997-03-05 00:20:32 +00001186PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001187PyRun_StringFlags(const char *str, int start, PyObject *globals,
1188 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001189{
Neal Norwitze92fba02006-03-04 18:52:26 +00001190 PyObject *ret = NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001191 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001192 mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001193 arena);
Neal Norwitze92fba02006-03-04 18:52:26 +00001194 if (mod != NULL)
1195 ret = run_mod(mod, "<string>", globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001196 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001197 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001198}
1199
1200PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001201PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001202 PyObject *locals, int closeit, PyCompilerFlags *flags)
1203{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001204 PyObject *ret;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001205 PyArena *arena = PyArena_New();
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001206 mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001207 flags, NULL, arena);
1208 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001209 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001210 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001211 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001212 if (closeit)
1213 fclose(fp);
Neal Norwitze92fba02006-03-04 18:52:26 +00001214 ret = run_mod(mod, filename, globals, locals, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001215 PyArena_Free(arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001216 return ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001217}
1218
Guido van Rossum82598051997-03-05 00:20:32 +00001219static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001220run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001221 PyCompilerFlags *flags, PyArena *arena)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001222{
Guido van Rossum82598051997-03-05 00:20:32 +00001223 PyCodeObject *co;
1224 PyObject *v;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001225 co = PyAST_Compile(mod, filename, flags, arena);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001226 if (co == NULL)
1227 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001228 v = PyEval_EvalCode(co, globals, locals);
1229 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001230 return v;
1231}
1232
Guido van Rossum82598051997-03-05 00:20:32 +00001233static PyObject *
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001234run_pyc_file(FILE *fp, const char *filename, PyObject *globals,
1235 PyObject *locals, PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001236{
Guido van Rossum82598051997-03-05 00:20:32 +00001237 PyCodeObject *co;
1238 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001239 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001240 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001241
Guido van Rossum82598051997-03-05 00:20:32 +00001242 magic = PyMarshal_ReadLongFromFile(fp);
1243 if (magic != PyImport_GetMagicNumber()) {
1244 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001245 "Bad magic number in .pyc file");
1246 return NULL;
1247 }
Guido van Rossum82598051997-03-05 00:20:32 +00001248 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001249 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001250 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001251 if (v == NULL || !PyCode_Check(v)) {
1252 Py_XDECREF(v);
1253 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001254 "Bad code object in .pyc file");
1255 return NULL;
1256 }
Guido van Rossum82598051997-03-05 00:20:32 +00001257 co = (PyCodeObject *)v;
1258 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001259 if (v && flags)
1260 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001261 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001262 return v;
1263}
1264
Guido van Rossum82598051997-03-05 00:20:32 +00001265PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001266Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001267 PyCompilerFlags *flags)
1268{
Guido van Rossum82598051997-03-05 00:20:32 +00001269 PyCodeObject *co;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001270 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001271 mod_ty mod = PyParser_ASTFromString(str, filename, start, flags, arena);
1272 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001273 PyArena_Free(arena);
Guido van Rossum5b722181993-03-30 17:46:03 +00001274 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001275 }
Martin v. Löwis2b366e42006-02-26 22:12:35 +00001276 if (flags && (flags->cf_flags & PyCF_ONLY_AST)) {
Martin v. Löwisbd260da2006-02-26 19:42:26 +00001277 PyObject *result = PyAST_mod2obj(mod);
1278 PyArena_Free(arena);
1279 return result;
1280 }
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001281 co = PyAST_Compile(mod, filename, flags, arena);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001282 PyArena_Free(arena);
Guido van Rossum82598051997-03-05 00:20:32 +00001283 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001284}
1285
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001286struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001287Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001288{
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001289 struct symtable *st;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001290 PyArena *arena = PyArena_New();
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001291 mod_ty mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
1292 if (mod == NULL) {
Neal Norwitz9589ee22006-03-04 19:01:22 +00001293 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001294 return NULL;
Neal Norwitz9589ee22006-03-04 19:01:22 +00001295 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001296 st = PySymtable_Build(mod, filename, 0);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001297 PyArena_Free(arena);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001298 return st;
1299}
1300
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001301/* Preferred access to parser is through AST. */
1302mod_ty
1303PyParser_ASTFromString(const char *s, const char *filename, int start,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001304 PyCompilerFlags *flags, PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001305{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001306 mod_ty mod;
1307 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001308 node *n = PyParser_ParseStringFlagsFilename(s, filename,
1309 &_PyParser_Grammar, start, &err,
1310 PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001311 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001312 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001313 PyNode_Free(n);
1314 return mod;
1315 }
1316 else {
1317 err_input(&err);
1318 return NULL;
1319 }
1320}
1321
1322mod_ty
1323PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1,
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001324 char *ps2, PyCompilerFlags *flags, int *errcode,
Neal Norwitz9589ee22006-03-04 19:01:22 +00001325 PyArena *arena)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001326{
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001327 mod_ty mod;
1328 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001329 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1330 start, ps1, ps2, &err, PARSER_FLAGS(flags));
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001331 if (n) {
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001332 mod = PyAST_FromNode(n, flags, filename, arena);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001333 PyNode_Free(n);
1334 return mod;
1335 }
1336 else {
1337 err_input(&err);
1338 if (errcode)
1339 *errcode = err.error;
1340 return NULL;
1341 }
1342}
1343
Guido van Rossuma110aa61994-08-29 12:50:44 +00001344/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001345
Guido van Rossuma110aa61994-08-29 12:50:44 +00001346node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001347PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001348{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001349 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001350 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
1351 start, NULL, NULL, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001352 if (n == NULL)
1353 err_input(&err);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001354
Guido van Rossuma110aa61994-08-29 12:50:44 +00001355 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001356}
1357
Guido van Rossuma110aa61994-08-29 12:50:44 +00001358/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001359
Guido van Rossuma110aa61994-08-29 12:50:44 +00001360node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001361PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001362{
Tim Petersfe2127d2001-07-16 05:37:24 +00001363 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001364 node *n = PyParser_ParseStringFlags(str, &_PyParser_Grammar,
1365 start, &err, flags);
Tim Petersfe2127d2001-07-16 05:37:24 +00001366 if (n == NULL)
1367 err_input(&err);
1368 return n;
1369}
1370
1371node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001372PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001373 int start, int flags)
1374{
Thomas Heller6b17abf2002-07-09 09:23:27 +00001375 perrdetail err;
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001376 node *n = PyParser_ParseStringFlagsFilename(str, filename,
1377 &_PyParser_Grammar, start, &err, flags);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001378 if (n == NULL)
1379 err_input(&err);
1380 return n;
1381}
1382
1383node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001384PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001385{
Neal Norwitzadb69fc2005-12-17 20:54:49 +00001386 return PyParser_SimpleParseStringFlagsFilename(str, filename, start, 0);
Thomas Heller6b17abf2002-07-09 09:23:27 +00001387}
1388
Guido van Rossum66ebd912003-04-17 16:02:26 +00001389/* May want to move a more generalized form of this to parsetok.c or
1390 even parser modules. */
1391
1392void
1393PyParser_SetError(perrdetail *err)
1394{
1395 err_input(err);
1396}
1397
Guido van Rossuma110aa61994-08-29 12:50:44 +00001398/* Set the error appropriate to the given input error code (see errcode.h) */
1399
1400static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001401err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001402{
Fred Drake85f36392000-07-11 17:53:00 +00001403 PyObject *v, *w, *errtype;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001404 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001405 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001406 errtype = PyExc_SyntaxError;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001407 switch (err->error) {
1408 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001409 errtype = PyExc_IndentationError;
1410 if (err->expected == INDENT)
1411 msg = "expected an indented block";
1412 else if (err->token == INDENT)
1413 msg = "unexpected indent";
1414 else if (err->token == DEDENT)
1415 msg = "unexpected unindent";
1416 else {
1417 errtype = PyExc_SyntaxError;
1418 msg = "invalid syntax";
1419 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001420 break;
1421 case E_TOKEN:
1422 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001423 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001424 case E_EOFS:
1425 msg = "EOF while scanning triple-quoted string";
1426 break;
1427 case E_EOLS:
1428 msg = "EOL while scanning single-quoted string";
1429 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001430 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001431 if (!PyErr_Occurred())
1432 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001433 return;
1434 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001435 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001436 return;
1437 case E_EOF:
1438 msg = "unexpected EOF while parsing";
1439 break;
Fred Drake85f36392000-07-11 17:53:00 +00001440 case E_TABSPACE:
1441 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001442 msg = "inconsistent use of tabs and spaces in indentation";
1443 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001444 case E_OVERFLOW:
1445 msg = "expression too long";
1446 break;
Fred Drake85f36392000-07-11 17:53:00 +00001447 case E_DEDENT:
1448 errtype = PyExc_IndentationError;
1449 msg = "unindent does not match any outer indentation level";
1450 break;
1451 case E_TOODEEP:
1452 errtype = PyExc_IndentationError;
1453 msg = "too many levels of indentation";
1454 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001455 case E_DECODE: {
1456 PyObject *type, *value, *tb;
1457 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001458 if (value != NULL) {
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001459 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001460 if (u != NULL) {
1461 msg = PyString_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001462 }
1463 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001464 if (msg == NULL)
1465 msg = "unknown decode error";
Neal Norwitzdb83eb32005-12-18 05:29:30 +00001466 Py_XDECREF(type);
1467 Py_XDECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001468 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001469 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001470 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001471 case E_LINECONT:
1472 msg = "unexpected character after line continuation character";
1473 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001474 default:
1475 fprintf(stderr, "error=%d\n", err->error);
1476 msg = "unknown parsing error";
1477 break;
1478 }
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001479 v = Py_BuildValue("(ziiz)", err->filename,
1480 err->lineno, err->offset, err->text);
Neal Norwitz9589ee22006-03-04 19:01:22 +00001481 if (err->text != NULL) {
Tim Petersc9d78aa2006-03-26 23:27:58 +00001482 PyObject_FREE(err->text);
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001483 err->text = NULL;
1484 }
1485 w = NULL;
1486 if (v != NULL)
1487 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001488 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001489 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001490 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001491 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001492}
1493
1494/* Print fatal error message and abort */
1495
1496void
Tim Peters7c321a82002-07-09 02:57:01 +00001497Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001498{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001499 fprintf(stderr, "Fatal Python error: %s\n", msg);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001500#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001501 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001502 OutputDebugString(msg);
1503 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001504#ifdef _DEBUG
1505 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001506#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001507#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001508 abort();
1509}
1510
1511/* Clean up and exit */
1512
Guido van Rossuma110aa61994-08-29 12:50:44 +00001513#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001514#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001515#endif
1516
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001517#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001518static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001519static int nexitfuncs = 0;
1520
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001521int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001522{
1523 if (nexitfuncs >= NEXITFUNCS)
1524 return -1;
1525 exitfuncs[nexitfuncs++] = func;
1526 return 0;
1527}
1528
Guido van Rossumcc283f51997-08-05 02:22:03 +00001529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001530call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001531{
Guido van Rossum82598051997-03-05 00:20:32 +00001532 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001533
1534 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001535 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001536 Py_INCREF(exitfunc);
1537 PySys_SetObject("exitfunc", (PyObject *)NULL);
1538 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001539 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001540 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1541 PySys_WriteStderr("Error in sys.exitfunc:\n");
1542 }
Guido van Rossum82598051997-03-05 00:20:32 +00001543 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001544 }
Guido van Rossum82598051997-03-05 00:20:32 +00001545 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001546 }
1547
Guido van Rossum0829c751998-02-28 04:31:39 +00001548 if (Py_FlushLine())
1549 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001550}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001551
Guido van Rossumcc283f51997-08-05 02:22:03 +00001552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001553call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001554{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001555 while (nexitfuncs > 0)
1556 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001557
1558 fflush(stdout);
1559 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001560}
1561
1562void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001563Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001564{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001565 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001566
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001567 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001568}
1569
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001571initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001572{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001573#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001574 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001575#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001576#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001577 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001578#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001579#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001580 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001581#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001582 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001583}
1584
Guido van Rossum7433b121997-02-14 19:45:36 +00001585
1586/*
1587 * The file descriptor fd is considered ``interactive'' if either
1588 * a) isatty(fd) is TRUE, or
1589 * b) the -i flag was given, and the filename associated with
1590 * the descriptor is NULL or "<stdin>" or "???".
1591 */
1592int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001593Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001594{
1595 if (isatty((int)fileno(fp)))
1596 return 1;
1597 if (!Py_InteractiveFlag)
1598 return 0;
1599 return (filename == NULL) ||
1600 (strcmp(filename, "<stdin>") == 0) ||
1601 (strcmp(filename, "???") == 0);
1602}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001603
1604
Tim Petersd08e3822003-04-17 15:24:21 +00001605#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001606#if defined(WIN32) && defined(_MSC_VER)
1607
1608/* Stack checking for Microsoft C */
1609
1610#include <malloc.h>
1611#include <excpt.h>
1612
Fred Drakee8de31c2000-08-31 05:38:39 +00001613/*
1614 * Return non-zero when we run out of memory on the stack; zero otherwise.
1615 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001616int
Fred Drake399739f2000-08-31 05:52:44 +00001617PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001618{
1619 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001620 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001621 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001622 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001623 return 0;
1624 } __except (EXCEPTION_EXECUTE_HANDLER) {
1625 /* just ignore all errors */
1626 }
1627 return 1;
1628}
1629
1630#endif /* WIN32 && _MSC_VER */
1631
1632/* Alternate implementations can be added here... */
1633
1634#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001635
1636
1637/* Wrappers around sigaction() or signal(). */
1638
1639PyOS_sighandler_t
1640PyOS_getsig(int sig)
1641{
1642#ifdef HAVE_SIGACTION
1643 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001644 if (sigaction(sig, NULL, &context) == -1)
1645 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001646 return context.sa_handler;
1647#else
1648 PyOS_sighandler_t handler;
Martin v. Löwisb45b3152005-11-28 17:34:23 +00001649/* Special signal handling for the secure CRT in Visual Studio 2005 */
1650#if defined(_MSC_VER) && _MSC_VER >= 1400
1651 switch (sig) {
1652 /* Only these signals are valid */
1653 case SIGINT:
1654 case SIGILL:
1655 case SIGFPE:
1656 case SIGSEGV:
1657 case SIGTERM:
1658 case SIGBREAK:
1659 case SIGABRT:
1660 break;
1661 /* Don't call signal() with other values or it will assert */
1662 default:
1663 return SIG_ERR;
1664 }
1665#endif /* _MSC_VER && _MSC_VER >= 1400 */
Guido van Rossum6f256182000-09-16 16:32:19 +00001666 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001667 if (handler != SIG_ERR)
1668 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001669 return handler;
1670#endif
1671}
1672
1673PyOS_sighandler_t
1674PyOS_setsig(int sig, PyOS_sighandler_t handler)
1675{
1676#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001677 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001678 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001679 sigemptyset(&context.sa_mask);
1680 context.sa_flags = 0;
1681 if (sigaction(sig, &context, &ocontext) == -1)
1682 return SIG_ERR;
1683 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001684#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001685 PyOS_sighandler_t oldhandler;
1686 oldhandler = signal(sig, handler);
1687#ifdef HAVE_SIGINTERRUPT
1688 siginterrupt(sig, 1);
1689#endif
1690 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001691#endif
1692}
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001693
1694/* Deprecated C API functions still provided for binary compatiblity */
1695
1696#undef PyParser_SimpleParseFile
Thomas Heller1b046642006-04-18 18:51:06 +00001697PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001698PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
1699{
1700 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1701}
1702
Thomas Heller1b046642006-04-18 18:51:06 +00001703#undef PyParser_SimpleParseString
1704PyAPI_FUNC(node *)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001705PyParser_SimpleParseString(const char *str, int start)
1706{
1707 return PyParser_SimpleParseStringFlags(str, start, 0);
1708}
Anthony Baxterac6bd462006-04-13 02:06:09 +00001709
Thomas Heller1b046642006-04-18 18:51:06 +00001710#undef PyRun_AnyFile
1711PyAPI_FUNC(int)
1712PyRun_AnyFile(FILE *fp, const char *name)
1713{
1714 return PyRun_AnyFileExFlags(fp, name, 0, NULL);
1715}
1716
1717#undef PyRun_AnyFileEx
1718PyAPI_FUNC(int)
1719PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
1720{
1721 return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
1722}
1723
1724#undef PyRun_AnyFileFlags
1725PyAPI_FUNC(int)
1726PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
1727{
1728 return PyRun_AnyFileExFlags(fp, name, 0, flags);
1729}
1730
1731#undef PyRun_File
1732PyAPI_FUNC(PyObject *)
1733PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
1734{
1735 return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
1736}
1737
1738#undef PyRun_FileEx
1739PyAPI_FUNC(PyObject *)
1740PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
1741{
1742 return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
1743}
1744
1745#undef PyRun_FileFlags
1746PyAPI_FUNC(PyObject *)
1747PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
1748 PyCompilerFlags *flags)
1749{
1750 return PyRun_FileExFlags(fp, p, s, g, l, 0, flags);
1751}
1752
1753#undef PyRun_SimpleFile
1754PyAPI_FUNC(int)
1755PyRun_SimpleFile(FILE *f, const char *p)
1756{
1757 return PyRun_SimpleFileExFlags(f, p, 0, NULL);
1758}
1759
1760#undef PyRun_SimpleFileEx
1761PyAPI_FUNC(int)
1762PyRun_SimpleFileEx(FILE *f, const char *p, int c)
1763{
1764 return PyRun_SimpleFileExFlags(f, p, c, NULL);
1765}
1766
1767
1768#undef PyRun_String
1769PyAPI_FUNC(PyObject *)
1770PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
1771{
1772 return PyRun_StringFlags(str, s, g, l, NULL);
1773}
1774
1775#undef PyRun_SimpleString
1776PyAPI_FUNC(int)
1777PyRun_SimpleString(const char *s)
1778{
1779 return PyRun_SimpleStringFlags(s, NULL);
1780}
1781
1782#undef Py_CompileString
1783PyAPI_FUNC(PyObject *)
1784Py_CompileString(const char *str, const char *p, int s)
1785{
1786 return Py_CompileStringFlags(str, p, s, NULL);
1787}
1788
1789#undef PyRun_InteractiveOne
1790PyAPI_FUNC(int)
1791PyRun_InteractiveOne(FILE *f, const char *p)
1792{
1793 return PyRun_InteractiveOneFlags(f, p, NULL);
1794}
1795
1796#undef PyRun_InteractiveLoop
1797PyAPI_FUNC(int)
1798PyRun_InteractiveLoop(FILE *f, const char *p)
1799{
1800 return PyRun_InteractiveLoopFlags(f, p, NULL);
1801}
1802
Anthony Baxterac6bd462006-04-13 02:06:09 +00001803#ifdef __cplusplus
1804}
1805#endif
1806