blob: e007f98a9bfb3954553f2f08b1775fa95e576312 [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
6#include "grammar.h"
7#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +00008#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000012#include "symtable.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000014#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000015
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000016#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000017
Martin v. Löwis73d538b2003-03-05 15:13:47 +000018#ifdef HAVE_LANGINFO_H
19#include <locale.h>
20#include <langinfo.h>
21#endif
22
Martin v. Löwis6238d2b2002-06-30 15:26:10 +000023#ifdef MS_WINDOWS
Guido van Rossuma44823b1995-03-14 15:01:17 +000024#undef BYTE
25#include "windows.h"
26#endif
27
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000028extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029
Guido van Rossum82598051997-03-05 00:20:32 +000030extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000031
Guido van Rossumb73cc041993-11-01 16:28:59 +000032/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000033static void initmain(void);
34static void initsite(void);
Martin v. Löwis95292d62002-12-11 14:04:59 +000035static PyObject *run_err_node(node *, const char *, PyObject *, PyObject *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +000036 PyCompilerFlags *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000037static PyObject *run_node(node *, const char *, PyObject *, PyObject *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +000038 PyCompilerFlags *);
Martin v. Löwis95292d62002-12-11 14:04:59 +000039static PyObject *run_pyc_file(FILE *, const char *, PyObject *, PyObject *,
Jeremy Hyltonbc320242001-03-22 02:47:58 +000040 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000041static void err_input(perrdetail *);
42static void initsigs(void);
43static void call_sys_exitfunc(void);
44static void call_ll_exitfuncs(void);
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000045extern void _PyUnicode_Init(void);
46extern void _PyUnicode_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000047
Mark Hammond8d98d2c2003-04-19 15:41:53 +000048#ifdef WITH_THREAD
49extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
50extern void _PyGILState_Fini(void);
51#endif /* WITH_THREAD */
52
Guido van Rossum82598051997-03-05 00:20:32 +000053int Py_DebugFlag; /* Needed by parser.c */
54int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000055int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000056int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000057int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000058int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000059int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000060int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Tim Peters3caca232001-12-06 06:23:26 +000061/* _XXX Py_QnewFlag should go away in 2.3. It's true iff -Qnew is passed,
62 on the command line, and is used in 2.2 by ceval.c to make all "/" divisions
63 true divisions (which they will be in 2.3). */
64int _Py_QnewFlag = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000065
Mark Hammonda43fd0c2003-02-19 00:33:33 +000066/* Reference to 'warnings' module, to avoid importing it
Mark Hammondedd07732003-07-15 23:03:55 +000067 on the fly when the import lock may be held. See 683658/771097
Mark Hammonda43fd0c2003-02-19 00:33:33 +000068*/
Mark Hammondedd07732003-07-15 23:03:55 +000069static PyObject *warnings_module = NULL;
70
71/* Returns a borrowed reference to the 'warnings' module, or NULL.
72 If the module is returned, it is guaranteed to have been obtained
73 without acquiring the import lock
74*/
Martin v. Löwisa2c17c52003-08-09 09:47:11 +000075PyObject *PyModule_GetWarningsModule(void)
Mark Hammondedd07732003-07-15 23:03:55 +000076{
77 PyObject *typ, *val, *tb;
78 PyObject *all_modules;
79 /* If we managed to get the module at init time, just use it */
80 if (warnings_module)
81 return warnings_module;
82 /* If it wasn't available at init time, it may be available
83 now in sys.modules (common scenario is frozen apps: import
84 at init time fails, but the frozen init code sets up sys.path
85 correctly, then does an implicit import of warnings for us
86 */
87 /* Save and restore any exceptions */
88 PyErr_Fetch(&typ, &val, &tb);
89
Mark Hammond5f4e8ca2003-07-16 01:54:38 +000090 all_modules = PySys_GetObject("modules");
Mark Hammondedd07732003-07-15 23:03:55 +000091 if (all_modules) {
92 warnings_module = PyDict_GetItemString(all_modules, "warnings");
93 /* We keep a ref in the global */
94 Py_XINCREF(warnings_module);
95 }
96 PyErr_Restore(typ, val, tb);
97 return warnings_module;
98}
Mark Hammonda43fd0c2003-02-19 00:33:33 +000099
Guido van Rossum25ce5661997-08-02 03:10:38 +0000100static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101
Thomas Wouters7e474022000-07-16 12:04:32 +0000102/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000103
104int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000105Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +0000106{
107 return initialized;
108}
109
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110/* Global initializations. Can be undone by Py_Finalize(). Don't
111 call this twice without an intervening Py_Finalize() call. When
112 initializations fail, a fatal error is issued and the function does
113 not return. On return, the first thread and interpreter state have
114 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116 Locking: you must hold the interpreter lock while calling this.
117 (If the lock has not yet been initialized, that's equivalent to
118 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000119
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000122static int
123add_flag(int flag, const char *envs)
124{
125 int env = atoi(envs);
126 if (flag < env)
127 flag = env;
128 if (flag < 1)
129 flag = 1;
130 return flag;
131}
132
Guido van Rossuma027efa1997-05-05 20:56:21 +0000133void
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000134Py_InitializeEx(int install_sigs)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000137 PyThreadState *tstate;
138 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000139 char *p;
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000140#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
141 char *codeset;
142 char *saved_locale;
143 PyObject *sys_stream, *sys_isatty;
144#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +0000145 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000146
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000147 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000148 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000149 initialized = 1;
Tim Petersd08e3822003-04-17 15:24:21 +0000150
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000151 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000152 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000153 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000154 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000155 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000156 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000157
Guido van Rossuma027efa1997-05-05 20:56:21 +0000158 interp = PyInterpreterState_New();
159 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000161
Guido van Rossuma027efa1997-05-05 20:56:21 +0000162 tstate = PyThreadState_New(interp);
163 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000165 (void) PyThreadState_Swap(tstate);
166
Guido van Rossum70d893a2001-08-16 08:21:42 +0000167 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000168
Neal Norwitzb2501f42002-12-31 03:42:13 +0000169 if (!_PyFrame_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000170 Py_FatalError("Py_Initialize: can't init frames");
171
Neal Norwitzb2501f42002-12-31 03:42:13 +0000172 if (!_PyInt_Init())
Neal Norwitzc91ed402002-12-30 22:29:22 +0000173 Py_FatalError("Py_Initialize: can't init ints");
174
Michael W. Hudsonba283e22005-05-27 15:23:20 +0000175 _PyFloat_Init();
176
Guido van Rossum25ce5661997-08-02 03:10:38 +0000177 interp->modules = PyDict_New();
178 if (interp->modules == NULL)
179 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000180
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000181#ifdef Py_USING_UNICODE
Guido van Rossumc94044c2000-03-10 23:03:54 +0000182 /* Init Unicode implementation; relies on the codec registry */
183 _PyUnicode_Init();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000184#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000185
Barry Warsawf242aa02000-05-25 23:09:49 +0000186 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187 if (bimod == NULL)
188 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000189 interp->builtins = PyModule_GetDict(bimod);
190 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191
192 sysmod = _PySys_Init();
193 if (sysmod == NULL)
194 Py_FatalError("Py_Initialize: can't initialize sys");
195 interp->sysdict = PyModule_GetDict(sysmod);
196 Py_INCREF(interp->sysdict);
197 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000198 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 PyDict_SetItemString(interp->sysdict, "modules",
200 interp->modules);
201
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000202 _PyImport_Init();
203
Barry Warsawf242aa02000-05-25 23:09:49 +0000204 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000205 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000206 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000207
Barry Warsaw035574d1997-08-29 22:07:17 +0000208 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000209 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000210
Just van Rossum52e14d62002-12-30 22:08:05 +0000211 _PyImportHooks_Init();
212
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000213 if (install_sigs)
214 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000215
216 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000217 if (!Py_NoSiteFlag)
218 initsite(); /* Module site */
Just van Rossum5bfba3a2003-02-25 20:25:12 +0000219
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000220 /* auto-thread-state API, if available */
221#ifdef WITH_THREAD
222 _PyGILState_Init(interp, tstate);
223#endif /* WITH_THREAD */
224
Mark Hammondedd07732003-07-15 23:03:55 +0000225 warnings_module = PyImport_ImportModule("warnings");
226 if (!warnings_module)
227 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000228
229#if defined(Py_USING_UNICODE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
230 /* On Unix, set the file system encoding according to the
231 user's preference, if the CODESET names a well-known
232 Python codec, and Py_FileSystemDefaultEncoding isn't
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000233 initialized by other means. Also set the encoding of
234 stdin and stdout if these are terminals. */
235
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000236 saved_locale = strdup(setlocale(LC_CTYPE, NULL));
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000237 setlocale(LC_CTYPE, "");
238 codeset = nl_langinfo(CODESET);
239 if (codeset && *codeset) {
240 PyObject *enc = PyCodec_Encoder(codeset);
241 if (enc) {
242 codeset = strdup(codeset);
243 Py_DECREF(enc);
244 } else {
245 codeset = NULL;
246 PyErr_Clear();
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000247 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000248 } else
249 codeset = NULL;
250 setlocale(LC_CTYPE, saved_locale);
Martin v. Löwisf56d0152003-11-13 07:43:21 +0000251 free(saved_locale);
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000252
253 if (codeset) {
Michael W. Hudson68debc92003-08-11 12:20:24 +0000254 sys_stream = PySys_GetObject("stdin");
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000255 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
256 if (!sys_isatty)
257 PyErr_Clear();
258 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
259 if (!PyFile_SetEncoding(sys_stream, codeset))
260 Py_FatalError("Cannot set codeset of stdin");
261 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000262 Py_XDECREF(sys_isatty);
263
264 sys_stream = PySys_GetObject("stdout");
265 sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
266 if (!sys_isatty)
267 PyErr_Clear();
268 if(sys_isatty && PyObject_IsTrue(sys_isatty)) {
269 if (!PyFile_SetEncoding(sys_stream, codeset))
270 Py_FatalError("Cannot set codeset of stdout");
271 }
Martin v. Löwisa2c17c52003-08-09 09:47:11 +0000272 Py_XDECREF(sys_isatty);
273
274 if (!Py_FileSystemDefaultEncoding)
275 Py_FileSystemDefaultEncoding = codeset;
276 else
277 free(codeset);
Martin v. Löwis73d538b2003-03-05 15:13:47 +0000278 }
279#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000280}
281
Martin v. Löwis336e85f2004-08-19 11:31:58 +0000282void
283Py_Initialize(void)
284{
285 Py_InitializeEx(1);
286}
287
288
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000289#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000290extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000291#endif
292
Guido van Rossum25ce5661997-08-02 03:10:38 +0000293/* Undo the effect of Py_Initialize().
294
295 Beware: if multiple interpreter and/or thread states exist, these
296 are not wiped out; only the current thread and interpreter state
297 are deleted. But since everything else is deleted, those other
298 interpreter and thread states should no longer be used.
299
300 (XXX We should do better, e.g. wipe out all interpreters and
301 threads.)
302
303 Locking: as above.
304
305*/
306
307void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000308Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000309{
310 PyInterpreterState *interp;
311 PyThreadState *tstate;
312
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000313 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000314 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315
Tim Peters384fd102001-01-21 03:40:37 +0000316 /* The interpreter is still entirely intact at this point, and the
317 * exit funcs may be relying on that. In particular, if some thread
318 * or exit func is still waiting to do an import, the import machinery
319 * expects Py_IsInitialized() to return true. So don't say the
320 * interpreter is uninitialized until after the exit funcs have run.
321 * Note that Threading.py uses an exit func to do a join on all the
322 * threads created thru it, so this also protects pending imports in
323 * the threads created via Threading.
324 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000325 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000326 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000327
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000328 /* Get current thread state and interpreter pointer */
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000329 tstate = PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000330 interp = tstate->interp;
331
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000332 /* Disable signal handling */
333 PyOS_FiniInterrupts();
334
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000335 /* drop module references we saved */
Mark Hammondedd07732003-07-15 23:03:55 +0000336 Py_XDECREF(warnings_module);
337 warnings_module = NULL;
Mark Hammonda43fd0c2003-02-19 00:33:33 +0000338
Guido van Rossume13ddc92003-04-17 17:29:22 +0000339 /* Collect garbage. This may call finalizers; it's nice to call these
Tim Peters1d7323e2003-12-01 21:35:27 +0000340 * before all modules are destroyed.
341 * XXX If a __del__ or weakref callback is triggered here, and tries to
342 * XXX import a module, bad things can happen, because Python no
343 * XXX longer believes it's initialized.
344 * XXX Fatal Python error: Interpreter not initialized (version mismatch?)
345 * XXX is easy to provoke that way. I've also seen, e.g.,
346 * XXX Exception exceptions.ImportError: 'No module named sha'
347 * XXX in <function callback at 0x008F5718> ignored
348 * XXX but I'm unclear on exactly how that one happens. In any case,
349 * XXX I haven't seen a real-life report of either of these.
350 */
Guido van Rossume13ddc92003-04-17 17:29:22 +0000351 PyGC_Collect();
352
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000353 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000354 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000355
Guido van Rossume13ddc92003-04-17 17:29:22 +0000356 /* Collect final garbage. This disposes of cycles created by
Tim Peters1d7323e2003-12-01 21:35:27 +0000357 * new-style class definitions, for example.
358 * XXX This is disabled because it caused too many problems. If
359 * XXX a __del__ or weakref callback triggers here, Python code has
360 * XXX a hard time running, because even the sys module has been
361 * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
362 * XXX One symptom is a sequence of information-free messages
363 * XXX coming from threads (if a __del__ or callback is invoked,
364 * XXX other threads can execute too, and any exception they encounter
365 * XXX triggers a comedy of errors as subsystem after subsystem
366 * XXX fails to find what it *expects* to find in sys to help report
367 * XXX the exception and consequent unexpected failures). I've also
368 * XXX seen segfaults then, after adding print statements to the
369 * XXX Python code getting called.
370 */
371#if 0
Guido van Rossume13ddc92003-04-17 17:29:22 +0000372 PyGC_Collect();
Tim Peters1d7323e2003-12-01 21:35:27 +0000373#endif
Guido van Rossume13ddc92003-04-17 17:29:22 +0000374
Guido van Rossum1707aad1997-12-08 23:43:45 +0000375 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
376 _PyImport_Fini();
377
378 /* Debugging stuff */
379#ifdef COUNT_ALLOCS
380 dump_counts();
381#endif
382
383#ifdef Py_REF_DEBUG
384 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
385#endif
386
Tim Peters9cf25ce2003-04-17 15:21:01 +0000387#ifdef Py_TRACE_REFS
388 /* Display all objects still alive -- this can invoke arbitrary
389 * __repr__ overrides, so requires a mostly-intact interpreter.
390 * Alas, a lot of stuff may still be alive now that will be cleaned
391 * up later.
392 */
Tim Peters269b2a62003-04-17 19:52:29 +0000393 if (Py_GETENV("PYTHONDUMPREFS"))
Tim Peters9cf25ce2003-04-17 15:21:01 +0000394 _Py_PrintReferences(stderr);
Tim Peters9cf25ce2003-04-17 15:21:01 +0000395#endif /* Py_TRACE_REFS */
396
Mark Hammond6cb90292003-04-22 11:18:00 +0000397 /* Cleanup auto-thread-state */
398#ifdef WITH_THREAD
399 _PyGILState_Fini();
400#endif /* WITH_THREAD */
401
Guido van Rossumd922fa42003-04-15 14:10:09 +0000402 /* Clear interpreter state */
Barry Warsawf242aa02000-05-25 23:09:49 +0000403 PyInterpreterState_Clear(interp);
Guido van Rossumd922fa42003-04-15 14:10:09 +0000404
Anthony Baxter12b6f6c2005-03-29 13:36:16 +0000405 /* Now we decref the exception classes. After this point nothing
406 can raise an exception. That's okay, because each Fini() method
407 below has been checked to make sure no exceptions are ever
408 raised.
409 */
410
411 _PyExc_Fini();
412
Guido van Rossumd922fa42003-04-15 14:10:09 +0000413 /* Delete current thread */
Barry Warsawf242aa02000-05-25 23:09:49 +0000414 PyThreadState_Swap(NULL);
415 PyInterpreterState_Delete(interp);
416
Guido van Rossumd922fa42003-04-15 14:10:09 +0000417 /* Sundry finalizers */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000418 PyMethod_Fini();
419 PyFrame_Fini();
420 PyCFunction_Fini();
421 PyTuple_Fini();
Raymond Hettingerfb09f0e2004-10-07 03:58:07 +0000422 PyList_Fini();
Raymond Hettingerd7946662005-08-01 21:39:29 +0000423 PySet_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000424 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000425 PyInt_Fini();
426 PyFloat_Fini();
427
Marc-André Lemburg95de5c12002-04-08 08:19:36 +0000428#ifdef Py_USING_UNICODE
429 /* Cleanup Unicode implementation */
430 _PyUnicode_Fini();
431#endif
432
Guido van Rossumcc283f51997-08-05 02:22:03 +0000433 /* XXX Still allocated:
434 - various static ad-hoc pointers to interned strings
435 - int and float free list blocks
436 - whatever various modules and libraries allocate
437 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000438
439 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000440
Tim Peters269b2a62003-04-17 19:52:29 +0000441#ifdef Py_TRACE_REFS
442 /* Display addresses (& refcnts) of all objects still alive.
443 * An address can be used to find the repr of the object, printed
444 * above by _Py_PrintReferences.
445 */
446 if (Py_GETENV("PYTHONDUMPREFS"))
447 _Py_PrintReferenceAddresses(stderr);
448#endif /* Py_TRACE_REFS */
Tim Peters0e871182002-04-13 08:29:14 +0000449#ifdef PYMALLOC_DEBUG
450 if (Py_GETENV("PYTHONMALLOCSTATS"))
451 _PyObject_DebugMallocStats();
452#endif
453
Guido van Rossumcc283f51997-08-05 02:22:03 +0000454 call_ll_exitfuncs();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000455}
456
457/* Create and initialize a new interpreter and thread, and return the
458 new thread. This requires that Py_Initialize() has been called
459 first.
460
461 Unsuccessful initialization yields a NULL pointer. Note that *no*
462 exception information is available even in this case -- the
463 exception information is held in the thread, and there is no
464 thread.
465
466 Locking: as above.
467
468*/
469
470PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000471Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000472{
473 PyInterpreterState *interp;
474 PyThreadState *tstate, *save_tstate;
475 PyObject *bimod, *sysmod;
476
477 if (!initialized)
478 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
479
480 interp = PyInterpreterState_New();
481 if (interp == NULL)
482 return NULL;
483
484 tstate = PyThreadState_New(interp);
485 if (tstate == NULL) {
486 PyInterpreterState_Delete(interp);
487 return NULL;
488 }
489
490 save_tstate = PyThreadState_Swap(tstate);
491
492 /* XXX The following is lax in error checking */
493
494 interp->modules = PyDict_New();
495
496 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
497 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000498 interp->builtins = PyModule_GetDict(bimod);
499 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000500 }
501 sysmod = _PyImport_FindExtension("sys", "sys");
502 if (bimod != NULL && sysmod != NULL) {
503 interp->sysdict = PyModule_GetDict(sysmod);
504 Py_INCREF(interp->sysdict);
505 PySys_SetPath(Py_GetPath());
506 PyDict_SetItemString(interp->sysdict, "modules",
507 interp->modules);
Martin v. Löwisd7ceb222003-01-22 09:00:38 +0000508 _PyImportHooks_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000509 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000510 if (!Py_NoSiteFlag)
511 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000512 }
513
514 if (!PyErr_Occurred())
515 return tstate;
516
517 /* Oops, it didn't work. Undo it all. */
518
519 PyErr_Print();
520 PyThreadState_Clear(tstate);
521 PyThreadState_Swap(save_tstate);
522 PyThreadState_Delete(tstate);
523 PyInterpreterState_Delete(interp);
524
525 return NULL;
526}
527
528/* Delete an interpreter and its last thread. This requires that the
529 given thread state is current, that the thread has no remaining
530 frames, and that it is its interpreter's only remaining thread.
531 It is a fatal error to violate these constraints.
532
533 (Py_Finalize() doesn't have these constraints -- it zaps
534 everything, regardless.)
535
536 Locking: as above.
537
538*/
539
540void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000541Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000542{
543 PyInterpreterState *interp = tstate->interp;
544
Nicholas Bastine5662ae2004-03-24 22:22:12 +0000545 if (tstate != PyThreadState_GET())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000546 Py_FatalError("Py_EndInterpreter: thread is not current");
547 if (tstate->frame != NULL)
548 Py_FatalError("Py_EndInterpreter: thread still has a frame");
549 if (tstate != interp->tstate_head || tstate->next != NULL)
550 Py_FatalError("Py_EndInterpreter: not the last thread");
551
552 PyImport_Cleanup();
553 PyInterpreterState_Clear(interp);
554 PyThreadState_Swap(NULL);
555 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000556}
557
558static char *progname = "python";
559
560void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000561Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000562{
563 if (pn && *pn)
564 progname = pn;
565}
566
567char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000568Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000569{
570 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571}
572
Guido van Rossuma61691e1998-02-06 22:27:24 +0000573static char *default_home = NULL;
574
575void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000576Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000577{
578 default_home = home;
579}
580
581char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000582Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000583{
584 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000585 if (home == NULL && !Py_IgnoreEnvironmentFlag)
586 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000587 return home;
588}
589
Guido van Rossum6135a871995-01-09 17:53:26 +0000590/* Create __main__ module */
591
592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000593initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000594{
Guido van Rossum82598051997-03-05 00:20:32 +0000595 PyObject *m, *d;
596 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000597 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000598 Py_FatalError("can't create __main__ module");
599 d = PyModule_GetDict(m);
600 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000601 PyObject *bimod = PyImport_ImportModule("__builtin__");
602 if (bimod == NULL ||
603 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000604 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000605 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000606 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607}
608
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000609/* Import the site module (not into __main__ though) */
610
611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000612initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000613{
614 PyObject *m, *f;
615 m = PyImport_ImportModule("site");
616 if (m == NULL) {
617 f = PySys_GetObject("stderr");
618 if (Py_VerboseFlag) {
619 PyFile_WriteString(
620 "'import site' failed; traceback:\n", f);
621 PyErr_Print();
622 }
623 else {
624 PyFile_WriteString(
625 "'import site' failed; use -v for traceback\n", f);
626 PyErr_Clear();
627 }
628 }
629 else {
630 Py_DECREF(m);
631 }
632}
633
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000634/* Parse input from a file and execute it */
635
636int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000637PyRun_AnyFile(FILE *fp, const char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000639 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
640}
641
642int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000643PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000644{
645 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000646}
647
648int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000649PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +0000650{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000651 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
652}
653
654int
Tim Petersd08e3822003-04-17 15:24:21 +0000655PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000656 PyCompilerFlags *flags)
657{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658 if (filename == NULL)
659 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000660 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000661 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000662 if (closeit)
663 fclose(fp);
664 return err;
665 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000667 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668}
669
670int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000671PyRun_InteractiveLoop(FILE *fp, const char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000673 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
674}
675
676int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000677PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000678{
Guido van Rossum82598051997-03-05 00:20:32 +0000679 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000681 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000682
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000683 if (flags == NULL) {
684 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000685 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000686 }
Guido van Rossum82598051997-03-05 00:20:32 +0000687 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000688 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000689 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
690 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000691 }
Guido van Rossum82598051997-03-05 00:20:32 +0000692 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000693 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000694 PySys_SetObject("ps2", v = PyString_FromString("... "));
695 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696 }
697 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000698 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000699#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000700 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000701#endif
702 if (ret == E_EOF)
703 return 0;
704 /*
705 if (ret == E_NOMEM)
706 return -1;
707 */
708 }
709}
710
711int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000712PyRun_InteractiveOne(FILE *fp, const char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000713{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000714 return PyRun_InteractiveOneFlags(fp, filename, NULL);
715}
716
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000717/* compute parser flags based on compiler flags */
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000718#define PARSER_FLAGS(flags) \
Guido van Rossum4b499dd32003-02-13 22:07:59 +0000719 (((flags) && (flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
720 PyPARSE_DONT_IMPLY_DEDENT : 0)
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000721
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000722int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000723PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000724{
Guido van Rossum82598051997-03-05 00:20:32 +0000725 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000726 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000727 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000728 char *ps1 = "", *ps2 = "";
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 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000746 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
747 Py_single_input, ps1, ps2, &err,
Neil Schemenauerc24ea082002-03-22 23:53:36 +0000748 PARSER_FLAGS(flags));
Guido van Rossum82598051997-03-05 00:20:32 +0000749 Py_XDECREF(v);
750 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000751 if (n == NULL) {
752 if (err.error == E_EOF) {
753 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000754 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000755 return E_EOF;
756 }
757 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000758 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000760 }
Guido van Rossum82598051997-03-05 00:20:32 +0000761 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000762 if (m == NULL)
763 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000764 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000765 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000766 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000767 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000768 return -1;
769 }
Guido van Rossum82598051997-03-05 00:20:32 +0000770 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000771 if (Py_FlushLine())
772 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000773 return 0;
774}
775
776int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000777PyRun_SimpleFile(FILE *fp, const char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000778{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000779 return PyRun_SimpleFileEx(fp, filename, 0);
780}
781
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000782/* Check whether a file maybe a pyc file: Look at the extension,
783 the file type, and, if we may close it, at the first few bytes. */
784
785static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000786maybe_pyc_file(FILE *fp, const char* filename, const char* ext, int closeit)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000787{
788 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
789 return 1;
790
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000791 /* Only look into the file if we are allowed to close it, since
792 it then should also be seekable. */
793 if (closeit) {
794 /* Read only two bytes of the magic. If the file was opened in
795 text mode, the bytes 3 and 4 of the magic (\r\n) might not
796 be read as they are on disk. */
797 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
798 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000799 /* Mess: In case of -x, the stream is NOT at its start now,
800 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000801 which makes the current stream position formally undefined,
802 and a x-platform nightmare.
803 Unfortunately, we have no direct way to know whether -x
804 was specified. So we use a terrible hack: if the current
805 stream position is not 0, we assume -x was specified, and
806 give up. Bug 132850 on SourceForge spells out the
807 hopelessness of trying anything else (fseek and ftell
808 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000809 */
Tim Peters3e876562001-02-11 04:35:39 +0000810 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000811 if (ftell(fp) == 0) {
812 if (fread(buf, 1, 2, fp) == 2 &&
Tim Petersd08e3822003-04-17 15:24:21 +0000813 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000814 ispyc = 1;
815 rewind(fp);
816 }
Tim Peters3e876562001-02-11 04:35:39 +0000817 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000818 }
819 return 0;
Tim Petersd08e3822003-04-17 15:24:21 +0000820}
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000821
Guido van Rossum0df002c2000-08-27 19:21:52 +0000822int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000823PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +0000824{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000825 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
826}
827
828int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000829PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000830 PyCompilerFlags *flags)
831{
Guido van Rossum82598051997-03-05 00:20:32 +0000832 PyObject *m, *d, *v;
Martin v. Löwis95292d62002-12-11 14:04:59 +0000833 const char *ext;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000834
Guido van Rossum82598051997-03-05 00:20:32 +0000835 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836 if (m == NULL)
837 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000838 d = PyModule_GetDict(m);
Fred Drake8ed02042002-10-17 21:24:58 +0000839 if (PyDict_GetItemString(d, "__file__") == NULL) {
840 PyObject *f = PyString_FromString(filename);
841 if (f == NULL)
842 return -1;
843 if (PyDict_SetItemString(d, "__file__", f) < 0) {
844 Py_DECREF(f);
845 return -1;
846 }
847 Py_DECREF(f);
848 }
Guido van Rossumfdef2711994-09-14 13:31:04 +0000849 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000850 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000851 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000852 if (closeit)
853 fclose(fp);
Fred Drake8ed02042002-10-17 21:24:58 +0000854 if ((fp = fopen(filename, "rb")) == NULL) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000855 fprintf(stderr, "python: Can't reopen .pyc file\n");
856 return -1;
857 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000858 /* Turn on optimization if a .pyo file is given */
859 if (strcmp(ext, ".pyo") == 0)
860 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000861 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000862 } else {
Tim Petersd08e3822003-04-17 15:24:21 +0000863 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000864 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000865 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000866 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000867 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000868 return -1;
869 }
Guido van Rossum82598051997-03-05 00:20:32 +0000870 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000871 if (Py_FlushLine())
872 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873 return 0;
874}
875
876int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000877PyRun_SimpleString(const char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000878{
Guido van Rossum393661d2001-08-31 17:40:15 +0000879 return PyRun_SimpleStringFlags(command, NULL);
880}
881
882int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000883PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
Guido van Rossum393661d2001-08-31 17:40:15 +0000884{
Guido van Rossum82598051997-03-05 00:20:32 +0000885 PyObject *m, *d, *v;
886 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000887 if (m == NULL)
888 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000889 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +0000890 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000891 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000892 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000893 return -1;
894 }
Guido van Rossum82598051997-03-05 00:20:32 +0000895 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000896 if (Py_FlushLine())
897 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000898 return 0;
899}
900
Barry Warsaw035574d1997-08-29 22:07:17 +0000901static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000902parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
903 int *lineno, int *offset, const char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000904{
905 long hold;
906 PyObject *v;
907
908 /* old style errors */
909 if (PyTuple_Check(err))
Neal Norwitz78293352002-04-01 01:41:20 +0000910 return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
911 lineno, offset, text);
Barry Warsaw035574d1997-08-29 22:07:17 +0000912
913 /* new style errors. `err' is an instance */
914
915 if (! (v = PyObject_GetAttrString(err, "msg")))
916 goto finally;
917 *message = v;
918
919 if (!(v = PyObject_GetAttrString(err, "filename")))
920 goto finally;
921 if (v == Py_None)
922 *filename = NULL;
923 else if (! (*filename = PyString_AsString(v)))
924 goto finally;
925
926 Py_DECREF(v);
927 if (!(v = PyObject_GetAttrString(err, "lineno")))
928 goto finally;
929 hold = PyInt_AsLong(v);
930 Py_DECREF(v);
931 v = NULL;
932 if (hold < 0 && PyErr_Occurred())
933 goto finally;
934 *lineno = (int)hold;
935
936 if (!(v = PyObject_GetAttrString(err, "offset")))
937 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000938 if (v == Py_None) {
939 *offset = -1;
940 Py_DECREF(v);
941 v = NULL;
942 } else {
943 hold = PyInt_AsLong(v);
944 Py_DECREF(v);
945 v = NULL;
946 if (hold < 0 && PyErr_Occurred())
947 goto finally;
948 *offset = (int)hold;
949 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000950
951 if (!(v = PyObject_GetAttrString(err, "text")))
952 goto finally;
953 if (v == Py_None)
954 *text = NULL;
955 else if (! (*text = PyString_AsString(v)))
956 goto finally;
957 Py_DECREF(v);
958 return 1;
959
960finally:
961 Py_XDECREF(v);
962 return 0;
963}
964
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000965void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000966PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000967{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000968 PyErr_PrintEx(1);
969}
970
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000971static void
Martin v. Löwis95292d62002-12-11 14:04:59 +0000972print_error_text(PyObject *f, int offset, const char *text)
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000973{
974 char *nl;
975 if (offset >= 0) {
976 if (offset > 0 && offset == (int)strlen(text))
977 offset--;
978 for (;;) {
979 nl = strchr(text, '\n');
980 if (nl == NULL || nl-text >= offset)
981 break;
982 offset -= (nl+1-text);
983 text = nl+1;
984 }
985 while (*text == ' ' || *text == '\t') {
986 text++;
987 offset--;
988 }
989 }
990 PyFile_WriteString(" ", f);
991 PyFile_WriteString(text, f);
992 if (*text == '\0' || text[strlen(text)-1] != '\n')
993 PyFile_WriteString("\n", f);
994 if (offset == -1)
995 return;
996 PyFile_WriteString(" ", f);
997 offset--;
998 while (offset > 0) {
999 PyFile_WriteString(" ", f);
1000 offset--;
1001 }
1002 PyFile_WriteString("^\n", f);
1003}
1004
Guido van Rossum66e8e862001-03-23 17:54:43 +00001005static void
1006handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001007{
Guido van Rossum66e8e862001-03-23 17:54:43 +00001008 PyObject *exception, *value, *tb;
Tim Peterscf615b52003-04-19 18:47:02 +00001009 int exitcode = 0;
1010
Guido van Rossum66e8e862001-03-23 17:54:43 +00001011 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001012 if (Py_FlushLine())
1013 PyErr_Clear();
1014 fflush(stdout);
1015 if (value == NULL || value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001016 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001017 if (PyInstance_Check(value)) {
1018 /* The error code should be in the `code' attribute. */
1019 PyObject *code = PyObject_GetAttrString(value, "code");
1020 if (code) {
1021 Py_DECREF(value);
1022 value = code;
1023 if (value == Py_None)
Tim Peterscf615b52003-04-19 18:47:02 +00001024 goto done;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001025 }
1026 /* If we failed to dig out the 'code' attribute,
1027 just let the else clause below print the error. */
1028 }
1029 if (PyInt_Check(value))
Tim Peterscf615b52003-04-19 18:47:02 +00001030 exitcode = (int)PyInt_AsLong(value);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001031 else {
1032 PyObject_Print(value, stderr, Py_PRINT_RAW);
1033 PySys_WriteStderr("\n");
Tim Peterscf615b52003-04-19 18:47:02 +00001034 exitcode = 1;
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001035 }
Tim Peterscf615b52003-04-19 18:47:02 +00001036 done:
1037 /* Restore and clear the exception info, in order to properly decref
1038 * the exception, value, and traceback. If we just exit instead,
1039 * these leak, which confuses PYTHONDUMPREFS output, and may prevent
1040 * some finalizers from running.
1041 */
1042 PyErr_Restore(exception, value, tb);
1043 PyErr_Clear();
1044 Py_Exit(exitcode);
1045 /* NOTREACHED */
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001046}
1047
1048void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001049PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +00001050{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001051 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001052
1053 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1054 handle_system_exit();
1055 }
Guido van Rossum82598051997-03-05 00:20:32 +00001056 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +00001057 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +00001059 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +00001060 if (set_sys_last_vars) {
1061 PySys_SetObject("last_type", exception);
1062 PySys_SetObject("last_value", v);
1063 PySys_SetObject("last_traceback", tb);
1064 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001065 hook = PySys_GetObject("excepthook");
1066 if (hook) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001067 PyObject *args = PyTuple_Pack(3,
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001068 exception, v ? v : Py_None, tb ? tb : Py_None);
1069 PyObject *result = PyEval_CallObject(hook, args);
1070 if (result == NULL) {
1071 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +00001072 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
1073 handle_system_exit();
1074 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001075 PyErr_Fetch(&exception2, &v2, &tb2);
1076 PyErr_NormalizeException(&exception2, &v2, &tb2);
1077 if (Py_FlushLine())
1078 PyErr_Clear();
1079 fflush(stdout);
1080 PySys_WriteStderr("Error in sys.excepthook:\n");
1081 PyErr_Display(exception2, v2, tb2);
1082 PySys_WriteStderr("\nOriginal exception was:\n");
1083 PyErr_Display(exception, v, tb);
Jeremy Hylton07028582001-12-07 15:35:35 +00001084 Py_XDECREF(exception2);
1085 Py_XDECREF(v2);
1086 Py_XDECREF(tb2);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001087 }
1088 Py_XDECREF(result);
1089 Py_XDECREF(args);
1090 } else {
1091 PySys_WriteStderr("sys.excepthook is missing\n");
1092 PyErr_Display(exception, v, tb);
1093 }
1094 Py_XDECREF(exception);
1095 Py_XDECREF(v);
1096 Py_XDECREF(tb);
1097}
1098
1099void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
1100{
1101 int err = 0;
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001102 PyObject *f = PySys_GetObject("stderr");
Armin Rigo5d2c6832004-03-22 20:16:58 +00001103 Py_INCREF(value);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001104 if (f == NULL)
1105 fprintf(stderr, "lost sys.stderr\n");
1106 else {
Guido van Rossum0829c751998-02-28 04:31:39 +00001107 if (Py_FlushLine())
1108 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001109 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +00001110 if (tb && tb != Py_None)
1111 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +00001112 if (err == 0 &&
Armin Rigo5d2c6832004-03-22 20:16:58 +00001113 PyObject_HasAttrString(value, "print_file_and_line"))
Barry Warsaw36b8f941997-08-26 18:09:48 +00001114 {
Guido van Rossum82598051997-03-05 00:20:32 +00001115 PyObject *message;
Martin v. Löwis95292d62002-12-11 14:04:59 +00001116 const char *filename, *text;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001117 int lineno, offset;
Armin Rigo5d2c6832004-03-22 20:16:58 +00001118 if (!parse_syntax_error(value, &message, &filename,
Barry Warsaw035574d1997-08-29 22:07:17 +00001119 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +00001120 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001121 else {
1122 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +00001123 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001124 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +00001125 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001126 else
Guido van Rossum82598051997-03-05 00:20:32 +00001127 PyFile_WriteString(filename, f);
1128 PyFile_WriteString("\", line ", f);
Jeremy Hylton518ab1c2001-11-28 20:42:20 +00001129 PyOS_snprintf(buf, sizeof(buf), "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +00001130 PyFile_WriteString(buf, f);
1131 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001132 if (text != NULL)
1133 print_error_text(f, offset, text);
Armin Rigo5d2c6832004-03-22 20:16:58 +00001134 Py_DECREF(value);
1135 value = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001136 /* Can't be bothered to check all those
1137 PyFile_WriteString() calls */
1138 if (PyErr_Occurred())
1139 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001140 }
1141 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001142 if (err) {
1143 /* Don't do anything else */
1144 }
1145 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001146 PyClassObject* exc = (PyClassObject*)exception;
1147 PyObject* className = exc->cl_name;
1148 PyObject* moduleName =
1149 PyDict_GetItemString(exc->cl_dict, "__module__");
1150
1151 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001152 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001153 else {
1154 char* modstr = PyString_AsString(moduleName);
Tim Petersd08e3822003-04-17 15:24:21 +00001155 if (modstr && strcmp(modstr, "exceptions"))
Barry Warsaw2f5f6a21997-09-16 21:42:03 +00001156 {
1157 err = PyFile_WriteString(modstr, f);
1158 err += PyFile_WriteString(".", f);
1159 }
1160 }
1161 if (err == 0) {
1162 if (className == NULL)
1163 err = PyFile_WriteString("<unknown>", f);
1164 else
1165 err = PyFile_WriteObject(className, f,
1166 Py_PRINT_RAW);
1167 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001168 }
1169 else
1170 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
1171 if (err == 0) {
Armin Rigo5d2c6832004-03-22 20:16:58 +00001172 if (value != Py_None) {
1173 PyObject *s = PyObject_Str(value);
Barry Warsaw035574d1997-08-29 22:07:17 +00001174 /* only print colon if the str() of the
1175 object is not the empty string
1176 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +00001177 if (s == NULL)
1178 err = -1;
1179 else if (!PyString_Check(s) ||
1180 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +00001181 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001182 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +00001183 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
1184 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +00001185 }
Guido van Rossum262e1241995-02-07 15:30:45 +00001186 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001187 if (err == 0)
1188 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001189 }
Armin Rigo5d2c6832004-03-22 20:16:58 +00001190 Py_DECREF(value);
Guido van Rossum78a1ed31997-05-22 22:35:04 +00001191 /* If an error happened here, don't show it.
1192 XXX This is wrong, but too many callers rely on this behavior. */
1193 if (err != 0)
1194 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001195}
1196
Guido van Rossum82598051997-03-05 00:20:32 +00001197PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001198PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001199{
Guido van Rossum82598051997-03-05 00:20:32 +00001200 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001201 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001202}
1203
Guido van Rossum82598051997-03-05 00:20:32 +00001204PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001205PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals,
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001206 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001207{
Tim Peterse8682112000-08-27 20:18:17 +00001208 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +00001209}
1210
1211PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001212PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001213 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +00001214{
1215 node *n = PyParser_SimpleParseFile(fp, filename, start);
1216 if (closeit)
1217 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001218 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001219}
1220
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001221PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001222PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001223 PyCompilerFlags *flags)
1224{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001225 return run_err_node(PyParser_SimpleParseStringFlags(
Neil Schemenauerc24ea082002-03-22 23:53:36 +00001226 str, start, PARSER_FLAGS(flags)),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001227 "<string>", globals, locals, flags);
1228}
1229
1230PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001231PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001232 PyObject *locals, PyCompilerFlags *flags)
1233{
1234 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
Tim Petersd08e3822003-04-17 15:24:21 +00001235 flags);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001236}
1237
1238PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001239PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001240 PyObject *locals, int closeit, PyCompilerFlags *flags)
1241{
Tim Petersfe2127d2001-07-16 05:37:24 +00001242 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
Neil Schemenauerc24ea082002-03-22 23:53:36 +00001243 PARSER_FLAGS(flags));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001244 if (closeit)
1245 fclose(fp);
1246 return run_err_node(n, filename, globals, locals, flags);
1247}
1248
Guido van Rossum82598051997-03-05 00:20:32 +00001249static PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001250run_err_node(node *n, const char *filename, PyObject *globals, PyObject *locals,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001251 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001252{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001253 if (n == NULL)
1254 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001255 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001256}
1257
Guido van Rossum82598051997-03-05 00:20:32 +00001258static PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001259run_node(node *n, const char *filename, PyObject *globals, PyObject *locals,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001260 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001261{
Guido van Rossum82598051997-03-05 00:20:32 +00001262 PyCodeObject *co;
1263 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001264 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001265 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001266 if (co == NULL)
1267 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001268 v = PyEval_EvalCode(co, globals, locals);
1269 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001270 return v;
1271}
1272
Guido van Rossum82598051997-03-05 00:20:32 +00001273static PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001274run_pyc_file(FILE *fp, const char *filename, PyObject *globals, PyObject *locals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001275 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001276{
Guido van Rossum82598051997-03-05 00:20:32 +00001277 PyCodeObject *co;
1278 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001279 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001280 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001281
Guido van Rossum82598051997-03-05 00:20:32 +00001282 magic = PyMarshal_ReadLongFromFile(fp);
1283 if (magic != PyImport_GetMagicNumber()) {
1284 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001285 "Bad magic number in .pyc file");
1286 return NULL;
1287 }
Guido van Rossum82598051997-03-05 00:20:32 +00001288 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001289 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001290 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001291 if (v == NULL || !PyCode_Check(v)) {
1292 Py_XDECREF(v);
1293 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001294 "Bad code object in .pyc file");
1295 return NULL;
1296 }
Guido van Rossum82598051997-03-05 00:20:32 +00001297 co = (PyCodeObject *)v;
1298 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001299 if (v && flags)
1300 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001301 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001302 return v;
1303}
1304
Guido van Rossum82598051997-03-05 00:20:32 +00001305PyObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001306Py_CompileString(const char *str, const char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001307{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001308 return Py_CompileStringFlags(str, filename, start, NULL);
1309}
1310
1311PyObject *
Tim Petersd08e3822003-04-17 15:24:21 +00001312Py_CompileStringFlags(const char *str, const char *filename, int start,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001313 PyCompilerFlags *flags)
1314{
Guido van Rossum5b722181993-03-30 17:46:03 +00001315 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001316 PyCodeObject *co;
Thomas Heller6b17abf2002-07-09 09:23:27 +00001317
1318 n = PyParser_SimpleParseStringFlagsFilename(str, filename, start,
1319 PARSER_FLAGS(flags));
Guido van Rossuma110aa61994-08-29 12:50:44 +00001320 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001321 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001322 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001323 PyNode_Free(n);
1324 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001325}
1326
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001327struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001328Py_SymtableString(const char *str, const char *filename, int start)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001329{
1330 node *n;
1331 struct symtable *st;
Thomas Heller6b17abf2002-07-09 09:23:27 +00001332 n = PyParser_SimpleParseStringFlagsFilename(str, filename,
1333 start, 0);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001334 if (n == NULL)
1335 return NULL;
1336 st = PyNode_CompileSymtable(n, filename);
1337 PyNode_Free(n);
1338 return st;
1339}
1340
Guido van Rossuma110aa61994-08-29 12:50:44 +00001341/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001342
Guido van Rossuma110aa61994-08-29 12:50:44 +00001343node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001344PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001345{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001346 node *n;
1347 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001348 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1349 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001350 if (n == NULL)
1351 err_input(&err);
1352 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001353}
1354
Tim Petersfe2127d2001-07-16 05:37:24 +00001355node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001356PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
Tim Petersfe2127d2001-07-16 05:37:24 +00001357{
1358 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1359}
1360
Guido van Rossuma110aa61994-08-29 12:50:44 +00001361/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001362
Guido van Rossuma110aa61994-08-29 12:50:44 +00001363node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001364PyParser_SimpleParseStringFlags(const char *str, int start, int flags)
Tim Petersfe2127d2001-07-16 05:37:24 +00001365{
1366 node *n;
1367 perrdetail err;
1368 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1369 flags);
1370 if (n == NULL)
1371 err_input(&err);
1372 return n;
1373}
1374
1375node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001376PyParser_SimpleParseString(const char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001377{
Tim Petersfe2127d2001-07-16 05:37:24 +00001378 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001379}
1380
Thomas Heller6b17abf2002-07-09 09:23:27 +00001381node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001382PyParser_SimpleParseStringFlagsFilename(const char *str, const char *filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001383 int start, int flags)
1384{
1385 node *n;
1386 perrdetail err;
1387
Tim Petersd08e3822003-04-17 15:24:21 +00001388 n = PyParser_ParseStringFlagsFilename(str, filename,
Thomas Heller6b17abf2002-07-09 09:23:27 +00001389 &_PyParser_Grammar,
1390 start, &err, flags);
1391 if (n == NULL)
1392 err_input(&err);
1393 return n;
1394}
1395
1396node *
Martin v. Löwis95292d62002-12-11 14:04:59 +00001397PyParser_SimpleParseStringFilename(const char *str, const char *filename, int start)
Thomas Heller6b17abf2002-07-09 09:23:27 +00001398{
1399 return PyParser_SimpleParseStringFlagsFilename(str, filename,
1400 start, 0);
1401}
1402
Guido van Rossum66ebd912003-04-17 16:02:26 +00001403/* May want to move a more generalized form of this to parsetok.c or
1404 even parser modules. */
1405
1406void
1407PyParser_SetError(perrdetail *err)
1408{
1409 err_input(err);
1410}
1411
Guido van Rossuma110aa61994-08-29 12:50:44 +00001412/* Set the error appropriate to the given input error code (see errcode.h) */
1413
1414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001415err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001416{
Fred Drake85f36392000-07-11 17:53:00 +00001417 PyObject *v, *w, *errtype;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001418 PyObject* u = NULL;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001419 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001420 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001421 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001422 err->lineno, err->offset, err->text);
1423 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001424 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001425 err->text = NULL;
1426 }
1427 switch (err->error) {
1428 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001429 errtype = PyExc_IndentationError;
1430 if (err->expected == INDENT)
1431 msg = "expected an indented block";
1432 else if (err->token == INDENT)
1433 msg = "unexpected indent";
1434 else if (err->token == DEDENT)
1435 msg = "unexpected unindent";
1436 else {
1437 errtype = PyExc_SyntaxError;
1438 msg = "invalid syntax";
1439 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001440 break;
1441 case E_TOKEN:
1442 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001443 break;
Skip Montanaro118ec702002-08-15 01:20:16 +00001444 case E_EOFS:
1445 msg = "EOF while scanning triple-quoted string";
1446 break;
1447 case E_EOLS:
1448 msg = "EOL while scanning single-quoted string";
1449 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001450 case E_INTR:
Michael W. Hudson30ea2f22004-07-07 17:44:12 +00001451 if (!PyErr_Occurred())
1452 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001453 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001454 return;
1455 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001456 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001457 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001458 return;
1459 case E_EOF:
1460 msg = "unexpected EOF while parsing";
1461 break;
Fred Drake85f36392000-07-11 17:53:00 +00001462 case E_TABSPACE:
1463 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001464 msg = "inconsistent use of tabs and spaces in indentation";
1465 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001466 case E_OVERFLOW:
1467 msg = "expression too long";
1468 break;
Fred Drake85f36392000-07-11 17:53:00 +00001469 case E_DEDENT:
1470 errtype = PyExc_IndentationError;
1471 msg = "unindent does not match any outer indentation level";
1472 break;
1473 case E_TOODEEP:
1474 errtype = PyExc_IndentationError;
1475 msg = "too many levels of indentation";
1476 break;
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001477 case E_DECODE: {
1478 PyObject *type, *value, *tb;
1479 PyErr_Fetch(&type, &value, &tb);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001480 if (value != NULL) {
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001481 u = PyObject_Str(value);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001482 if (u != NULL) {
1483 msg = PyString_AsString(u);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001484 }
1485 }
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001486 if (msg == NULL)
1487 msg = "unknown decode error";
Martin v. Löwisd35edda2005-08-24 08:39:24 +00001488 Py_DECREF(type);
1489 Py_DECREF(value);
Neal Norwitz40d37812005-10-02 01:48:49 +00001490 Py_XDECREF(tb);
Martin v. Löwisc2632a52004-07-21 05:35:02 +00001491 break;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001492 }
Martin v. Löwis4bf108d2005-03-03 11:45:45 +00001493 case E_LINECONT:
1494 msg = "unexpected character after line continuation character";
1495 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001496 default:
1497 fprintf(stderr, "error=%d\n", err->error);
1498 msg = "unknown parsing error";
1499 break;
1500 }
Guido van Rossum82598051997-03-05 00:20:32 +00001501 w = Py_BuildValue("(sO)", msg, v);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001502 Py_XDECREF(u);
Guido van Rossum41318302001-03-23 04:01:07 +00001503 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001504 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001505 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001506}
1507
1508/* Print fatal error message and abort */
1509
1510void
Tim Peters7c321a82002-07-09 02:57:01 +00001511Py_FatalError(const char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001512{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001513 fprintf(stderr, "Fatal Python error: %s\n", msg);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001514#ifdef MS_WINDOWS
Guido van Rossum23c94461997-05-22 20:21:30 +00001515 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001516 OutputDebugString(msg);
1517 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001518#ifdef _DEBUG
1519 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001520#endif
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00001521#endif /* MS_WINDOWS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001522 abort();
1523}
1524
1525/* Clean up and exit */
1526
Guido van Rossuma110aa61994-08-29 12:50:44 +00001527#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001528#include "pythread.h"
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001529#endif
1530
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001531#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001532static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001533static int nexitfuncs = 0;
1534
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001535int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001536{
1537 if (nexitfuncs >= NEXITFUNCS)
1538 return -1;
1539 exitfuncs[nexitfuncs++] = func;
1540 return 0;
1541}
1542
Guido van Rossumcc283f51997-08-05 02:22:03 +00001543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001544call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001545{
Guido van Rossum82598051997-03-05 00:20:32 +00001546 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001547
1548 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001549 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001550 Py_INCREF(exitfunc);
1551 PySys_SetObject("exitfunc", (PyObject *)NULL);
1552 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001553 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001554 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1555 PySys_WriteStderr("Error in sys.exitfunc:\n");
1556 }
Guido van Rossum82598051997-03-05 00:20:32 +00001557 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001558 }
Guido van Rossum82598051997-03-05 00:20:32 +00001559 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001560 }
1561
Guido van Rossum0829c751998-02-28 04:31:39 +00001562 if (Py_FlushLine())
1563 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001564}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001565
Guido van Rossumcc283f51997-08-05 02:22:03 +00001566static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001567call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001568{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001569 while (nexitfuncs > 0)
1570 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001571
1572 fflush(stdout);
1573 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001574}
1575
1576void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001577Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001578{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001579 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001580
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001581 exit(sts);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001582}
1583
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001585initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001586{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001587#ifdef SIGPIPE
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001588 PyOS_setsig(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001589#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001590#ifdef SIGXFZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001591 PyOS_setsig(SIGXFZ, SIG_IGN);
Guido van Rossum70d893a2001-08-16 08:21:42 +00001592#endif
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001593#ifdef SIGXFSZ
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001594 PyOS_setsig(SIGXFSZ, SIG_IGN);
Jeremy Hylton1b0bf9b2002-04-23 20:31:01 +00001595#endif
Guido van Rossum82598051997-03-05 00:20:32 +00001596 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001597}
1598
Guido van Rossum7433b121997-02-14 19:45:36 +00001599
1600/*
1601 * The file descriptor fd is considered ``interactive'' if either
1602 * a) isatty(fd) is TRUE, or
1603 * b) the -i flag was given, and the filename associated with
1604 * the descriptor is NULL or "<stdin>" or "???".
1605 */
1606int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001607Py_FdIsInteractive(FILE *fp, const char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001608{
1609 if (isatty((int)fileno(fp)))
1610 return 1;
1611 if (!Py_InteractiveFlag)
1612 return 0;
1613 return (filename == NULL) ||
1614 (strcmp(filename, "<stdin>") == 0) ||
1615 (strcmp(filename, "???") == 0);
1616}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001617
1618
Tim Petersd08e3822003-04-17 15:24:21 +00001619#if defined(USE_STACKCHECK)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001620#if defined(WIN32) && defined(_MSC_VER)
1621
1622/* Stack checking for Microsoft C */
1623
1624#include <malloc.h>
1625#include <excpt.h>
1626
Fred Drakee8de31c2000-08-31 05:38:39 +00001627/*
1628 * Return non-zero when we run out of memory on the stack; zero otherwise.
1629 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001630int
Fred Drake399739f2000-08-31 05:52:44 +00001631PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001632{
1633 __try {
Tim Peters92e4dd82002-10-05 01:47:34 +00001634 /* alloca throws a stack overflow exception if there's
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001635 not enough space left on the stack */
Tim Peters92e4dd82002-10-05 01:47:34 +00001636 alloca(PYOS_STACK_MARGIN * sizeof(void*));
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001637 return 0;
1638 } __except (EXCEPTION_EXECUTE_HANDLER) {
1639 /* just ignore all errors */
1640 }
1641 return 1;
1642}
1643
1644#endif /* WIN32 && _MSC_VER */
1645
1646/* Alternate implementations can be added here... */
1647
1648#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001649
1650
1651/* Wrappers around sigaction() or signal(). */
1652
1653PyOS_sighandler_t
1654PyOS_getsig(int sig)
1655{
1656#ifdef HAVE_SIGACTION
1657 struct sigaction context;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001658 if (sigaction(sig, NULL, &context) == -1)
1659 return SIG_ERR;
Guido van Rossum6f256182000-09-16 16:32:19 +00001660 return context.sa_handler;
1661#else
1662 PyOS_sighandler_t handler;
1663 handler = signal(sig, SIG_IGN);
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001664 if (handler != SIG_ERR)
1665 signal(sig, handler);
Guido van Rossum6f256182000-09-16 16:32:19 +00001666 return handler;
1667#endif
1668}
1669
1670PyOS_sighandler_t
1671PyOS_setsig(int sig, PyOS_sighandler_t handler)
1672{
1673#ifdef HAVE_SIGACTION
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001674 struct sigaction context, ocontext;
Guido van Rossum6f256182000-09-16 16:32:19 +00001675 context.sa_handler = handler;
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001676 sigemptyset(&context.sa_mask);
1677 context.sa_flags = 0;
1678 if (sigaction(sig, &context, &ocontext) == -1)
1679 return SIG_ERR;
1680 return ocontext.sa_handler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001681#else
Anthony Baxter9ceaa722004-10-13 14:48:50 +00001682 PyOS_sighandler_t oldhandler;
1683 oldhandler = signal(sig, handler);
1684#ifdef HAVE_SIGINTERRUPT
1685 siginterrupt(sig, 1);
1686#endif
1687 return oldhandler;
Guido van Rossum6f256182000-09-16 16:32:19 +00001688#endif
1689}