blob: cf2c777556b0c2113eec1ae1e347db3c3bb1ab38 [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 Rossumeca47842000-04-27 23:44:15 +0000233 if (
234#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000235 Py_GETENV("PYTHONDUMPREFS") &&
Guido van Rossumeca47842000-04-27 23:44:15 +0000236#endif /* MS_WINDOWS */
237 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000238 _Py_PrintReferences(stderr);
239 }
240#endif /* Py_TRACE_REFS */
241
Barry Warsaw035574d1997-08-29 22:07:17 +0000242 /* Now we decref the exception classes. After this point nothing
243 can raise an exception. That's okay, because each Fini() method
244 below has been checked to make sure no exceptions are ever
245 raised.
246 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000247 _PyExc_Fini();
Barry Warsawf242aa02000-05-25 23:09:49 +0000248
249 /* Delete current thread */
250 PyInterpreterState_Clear(interp);
251 PyThreadState_Swap(NULL);
252 PyInterpreterState_Delete(interp);
253
Guido van Rossumcc283f51997-08-05 02:22:03 +0000254 PyMethod_Fini();
255 PyFrame_Fini();
256 PyCFunction_Fini();
257 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000258 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000259 PyInt_Fini();
260 PyFloat_Fini();
261
262 /* XXX Still allocated:
263 - various static ad-hoc pointers to interned strings
264 - int and float free list blocks
265 - whatever various modules and libraries allocate
266 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267
268 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000269
270 call_ll_exitfuncs();
271
Guido van Rossumcc283f51997-08-05 02:22:03 +0000272#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000273 _Py_ResetReferences();
274#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000275}
276
277/* Create and initialize a new interpreter and thread, and return the
278 new thread. This requires that Py_Initialize() has been called
279 first.
280
281 Unsuccessful initialization yields a NULL pointer. Note that *no*
282 exception information is available even in this case -- the
283 exception information is held in the thread, and there is no
284 thread.
285
286 Locking: as above.
287
288*/
289
290PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000291Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292{
293 PyInterpreterState *interp;
294 PyThreadState *tstate, *save_tstate;
295 PyObject *bimod, *sysmod;
296
297 if (!initialized)
298 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
299
300 interp = PyInterpreterState_New();
301 if (interp == NULL)
302 return NULL;
303
304 tstate = PyThreadState_New(interp);
305 if (tstate == NULL) {
306 PyInterpreterState_Delete(interp);
307 return NULL;
308 }
309
310 save_tstate = PyThreadState_Swap(tstate);
311
312 /* XXX The following is lax in error checking */
313
314 interp->modules = PyDict_New();
315
316 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
317 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000318 interp->builtins = PyModule_GetDict(bimod);
319 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000320 }
321 sysmod = _PyImport_FindExtension("sys", "sys");
322 if (bimod != NULL && sysmod != NULL) {
323 interp->sysdict = PyModule_GetDict(sysmod);
324 Py_INCREF(interp->sysdict);
325 PySys_SetPath(Py_GetPath());
326 PyDict_SetItemString(interp->sysdict, "modules",
327 interp->modules);
328 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000329 if (!Py_NoSiteFlag)
330 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000331 }
332
333 if (!PyErr_Occurred())
334 return tstate;
335
336 /* Oops, it didn't work. Undo it all. */
337
338 PyErr_Print();
339 PyThreadState_Clear(tstate);
340 PyThreadState_Swap(save_tstate);
341 PyThreadState_Delete(tstate);
342 PyInterpreterState_Delete(interp);
343
344 return NULL;
345}
346
347/* Delete an interpreter and its last thread. This requires that the
348 given thread state is current, that the thread has no remaining
349 frames, and that it is its interpreter's only remaining thread.
350 It is a fatal error to violate these constraints.
351
352 (Py_Finalize() doesn't have these constraints -- it zaps
353 everything, regardless.)
354
355 Locking: as above.
356
357*/
358
359void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000360Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000361{
362 PyInterpreterState *interp = tstate->interp;
363
364 if (tstate != PyThreadState_Get())
365 Py_FatalError("Py_EndInterpreter: thread is not current");
366 if (tstate->frame != NULL)
367 Py_FatalError("Py_EndInterpreter: thread still has a frame");
368 if (tstate != interp->tstate_head || tstate->next != NULL)
369 Py_FatalError("Py_EndInterpreter: not the last thread");
370
371 PyImport_Cleanup();
372 PyInterpreterState_Clear(interp);
373 PyThreadState_Swap(NULL);
374 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000375}
376
377static char *progname = "python";
378
379void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000380Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000381{
382 if (pn && *pn)
383 progname = pn;
384}
385
386char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000388{
389 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000390}
391
Guido van Rossuma61691e1998-02-06 22:27:24 +0000392static char *default_home = NULL;
393
394void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000395Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000396{
397 default_home = home;
398}
399
400char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000401Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000402{
403 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000404 if (home == NULL && !Py_IgnoreEnvironmentFlag)
405 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000406 return home;
407}
408
Guido van Rossum6135a871995-01-09 17:53:26 +0000409/* Create __main__ module */
410
411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000412initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000413{
Guido van Rossum82598051997-03-05 00:20:32 +0000414 PyObject *m, *d;
415 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000416 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000417 Py_FatalError("can't create __main__ module");
418 d = PyModule_GetDict(m);
419 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000420 PyObject *bimod = PyImport_ImportModule("__builtin__");
421 if (bimod == NULL ||
422 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000423 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000424 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000425 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426}
427
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000428/* Import the site module (not into __main__ though) */
429
430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000432{
433 PyObject *m, *f;
434 m = PyImport_ImportModule("site");
435 if (m == NULL) {
436 f = PySys_GetObject("stderr");
437 if (Py_VerboseFlag) {
438 PyFile_WriteString(
439 "'import site' failed; traceback:\n", f);
440 PyErr_Print();
441 }
442 else {
443 PyFile_WriteString(
444 "'import site' failed; use -v for traceback\n", f);
445 PyErr_Clear();
446 }
447 }
448 else {
449 Py_DECREF(m);
450 }
451}
452
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453/* Parse input from a file and execute it */
454
455int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000456PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000458 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
459}
460
461int
462PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
463{
464 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000465}
466
467int
468PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
469{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000470 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
471}
472
473int
474PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
475 PyCompilerFlags *flags)
476{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000477 if (filename == NULL)
478 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000479 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000480 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000481 if (closeit)
482 fclose(fp);
483 return err;
484 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000485 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000486 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487}
488
489int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000490PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000491{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000492 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
493}
494
495int
496PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
497{
Guido van Rossum82598051997-03-05 00:20:32 +0000498 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000500 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000501
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000502 if (flags == NULL) {
503 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000504 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000505 }
Guido van Rossum82598051997-03-05 00:20:32 +0000506 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000508 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
509 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000510 }
Guido van Rossum82598051997-03-05 00:20:32 +0000511 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000513 PySys_SetObject("ps2", v = PyString_FromString("... "));
514 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 }
516 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000517 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000518#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000519 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000520#endif
521 if (ret == E_EOF)
522 return 0;
523 /*
524 if (ret == E_NOMEM)
525 return -1;
526 */
527 }
528}
529
530int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000533 return PyRun_InteractiveOneFlags(fp, filename, NULL);
534}
535
536int
537PyRun_InteractiveOneFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
538{
Guido van Rossum82598051997-03-05 00:20:32 +0000539 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000541 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000542 char *ps1 = "", *ps2 = "";
Tim Petersfe2127d2001-07-16 05:37:24 +0000543
Guido van Rossum82598051997-03-05 00:20:32 +0000544 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000545 if (v != NULL) {
546 v = PyObject_Str(v);
547 if (v == NULL)
548 PyErr_Clear();
549 else if (PyString_Check(v))
550 ps1 = PyString_AsString(v);
551 }
Guido van Rossum82598051997-03-05 00:20:32 +0000552 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000553 if (w != NULL) {
554 w = PyObject_Str(w);
555 if (w == NULL)
556 PyErr_Clear();
557 else if (PyString_Check(w))
558 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000559 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000560 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
561 Py_single_input, ps1, ps2, &err,
562 (flags &&
563 flags->cf_flags & PyCF_GENERATORS) ?
564 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossum82598051997-03-05 00:20:32 +0000565 Py_XDECREF(v);
566 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000567 if (n == NULL) {
568 if (err.error == E_EOF) {
569 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000570 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000571 return E_EOF;
572 }
573 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000574 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000575 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000576 }
Guido van Rossum82598051997-03-05 00:20:32 +0000577 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000578 if (m == NULL)
579 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000580 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000581 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000583 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584 return -1;
585 }
Guido van Rossum82598051997-03-05 00:20:32 +0000586 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000587 if (Py_FlushLine())
588 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589 return 0;
590}
591
592int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000593PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000594{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000595 return PyRun_SimpleFileEx(fp, filename, 0);
596}
597
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000598/* Check whether a file maybe a pyc file: Look at the extension,
599 the file type, and, if we may close it, at the first few bytes. */
600
601static int
602maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
603{
604 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
605 return 1;
606
607#ifdef macintosh
608 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
609 if (PyMac_getfiletype(filename) == 'PYC '
610 || PyMac_getfiletype(filename) == 'APPL')
611 return 1;
612#endif /* macintosh */
613
614 /* Only look into the file if we are allowed to close it, since
615 it then should also be seekable. */
616 if (closeit) {
617 /* Read only two bytes of the magic. If the file was opened in
618 text mode, the bytes 3 and 4 of the magic (\r\n) might not
619 be read as they are on disk. */
620 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
621 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000622 /* Mess: In case of -x, the stream is NOT at its start now,
623 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000624 which makes the current stream position formally undefined,
625 and a x-platform nightmare.
626 Unfortunately, we have no direct way to know whether -x
627 was specified. So we use a terrible hack: if the current
628 stream position is not 0, we assume -x was specified, and
629 give up. Bug 132850 on SourceForge spells out the
630 hopelessness of trying anything else (fseek and ftell
631 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000632 */
Tim Peters3e876562001-02-11 04:35:39 +0000633 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000634 if (ftell(fp) == 0) {
635 if (fread(buf, 1, 2, fp) == 2 &&
636 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
637 ispyc = 1;
638 rewind(fp);
639 }
Tim Peters3e876562001-02-11 04:35:39 +0000640 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000641 }
642 return 0;
643}
644
Guido van Rossum0df002c2000-08-27 19:21:52 +0000645int
646PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
647{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000648 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
649}
650
651int
652PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
653 PyCompilerFlags *flags)
654{
Guido van Rossum82598051997-03-05 00:20:32 +0000655 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000656 char *ext;
657
Guido van Rossum82598051997-03-05 00:20:32 +0000658 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000659 if (m == NULL)
660 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000661 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000662 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000663 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000664 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000665 if (closeit)
666 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000667 if( (fp = fopen(filename, "rb")) == NULL ) {
668 fprintf(stderr, "python: Can't reopen .pyc file\n");
669 return -1;
670 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000671 /* Turn on optimization if a .pyo file is given */
672 if (strcmp(ext, ".pyo") == 0)
673 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000674 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000675 } else {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000676 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
677 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000678 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000680 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681 return -1;
682 }
Guido van Rossum82598051997-03-05 00:20:32 +0000683 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000684 if (Py_FlushLine())
685 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686 return 0;
687}
688
689int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000690PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000691{
Guido van Rossum82598051997-03-05 00:20:32 +0000692 PyObject *m, *d, *v;
693 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000694 if (m == NULL)
695 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000696 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000697 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000698 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000699 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000700 return -1;
701 }
Guido van Rossum82598051997-03-05 00:20:32 +0000702 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000703 if (Py_FlushLine())
704 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705 return 0;
706}
707
Barry Warsaw035574d1997-08-29 22:07:17 +0000708static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709parse_syntax_error(PyObject *err, PyObject **message, char **filename,
710 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000711{
712 long hold;
713 PyObject *v;
714
715 /* old style errors */
716 if (PyTuple_Check(err))
717 return PyArg_Parse(err, "(O(ziiz))", message, filename,
718 lineno, offset, text);
719
720 /* new style errors. `err' is an instance */
721
722 if (! (v = PyObject_GetAttrString(err, "msg")))
723 goto finally;
724 *message = v;
725
726 if (!(v = PyObject_GetAttrString(err, "filename")))
727 goto finally;
728 if (v == Py_None)
729 *filename = NULL;
730 else if (! (*filename = PyString_AsString(v)))
731 goto finally;
732
733 Py_DECREF(v);
734 if (!(v = PyObject_GetAttrString(err, "lineno")))
735 goto finally;
736 hold = PyInt_AsLong(v);
737 Py_DECREF(v);
738 v = NULL;
739 if (hold < 0 && PyErr_Occurred())
740 goto finally;
741 *lineno = (int)hold;
742
743 if (!(v = PyObject_GetAttrString(err, "offset")))
744 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000745 if (v == Py_None) {
746 *offset = -1;
747 Py_DECREF(v);
748 v = NULL;
749 } else {
750 hold = PyInt_AsLong(v);
751 Py_DECREF(v);
752 v = NULL;
753 if (hold < 0 && PyErr_Occurred())
754 goto finally;
755 *offset = (int)hold;
756 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000757
758 if (!(v = PyObject_GetAttrString(err, "text")))
759 goto finally;
760 if (v == Py_None)
761 *text = NULL;
762 else if (! (*text = PyString_AsString(v)))
763 goto finally;
764 Py_DECREF(v);
765 return 1;
766
767finally:
768 Py_XDECREF(v);
769 return 0;
770}
771
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000772void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000773PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000774{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000775 PyErr_PrintEx(1);
776}
777
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000778static void
779print_error_text(PyObject *f, int offset, char *text)
780{
781 char *nl;
782 if (offset >= 0) {
783 if (offset > 0 && offset == (int)strlen(text))
784 offset--;
785 for (;;) {
786 nl = strchr(text, '\n');
787 if (nl == NULL || nl-text >= offset)
788 break;
789 offset -= (nl+1-text);
790 text = nl+1;
791 }
792 while (*text == ' ' || *text == '\t') {
793 text++;
794 offset--;
795 }
796 }
797 PyFile_WriteString(" ", f);
798 PyFile_WriteString(text, f);
799 if (*text == '\0' || text[strlen(text)-1] != '\n')
800 PyFile_WriteString("\n", f);
801 if (offset == -1)
802 return;
803 PyFile_WriteString(" ", f);
804 offset--;
805 while (offset > 0) {
806 PyFile_WriteString(" ", f);
807 offset--;
808 }
809 PyFile_WriteString("^\n", f);
810}
811
Guido van Rossum66e8e862001-03-23 17:54:43 +0000812static void
813handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000814{
Guido van Rossum66e8e862001-03-23 17:54:43 +0000815 PyObject *exception, *value, *tb;
816 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000817 if (Py_FlushLine())
818 PyErr_Clear();
819 fflush(stdout);
820 if (value == NULL || value == Py_None)
821 Py_Exit(0);
822 if (PyInstance_Check(value)) {
823 /* The error code should be in the `code' attribute. */
824 PyObject *code = PyObject_GetAttrString(value, "code");
825 if (code) {
826 Py_DECREF(value);
827 value = code;
828 if (value == Py_None)
829 Py_Exit(0);
830 }
831 /* If we failed to dig out the 'code' attribute,
832 just let the else clause below print the error. */
833 }
834 if (PyInt_Check(value))
835 Py_Exit((int)PyInt_AsLong(value));
836 else {
837 PyObject_Print(value, stderr, Py_PRINT_RAW);
838 PySys_WriteStderr("\n");
839 Py_Exit(1);
840 }
841}
842
843void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000844PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000845{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000846 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000847
848 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
849 handle_system_exit();
850 }
Guido van Rossum82598051997-03-05 00:20:32 +0000851 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000852 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000854 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000855 if (set_sys_last_vars) {
856 PySys_SetObject("last_type", exception);
857 PySys_SetObject("last_value", v);
858 PySys_SetObject("last_traceback", tb);
859 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000860 hook = PySys_GetObject("excepthook");
861 if (hook) {
862 PyObject *args = Py_BuildValue("(OOO)",
863 exception, v ? v : Py_None, tb ? tb : Py_None);
864 PyObject *result = PyEval_CallObject(hook, args);
865 if (result == NULL) {
866 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000867 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
868 handle_system_exit();
869 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000870 PyErr_Fetch(&exception2, &v2, &tb2);
871 PyErr_NormalizeException(&exception2, &v2, &tb2);
872 if (Py_FlushLine())
873 PyErr_Clear();
874 fflush(stdout);
875 PySys_WriteStderr("Error in sys.excepthook:\n");
876 PyErr_Display(exception2, v2, tb2);
877 PySys_WriteStderr("\nOriginal exception was:\n");
878 PyErr_Display(exception, v, tb);
879 }
880 Py_XDECREF(result);
881 Py_XDECREF(args);
882 } else {
883 PySys_WriteStderr("sys.excepthook is missing\n");
884 PyErr_Display(exception, v, tb);
885 }
886 Py_XDECREF(exception);
887 Py_XDECREF(v);
888 Py_XDECREF(tb);
889}
890
891void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
892{
893 int err = 0;
894 PyObject *v = value;
895 PyObject *f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000896 if (f == NULL)
897 fprintf(stderr, "lost sys.stderr\n");
898 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000899 if (Py_FlushLine())
900 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000901 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000902 if (tb && tb != Py_None)
903 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000904 if (err == 0 &&
905 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
906 {
Guido van Rossum82598051997-03-05 00:20:32 +0000907 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000908 char *filename, *text;
909 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000910 if (!parse_syntax_error(v, &message, &filename,
911 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000912 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000913 else {
914 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000915 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000916 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000917 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000918 else
Guido van Rossum82598051997-03-05 00:20:32 +0000919 PyFile_WriteString(filename, f);
920 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000921 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000922 PyFile_WriteString(buf, f);
923 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000924 if (text != NULL)
925 print_error_text(f, offset, text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000926 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000927 /* Can't be bothered to check all those
928 PyFile_WriteString() calls */
929 if (PyErr_Occurred())
930 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000931 }
932 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000933 if (err) {
934 /* Don't do anything else */
935 }
936 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000937 PyClassObject* exc = (PyClassObject*)exception;
938 PyObject* className = exc->cl_name;
939 PyObject* moduleName =
940 PyDict_GetItemString(exc->cl_dict, "__module__");
941
942 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000943 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000944 else {
945 char* modstr = PyString_AsString(moduleName);
946 if (modstr && strcmp(modstr, "exceptions"))
947 {
948 err = PyFile_WriteString(modstr, f);
949 err += PyFile_WriteString(".", f);
950 }
951 }
952 if (err == 0) {
953 if (className == NULL)
954 err = PyFile_WriteString("<unknown>", f);
955 else
956 err = PyFile_WriteObject(className, f,
957 Py_PRINT_RAW);
958 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000959 }
960 else
961 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
962 if (err == 0) {
963 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000964 PyObject *s = PyObject_Str(v);
965 /* only print colon if the str() of the
966 object is not the empty string
967 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000968 if (s == NULL)
969 err = -1;
970 else if (!PyString_Check(s) ||
971 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000972 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000973 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000974 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
975 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000976 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000977 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000978 if (err == 0)
979 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000980 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000981 /* If an error happened here, don't show it.
982 XXX This is wrong, but too many callers rely on this behavior. */
983 if (err != 0)
984 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000985}
986
Guido van Rossum82598051997-03-05 00:20:32 +0000987PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000988PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000989{
Guido van Rossum82598051997-03-05 00:20:32 +0000990 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000991 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000992}
993
Guido van Rossum82598051997-03-05 00:20:32 +0000994PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000995PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
996 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000997{
Tim Peterse8682112000-08-27 20:18:17 +0000998 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000999}
1000
1001PyObject *
1002PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001003 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +00001004{
1005 node *n = PyParser_SimpleParseFile(fp, filename, start);
1006 if (closeit)
1007 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001008 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001009}
1010
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001011PyObject *
1012PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
1013 PyCompilerFlags *flags)
1014{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001015 return run_err_node(PyParser_SimpleParseStringFlags(
1016 str, start,
1017 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1018 PyPARSE_YIELD_IS_KEYWORD : 0),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001019 "<string>", globals, locals, flags);
1020}
1021
1022PyObject *
1023PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
1024 PyObject *locals, PyCompilerFlags *flags)
1025{
1026 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1027 flags);
1028}
1029
1030PyObject *
1031PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
1032 PyObject *locals, int closeit, PyCompilerFlags *flags)
1033{
Tim Petersfe2127d2001-07-16 05:37:24 +00001034 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
1035 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1036 PyPARSE_YIELD_IS_KEYWORD : 0);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001037 if (closeit)
1038 fclose(fp);
1039 return run_err_node(n, filename, globals, locals, flags);
1040}
1041
Guido van Rossum82598051997-03-05 00:20:32 +00001042static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001043run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1044 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001045{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001046 if (n == NULL)
1047 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001048 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001049}
1050
Guido van Rossum82598051997-03-05 00:20:32 +00001051static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001052run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1053 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001054{
Guido van Rossum82598051997-03-05 00:20:32 +00001055 PyCodeObject *co;
1056 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001057 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001058 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001059 if (co == NULL)
1060 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001061 v = PyEval_EvalCode(co, globals, locals);
1062 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001063 return v;
1064}
1065
Guido van Rossum82598051997-03-05 00:20:32 +00001066static PyObject *
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001067run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
1068 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001069{
Guido van Rossum82598051997-03-05 00:20:32 +00001070 PyCodeObject *co;
1071 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001072 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001073 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001074
Guido van Rossum82598051997-03-05 00:20:32 +00001075 magic = PyMarshal_ReadLongFromFile(fp);
1076 if (magic != PyImport_GetMagicNumber()) {
1077 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001078 "Bad magic number in .pyc file");
1079 return NULL;
1080 }
Guido van Rossum82598051997-03-05 00:20:32 +00001081 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001082 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001083 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001084 if (v == NULL || !PyCode_Check(v)) {
1085 Py_XDECREF(v);
1086 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001087 "Bad code object in .pyc file");
1088 return NULL;
1089 }
Guido van Rossum82598051997-03-05 00:20:32 +00001090 co = (PyCodeObject *)v;
1091 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001092 if (v && flags) {
1093 if (co->co_flags & CO_NESTED)
Tim Peters5ba58662001-07-16 02:29:45 +00001094 flags->cf_flags |= PyCF_NESTED_SCOPES;
Tim Peters51d76f12001-07-16 03:11:48 +00001095 if (co->co_flags & CO_GENERATOR_ALLOWED)
Tim Peters5ba58662001-07-16 02:29:45 +00001096 flags->cf_flags |= PyCF_GENERATORS;
Marc-André Lemburg464fe3a2001-06-13 17:18:06 +00001097#if 0
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001098 fprintf(stderr, "run_pyc_file: nested_scopes: %d\n",
Tim Peters5ba58662001-07-16 02:29:45 +00001099 flags->cf_flags & PyCF_NESTED_SCOPES);
1100 fprintf(stderr, "run_pyc_file: generators: %d\n",
1101 flags->cf_flags & PyCF_GENERATORS);
Marc-André Lemburg464fe3a2001-06-13 17:18:06 +00001102#endif
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001103 }
Guido van Rossum82598051997-03-05 00:20:32 +00001104 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001105 return v;
1106}
1107
Guido van Rossum82598051997-03-05 00:20:32 +00001108PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001109Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001110{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001111 return Py_CompileStringFlags(str, filename, start, NULL);
1112}
1113
1114PyObject *
1115Py_CompileStringFlags(char *str, char *filename, int start,
1116 PyCompilerFlags *flags)
1117{
Guido van Rossum5b722181993-03-30 17:46:03 +00001118 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001119 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001120 n = PyParser_SimpleParseStringFlags(str, start,
1121 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1122 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001123 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001124 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001125 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001126 PyNode_Free(n);
1127 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001128}
1129
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001130struct symtable *
1131Py_SymtableString(char *str, char *filename, int start)
1132{
1133 node *n;
1134 struct symtable *st;
1135 n = PyParser_SimpleParseString(str, start);
1136 if (n == NULL)
1137 return NULL;
1138 st = PyNode_CompileSymtable(n, filename);
1139 PyNode_Free(n);
1140 return st;
1141}
1142
Guido van Rossuma110aa61994-08-29 12:50:44 +00001143/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001144
Guido van Rossuma110aa61994-08-29 12:50:44 +00001145node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001146PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001147{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001148 node *n;
1149 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001150 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1151 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001152 if (n == NULL)
1153 err_input(&err);
1154 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001155}
1156
Tim Petersfe2127d2001-07-16 05:37:24 +00001157node *
1158PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1159{
1160 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1161}
1162
Guido van Rossuma110aa61994-08-29 12:50:44 +00001163/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001164
Guido van Rossuma110aa61994-08-29 12:50:44 +00001165node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001166PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1167{
1168 node *n;
1169 perrdetail err;
1170 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1171 flags);
1172 if (n == NULL)
1173 err_input(&err);
1174 return n;
1175}
1176
1177node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001178PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001179{
Tim Petersfe2127d2001-07-16 05:37:24 +00001180 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001181}
1182
1183/* Set the error appropriate to the given input error code (see errcode.h) */
1184
1185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001186err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001187{
Fred Drake85f36392000-07-11 17:53:00 +00001188 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001189 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001190 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001191 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001192 err->lineno, err->offset, err->text);
1193 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001194 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001195 err->text = NULL;
1196 }
1197 switch (err->error) {
1198 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001199 errtype = PyExc_IndentationError;
1200 if (err->expected == INDENT)
1201 msg = "expected an indented block";
1202 else if (err->token == INDENT)
1203 msg = "unexpected indent";
1204 else if (err->token == DEDENT)
1205 msg = "unexpected unindent";
1206 else {
1207 errtype = PyExc_SyntaxError;
1208 msg = "invalid syntax";
1209 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001210 break;
1211 case E_TOKEN:
1212 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001213 break;
1214 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001215 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001216 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001217 return;
1218 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001219 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001220 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001221 return;
1222 case E_EOF:
1223 msg = "unexpected EOF while parsing";
1224 break;
Fred Drake85f36392000-07-11 17:53:00 +00001225 case E_TABSPACE:
1226 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001227 msg = "inconsistent use of tabs and spaces in indentation";
1228 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001229 case E_OVERFLOW:
1230 msg = "expression too long";
1231 break;
Fred Drake85f36392000-07-11 17:53:00 +00001232 case E_DEDENT:
1233 errtype = PyExc_IndentationError;
1234 msg = "unindent does not match any outer indentation level";
1235 break;
1236 case E_TOODEEP:
1237 errtype = PyExc_IndentationError;
1238 msg = "too many levels of indentation";
1239 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001240 default:
1241 fprintf(stderr, "error=%d\n", err->error);
1242 msg = "unknown parsing error";
1243 break;
1244 }
Guido van Rossum82598051997-03-05 00:20:32 +00001245 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001246 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001247 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001248 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001249}
1250
1251/* Print fatal error message and abort */
1252
1253void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001254Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001255{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001256 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001257#ifdef macintosh
1258 for (;;);
1259#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001260#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001261 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001262 OutputDebugString(msg);
1263 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001264#ifdef _DEBUG
1265 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001266#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001267#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001268 abort();
1269}
1270
1271/* Clean up and exit */
1272
Guido van Rossuma110aa61994-08-29 12:50:44 +00001273#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001274#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001275int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001276#endif
1277
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001278#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001279static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001280static int nexitfuncs = 0;
1281
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001282int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001283{
1284 if (nexitfuncs >= NEXITFUNCS)
1285 return -1;
1286 exitfuncs[nexitfuncs++] = func;
1287 return 0;
1288}
1289
Guido van Rossumcc283f51997-08-05 02:22:03 +00001290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001291call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001292{
Guido van Rossum82598051997-03-05 00:20:32 +00001293 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001294
1295 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001296 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001297 Py_INCREF(exitfunc);
1298 PySys_SetObject("exitfunc", (PyObject *)NULL);
1299 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001300 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001301 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1302 PySys_WriteStderr("Error in sys.exitfunc:\n");
1303 }
Guido van Rossum82598051997-03-05 00:20:32 +00001304 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001305 }
Guido van Rossum82598051997-03-05 00:20:32 +00001306 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001307 }
1308
Guido van Rossum0829c751998-02-28 04:31:39 +00001309 if (Py_FlushLine())
1310 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001311}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001312
Guido van Rossumcc283f51997-08-05 02:22:03 +00001313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001314call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001315{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001316 while (nexitfuncs > 0)
1317 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001318
1319 fflush(stdout);
1320 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001321}
1322
1323void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001324Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001325{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001326 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001327
Jack Jansen66a89771995-10-27 13:22:14 +00001328#ifdef macintosh
1329 PyMac_Exit(sts);
1330#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001331 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001332#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001333}
1334
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001335static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001336initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001337{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001338#ifdef HAVE_SIGNAL_H
1339#ifdef SIGPIPE
1340 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001341#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001342#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001343 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001344}
1345
Guido van Rossumaae0d321996-05-22 16:35:33 +00001346#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001347/* Ask a yes/no question */
1348
Guido van Rossum59bff391992-09-03 20:28:00 +00001349int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001350_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001351{
1352 char buf[256];
1353
Tim Peters6d6c1a32001-08-02 04:15:00 +00001354 fprintf(stderr, "%s [ny] ", prompt);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001355 if (fgets(buf, sizeof buf, stdin) == NULL)
1356 return 0;
1357 return buf[0] == 'y' || buf[0] == 'Y';
1358}
1359#endif
1360
Guido van Rossuma110aa61994-08-29 12:50:44 +00001361#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001362
1363/* Check for file descriptor connected to interactive device.
1364 Pretend that stdin is always interactive, other files never. */
1365
1366int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001367isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001368{
1369 return fd == fileno(stdin);
1370}
1371
1372#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001373
1374/*
1375 * The file descriptor fd is considered ``interactive'' if either
1376 * a) isatty(fd) is TRUE, or
1377 * b) the -i flag was given, and the filename associated with
1378 * the descriptor is NULL or "<stdin>" or "???".
1379 */
1380int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001381Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001382{
1383 if (isatty((int)fileno(fp)))
1384 return 1;
1385 if (!Py_InteractiveFlag)
1386 return 0;
1387 return (filename == NULL) ||
1388 (strcmp(filename, "<stdin>") == 0) ||
1389 (strcmp(filename, "???") == 0);
1390}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001391
1392
1393#if defined(USE_STACKCHECK)
1394#if defined(WIN32) && defined(_MSC_VER)
1395
1396/* Stack checking for Microsoft C */
1397
1398#include <malloc.h>
1399#include <excpt.h>
1400
Fred Drakee8de31c2000-08-31 05:38:39 +00001401/*
1402 * Return non-zero when we run out of memory on the stack; zero otherwise.
1403 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001404int
Fred Drake399739f2000-08-31 05:52:44 +00001405PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001406{
1407 __try {
1408 /* _alloca throws a stack overflow exception if there's
1409 not enough space left on the stack */
1410 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1411 return 0;
1412 } __except (EXCEPTION_EXECUTE_HANDLER) {
1413 /* just ignore all errors */
1414 }
1415 return 1;
1416}
1417
1418#endif /* WIN32 && _MSC_VER */
1419
1420/* Alternate implementations can be added here... */
1421
1422#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001423
1424
1425/* Wrappers around sigaction() or signal(). */
1426
1427PyOS_sighandler_t
1428PyOS_getsig(int sig)
1429{
1430#ifdef HAVE_SIGACTION
1431 struct sigaction context;
1432 sigaction(sig, NULL, &context);
1433 return context.sa_handler;
1434#else
1435 PyOS_sighandler_t handler;
1436 handler = signal(sig, SIG_IGN);
1437 signal(sig, handler);
1438 return handler;
1439#endif
1440}
1441
1442PyOS_sighandler_t
1443PyOS_setsig(int sig, PyOS_sighandler_t handler)
1444{
1445#ifdef HAVE_SIGACTION
1446 struct sigaction context;
1447 PyOS_sighandler_t oldhandler;
1448 sigaction(sig, NULL, &context);
1449 oldhandler = context.sa_handler;
1450 context.sa_handler = handler;
1451 sigaction(sig, &context, NULL);
1452 return oldhandler;
1453#else
1454 return signal(sig, handler);
1455#endif
1456}