blob: f5fcaf15de2764e513f723f45303cd3e23ec0d0f [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 Rossumad6dfda1997-07-19 19:17:22 +000097
Guido van Rossumdcc0c131997-08-29 22:32:42 +000098 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +000099 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000100 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000101
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000102 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000103 Py_DebugFlag = Py_DebugFlag ? Py_DebugFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000104 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000105 Py_VerboseFlag = Py_VerboseFlag ? Py_VerboseFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000106 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000107 Py_OptimizeFlag = Py_OptimizeFlag ? Py_OptimizeFlag : 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000108
Guido van Rossuma027efa1997-05-05 20:56:21 +0000109 interp = PyInterpreterState_New();
110 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113 tstate = PyThreadState_New(interp);
114 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116 (void) PyThreadState_Swap(tstate);
117
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000118 if (PyType_Ready(&PyType_Type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000119 Py_FatalError("Py_Initialize: can't initialize 'type'");
120
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000121 if (PyType_Ready(&PyList_Type) < 0)
122 Py_FatalError("Py_Initialize: can't initialize 'list'");
123
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124 interp->modules = PyDict_New();
125 if (interp->modules == NULL)
126 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127
Guido van Rossumc94044c2000-03-10 23:03:54 +0000128 /* Init codec registry */
129 _PyCodecRegistry_Init();
130
131 /* Init Unicode implementation; relies on the codec registry */
132 _PyUnicode_Init();
133
Barry Warsawf242aa02000-05-25 23:09:49 +0000134 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135 if (bimod == NULL)
136 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000137 interp->builtins = PyModule_GetDict(bimod);
138 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139
140 sysmod = _PySys_Init();
141 if (sysmod == NULL)
142 Py_FatalError("Py_Initialize: can't initialize sys");
143 interp->sysdict = PyModule_GetDict(sysmod);
144 Py_INCREF(interp->sysdict);
145 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyDict_SetItemString(interp->sysdict, "modules",
148 interp->modules);
149
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000150 _PyImport_Init();
151
Barry Warsawf242aa02000-05-25 23:09:49 +0000152 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153 _PyExc_Init();
Barry Warsawf242aa02000-05-25 23:09:49 +0000154
Barry Warsaw035574d1997-08-29 22:07:17 +0000155 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000156 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000157
Guido van Rossum25ce5661997-08-02 03:10:38 +0000158 initsigs(); /* Signal handling stuff, including initintr() */
159
160 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000161 if (!Py_NoSiteFlag)
162 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000163}
164
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000165#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000166extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000167#endif
168
Guido van Rossum25ce5661997-08-02 03:10:38 +0000169/* Undo the effect of Py_Initialize().
170
171 Beware: if multiple interpreter and/or thread states exist, these
172 are not wiped out; only the current thread and interpreter state
173 are deleted. But since everything else is deleted, those other
174 interpreter and thread states should no longer be used.
175
176 (XXX We should do better, e.g. wipe out all interpreters and
177 threads.)
178
179 Locking: as above.
180
181*/
182
183void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000184Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000185{
186 PyInterpreterState *interp;
187 PyThreadState *tstate;
188
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000189 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000190 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191
Tim Peters384fd102001-01-21 03:40:37 +0000192 /* The interpreter is still entirely intact at this point, and the
193 * exit funcs may be relying on that. In particular, if some thread
194 * or exit func is still waiting to do an import, the import machinery
195 * expects Py_IsInitialized() to return true. So don't say the
196 * interpreter is uninitialized until after the exit funcs have run.
197 * Note that Threading.py uses an exit func to do a join on all the
198 * threads created thru it, so this also protects pending imports in
199 * the threads created via Threading.
200 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000201 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000202 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000203
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000204 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000205 tstate = PyThreadState_Get();
206 interp = tstate->interp;
207
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000208 /* Disable signal handling */
209 PyOS_FiniInterrupts();
210
Guido van Rossumc94044c2000-03-10 23:03:54 +0000211 /* Cleanup Unicode implementation */
212 _PyUnicode_Fini();
213
214 /* Cleanup Codec registry */
215 _PyCodecRegistry_Fini();
216
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000217 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000218 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000219
Guido van Rossum1707aad1997-12-08 23:43:45 +0000220 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
221 _PyImport_Fini();
222
223 /* Debugging stuff */
224#ifdef COUNT_ALLOCS
225 dump_counts();
226#endif
227
228#ifdef Py_REF_DEBUG
229 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
230#endif
231
232#ifdef Py_TRACE_REFS
Guido van Rossum92e2d5c2001-08-09 16:37:16 +0000233 if (Py_GETENV("PYTHONDUMPREFS")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000234 _Py_PrintReferences(stderr);
235 }
236#endif /* Py_TRACE_REFS */
237
Barry Warsaw035574d1997-08-29 22:07:17 +0000238 /* Now we decref the exception classes. After this point nothing
239 can raise an exception. That's okay, because each Fini() method
240 below has been checked to make sure no exceptions are ever
241 raised.
242 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000243 _PyExc_Fini();
Barry Warsawf242aa02000-05-25 23:09:49 +0000244
245 /* Delete current thread */
246 PyInterpreterState_Clear(interp);
247 PyThreadState_Swap(NULL);
248 PyInterpreterState_Delete(interp);
249
Guido van Rossumcc283f51997-08-05 02:22:03 +0000250 PyMethod_Fini();
251 PyFrame_Fini();
252 PyCFunction_Fini();
253 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000254 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000255 PyInt_Fini();
256 PyFloat_Fini();
257
258 /* XXX Still allocated:
259 - various static ad-hoc pointers to interned strings
260 - int and float free list blocks
261 - whatever various modules and libraries allocate
262 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000263
264 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000265
266 call_ll_exitfuncs();
267
Guido van Rossumcc283f51997-08-05 02:22:03 +0000268#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000269 _Py_ResetReferences();
270#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000271}
272
273/* Create and initialize a new interpreter and thread, and return the
274 new thread. This requires that Py_Initialize() has been called
275 first.
276
277 Unsuccessful initialization yields a NULL pointer. Note that *no*
278 exception information is available even in this case -- the
279 exception information is held in the thread, and there is no
280 thread.
281
282 Locking: as above.
283
284*/
285
286PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000287Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000288{
289 PyInterpreterState *interp;
290 PyThreadState *tstate, *save_tstate;
291 PyObject *bimod, *sysmod;
292
293 if (!initialized)
294 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
295
296 interp = PyInterpreterState_New();
297 if (interp == NULL)
298 return NULL;
299
300 tstate = PyThreadState_New(interp);
301 if (tstate == NULL) {
302 PyInterpreterState_Delete(interp);
303 return NULL;
304 }
305
306 save_tstate = PyThreadState_Swap(tstate);
307
308 /* XXX The following is lax in error checking */
309
310 interp->modules = PyDict_New();
311
312 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
313 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000314 interp->builtins = PyModule_GetDict(bimod);
315 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000316 }
317 sysmod = _PyImport_FindExtension("sys", "sys");
318 if (bimod != NULL && sysmod != NULL) {
319 interp->sysdict = PyModule_GetDict(sysmod);
320 Py_INCREF(interp->sysdict);
321 PySys_SetPath(Py_GetPath());
322 PyDict_SetItemString(interp->sysdict, "modules",
323 interp->modules);
324 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000325 if (!Py_NoSiteFlag)
326 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000327 }
328
329 if (!PyErr_Occurred())
330 return tstate;
331
332 /* Oops, it didn't work. Undo it all. */
333
334 PyErr_Print();
335 PyThreadState_Clear(tstate);
336 PyThreadState_Swap(save_tstate);
337 PyThreadState_Delete(tstate);
338 PyInterpreterState_Delete(interp);
339
340 return NULL;
341}
342
343/* Delete an interpreter and its last thread. This requires that the
344 given thread state is current, that the thread has no remaining
345 frames, and that it is its interpreter's only remaining thread.
346 It is a fatal error to violate these constraints.
347
348 (Py_Finalize() doesn't have these constraints -- it zaps
349 everything, regardless.)
350
351 Locking: as above.
352
353*/
354
355void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000356Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000357{
358 PyInterpreterState *interp = tstate->interp;
359
360 if (tstate != PyThreadState_Get())
361 Py_FatalError("Py_EndInterpreter: thread is not current");
362 if (tstate->frame != NULL)
363 Py_FatalError("Py_EndInterpreter: thread still has a frame");
364 if (tstate != interp->tstate_head || tstate->next != NULL)
365 Py_FatalError("Py_EndInterpreter: not the last thread");
366
367 PyImport_Cleanup();
368 PyInterpreterState_Clear(interp);
369 PyThreadState_Swap(NULL);
370 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000371}
372
373static char *progname = "python";
374
375void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000376Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000377{
378 if (pn && *pn)
379 progname = pn;
380}
381
382char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000383Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000384{
385 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000386}
387
Guido van Rossuma61691e1998-02-06 22:27:24 +0000388static char *default_home = NULL;
389
390void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000391Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000392{
393 default_home = home;
394}
395
396char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000397Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000398{
399 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000400 if (home == NULL && !Py_IgnoreEnvironmentFlag)
401 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000402 return home;
403}
404
Guido van Rossum6135a871995-01-09 17:53:26 +0000405/* Create __main__ module */
406
407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000408initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000409{
Guido van Rossum82598051997-03-05 00:20:32 +0000410 PyObject *m, *d;
411 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000412 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000413 Py_FatalError("can't create __main__ module");
414 d = PyModule_GetDict(m);
415 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000416 PyObject *bimod = PyImport_ImportModule("__builtin__");
417 if (bimod == NULL ||
418 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000419 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000420 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000421 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000422}
423
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000424/* Import the site module (not into __main__ though) */
425
426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000427initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000428{
429 PyObject *m, *f;
430 m = PyImport_ImportModule("site");
431 if (m == NULL) {
432 f = PySys_GetObject("stderr");
433 if (Py_VerboseFlag) {
434 PyFile_WriteString(
435 "'import site' failed; traceback:\n", f);
436 PyErr_Print();
437 }
438 else {
439 PyFile_WriteString(
440 "'import site' failed; use -v for traceback\n", f);
441 PyErr_Clear();
442 }
443 }
444 else {
445 Py_DECREF(m);
446 }
447}
448
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000449/* Parse input from a file and execute it */
450
451int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000452PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000454 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
455}
456
457int
458PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
459{
460 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000461}
462
463int
464PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
465{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000466 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
467}
468
469int
470PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
471 PyCompilerFlags *flags)
472{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000473 if (filename == NULL)
474 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000475 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000476 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000477 if (closeit)
478 fclose(fp);
479 return err;
480 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000482 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000483}
484
485int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000486PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000488 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
489}
490
491int
492PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
493{
Guido van Rossum82598051997-03-05 00:20:32 +0000494 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000496 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000497
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000498 if (flags == NULL) {
499 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000500 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000501 }
Guido van Rossum82598051997-03-05 00:20:32 +0000502 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000504 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
505 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506 }
Guido van Rossum82598051997-03-05 00:20:32 +0000507 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000508 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000509 PySys_SetObject("ps2", v = PyString_FromString("... "));
510 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511 }
512 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000513 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000514#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000515 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000516#endif
517 if (ret == E_EOF)
518 return 0;
519 /*
520 if (ret == E_NOMEM)
521 return -1;
522 */
523 }
524}
525
526int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000527PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000528{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000529 return PyRun_InteractiveOneFlags(fp, filename, NULL);
530}
531
532int
533PyRun_InteractiveOneFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
534{
Guido van Rossum82598051997-03-05 00:20:32 +0000535 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000537 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000538 char *ps1 = "", *ps2 = "";
Tim Petersfe2127d2001-07-16 05:37:24 +0000539
Guido van Rossum82598051997-03-05 00:20:32 +0000540 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000541 if (v != NULL) {
542 v = PyObject_Str(v);
543 if (v == NULL)
544 PyErr_Clear();
545 else if (PyString_Check(v))
546 ps1 = PyString_AsString(v);
547 }
Guido van Rossum82598051997-03-05 00:20:32 +0000548 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000549 if (w != NULL) {
550 w = PyObject_Str(w);
551 if (w == NULL)
552 PyErr_Clear();
553 else if (PyString_Check(w))
554 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000555 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000556 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
557 Py_single_input, ps1, ps2, &err,
558 (flags &&
Jeremy Hyltonb857ba22001-08-10 21:41:33 +0000559 flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +0000560 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossum82598051997-03-05 00:20:32 +0000561 Py_XDECREF(v);
562 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000563 if (n == NULL) {
564 if (err.error == E_EOF) {
565 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000566 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000567 return E_EOF;
568 }
569 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000570 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000571 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 }
Guido van Rossum82598051997-03-05 00:20:32 +0000573 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000574 if (m == NULL)
575 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000576 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000577 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000578 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000579 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000580 return -1;
581 }
Guido van Rossum82598051997-03-05 00:20:32 +0000582 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000583 if (Py_FlushLine())
584 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585 return 0;
586}
587
588int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000589PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000590{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000591 return PyRun_SimpleFileEx(fp, filename, 0);
592}
593
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000594/* Check whether a file maybe a pyc file: Look at the extension,
595 the file type, and, if we may close it, at the first few bytes. */
596
597static int
598maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
599{
600 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
601 return 1;
602
603#ifdef macintosh
604 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
605 if (PyMac_getfiletype(filename) == 'PYC '
606 || PyMac_getfiletype(filename) == 'APPL')
607 return 1;
608#endif /* macintosh */
609
610 /* Only look into the file if we are allowed to close it, since
611 it then should also be seekable. */
612 if (closeit) {
613 /* Read only two bytes of the magic. If the file was opened in
614 text mode, the bytes 3 and 4 of the magic (\r\n) might not
615 be read as they are on disk. */
616 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
617 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000618 /* Mess: In case of -x, the stream is NOT at its start now,
619 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000620 which makes the current stream position formally undefined,
621 and a x-platform nightmare.
622 Unfortunately, we have no direct way to know whether -x
623 was specified. So we use a terrible hack: if the current
624 stream position is not 0, we assume -x was specified, and
625 give up. Bug 132850 on SourceForge spells out the
626 hopelessness of trying anything else (fseek and ftell
627 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000628 */
Tim Peters3e876562001-02-11 04:35:39 +0000629 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000630 if (ftell(fp) == 0) {
631 if (fread(buf, 1, 2, fp) == 2 &&
632 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
633 ispyc = 1;
634 rewind(fp);
635 }
Tim Peters3e876562001-02-11 04:35:39 +0000636 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000637 }
638 return 0;
639}
640
Guido van Rossum0df002c2000-08-27 19:21:52 +0000641int
642PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
643{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000644 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
645}
646
647int
648PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
649 PyCompilerFlags *flags)
650{
Guido van Rossum82598051997-03-05 00:20:32 +0000651 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000652 char *ext;
653
Guido van Rossum82598051997-03-05 00:20:32 +0000654 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000655 if (m == NULL)
656 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000657 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000658 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000659 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000660 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000661 if (closeit)
662 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000663 if( (fp = fopen(filename, "rb")) == NULL ) {
664 fprintf(stderr, "python: Can't reopen .pyc file\n");
665 return -1;
666 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000667 /* Turn on optimization if a .pyo file is given */
668 if (strcmp(ext, ".pyo") == 0)
669 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000670 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000671 } else {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000672 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
673 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000674 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000676 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 return -1;
678 }
Guido van Rossum82598051997-03-05 00:20:32 +0000679 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000680 if (Py_FlushLine())
681 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682 return 0;
683}
684
685int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000687{
Guido van Rossum82598051997-03-05 00:20:32 +0000688 PyObject *m, *d, *v;
689 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000690 if (m == NULL)
691 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000692 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000693 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000694 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000695 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696 return -1;
697 }
Guido van Rossum82598051997-03-05 00:20:32 +0000698 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000699 if (Py_FlushLine())
700 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000701 return 0;
702}
703
Barry Warsaw035574d1997-08-29 22:07:17 +0000704static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000705parse_syntax_error(PyObject *err, PyObject **message, char **filename,
706 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000707{
708 long hold;
709 PyObject *v;
710
711 /* old style errors */
712 if (PyTuple_Check(err))
713 return PyArg_Parse(err, "(O(ziiz))", message, filename,
714 lineno, offset, text);
715
716 /* new style errors. `err' is an instance */
717
718 if (! (v = PyObject_GetAttrString(err, "msg")))
719 goto finally;
720 *message = v;
721
722 if (!(v = PyObject_GetAttrString(err, "filename")))
723 goto finally;
724 if (v == Py_None)
725 *filename = NULL;
726 else if (! (*filename = PyString_AsString(v)))
727 goto finally;
728
729 Py_DECREF(v);
730 if (!(v = PyObject_GetAttrString(err, "lineno")))
731 goto finally;
732 hold = PyInt_AsLong(v);
733 Py_DECREF(v);
734 v = NULL;
735 if (hold < 0 && PyErr_Occurred())
736 goto finally;
737 *lineno = (int)hold;
738
739 if (!(v = PyObject_GetAttrString(err, "offset")))
740 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000741 if (v == Py_None) {
742 *offset = -1;
743 Py_DECREF(v);
744 v = NULL;
745 } else {
746 hold = PyInt_AsLong(v);
747 Py_DECREF(v);
748 v = NULL;
749 if (hold < 0 && PyErr_Occurred())
750 goto finally;
751 *offset = (int)hold;
752 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000753
754 if (!(v = PyObject_GetAttrString(err, "text")))
755 goto finally;
756 if (v == Py_None)
757 *text = NULL;
758 else if (! (*text = PyString_AsString(v)))
759 goto finally;
760 Py_DECREF(v);
761 return 1;
762
763finally:
764 Py_XDECREF(v);
765 return 0;
766}
767
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000768void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000769PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000770{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000771 PyErr_PrintEx(1);
772}
773
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000774static void
775print_error_text(PyObject *f, int offset, char *text)
776{
777 char *nl;
778 if (offset >= 0) {
779 if (offset > 0 && offset == (int)strlen(text))
780 offset--;
781 for (;;) {
782 nl = strchr(text, '\n');
783 if (nl == NULL || nl-text >= offset)
784 break;
785 offset -= (nl+1-text);
786 text = nl+1;
787 }
788 while (*text == ' ' || *text == '\t') {
789 text++;
790 offset--;
791 }
792 }
793 PyFile_WriteString(" ", f);
794 PyFile_WriteString(text, f);
795 if (*text == '\0' || text[strlen(text)-1] != '\n')
796 PyFile_WriteString("\n", f);
797 if (offset == -1)
798 return;
799 PyFile_WriteString(" ", f);
800 offset--;
801 while (offset > 0) {
802 PyFile_WriteString(" ", f);
803 offset--;
804 }
805 PyFile_WriteString("^\n", f);
806}
807
Guido van Rossum66e8e862001-03-23 17:54:43 +0000808static void
809handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000810{
Guido van Rossum66e8e862001-03-23 17:54:43 +0000811 PyObject *exception, *value, *tb;
812 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000813 if (Py_FlushLine())
814 PyErr_Clear();
815 fflush(stdout);
816 if (value == NULL || value == Py_None)
817 Py_Exit(0);
818 if (PyInstance_Check(value)) {
819 /* The error code should be in the `code' attribute. */
820 PyObject *code = PyObject_GetAttrString(value, "code");
821 if (code) {
822 Py_DECREF(value);
823 value = code;
824 if (value == Py_None)
825 Py_Exit(0);
826 }
827 /* If we failed to dig out the 'code' attribute,
828 just let the else clause below print the error. */
829 }
830 if (PyInt_Check(value))
831 Py_Exit((int)PyInt_AsLong(value));
832 else {
833 PyObject_Print(value, stderr, Py_PRINT_RAW);
834 PySys_WriteStderr("\n");
835 Py_Exit(1);
836 }
837}
838
839void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000840PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000841{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000842 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000843
844 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
845 handle_system_exit();
846 }
Guido van Rossum82598051997-03-05 00:20:32 +0000847 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000848 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000850 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000851 if (set_sys_last_vars) {
852 PySys_SetObject("last_type", exception);
853 PySys_SetObject("last_value", v);
854 PySys_SetObject("last_traceback", tb);
855 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000856 hook = PySys_GetObject("excepthook");
857 if (hook) {
858 PyObject *args = Py_BuildValue("(OOO)",
859 exception, v ? v : Py_None, tb ? tb : Py_None);
860 PyObject *result = PyEval_CallObject(hook, args);
861 if (result == NULL) {
862 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000863 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
864 handle_system_exit();
865 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000866 PyErr_Fetch(&exception2, &v2, &tb2);
867 PyErr_NormalizeException(&exception2, &v2, &tb2);
868 if (Py_FlushLine())
869 PyErr_Clear();
870 fflush(stdout);
871 PySys_WriteStderr("Error in sys.excepthook:\n");
872 PyErr_Display(exception2, v2, tb2);
873 PySys_WriteStderr("\nOriginal exception was:\n");
874 PyErr_Display(exception, v, tb);
875 }
876 Py_XDECREF(result);
877 Py_XDECREF(args);
878 } else {
879 PySys_WriteStderr("sys.excepthook is missing\n");
880 PyErr_Display(exception, v, tb);
881 }
882 Py_XDECREF(exception);
883 Py_XDECREF(v);
884 Py_XDECREF(tb);
885}
886
887void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
888{
889 int err = 0;
890 PyObject *v = value;
891 PyObject *f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000892 if (f == NULL)
893 fprintf(stderr, "lost sys.stderr\n");
894 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000895 if (Py_FlushLine())
896 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000897 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000898 if (tb && tb != Py_None)
899 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000900 if (err == 0 &&
901 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
902 {
Guido van Rossum82598051997-03-05 00:20:32 +0000903 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000904 char *filename, *text;
905 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000906 if (!parse_syntax_error(v, &message, &filename,
907 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000908 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000909 else {
910 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000911 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000912 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000913 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000914 else
Guido van Rossum82598051997-03-05 00:20:32 +0000915 PyFile_WriteString(filename, f);
916 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000917 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000918 PyFile_WriteString(buf, f);
919 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000920 if (text != NULL)
921 print_error_text(f, offset, text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000922 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000923 /* Can't be bothered to check all those
924 PyFile_WriteString() calls */
925 if (PyErr_Occurred())
926 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000927 }
928 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000929 if (err) {
930 /* Don't do anything else */
931 }
932 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000933 PyClassObject* exc = (PyClassObject*)exception;
934 PyObject* className = exc->cl_name;
935 PyObject* moduleName =
936 PyDict_GetItemString(exc->cl_dict, "__module__");
937
938 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000939 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000940 else {
941 char* modstr = PyString_AsString(moduleName);
942 if (modstr && strcmp(modstr, "exceptions"))
943 {
944 err = PyFile_WriteString(modstr, f);
945 err += PyFile_WriteString(".", f);
946 }
947 }
948 if (err == 0) {
949 if (className == NULL)
950 err = PyFile_WriteString("<unknown>", f);
951 else
952 err = PyFile_WriteObject(className, f,
953 Py_PRINT_RAW);
954 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000955 }
956 else
957 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
958 if (err == 0) {
959 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000960 PyObject *s = PyObject_Str(v);
961 /* only print colon if the str() of the
962 object is not the empty string
963 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000964 if (s == NULL)
965 err = -1;
966 else if (!PyString_Check(s) ||
967 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000968 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000969 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000970 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
971 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000972 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000973 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000974 if (err == 0)
975 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000976 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000977 /* If an error happened here, don't show it.
978 XXX This is wrong, but too many callers rely on this behavior. */
979 if (err != 0)
980 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000981}
982
Guido van Rossum82598051997-03-05 00:20:32 +0000983PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000984PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000985{
Guido van Rossum82598051997-03-05 00:20:32 +0000986 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000987 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000988}
989
Guido van Rossum82598051997-03-05 00:20:32 +0000990PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000991PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
992 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000993{
Tim Peterse8682112000-08-27 20:18:17 +0000994 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000995}
996
997PyObject *
998PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000999 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +00001000{
1001 node *n = PyParser_SimpleParseFile(fp, filename, start);
1002 if (closeit)
1003 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001004 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001005}
1006
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001007PyObject *
1008PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
1009 PyCompilerFlags *flags)
1010{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001011 return run_err_node(PyParser_SimpleParseStringFlags(
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001012 str, start,
1013 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001014 PyPARSE_YIELD_IS_KEYWORD : 0),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001015 "<string>", globals, locals, flags);
1016}
1017
1018PyObject *
1019PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
1020 PyObject *locals, PyCompilerFlags *flags)
1021{
1022 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1023 flags);
1024}
1025
1026PyObject *
1027PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
1028 PyObject *locals, int closeit, PyCompilerFlags *flags)
1029{
Tim Petersfe2127d2001-07-16 05:37:24 +00001030 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001031 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001032 PyPARSE_YIELD_IS_KEYWORD : 0);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001033 if (closeit)
1034 fclose(fp);
1035 return run_err_node(n, filename, globals, locals, flags);
1036}
1037
Guido van Rossum82598051997-03-05 00:20:32 +00001038static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001039run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1040 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001041{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001042 if (n == NULL)
1043 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001044 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001045}
1046
Guido van Rossum82598051997-03-05 00:20:32 +00001047static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001048run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1049 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001050{
Guido van Rossum82598051997-03-05 00:20:32 +00001051 PyCodeObject *co;
1052 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001053 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001054 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001055 if (co == NULL)
1056 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001057 v = PyEval_EvalCode(co, globals, locals);
1058 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001059 return v;
1060}
1061
Guido van Rossum82598051997-03-05 00:20:32 +00001062static PyObject *
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001063run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
1064 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001065{
Guido van Rossum82598051997-03-05 00:20:32 +00001066 PyCodeObject *co;
1067 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001068 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001069 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001070
Guido van Rossum82598051997-03-05 00:20:32 +00001071 magic = PyMarshal_ReadLongFromFile(fp);
1072 if (magic != PyImport_GetMagicNumber()) {
1073 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001074 "Bad magic number in .pyc file");
1075 return NULL;
1076 }
Guido van Rossum82598051997-03-05 00:20:32 +00001077 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001078 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001079 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001080 if (v == NULL || !PyCode_Check(v)) {
1081 Py_XDECREF(v);
1082 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001083 "Bad code object in .pyc file");
1084 return NULL;
1085 }
Guido van Rossum82598051997-03-05 00:20:32 +00001086 co = (PyCodeObject *)v;
1087 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001088 if (v && flags)
1089 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001090 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001091 return v;
1092}
1093
Guido van Rossum82598051997-03-05 00:20:32 +00001094PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001095Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001096{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001097 return Py_CompileStringFlags(str, filename, start, NULL);
1098}
1099
1100PyObject *
1101Py_CompileStringFlags(char *str, char *filename, int start,
1102 PyCompilerFlags *flags)
1103{
Guido van Rossum5b722181993-03-30 17:46:03 +00001104 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001105 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001106 n = PyParser_SimpleParseStringFlags(str, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001107 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001108 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001109 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001110 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001111 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001112 PyNode_Free(n);
1113 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001114}
1115
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001116struct symtable *
1117Py_SymtableString(char *str, char *filename, int start)
1118{
1119 node *n;
1120 struct symtable *st;
1121 n = PyParser_SimpleParseString(str, start);
1122 if (n == NULL)
1123 return NULL;
1124 st = PyNode_CompileSymtable(n, filename);
1125 PyNode_Free(n);
1126 return st;
1127}
1128
Guido van Rossuma110aa61994-08-29 12:50:44 +00001129/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001130
Guido van Rossuma110aa61994-08-29 12:50:44 +00001131node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001132PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001133{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001134 node *n;
1135 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001136 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1137 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001138 if (n == NULL)
1139 err_input(&err);
1140 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001141}
1142
Tim Petersfe2127d2001-07-16 05:37:24 +00001143node *
1144PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1145{
1146 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1147}
1148
Guido van Rossuma110aa61994-08-29 12:50:44 +00001149/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001150
Guido van Rossuma110aa61994-08-29 12:50:44 +00001151node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001152PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1153{
1154 node *n;
1155 perrdetail err;
1156 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1157 flags);
1158 if (n == NULL)
1159 err_input(&err);
1160 return n;
1161}
1162
1163node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001164PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001165{
Tim Petersfe2127d2001-07-16 05:37:24 +00001166 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001167}
1168
1169/* Set the error appropriate to the given input error code (see errcode.h) */
1170
1171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001172err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001173{
Fred Drake85f36392000-07-11 17:53:00 +00001174 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001175 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001176 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001177 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001178 err->lineno, err->offset, err->text);
1179 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001180 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001181 err->text = NULL;
1182 }
1183 switch (err->error) {
1184 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001185 errtype = PyExc_IndentationError;
1186 if (err->expected == INDENT)
1187 msg = "expected an indented block";
1188 else if (err->token == INDENT)
1189 msg = "unexpected indent";
1190 else if (err->token == DEDENT)
1191 msg = "unexpected unindent";
1192 else {
1193 errtype = PyExc_SyntaxError;
1194 msg = "invalid syntax";
1195 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001196 break;
1197 case E_TOKEN:
1198 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001199 break;
1200 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001201 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001202 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001203 return;
1204 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001205 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001206 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001207 return;
1208 case E_EOF:
1209 msg = "unexpected EOF while parsing";
1210 break;
Fred Drake85f36392000-07-11 17:53:00 +00001211 case E_TABSPACE:
1212 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001213 msg = "inconsistent use of tabs and spaces in indentation";
1214 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001215 case E_OVERFLOW:
1216 msg = "expression too long";
1217 break;
Fred Drake85f36392000-07-11 17:53:00 +00001218 case E_DEDENT:
1219 errtype = PyExc_IndentationError;
1220 msg = "unindent does not match any outer indentation level";
1221 break;
1222 case E_TOODEEP:
1223 errtype = PyExc_IndentationError;
1224 msg = "too many levels of indentation";
1225 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001226 default:
1227 fprintf(stderr, "error=%d\n", err->error);
1228 msg = "unknown parsing error";
1229 break;
1230 }
Guido van Rossum82598051997-03-05 00:20:32 +00001231 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001232 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001233 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001234 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001235}
1236
1237/* Print fatal error message and abort */
1238
1239void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001240Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001241{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001242 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001243#ifdef macintosh
1244 for (;;);
1245#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001246#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001247 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001248 OutputDebugString(msg);
1249 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001250#ifdef _DEBUG
1251 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001252#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001253#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001254 abort();
1255}
1256
1257/* Clean up and exit */
1258
Guido van Rossuma110aa61994-08-29 12:50:44 +00001259#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001260#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001261int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001262#endif
1263
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001264#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001265static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001266static int nexitfuncs = 0;
1267
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001268int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001269{
1270 if (nexitfuncs >= NEXITFUNCS)
1271 return -1;
1272 exitfuncs[nexitfuncs++] = func;
1273 return 0;
1274}
1275
Guido van Rossumcc283f51997-08-05 02:22:03 +00001276static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001277call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001278{
Guido van Rossum82598051997-03-05 00:20:32 +00001279 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001280
1281 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001282 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001283 Py_INCREF(exitfunc);
1284 PySys_SetObject("exitfunc", (PyObject *)NULL);
1285 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001286 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001287 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1288 PySys_WriteStderr("Error in sys.exitfunc:\n");
1289 }
Guido van Rossum82598051997-03-05 00:20:32 +00001290 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001291 }
Guido van Rossum82598051997-03-05 00:20:32 +00001292 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001293 }
1294
Guido van Rossum0829c751998-02-28 04:31:39 +00001295 if (Py_FlushLine())
1296 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001297}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001298
Guido van Rossumcc283f51997-08-05 02:22:03 +00001299static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001300call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001301{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001302 while (nexitfuncs > 0)
1303 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001304
1305 fflush(stdout);
1306 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001307}
1308
1309void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001310Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001311{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001312 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001313
Jack Jansen66a89771995-10-27 13:22:14 +00001314#ifdef macintosh
1315 PyMac_Exit(sts);
1316#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001317 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001318#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001319}
1320
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001321static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001322initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001323{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001324#ifdef HAVE_SIGNAL_H
1325#ifdef SIGPIPE
1326 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001327#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001328#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001329 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001330}
1331
Guido van Rossumaae0d321996-05-22 16:35:33 +00001332#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001333/* Ask a yes/no question */
1334
Guido van Rossum59bff391992-09-03 20:28:00 +00001335int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001336_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001337{
1338 char buf[256];
1339
Tim Peters6d6c1a32001-08-02 04:15:00 +00001340 fprintf(stderr, "%s [ny] ", prompt);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001341 if (fgets(buf, sizeof buf, stdin) == NULL)
1342 return 0;
1343 return buf[0] == 'y' || buf[0] == 'Y';
1344}
1345#endif
1346
Guido van Rossuma110aa61994-08-29 12:50:44 +00001347#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001348
1349/* Check for file descriptor connected to interactive device.
1350 Pretend that stdin is always interactive, other files never. */
1351
1352int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001353isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001354{
1355 return fd == fileno(stdin);
1356}
1357
1358#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001359
1360/*
1361 * The file descriptor fd is considered ``interactive'' if either
1362 * a) isatty(fd) is TRUE, or
1363 * b) the -i flag was given, and the filename associated with
1364 * the descriptor is NULL or "<stdin>" or "???".
1365 */
1366int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001367Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001368{
1369 if (isatty((int)fileno(fp)))
1370 return 1;
1371 if (!Py_InteractiveFlag)
1372 return 0;
1373 return (filename == NULL) ||
1374 (strcmp(filename, "<stdin>") == 0) ||
1375 (strcmp(filename, "???") == 0);
1376}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001377
1378
1379#if defined(USE_STACKCHECK)
1380#if defined(WIN32) && defined(_MSC_VER)
1381
1382/* Stack checking for Microsoft C */
1383
1384#include <malloc.h>
1385#include <excpt.h>
1386
Fred Drakee8de31c2000-08-31 05:38:39 +00001387/*
1388 * Return non-zero when we run out of memory on the stack; zero otherwise.
1389 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001390int
Fred Drake399739f2000-08-31 05:52:44 +00001391PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001392{
1393 __try {
1394 /* _alloca throws a stack overflow exception if there's
1395 not enough space left on the stack */
1396 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1397 return 0;
1398 } __except (EXCEPTION_EXECUTE_HANDLER) {
1399 /* just ignore all errors */
1400 }
1401 return 1;
1402}
1403
1404#endif /* WIN32 && _MSC_VER */
1405
1406/* Alternate implementations can be added here... */
1407
1408#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001409
1410
1411/* Wrappers around sigaction() or signal(). */
1412
1413PyOS_sighandler_t
1414PyOS_getsig(int sig)
1415{
1416#ifdef HAVE_SIGACTION
1417 struct sigaction context;
1418 sigaction(sig, NULL, &context);
1419 return context.sa_handler;
1420#else
1421 PyOS_sighandler_t handler;
1422 handler = signal(sig, SIG_IGN);
1423 signal(sig, handler);
1424 return handler;
1425#endif
1426}
1427
1428PyOS_sighandler_t
1429PyOS_setsig(int sig, PyOS_sighandler_t handler)
1430{
1431#ifdef HAVE_SIGACTION
1432 struct sigaction context;
1433 PyOS_sighandler_t oldhandler;
1434 sigaction(sig, NULL, &context);
1435 oldhandler = context.sa_handler;
1436 context.sa_handler = handler;
1437 sigaction(sig, &context, NULL);
1438 return oldhandler;
1439#else
1440 return signal(sig, handler);
1441#endif
1442}