blob: 4ee82e44ee8fc513bf462ccc5463a1b2371aa7ee [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 Rossum80bb9651996-12-05 23:27:02 +000016#ifdef HAVE_UNISTD_H
17#include <unistd.h>
18#endif
19
Guido van Rossuma110aa61994-08-29 12:50:44 +000020#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000022#endif
23
Guido van Rossum9b38a141996-09-11 23:12:24 +000024#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000025#undef BYTE
26#include "windows.h"
27#endif
28
Jack Jansencbf630f2000-07-11 21:59:16 +000029#ifdef macintosh
30#include "macglue.h"
31#endif
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000032extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000033
Guido van Rossum82598051997-03-05 00:20:32 +000034extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
Guido van Rossumb73cc041993-11-01 16:28:59 +000036/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000037static void initmain(void);
38static void initsite(void);
Jeremy Hylton9f324e92001-03-01 22:59:14 +000039static PyObject *run_err_node(node *, char *, PyObject *, PyObject *,
40 PyCompilerFlags *);
41static PyObject *run_node(node *, char *, PyObject *, PyObject *,
42 PyCompilerFlags *);
Jeremy Hyltonbc320242001-03-22 02:47:58 +000043static PyObject *run_pyc_file(FILE *, char *, PyObject *, PyObject *,
44 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static void err_input(perrdetail *);
46static void initsigs(void);
47static void call_sys_exitfunc(void);
48static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000049
Guido van Rossumbffd6832000-01-20 22:32:56 +000050#ifdef Py_TRACE_REFS
51int _Py_AskYesNo(char *prompt);
52#endif
53
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000054extern void _PyUnicode_Init(void);
55extern void _PyUnicode_Fini(void);
56extern void _PyCodecRegistry_Init(void);
57extern void _PyCodecRegistry_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000058
Guido van Rossum82598051997-03-05 00:20:32 +000059int Py_DebugFlag; /* Needed by parser.c */
60int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000061int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000062int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000063int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000064int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000065int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000066int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000067
Guido van Rossum25ce5661997-08-02 03:10:38 +000068static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069
Thomas Wouters7e474022000-07-16 12:04:32 +000070/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000071
72int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000073Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000074{
75 return initialized;
76}
77
Guido van Rossum25ce5661997-08-02 03:10:38 +000078/* Global initializations. Can be undone by Py_Finalize(). Don't
79 call this twice without an intervening Py_Finalize() call. When
80 initializations fail, a fatal error is issued and the function does
81 not return. On return, the first thread and interpreter state have
82 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083
Guido van Rossum25ce5661997-08-02 03:10:38 +000084 Locking: you must hold the interpreter lock while calling this.
85 (If the lock has not yet been initialized, that's equivalent to
86 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000087
Guido van Rossum25ce5661997-08-02 03:10:38 +000088*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000089
90void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000091Py_Initialize(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000092{
Guido van Rossuma027efa1997-05-05 20:56:21 +000093 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000094 PyThreadState *tstate;
95 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000096 char *p;
Guido van Rossum70d893a2001-08-16 08:21:42 +000097 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +000098
Guido van Rossumdcc0c131997-08-29 22:32:42 +000099 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000100 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000101 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000103 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000104 Py_DebugFlag = Py_DebugFlag ? Py_DebugFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000105 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000106 Py_VerboseFlag = Py_VerboseFlag ? Py_VerboseFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000107 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000108 Py_OptimizeFlag = Py_OptimizeFlag ? Py_OptimizeFlag : 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109
Guido van Rossuma027efa1997-05-05 20:56:21 +0000110 interp = PyInterpreterState_New();
111 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000113
Guido van Rossuma027efa1997-05-05 20:56:21 +0000114 tstate = PyThreadState_New(interp);
115 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 (void) PyThreadState_Swap(tstate);
118
Guido van Rossum70d893a2001-08-16 08:21:42 +0000119 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000120
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121 interp->modules = PyDict_New();
122 if (interp->modules == NULL)
123 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124
Guido van Rossumc94044c2000-03-10 23:03:54 +0000125 /* Init codec registry */
126 _PyCodecRegistry_Init();
127
128 /* Init Unicode implementation; relies on the codec registry */
129 _PyUnicode_Init();
130
Barry Warsawf242aa02000-05-25 23:09:49 +0000131 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 if (bimod == NULL)
133 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000134 interp->builtins = PyModule_GetDict(bimod);
135 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136
137 sysmod = _PySys_Init();
138 if (sysmod == NULL)
139 Py_FatalError("Py_Initialize: can't initialize sys");
140 interp->sysdict = PyModule_GetDict(sysmod);
141 Py_INCREF(interp->sysdict);
142 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000144 PyDict_SetItemString(interp->sysdict, "modules",
145 interp->modules);
146
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000147 _PyImport_Init();
148
Barry Warsawf242aa02000-05-25 23:09:49 +0000149 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000150 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000151 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000152
Barry Warsaw035574d1997-08-29 22:07:17 +0000153 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000154 _PyImport_FixupExtension("__builtin__", "__builtin__");
Guido van Rossum70d893a2001-08-16 08:21:42 +0000155 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsaw035574d1997-08-29 22:07:17 +0000156
Guido van Rossum25ce5661997-08-02 03:10:38 +0000157 initsigs(); /* Signal handling stuff, including initintr() */
158
159 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000160 if (!Py_NoSiteFlag)
161 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000162}
163
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000164#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000165extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000166#endif
167
Guido van Rossum25ce5661997-08-02 03:10:38 +0000168/* Undo the effect of Py_Initialize().
169
170 Beware: if multiple interpreter and/or thread states exist, these
171 are not wiped out; only the current thread and interpreter state
172 are deleted. But since everything else is deleted, those other
173 interpreter and thread states should no longer be used.
174
175 (XXX We should do better, e.g. wipe out all interpreters and
176 threads.)
177
178 Locking: as above.
179
180*/
181
182void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000183Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000184{
185 PyInterpreterState *interp;
186 PyThreadState *tstate;
187
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000188 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000189 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190
Tim Peters384fd102001-01-21 03:40:37 +0000191 /* The interpreter is still entirely intact at this point, and the
192 * exit funcs may be relying on that. In particular, if some thread
193 * or exit func is still waiting to do an import, the import machinery
194 * expects Py_IsInitialized() to return true. So don't say the
195 * interpreter is uninitialized until after the exit funcs have run.
196 * Note that Threading.py uses an exit func to do a join on all the
197 * threads created thru it, so this also protects pending imports in
198 * the threads created via Threading.
199 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000200 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000201 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000202
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000204 tstate = PyThreadState_Get();
205 interp = tstate->interp;
206
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000207 /* Disable signal handling */
208 PyOS_FiniInterrupts();
209
Guido van Rossumc94044c2000-03-10 23:03:54 +0000210 /* Cleanup Unicode implementation */
211 _PyUnicode_Fini();
212
213 /* Cleanup Codec registry */
214 _PyCodecRegistry_Fini();
215
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000216 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000217 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000218
Guido van Rossum1707aad1997-12-08 23:43:45 +0000219 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
220 _PyImport_Fini();
221
222 /* Debugging stuff */
223#ifdef COUNT_ALLOCS
224 dump_counts();
225#endif
226
227#ifdef Py_REF_DEBUG
228 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
229#endif
230
231#ifdef Py_TRACE_REFS
Guido van Rossum92e2d5c2001-08-09 16:37:16 +0000232 if (Py_GETENV("PYTHONDUMPREFS")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000233 _Py_PrintReferences(stderr);
234 }
235#endif /* Py_TRACE_REFS */
236
Barry Warsaw035574d1997-08-29 22:07:17 +0000237 /* Now we decref the exception classes. After this point nothing
238 can raise an exception. That's okay, because each Fini() method
239 below has been checked to make sure no exceptions are ever
240 raised.
241 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000242 _PyExc_Fini();
Barry Warsawf242aa02000-05-25 23:09:49 +0000243
244 /* Delete current thread */
245 PyInterpreterState_Clear(interp);
246 PyThreadState_Swap(NULL);
247 PyInterpreterState_Delete(interp);
248
Guido van Rossumcc283f51997-08-05 02:22:03 +0000249 PyMethod_Fini();
250 PyFrame_Fini();
251 PyCFunction_Fini();
252 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000254 PyInt_Fini();
255 PyFloat_Fini();
256
257 /* XXX Still allocated:
258 - various static ad-hoc pointers to interned strings
259 - int and float free list blocks
260 - whatever various modules and libraries allocate
261 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262
263 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000264
265 call_ll_exitfuncs();
266
Guido van Rossumcc283f51997-08-05 02:22:03 +0000267#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000268 _Py_ResetReferences();
269#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270}
271
272/* Create and initialize a new interpreter and thread, and return the
273 new thread. This requires that Py_Initialize() has been called
274 first.
275
276 Unsuccessful initialization yields a NULL pointer. Note that *no*
277 exception information is available even in this case -- the
278 exception information is held in the thread, and there is no
279 thread.
280
281 Locking: as above.
282
283*/
284
285PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000286Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000287{
288 PyInterpreterState *interp;
289 PyThreadState *tstate, *save_tstate;
290 PyObject *bimod, *sysmod;
291
292 if (!initialized)
293 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
294
295 interp = PyInterpreterState_New();
296 if (interp == NULL)
297 return NULL;
298
299 tstate = PyThreadState_New(interp);
300 if (tstate == NULL) {
301 PyInterpreterState_Delete(interp);
302 return NULL;
303 }
304
305 save_tstate = PyThreadState_Swap(tstate);
306
307 /* XXX The following is lax in error checking */
308
309 interp->modules = PyDict_New();
310
311 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
312 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000313 interp->builtins = PyModule_GetDict(bimod);
314 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315 }
316 sysmod = _PyImport_FindExtension("sys", "sys");
317 if (bimod != NULL && sysmod != NULL) {
318 interp->sysdict = PyModule_GetDict(sysmod);
319 Py_INCREF(interp->sysdict);
320 PySys_SetPath(Py_GetPath());
321 PyDict_SetItemString(interp->sysdict, "modules",
322 interp->modules);
323 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000324 if (!Py_NoSiteFlag)
325 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326 }
327
328 if (!PyErr_Occurred())
329 return tstate;
330
331 /* Oops, it didn't work. Undo it all. */
332
333 PyErr_Print();
334 PyThreadState_Clear(tstate);
335 PyThreadState_Swap(save_tstate);
336 PyThreadState_Delete(tstate);
337 PyInterpreterState_Delete(interp);
338
339 return NULL;
340}
341
342/* Delete an interpreter and its last thread. This requires that the
343 given thread state is current, that the thread has no remaining
344 frames, and that it is its interpreter's only remaining thread.
345 It is a fatal error to violate these constraints.
346
347 (Py_Finalize() doesn't have these constraints -- it zaps
348 everything, regardless.)
349
350 Locking: as above.
351
352*/
353
354void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000355Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000356{
357 PyInterpreterState *interp = tstate->interp;
358
359 if (tstate != PyThreadState_Get())
360 Py_FatalError("Py_EndInterpreter: thread is not current");
361 if (tstate->frame != NULL)
362 Py_FatalError("Py_EndInterpreter: thread still has a frame");
363 if (tstate != interp->tstate_head || tstate->next != NULL)
364 Py_FatalError("Py_EndInterpreter: not the last thread");
365
366 PyImport_Cleanup();
367 PyInterpreterState_Clear(interp);
368 PyThreadState_Swap(NULL);
369 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000370}
371
372static char *progname = "python";
373
374void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000375Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000376{
377 if (pn && *pn)
378 progname = pn;
379}
380
381char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000382Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000383{
384 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385}
386
Guido van Rossuma61691e1998-02-06 22:27:24 +0000387static char *default_home = NULL;
388
389void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000390Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000391{
392 default_home = home;
393}
394
395char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000397{
398 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000399 if (home == NULL && !Py_IgnoreEnvironmentFlag)
400 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000401 return home;
402}
403
Guido van Rossum6135a871995-01-09 17:53:26 +0000404/* Create __main__ module */
405
406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000407initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000408{
Guido van Rossum82598051997-03-05 00:20:32 +0000409 PyObject *m, *d;
410 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000411 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000412 Py_FatalError("can't create __main__ module");
413 d = PyModule_GetDict(m);
414 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000415 PyObject *bimod = PyImport_ImportModule("__builtin__");
416 if (bimod == NULL ||
417 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000418 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000419 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000420 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421}
422
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000423/* Import the site module (not into __main__ though) */
424
425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000426initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000427{
428 PyObject *m, *f;
429 m = PyImport_ImportModule("site");
430 if (m == NULL) {
431 f = PySys_GetObject("stderr");
432 if (Py_VerboseFlag) {
433 PyFile_WriteString(
434 "'import site' failed; traceback:\n", f);
435 PyErr_Print();
436 }
437 else {
438 PyFile_WriteString(
439 "'import site' failed; use -v for traceback\n", f);
440 PyErr_Clear();
441 }
442 }
443 else {
444 Py_DECREF(m);
445 }
446}
447
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000448/* Parse input from a file and execute it */
449
450int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000452{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000453 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
454}
455
456int
457PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
458{
459 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000460}
461
462int
463PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
464{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000465 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
466}
467
468int
469PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
470 PyCompilerFlags *flags)
471{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000472 if (filename == NULL)
473 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000474 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000475 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000476 if (closeit)
477 fclose(fp);
478 return err;
479 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000481 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000482}
483
484int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000485PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000486{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000487 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
488}
489
490int
491PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
492{
Guido van Rossum82598051997-03-05 00:20:32 +0000493 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000495 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000496
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000497 if (flags == NULL) {
498 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000499 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000500 }
Guido van Rossum82598051997-03-05 00:20:32 +0000501 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000503 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
504 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000505 }
Guido van Rossum82598051997-03-05 00:20:32 +0000506 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000508 PySys_SetObject("ps2", v = PyString_FromString("... "));
509 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000510 }
511 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000512 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000513#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000514 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515#endif
516 if (ret == E_EOF)
517 return 0;
518 /*
519 if (ret == E_NOMEM)
520 return -1;
521 */
522 }
523}
524
525int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000526PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000528 return PyRun_InteractiveOneFlags(fp, filename, NULL);
529}
530
531int
532PyRun_InteractiveOneFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
533{
Guido van Rossum82598051997-03-05 00:20:32 +0000534 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000536 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000537 char *ps1 = "", *ps2 = "";
Tim Petersfe2127d2001-07-16 05:37:24 +0000538
Guido van Rossum82598051997-03-05 00:20:32 +0000539 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000540 if (v != NULL) {
541 v = PyObject_Str(v);
542 if (v == NULL)
543 PyErr_Clear();
544 else if (PyString_Check(v))
545 ps1 = PyString_AsString(v);
546 }
Guido van Rossum82598051997-03-05 00:20:32 +0000547 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000548 if (w != NULL) {
549 w = PyObject_Str(w);
550 if (w == NULL)
551 PyErr_Clear();
552 else if (PyString_Check(w))
553 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000554 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000555 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
556 Py_single_input, ps1, ps2, &err,
557 (flags &&
Jeremy Hyltonb857ba22001-08-10 21:41:33 +0000558 flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +0000559 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossum82598051997-03-05 00:20:32 +0000560 Py_XDECREF(v);
561 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000562 if (n == NULL) {
563 if (err.error == E_EOF) {
564 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000565 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000566 return E_EOF;
567 }
568 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000569 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000571 }
Guido van Rossum82598051997-03-05 00:20:32 +0000572 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000573 if (m == NULL)
574 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000575 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000576 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000578 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000579 return -1;
580 }
Guido van Rossum82598051997-03-05 00:20:32 +0000581 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000582 if (Py_FlushLine())
583 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584 return 0;
585}
586
587int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000588PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000590 return PyRun_SimpleFileEx(fp, filename, 0);
591}
592
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000593/* Check whether a file maybe a pyc file: Look at the extension,
594 the file type, and, if we may close it, at the first few bytes. */
595
596static int
597maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
598{
599 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
600 return 1;
601
602#ifdef macintosh
603 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
604 if (PyMac_getfiletype(filename) == 'PYC '
605 || PyMac_getfiletype(filename) == 'APPL')
606 return 1;
607#endif /* macintosh */
608
609 /* Only look into the file if we are allowed to close it, since
610 it then should also be seekable. */
611 if (closeit) {
612 /* Read only two bytes of the magic. If the file was opened in
613 text mode, the bytes 3 and 4 of the magic (\r\n) might not
614 be read as they are on disk. */
615 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
616 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000617 /* Mess: In case of -x, the stream is NOT at its start now,
618 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000619 which makes the current stream position formally undefined,
620 and a x-platform nightmare.
621 Unfortunately, we have no direct way to know whether -x
622 was specified. So we use a terrible hack: if the current
623 stream position is not 0, we assume -x was specified, and
624 give up. Bug 132850 on SourceForge spells out the
625 hopelessness of trying anything else (fseek and ftell
626 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000627 */
Tim Peters3e876562001-02-11 04:35:39 +0000628 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000629 if (ftell(fp) == 0) {
630 if (fread(buf, 1, 2, fp) == 2 &&
631 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
632 ispyc = 1;
633 rewind(fp);
634 }
Tim Peters3e876562001-02-11 04:35:39 +0000635 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000636 }
637 return 0;
638}
639
Guido van Rossum0df002c2000-08-27 19:21:52 +0000640int
641PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
642{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000643 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
644}
645
646int
647PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
648 PyCompilerFlags *flags)
649{
Guido van Rossum82598051997-03-05 00:20:32 +0000650 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000651 char *ext;
652
Guido van Rossum82598051997-03-05 00:20:32 +0000653 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000654 if (m == NULL)
655 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000656 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000657 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000658 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000659 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000660 if (closeit)
661 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000662 if( (fp = fopen(filename, "rb")) == NULL ) {
663 fprintf(stderr, "python: Can't reopen .pyc file\n");
664 return -1;
665 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000666 /* Turn on optimization if a .pyo file is given */
667 if (strcmp(ext, ".pyo") == 0)
668 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000669 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000670 } else {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000671 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
672 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000673 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000675 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676 return -1;
677 }
Guido van Rossum82598051997-03-05 00:20:32 +0000678 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000679 if (Py_FlushLine())
680 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681 return 0;
682}
683
684int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000685PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686{
Guido van Rossum82598051997-03-05 00:20:32 +0000687 PyObject *m, *d, *v;
688 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000689 if (m == NULL)
690 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000691 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000692 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000693 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000694 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000695 return -1;
696 }
Guido van Rossum82598051997-03-05 00:20:32 +0000697 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000698 if (Py_FlushLine())
699 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000700 return 0;
701}
702
Barry Warsaw035574d1997-08-29 22:07:17 +0000703static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000704parse_syntax_error(PyObject *err, PyObject **message, char **filename,
705 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000706{
707 long hold;
708 PyObject *v;
709
710 /* old style errors */
711 if (PyTuple_Check(err))
712 return PyArg_Parse(err, "(O(ziiz))", message, filename,
713 lineno, offset, text);
714
715 /* new style errors. `err' is an instance */
716
717 if (! (v = PyObject_GetAttrString(err, "msg")))
718 goto finally;
719 *message = v;
720
721 if (!(v = PyObject_GetAttrString(err, "filename")))
722 goto finally;
723 if (v == Py_None)
724 *filename = NULL;
725 else if (! (*filename = PyString_AsString(v)))
726 goto finally;
727
728 Py_DECREF(v);
729 if (!(v = PyObject_GetAttrString(err, "lineno")))
730 goto finally;
731 hold = PyInt_AsLong(v);
732 Py_DECREF(v);
733 v = NULL;
734 if (hold < 0 && PyErr_Occurred())
735 goto finally;
736 *lineno = (int)hold;
737
738 if (!(v = PyObject_GetAttrString(err, "offset")))
739 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000740 if (v == Py_None) {
741 *offset = -1;
742 Py_DECREF(v);
743 v = NULL;
744 } else {
745 hold = PyInt_AsLong(v);
746 Py_DECREF(v);
747 v = NULL;
748 if (hold < 0 && PyErr_Occurred())
749 goto finally;
750 *offset = (int)hold;
751 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000752
753 if (!(v = PyObject_GetAttrString(err, "text")))
754 goto finally;
755 if (v == Py_None)
756 *text = NULL;
757 else if (! (*text = PyString_AsString(v)))
758 goto finally;
759 Py_DECREF(v);
760 return 1;
761
762finally:
763 Py_XDECREF(v);
764 return 0;
765}
766
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000767void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000769{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000770 PyErr_PrintEx(1);
771}
772
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000773static void
774print_error_text(PyObject *f, int offset, char *text)
775{
776 char *nl;
777 if (offset >= 0) {
778 if (offset > 0 && offset == (int)strlen(text))
779 offset--;
780 for (;;) {
781 nl = strchr(text, '\n');
782 if (nl == NULL || nl-text >= offset)
783 break;
784 offset -= (nl+1-text);
785 text = nl+1;
786 }
787 while (*text == ' ' || *text == '\t') {
788 text++;
789 offset--;
790 }
791 }
792 PyFile_WriteString(" ", f);
793 PyFile_WriteString(text, f);
794 if (*text == '\0' || text[strlen(text)-1] != '\n')
795 PyFile_WriteString("\n", f);
796 if (offset == -1)
797 return;
798 PyFile_WriteString(" ", f);
799 offset--;
800 while (offset > 0) {
801 PyFile_WriteString(" ", f);
802 offset--;
803 }
804 PyFile_WriteString("^\n", f);
805}
806
Guido van Rossum66e8e862001-03-23 17:54:43 +0000807static void
808handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000809{
Guido van Rossum66e8e862001-03-23 17:54:43 +0000810 PyObject *exception, *value, *tb;
811 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000812 if (Py_FlushLine())
813 PyErr_Clear();
814 fflush(stdout);
815 if (value == NULL || value == Py_None)
816 Py_Exit(0);
817 if (PyInstance_Check(value)) {
818 /* The error code should be in the `code' attribute. */
819 PyObject *code = PyObject_GetAttrString(value, "code");
820 if (code) {
821 Py_DECREF(value);
822 value = code;
823 if (value == Py_None)
824 Py_Exit(0);
825 }
826 /* If we failed to dig out the 'code' attribute,
827 just let the else clause below print the error. */
828 }
829 if (PyInt_Check(value))
830 Py_Exit((int)PyInt_AsLong(value));
831 else {
832 PyObject_Print(value, stderr, Py_PRINT_RAW);
833 PySys_WriteStderr("\n");
834 Py_Exit(1);
835 }
836}
837
838void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000839PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000840{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000841 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000842
843 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
844 handle_system_exit();
845 }
Guido van Rossum82598051997-03-05 00:20:32 +0000846 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000847 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000849 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000850 if (set_sys_last_vars) {
851 PySys_SetObject("last_type", exception);
852 PySys_SetObject("last_value", v);
853 PySys_SetObject("last_traceback", tb);
854 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000855 hook = PySys_GetObject("excepthook");
856 if (hook) {
857 PyObject *args = Py_BuildValue("(OOO)",
858 exception, v ? v : Py_None, tb ? tb : Py_None);
859 PyObject *result = PyEval_CallObject(hook, args);
860 if (result == NULL) {
861 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000862 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
863 handle_system_exit();
864 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000865 PyErr_Fetch(&exception2, &v2, &tb2);
866 PyErr_NormalizeException(&exception2, &v2, &tb2);
867 if (Py_FlushLine())
868 PyErr_Clear();
869 fflush(stdout);
870 PySys_WriteStderr("Error in sys.excepthook:\n");
871 PyErr_Display(exception2, v2, tb2);
872 PySys_WriteStderr("\nOriginal exception was:\n");
873 PyErr_Display(exception, v, tb);
874 }
875 Py_XDECREF(result);
876 Py_XDECREF(args);
877 } else {
878 PySys_WriteStderr("sys.excepthook is missing\n");
879 PyErr_Display(exception, v, tb);
880 }
881 Py_XDECREF(exception);
882 Py_XDECREF(v);
883 Py_XDECREF(tb);
884}
885
886void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
887{
888 int err = 0;
889 PyObject *v = value;
890 PyObject *f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000891 if (f == NULL)
892 fprintf(stderr, "lost sys.stderr\n");
893 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000894 if (Py_FlushLine())
895 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000896 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000897 if (tb && tb != Py_None)
898 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000899 if (err == 0 &&
900 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
901 {
Guido van Rossum82598051997-03-05 00:20:32 +0000902 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000903 char *filename, *text;
904 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000905 if (!parse_syntax_error(v, &message, &filename,
906 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000907 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000908 else {
909 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000910 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000911 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000912 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000913 else
Guido van Rossum82598051997-03-05 00:20:32 +0000914 PyFile_WriteString(filename, f);
915 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000916 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000917 PyFile_WriteString(buf, f);
918 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000919 if (text != NULL)
920 print_error_text(f, offset, text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000921 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000922 /* Can't be bothered to check all those
923 PyFile_WriteString() calls */
924 if (PyErr_Occurred())
925 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000926 }
927 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000928 if (err) {
929 /* Don't do anything else */
930 }
931 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000932 PyClassObject* exc = (PyClassObject*)exception;
933 PyObject* className = exc->cl_name;
934 PyObject* moduleName =
935 PyDict_GetItemString(exc->cl_dict, "__module__");
936
937 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000938 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000939 else {
940 char* modstr = PyString_AsString(moduleName);
941 if (modstr && strcmp(modstr, "exceptions"))
942 {
943 err = PyFile_WriteString(modstr, f);
944 err += PyFile_WriteString(".", f);
945 }
946 }
947 if (err == 0) {
948 if (className == NULL)
949 err = PyFile_WriteString("<unknown>", f);
950 else
951 err = PyFile_WriteObject(className, f,
952 Py_PRINT_RAW);
953 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000954 }
955 else
956 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
957 if (err == 0) {
958 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000959 PyObject *s = PyObject_Str(v);
960 /* only print colon if the str() of the
961 object is not the empty string
962 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000963 if (s == NULL)
964 err = -1;
965 else if (!PyString_Check(s) ||
966 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000967 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000968 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000969 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
970 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000971 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000972 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000973 if (err == 0)
974 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000975 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000976 /* If an error happened here, don't show it.
977 XXX This is wrong, but too many callers rely on this behavior. */
978 if (err != 0)
979 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000980}
981
Guido van Rossum82598051997-03-05 00:20:32 +0000982PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000983PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000984{
Guido van Rossum82598051997-03-05 00:20:32 +0000985 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000986 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000987}
988
Guido van Rossum82598051997-03-05 00:20:32 +0000989PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000990PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
991 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000992{
Tim Peterse8682112000-08-27 20:18:17 +0000993 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000994}
995
996PyObject *
997PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000998 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +0000999{
1000 node *n = PyParser_SimpleParseFile(fp, filename, start);
1001 if (closeit)
1002 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001003 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001004}
1005
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001006PyObject *
1007PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
1008 PyCompilerFlags *flags)
1009{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001010 return run_err_node(PyParser_SimpleParseStringFlags(
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001011 str, start,
1012 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001013 PyPARSE_YIELD_IS_KEYWORD : 0),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001014 "<string>", globals, locals, flags);
1015}
1016
1017PyObject *
1018PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
1019 PyObject *locals, PyCompilerFlags *flags)
1020{
1021 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1022 flags);
1023}
1024
1025PyObject *
1026PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
1027 PyObject *locals, int closeit, PyCompilerFlags *flags)
1028{
Tim Petersfe2127d2001-07-16 05:37:24 +00001029 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001030 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001031 PyPARSE_YIELD_IS_KEYWORD : 0);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001032 if (closeit)
1033 fclose(fp);
1034 return run_err_node(n, filename, globals, locals, flags);
1035}
1036
Guido van Rossum82598051997-03-05 00:20:32 +00001037static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001038run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1039 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001040{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001041 if (n == NULL)
1042 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001043 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001044}
1045
Guido van Rossum82598051997-03-05 00:20:32 +00001046static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001047run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1048 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001049{
Guido van Rossum82598051997-03-05 00:20:32 +00001050 PyCodeObject *co;
1051 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001052 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001053 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001054 if (co == NULL)
1055 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001056 v = PyEval_EvalCode(co, globals, locals);
1057 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001058 return v;
1059}
1060
Guido van Rossum82598051997-03-05 00:20:32 +00001061static PyObject *
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001062run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
1063 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001064{
Guido van Rossum82598051997-03-05 00:20:32 +00001065 PyCodeObject *co;
1066 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001067 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001068 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001069
Guido van Rossum82598051997-03-05 00:20:32 +00001070 magic = PyMarshal_ReadLongFromFile(fp);
1071 if (magic != PyImport_GetMagicNumber()) {
1072 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001073 "Bad magic number in .pyc file");
1074 return NULL;
1075 }
Guido van Rossum82598051997-03-05 00:20:32 +00001076 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001077 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001078 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001079 if (v == NULL || !PyCode_Check(v)) {
1080 Py_XDECREF(v);
1081 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001082 "Bad code object in .pyc file");
1083 return NULL;
1084 }
Guido van Rossum82598051997-03-05 00:20:32 +00001085 co = (PyCodeObject *)v;
1086 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001087 if (v && flags)
1088 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001089 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001090 return v;
1091}
1092
Guido van Rossum82598051997-03-05 00:20:32 +00001093PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001094Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001095{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001096 return Py_CompileStringFlags(str, filename, start, NULL);
1097}
1098
1099PyObject *
1100Py_CompileStringFlags(char *str, char *filename, int start,
1101 PyCompilerFlags *flags)
1102{
Guido van Rossum5b722181993-03-30 17:46:03 +00001103 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001104 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001105 n = PyParser_SimpleParseStringFlags(str, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001106 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001107 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001108 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001109 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001110 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001111 PyNode_Free(n);
1112 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001113}
1114
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001115struct symtable *
1116Py_SymtableString(char *str, char *filename, int start)
1117{
1118 node *n;
1119 struct symtable *st;
1120 n = PyParser_SimpleParseString(str, start);
1121 if (n == NULL)
1122 return NULL;
1123 st = PyNode_CompileSymtable(n, filename);
1124 PyNode_Free(n);
1125 return st;
1126}
1127
Guido van Rossuma110aa61994-08-29 12:50:44 +00001128/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001129
Guido van Rossuma110aa61994-08-29 12:50:44 +00001130node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001131PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001132{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001133 node *n;
1134 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001135 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1136 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001137 if (n == NULL)
1138 err_input(&err);
1139 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001140}
1141
Tim Petersfe2127d2001-07-16 05:37:24 +00001142node *
1143PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1144{
1145 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1146}
1147
Guido van Rossuma110aa61994-08-29 12:50:44 +00001148/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001149
Guido van Rossuma110aa61994-08-29 12:50:44 +00001150node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001151PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1152{
1153 node *n;
1154 perrdetail err;
1155 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1156 flags);
1157 if (n == NULL)
1158 err_input(&err);
1159 return n;
1160}
1161
1162node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001163PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001164{
Tim Petersfe2127d2001-07-16 05:37:24 +00001165 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001166}
1167
1168/* Set the error appropriate to the given input error code (see errcode.h) */
1169
1170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001171err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001172{
Fred Drake85f36392000-07-11 17:53:00 +00001173 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001174 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001175 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001176 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001177 err->lineno, err->offset, err->text);
1178 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001179 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001180 err->text = NULL;
1181 }
1182 switch (err->error) {
1183 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001184 errtype = PyExc_IndentationError;
1185 if (err->expected == INDENT)
1186 msg = "expected an indented block";
1187 else if (err->token == INDENT)
1188 msg = "unexpected indent";
1189 else if (err->token == DEDENT)
1190 msg = "unexpected unindent";
1191 else {
1192 errtype = PyExc_SyntaxError;
1193 msg = "invalid syntax";
1194 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001195 break;
1196 case E_TOKEN:
1197 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001198 break;
1199 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001200 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001201 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001202 return;
1203 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001204 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001205 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001206 return;
1207 case E_EOF:
1208 msg = "unexpected EOF while parsing";
1209 break;
Fred Drake85f36392000-07-11 17:53:00 +00001210 case E_TABSPACE:
1211 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001212 msg = "inconsistent use of tabs and spaces in indentation";
1213 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001214 case E_OVERFLOW:
1215 msg = "expression too long";
1216 break;
Fred Drake85f36392000-07-11 17:53:00 +00001217 case E_DEDENT:
1218 errtype = PyExc_IndentationError;
1219 msg = "unindent does not match any outer indentation level";
1220 break;
1221 case E_TOODEEP:
1222 errtype = PyExc_IndentationError;
1223 msg = "too many levels of indentation";
1224 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001225 default:
1226 fprintf(stderr, "error=%d\n", err->error);
1227 msg = "unknown parsing error";
1228 break;
1229 }
Guido van Rossum82598051997-03-05 00:20:32 +00001230 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001231 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001232 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001233 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001234}
1235
1236/* Print fatal error message and abort */
1237
1238void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001239Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001240{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001241 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001242#ifdef macintosh
1243 for (;;);
1244#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001245#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001246 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001247 OutputDebugString(msg);
1248 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001249#ifdef _DEBUG
1250 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001251#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001252#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001253 abort();
1254}
1255
1256/* Clean up and exit */
1257
Guido van Rossuma110aa61994-08-29 12:50:44 +00001258#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001259#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001260int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001261#endif
1262
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001263#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001264static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001265static int nexitfuncs = 0;
1266
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001267int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001268{
1269 if (nexitfuncs >= NEXITFUNCS)
1270 return -1;
1271 exitfuncs[nexitfuncs++] = func;
1272 return 0;
1273}
1274
Guido van Rossumcc283f51997-08-05 02:22:03 +00001275static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001276call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001277{
Guido van Rossum82598051997-03-05 00:20:32 +00001278 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001279
1280 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001281 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001282 Py_INCREF(exitfunc);
1283 PySys_SetObject("exitfunc", (PyObject *)NULL);
1284 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001285 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001286 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1287 PySys_WriteStderr("Error in sys.exitfunc:\n");
1288 }
Guido van Rossum82598051997-03-05 00:20:32 +00001289 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001290 }
Guido van Rossum82598051997-03-05 00:20:32 +00001291 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001292 }
1293
Guido van Rossum0829c751998-02-28 04:31:39 +00001294 if (Py_FlushLine())
1295 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001296}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001297
Guido van Rossumcc283f51997-08-05 02:22:03 +00001298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001299call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001300{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001301 while (nexitfuncs > 0)
1302 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001303
1304 fflush(stdout);
1305 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001306}
1307
1308void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001309Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001310{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001311 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001312
Jack Jansen66a89771995-10-27 13:22:14 +00001313#ifdef macintosh
1314 PyMac_Exit(sts);
1315#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001316 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001317#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001318}
1319
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001320static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001321initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001322{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001323#ifdef HAVE_SIGNAL_H
1324#ifdef SIGPIPE
1325 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001326#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001327#ifdef SIGXFZ
1328 signal(SIGXFZ, SIG_IGN);
1329#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001330#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001331 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001332}
1333
Guido van Rossumaae0d321996-05-22 16:35:33 +00001334#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001335/* Ask a yes/no question */
1336
Guido van Rossum59bff391992-09-03 20:28:00 +00001337int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001338_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001339{
1340 char buf[256];
1341
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 fprintf(stderr, "%s [ny] ", prompt);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001343 if (fgets(buf, sizeof buf, stdin) == NULL)
1344 return 0;
1345 return buf[0] == 'y' || buf[0] == 'Y';
1346}
1347#endif
1348
Guido van Rossuma110aa61994-08-29 12:50:44 +00001349#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001350
1351/* Check for file descriptor connected to interactive device.
1352 Pretend that stdin is always interactive, other files never. */
1353
1354int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001355isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001356{
1357 return fd == fileno(stdin);
1358}
1359
1360#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001361
1362/*
1363 * The file descriptor fd is considered ``interactive'' if either
1364 * a) isatty(fd) is TRUE, or
1365 * b) the -i flag was given, and the filename associated with
1366 * the descriptor is NULL or "<stdin>" or "???".
1367 */
1368int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001369Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001370{
1371 if (isatty((int)fileno(fp)))
1372 return 1;
1373 if (!Py_InteractiveFlag)
1374 return 0;
1375 return (filename == NULL) ||
1376 (strcmp(filename, "<stdin>") == 0) ||
1377 (strcmp(filename, "???") == 0);
1378}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001379
1380
1381#if defined(USE_STACKCHECK)
1382#if defined(WIN32) && defined(_MSC_VER)
1383
1384/* Stack checking for Microsoft C */
1385
1386#include <malloc.h>
1387#include <excpt.h>
1388
Fred Drakee8de31c2000-08-31 05:38:39 +00001389/*
1390 * Return non-zero when we run out of memory on the stack; zero otherwise.
1391 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001392int
Fred Drake399739f2000-08-31 05:52:44 +00001393PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001394{
1395 __try {
1396 /* _alloca throws a stack overflow exception if there's
1397 not enough space left on the stack */
1398 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1399 return 0;
1400 } __except (EXCEPTION_EXECUTE_HANDLER) {
1401 /* just ignore all errors */
1402 }
1403 return 1;
1404}
1405
1406#endif /* WIN32 && _MSC_VER */
1407
1408/* Alternate implementations can be added here... */
1409
1410#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001411
1412
1413/* Wrappers around sigaction() or signal(). */
1414
1415PyOS_sighandler_t
1416PyOS_getsig(int sig)
1417{
1418#ifdef HAVE_SIGACTION
1419 struct sigaction context;
1420 sigaction(sig, NULL, &context);
1421 return context.sa_handler;
1422#else
1423 PyOS_sighandler_t handler;
1424 handler = signal(sig, SIG_IGN);
1425 signal(sig, handler);
1426 return handler;
1427#endif
1428}
1429
1430PyOS_sighandler_t
1431PyOS_setsig(int sig, PyOS_sighandler_t handler)
1432{
1433#ifdef HAVE_SIGACTION
1434 struct sigaction context;
1435 PyOS_sighandler_t oldhandler;
1436 sigaction(sig, NULL, &context);
1437 oldhandler = context.sa_handler;
1438 context.sa_handler = handler;
1439 sigaction(sig, &context, NULL);
1440 return oldhandler;
1441#else
1442 return signal(sig, handler);
1443#endif
1444}