blob: 963df8a4ba33632d9b050cbd4485a087640d0d5f [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
Guido van Rossum9abaf4d2001-10-12 22:17:56 +000090static int
91add_flag(int flag, const char *envs)
92{
93 int env = atoi(envs);
94 if (flag < env)
95 flag = env;
96 if (flag < 1)
97 flag = 1;
98 return flag;
99}
100
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000102Py_Initialize(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000103{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105 PyThreadState *tstate;
106 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000107 char *p;
Guido van Rossum70d893a2001-08-16 08:21:42 +0000108 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000110 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000111 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000112 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000113
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000114 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000115 Py_DebugFlag = add_flag(Py_DebugFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000116 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000117 Py_VerboseFlag = add_flag(Py_VerboseFlag, p);
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000118 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Guido van Rossum9abaf4d2001-10-12 22:17:56 +0000119 Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 interp = PyInterpreterState_New();
122 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000124
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125 tstate = PyThreadState_New(interp);
126 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000128 (void) PyThreadState_Swap(tstate);
129
Guido van Rossum70d893a2001-08-16 08:21:42 +0000130 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000131
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 interp->modules = PyDict_New();
133 if (interp->modules == NULL)
134 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135
Guido van Rossumc94044c2000-03-10 23:03:54 +0000136 /* Init codec registry */
137 _PyCodecRegistry_Init();
138
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000139#ifdef Py_USING_UNICODE
Guido van Rossumc94044c2000-03-10 23:03:54 +0000140 /* Init Unicode implementation; relies on the codec registry */
141 _PyUnicode_Init();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000142#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000143
Barry Warsawf242aa02000-05-25 23:09:49 +0000144 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145 if (bimod == NULL)
146 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000147 interp->builtins = PyModule_GetDict(bimod);
148 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000149
150 sysmod = _PySys_Init();
151 if (sysmod == NULL)
152 Py_FatalError("Py_Initialize: can't initialize sys");
153 interp->sysdict = PyModule_GetDict(sysmod);
154 Py_INCREF(interp->sysdict);
155 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000156 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000157 PyDict_SetItemString(interp->sysdict, "modules",
158 interp->modules);
159
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000160 _PyImport_Init();
161
Barry Warsawf242aa02000-05-25 23:09:49 +0000162 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000164 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000165
Barry Warsaw035574d1997-08-29 22:07:17 +0000166 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000167 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000168
Guido van Rossum25ce5661997-08-02 03:10:38 +0000169 initsigs(); /* Signal handling stuff, including initintr() */
170
171 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000172 if (!Py_NoSiteFlag)
173 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000174}
175
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000176#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000177extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000178#endif
179
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180/* Undo the effect of Py_Initialize().
181
182 Beware: if multiple interpreter and/or thread states exist, these
183 are not wiped out; only the current thread and interpreter state
184 are deleted. But since everything else is deleted, those other
185 interpreter and thread states should no longer be used.
186
187 (XXX We should do better, e.g. wipe out all interpreters and
188 threads.)
189
190 Locking: as above.
191
192*/
193
194void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000195Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196{
197 PyInterpreterState *interp;
198 PyThreadState *tstate;
199
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000200 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000201 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202
Tim Peters384fd102001-01-21 03:40:37 +0000203 /* The interpreter is still entirely intact at this point, and the
204 * exit funcs may be relying on that. In particular, if some thread
205 * or exit func is still waiting to do an import, the import machinery
206 * expects Py_IsInitialized() to return true. So don't say the
207 * interpreter is uninitialized until after the exit funcs have run.
208 * Note that Threading.py uses an exit func to do a join on all the
209 * threads created thru it, so this also protects pending imports in
210 * the threads created via Threading.
211 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000212 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000213 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000214
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000215 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216 tstate = PyThreadState_Get();
217 interp = tstate->interp;
218
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000219 /* Disable signal handling */
220 PyOS_FiniInterrupts();
221
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000222#ifdef Py_USING_UNICODE
Guido van Rossumc94044c2000-03-10 23:03:54 +0000223 /* Cleanup Unicode implementation */
224 _PyUnicode_Fini();
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000225#endif
Guido van Rossumc94044c2000-03-10 23:03:54 +0000226
227 /* Cleanup Codec registry */
228 _PyCodecRegistry_Fini();
229
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000230 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000232
Guido van Rossum1707aad1997-12-08 23:43:45 +0000233 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
234 _PyImport_Fini();
235
236 /* Debugging stuff */
237#ifdef COUNT_ALLOCS
238 dump_counts();
239#endif
240
241#ifdef Py_REF_DEBUG
242 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
243#endif
244
245#ifdef Py_TRACE_REFS
Guido van Rossum92e2d5c2001-08-09 16:37:16 +0000246 if (Py_GETENV("PYTHONDUMPREFS")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000247 _Py_PrintReferences(stderr);
248 }
249#endif /* Py_TRACE_REFS */
250
Barry Warsaw035574d1997-08-29 22:07:17 +0000251 /* Now we decref the exception classes. After this point nothing
252 can raise an exception. That's okay, because each Fini() method
253 below has been checked to make sure no exceptions are ever
254 raised.
255 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000256 _PyExc_Fini();
Barry Warsawf242aa02000-05-25 23:09:49 +0000257
258 /* Delete current thread */
259 PyInterpreterState_Clear(interp);
260 PyThreadState_Swap(NULL);
261 PyInterpreterState_Delete(interp);
262
Guido van Rossumcc283f51997-08-05 02:22:03 +0000263 PyMethod_Fini();
264 PyFrame_Fini();
265 PyCFunction_Fini();
266 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000268 PyInt_Fini();
269 PyFloat_Fini();
270
271 /* XXX Still allocated:
272 - various static ad-hoc pointers to interned strings
273 - int and float free list blocks
274 - whatever various modules and libraries allocate
275 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276
277 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000278
279 call_ll_exitfuncs();
280
Guido van Rossumcc283f51997-08-05 02:22:03 +0000281#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000282 _Py_ResetReferences();
283#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000284}
285
286/* Create and initialize a new interpreter and thread, and return the
287 new thread. This requires that Py_Initialize() has been called
288 first.
289
290 Unsuccessful initialization yields a NULL pointer. Note that *no*
291 exception information is available even in this case -- the
292 exception information is held in the thread, and there is no
293 thread.
294
295 Locking: as above.
296
297*/
298
299PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000300Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000301{
302 PyInterpreterState *interp;
303 PyThreadState *tstate, *save_tstate;
304 PyObject *bimod, *sysmod;
305
306 if (!initialized)
307 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
308
309 interp = PyInterpreterState_New();
310 if (interp == NULL)
311 return NULL;
312
313 tstate = PyThreadState_New(interp);
314 if (tstate == NULL) {
315 PyInterpreterState_Delete(interp);
316 return NULL;
317 }
318
319 save_tstate = PyThreadState_Swap(tstate);
320
321 /* XXX The following is lax in error checking */
322
323 interp->modules = PyDict_New();
324
325 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
326 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000327 interp->builtins = PyModule_GetDict(bimod);
328 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000329 }
330 sysmod = _PyImport_FindExtension("sys", "sys");
331 if (bimod != NULL && sysmod != NULL) {
332 interp->sysdict = PyModule_GetDict(sysmod);
333 Py_INCREF(interp->sysdict);
334 PySys_SetPath(Py_GetPath());
335 PyDict_SetItemString(interp->sysdict, "modules",
336 interp->modules);
337 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000338 if (!Py_NoSiteFlag)
339 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000340 }
341
342 if (!PyErr_Occurred())
343 return tstate;
344
345 /* Oops, it didn't work. Undo it all. */
346
347 PyErr_Print();
348 PyThreadState_Clear(tstate);
349 PyThreadState_Swap(save_tstate);
350 PyThreadState_Delete(tstate);
351 PyInterpreterState_Delete(interp);
352
353 return NULL;
354}
355
356/* Delete an interpreter and its last thread. This requires that the
357 given thread state is current, that the thread has no remaining
358 frames, and that it is its interpreter's only remaining thread.
359 It is a fatal error to violate these constraints.
360
361 (Py_Finalize() doesn't have these constraints -- it zaps
362 everything, regardless.)
363
364 Locking: as above.
365
366*/
367
368void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000369Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000370{
371 PyInterpreterState *interp = tstate->interp;
372
373 if (tstate != PyThreadState_Get())
374 Py_FatalError("Py_EndInterpreter: thread is not current");
375 if (tstate->frame != NULL)
376 Py_FatalError("Py_EndInterpreter: thread still has a frame");
377 if (tstate != interp->tstate_head || tstate->next != NULL)
378 Py_FatalError("Py_EndInterpreter: not the last thread");
379
380 PyImport_Cleanup();
381 PyInterpreterState_Clear(interp);
382 PyThreadState_Swap(NULL);
383 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000384}
385
386static char *progname = "python";
387
388void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000390{
391 if (pn && *pn)
392 progname = pn;
393}
394
395char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000397{
398 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000399}
400
Guido van Rossuma61691e1998-02-06 22:27:24 +0000401static char *default_home = NULL;
402
403void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000404Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000405{
406 default_home = home;
407}
408
409char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000410Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000411{
412 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000413 if (home == NULL && !Py_IgnoreEnvironmentFlag)
414 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000415 return home;
416}
417
Guido van Rossum6135a871995-01-09 17:53:26 +0000418/* Create __main__ module */
419
420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000421initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000422{
Guido van Rossum82598051997-03-05 00:20:32 +0000423 PyObject *m, *d;
424 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000425 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000426 Py_FatalError("can't create __main__ module");
427 d = PyModule_GetDict(m);
428 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000429 PyObject *bimod = PyImport_ImportModule("__builtin__");
430 if (bimod == NULL ||
431 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000432 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000433 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000434 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000435}
436
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000437/* Import the site module (not into __main__ though) */
438
439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000440initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000441{
442 PyObject *m, *f;
443 m = PyImport_ImportModule("site");
444 if (m == NULL) {
445 f = PySys_GetObject("stderr");
446 if (Py_VerboseFlag) {
447 PyFile_WriteString(
448 "'import site' failed; traceback:\n", f);
449 PyErr_Print();
450 }
451 else {
452 PyFile_WriteString(
453 "'import site' failed; use -v for traceback\n", f);
454 PyErr_Clear();
455 }
456 }
457 else {
458 Py_DECREF(m);
459 }
460}
461
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462/* Parse input from a file and execute it */
463
464int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000466{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000467 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
468}
469
470int
471PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
472{
473 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000474}
475
476int
477PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
478{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000479 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
480}
481
482int
483PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
484 PyCompilerFlags *flags)
485{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000486 if (filename == NULL)
487 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000488 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000489 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000490 if (closeit)
491 fclose(fp);
492 return err;
493 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000495 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496}
497
498int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000499PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000500{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000501 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
502}
503
504int
505PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
506{
Guido van Rossum82598051997-03-05 00:20:32 +0000507 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000508 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000509 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000510
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000511 if (flags == NULL) {
512 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000513 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000514 }
Guido van Rossum82598051997-03-05 00:20:32 +0000515 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000516 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000517 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
518 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000519 }
Guido van Rossum82598051997-03-05 00:20:32 +0000520 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000521 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000522 PySys_SetObject("ps2", v = PyString_FromString("... "));
523 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000524 }
525 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000526 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000527#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000528 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000529#endif
530 if (ret == E_EOF)
531 return 0;
532 /*
533 if (ret == E_NOMEM)
534 return -1;
535 */
536 }
537}
538
539int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000540PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000542 return PyRun_InteractiveOneFlags(fp, filename, NULL);
543}
544
545int
546PyRun_InteractiveOneFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
547{
Guido van Rossum82598051997-03-05 00:20:32 +0000548 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000549 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000550 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000551 char *ps1 = "", *ps2 = "";
Tim Petersfe2127d2001-07-16 05:37:24 +0000552
Guido van Rossum82598051997-03-05 00:20:32 +0000553 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000554 if (v != NULL) {
555 v = PyObject_Str(v);
556 if (v == NULL)
557 PyErr_Clear();
558 else if (PyString_Check(v))
559 ps1 = PyString_AsString(v);
560 }
Guido van Rossum82598051997-03-05 00:20:32 +0000561 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000562 if (w != NULL) {
563 w = PyObject_Str(w);
564 if (w == NULL)
565 PyErr_Clear();
566 else if (PyString_Check(w))
567 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000568 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000569 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
570 Py_single_input, ps1, ps2, &err,
571 (flags &&
Jeremy Hyltonb857ba22001-08-10 21:41:33 +0000572 flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +0000573 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossum82598051997-03-05 00:20:32 +0000574 Py_XDECREF(v);
575 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000576 if (n == NULL) {
577 if (err.error == E_EOF) {
578 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000579 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000580 return E_EOF;
581 }
582 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000583 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000584 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585 }
Guido van Rossum82598051997-03-05 00:20:32 +0000586 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 if (m == NULL)
588 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000589 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000590 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000592 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000593 return -1;
594 }
Guido van Rossum82598051997-03-05 00:20:32 +0000595 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000596 if (Py_FlushLine())
597 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000598 return 0;
599}
600
601int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000602PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000604 return PyRun_SimpleFileEx(fp, filename, 0);
605}
606
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000607/* Check whether a file maybe a pyc file: Look at the extension,
608 the file type, and, if we may close it, at the first few bytes. */
609
610static int
611maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
612{
613 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
614 return 1;
615
616#ifdef macintosh
617 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
618 if (PyMac_getfiletype(filename) == 'PYC '
619 || PyMac_getfiletype(filename) == 'APPL')
620 return 1;
621#endif /* macintosh */
622
623 /* Only look into the file if we are allowed to close it, since
624 it then should also be seekable. */
625 if (closeit) {
626 /* Read only two bytes of the magic. If the file was opened in
627 text mode, the bytes 3 and 4 of the magic (\r\n) might not
628 be read as they are on disk. */
629 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
630 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000631 /* Mess: In case of -x, the stream is NOT at its start now,
632 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000633 which makes the current stream position formally undefined,
634 and a x-platform nightmare.
635 Unfortunately, we have no direct way to know whether -x
636 was specified. So we use a terrible hack: if the current
637 stream position is not 0, we assume -x was specified, and
638 give up. Bug 132850 on SourceForge spells out the
639 hopelessness of trying anything else (fseek and ftell
640 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000641 */
Tim Peters3e876562001-02-11 04:35:39 +0000642 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000643 if (ftell(fp) == 0) {
644 if (fread(buf, 1, 2, fp) == 2 &&
645 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
646 ispyc = 1;
647 rewind(fp);
648 }
Tim Peters3e876562001-02-11 04:35:39 +0000649 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000650 }
651 return 0;
652}
653
Guido van Rossum0df002c2000-08-27 19:21:52 +0000654int
655PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
656{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000657 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
658}
659
660int
661PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
662 PyCompilerFlags *flags)
663{
Guido van Rossum82598051997-03-05 00:20:32 +0000664 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000665 char *ext;
666
Guido van Rossum82598051997-03-05 00:20:32 +0000667 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668 if (m == NULL)
669 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000670 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000671 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000672 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000673 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000674 if (closeit)
675 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000676 if( (fp = fopen(filename, "rb")) == NULL ) {
677 fprintf(stderr, "python: Can't reopen .pyc file\n");
678 return -1;
679 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000680 /* Turn on optimization if a .pyo file is given */
681 if (strcmp(ext, ".pyo") == 0)
682 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000683 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000684 } else {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000685 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
686 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000687 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000688 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000689 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000690 return -1;
691 }
Guido van Rossum82598051997-03-05 00:20:32 +0000692 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000693 if (Py_FlushLine())
694 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000695 return 0;
696}
697
698int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000699PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000700{
Guido van Rossum393661d2001-08-31 17:40:15 +0000701 return PyRun_SimpleStringFlags(command, NULL);
702}
703
704int
705PyRun_SimpleStringFlags(char *command, PyCompilerFlags *flags)
706{
Guido van Rossum82598051997-03-05 00:20:32 +0000707 PyObject *m, *d, *v;
708 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000709 if (m == NULL)
710 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000711 d = PyModule_GetDict(m);
Guido van Rossum393661d2001-08-31 17:40:15 +0000712 v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000713 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000714 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000715 return -1;
716 }
Guido van Rossum82598051997-03-05 00:20:32 +0000717 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000718 if (Py_FlushLine())
719 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000720 return 0;
721}
722
Barry Warsaw035574d1997-08-29 22:07:17 +0000723static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724parse_syntax_error(PyObject *err, PyObject **message, char **filename,
725 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000726{
727 long hold;
728 PyObject *v;
729
730 /* old style errors */
731 if (PyTuple_Check(err))
732 return PyArg_Parse(err, "(O(ziiz))", message, filename,
733 lineno, offset, text);
734
735 /* new style errors. `err' is an instance */
736
737 if (! (v = PyObject_GetAttrString(err, "msg")))
738 goto finally;
739 *message = v;
740
741 if (!(v = PyObject_GetAttrString(err, "filename")))
742 goto finally;
743 if (v == Py_None)
744 *filename = NULL;
745 else if (! (*filename = PyString_AsString(v)))
746 goto finally;
747
748 Py_DECREF(v);
749 if (!(v = PyObject_GetAttrString(err, "lineno")))
750 goto finally;
751 hold = PyInt_AsLong(v);
752 Py_DECREF(v);
753 v = NULL;
754 if (hold < 0 && PyErr_Occurred())
755 goto finally;
756 *lineno = (int)hold;
757
758 if (!(v = PyObject_GetAttrString(err, "offset")))
759 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000760 if (v == Py_None) {
761 *offset = -1;
762 Py_DECREF(v);
763 v = NULL;
764 } else {
765 hold = PyInt_AsLong(v);
766 Py_DECREF(v);
767 v = NULL;
768 if (hold < 0 && PyErr_Occurred())
769 goto finally;
770 *offset = (int)hold;
771 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000772
773 if (!(v = PyObject_GetAttrString(err, "text")))
774 goto finally;
775 if (v == Py_None)
776 *text = NULL;
777 else if (! (*text = PyString_AsString(v)))
778 goto finally;
779 Py_DECREF(v);
780 return 1;
781
782finally:
783 Py_XDECREF(v);
784 return 0;
785}
786
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000787void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000789{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000790 PyErr_PrintEx(1);
791}
792
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000793static void
794print_error_text(PyObject *f, int offset, char *text)
795{
796 char *nl;
797 if (offset >= 0) {
798 if (offset > 0 && offset == (int)strlen(text))
799 offset--;
800 for (;;) {
801 nl = strchr(text, '\n');
802 if (nl == NULL || nl-text >= offset)
803 break;
804 offset -= (nl+1-text);
805 text = nl+1;
806 }
807 while (*text == ' ' || *text == '\t') {
808 text++;
809 offset--;
810 }
811 }
812 PyFile_WriteString(" ", f);
813 PyFile_WriteString(text, f);
814 if (*text == '\0' || text[strlen(text)-1] != '\n')
815 PyFile_WriteString("\n", f);
816 if (offset == -1)
817 return;
818 PyFile_WriteString(" ", f);
819 offset--;
820 while (offset > 0) {
821 PyFile_WriteString(" ", f);
822 offset--;
823 }
824 PyFile_WriteString("^\n", f);
825}
826
Guido van Rossum66e8e862001-03-23 17:54:43 +0000827static void
828handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000829{
Guido van Rossum66e8e862001-03-23 17:54:43 +0000830 PyObject *exception, *value, *tb;
831 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000832 if (Py_FlushLine())
833 PyErr_Clear();
834 fflush(stdout);
835 if (value == NULL || value == Py_None)
836 Py_Exit(0);
837 if (PyInstance_Check(value)) {
838 /* The error code should be in the `code' attribute. */
839 PyObject *code = PyObject_GetAttrString(value, "code");
840 if (code) {
841 Py_DECREF(value);
842 value = code;
843 if (value == Py_None)
844 Py_Exit(0);
845 }
846 /* If we failed to dig out the 'code' attribute,
847 just let the else clause below print the error. */
848 }
849 if (PyInt_Check(value))
850 Py_Exit((int)PyInt_AsLong(value));
851 else {
852 PyObject_Print(value, stderr, Py_PRINT_RAW);
853 PySys_WriteStderr("\n");
854 Py_Exit(1);
855 }
856}
857
858void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000860{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000861 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000862
863 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
864 handle_system_exit();
865 }
Guido van Rossum82598051997-03-05 00:20:32 +0000866 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000867 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000868 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000869 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000870 if (set_sys_last_vars) {
871 PySys_SetObject("last_type", exception);
872 PySys_SetObject("last_value", v);
873 PySys_SetObject("last_traceback", tb);
874 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000875 hook = PySys_GetObject("excepthook");
876 if (hook) {
877 PyObject *args = Py_BuildValue("(OOO)",
878 exception, v ? v : Py_None, tb ? tb : Py_None);
879 PyObject *result = PyEval_CallObject(hook, args);
880 if (result == NULL) {
881 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000882 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
883 handle_system_exit();
884 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000885 PyErr_Fetch(&exception2, &v2, &tb2);
886 PyErr_NormalizeException(&exception2, &v2, &tb2);
887 if (Py_FlushLine())
888 PyErr_Clear();
889 fflush(stdout);
890 PySys_WriteStderr("Error in sys.excepthook:\n");
891 PyErr_Display(exception2, v2, tb2);
892 PySys_WriteStderr("\nOriginal exception was:\n");
893 PyErr_Display(exception, v, tb);
894 }
895 Py_XDECREF(result);
896 Py_XDECREF(args);
897 } else {
898 PySys_WriteStderr("sys.excepthook is missing\n");
899 PyErr_Display(exception, v, tb);
900 }
901 Py_XDECREF(exception);
902 Py_XDECREF(v);
903 Py_XDECREF(tb);
904}
905
906void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
907{
908 int err = 0;
909 PyObject *v = value;
910 PyObject *f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000911 if (f == NULL)
912 fprintf(stderr, "lost sys.stderr\n");
913 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000914 if (Py_FlushLine())
915 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000916 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000917 if (tb && tb != Py_None)
918 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000919 if (err == 0 &&
920 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
921 {
Guido van Rossum82598051997-03-05 00:20:32 +0000922 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000923 char *filename, *text;
924 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000925 if (!parse_syntax_error(v, &message, &filename,
926 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000927 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000928 else {
929 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000930 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000931 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000932 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000933 else
Guido van Rossum82598051997-03-05 00:20:32 +0000934 PyFile_WriteString(filename, f);
935 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000936 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000937 PyFile_WriteString(buf, f);
938 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000939 if (text != NULL)
940 print_error_text(f, offset, text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000942 /* Can't be bothered to check all those
943 PyFile_WriteString() calls */
944 if (PyErr_Occurred())
945 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000946 }
947 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000948 if (err) {
949 /* Don't do anything else */
950 }
951 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000952 PyClassObject* exc = (PyClassObject*)exception;
953 PyObject* className = exc->cl_name;
954 PyObject* moduleName =
955 PyDict_GetItemString(exc->cl_dict, "__module__");
956
957 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000958 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000959 else {
960 char* modstr = PyString_AsString(moduleName);
961 if (modstr && strcmp(modstr, "exceptions"))
962 {
963 err = PyFile_WriteString(modstr, f);
964 err += PyFile_WriteString(".", f);
965 }
966 }
967 if (err == 0) {
968 if (className == NULL)
969 err = PyFile_WriteString("<unknown>", f);
970 else
971 err = PyFile_WriteObject(className, f,
972 Py_PRINT_RAW);
973 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000974 }
975 else
976 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
977 if (err == 0) {
978 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000979 PyObject *s = PyObject_Str(v);
980 /* only print colon if the str() of the
981 object is not the empty string
982 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000983 if (s == NULL)
984 err = -1;
985 else if (!PyString_Check(s) ||
986 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000987 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000988 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000989 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
990 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000991 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000992 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000993 if (err == 0)
994 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000995 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000996 /* If an error happened here, don't show it.
997 XXX This is wrong, but too many callers rely on this behavior. */
998 if (err != 0)
999 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001000}
1001
Guido van Rossum82598051997-03-05 00:20:32 +00001002PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001003PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001004{
Guido van Rossum82598051997-03-05 00:20:32 +00001005 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001006 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001007}
1008
Guido van Rossum82598051997-03-05 00:20:32 +00001009PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001010PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
1011 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001012{
Tim Peterse8682112000-08-27 20:18:17 +00001013 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +00001014}
1015
1016PyObject *
1017PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001018 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +00001019{
1020 node *n = PyParser_SimpleParseFile(fp, filename, start);
1021 if (closeit)
1022 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001023 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001024}
1025
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001026PyObject *
1027PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
1028 PyCompilerFlags *flags)
1029{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001030 return run_err_node(PyParser_SimpleParseStringFlags(
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001031 str, start,
1032 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001033 PyPARSE_YIELD_IS_KEYWORD : 0),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001034 "<string>", globals, locals, flags);
1035}
1036
1037PyObject *
1038PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
1039 PyObject *locals, PyCompilerFlags *flags)
1040{
1041 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1042 flags);
1043}
1044
1045PyObject *
1046PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
1047 PyObject *locals, int closeit, PyCompilerFlags *flags)
1048{
Tim Petersfe2127d2001-07-16 05:37:24 +00001049 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001050 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001051 PyPARSE_YIELD_IS_KEYWORD : 0);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001052 if (closeit)
1053 fclose(fp);
1054 return run_err_node(n, filename, globals, locals, flags);
1055}
1056
Guido van Rossum82598051997-03-05 00:20:32 +00001057static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001058run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1059 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001060{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001061 if (n == NULL)
1062 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001063 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001064}
1065
Guido van Rossum82598051997-03-05 00:20:32 +00001066static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001067run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1068 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001069{
Guido van Rossum82598051997-03-05 00:20:32 +00001070 PyCodeObject *co;
1071 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001072 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001073 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001074 if (co == NULL)
1075 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001076 v = PyEval_EvalCode(co, globals, locals);
1077 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001078 return v;
1079}
1080
Guido van Rossum82598051997-03-05 00:20:32 +00001081static PyObject *
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001082run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
1083 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001084{
Guido van Rossum82598051997-03-05 00:20:32 +00001085 PyCodeObject *co;
1086 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001087 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001088 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001089
Guido van Rossum82598051997-03-05 00:20:32 +00001090 magic = PyMarshal_ReadLongFromFile(fp);
1091 if (magic != PyImport_GetMagicNumber()) {
1092 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001093 "Bad magic number in .pyc file");
1094 return NULL;
1095 }
Guido van Rossum82598051997-03-05 00:20:32 +00001096 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001097 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001098 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001099 if (v == NULL || !PyCode_Check(v)) {
1100 Py_XDECREF(v);
1101 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001102 "Bad code object in .pyc file");
1103 return NULL;
1104 }
Guido van Rossum82598051997-03-05 00:20:32 +00001105 co = (PyCodeObject *)v;
1106 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001107 if (v && flags)
1108 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001109 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001110 return v;
1111}
1112
Guido van Rossum82598051997-03-05 00:20:32 +00001113PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001114Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001115{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001116 return Py_CompileStringFlags(str, filename, start, NULL);
1117}
1118
1119PyObject *
1120Py_CompileStringFlags(char *str, char *filename, int start,
1121 PyCompilerFlags *flags)
1122{
Guido van Rossum5b722181993-03-30 17:46:03 +00001123 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001124 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001125 n = PyParser_SimpleParseStringFlags(str, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001126 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001127 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001128 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001129 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001130 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001131 PyNode_Free(n);
1132 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001133}
1134
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001135struct symtable *
1136Py_SymtableString(char *str, char *filename, int start)
1137{
1138 node *n;
1139 struct symtable *st;
1140 n = PyParser_SimpleParseString(str, start);
1141 if (n == NULL)
1142 return NULL;
1143 st = PyNode_CompileSymtable(n, filename);
1144 PyNode_Free(n);
1145 return st;
1146}
1147
Guido van Rossuma110aa61994-08-29 12:50:44 +00001148/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001149
Guido van Rossuma110aa61994-08-29 12:50:44 +00001150node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001151PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001152{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001153 node *n;
1154 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001155 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1156 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001157 if (n == NULL)
1158 err_input(&err);
1159 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001160}
1161
Tim Petersfe2127d2001-07-16 05:37:24 +00001162node *
1163PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1164{
1165 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1166}
1167
Guido van Rossuma110aa61994-08-29 12:50:44 +00001168/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001169
Guido van Rossuma110aa61994-08-29 12:50:44 +00001170node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001171PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1172{
1173 node *n;
1174 perrdetail err;
1175 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1176 flags);
1177 if (n == NULL)
1178 err_input(&err);
1179 return n;
1180}
1181
1182node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001183PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001184{
Tim Petersfe2127d2001-07-16 05:37:24 +00001185 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001186}
1187
1188/* Set the error appropriate to the given input error code (see errcode.h) */
1189
1190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001192{
Fred Drake85f36392000-07-11 17:53:00 +00001193 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001194 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001195 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001196 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001197 err->lineno, err->offset, err->text);
1198 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001199 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001200 err->text = NULL;
1201 }
1202 switch (err->error) {
1203 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001204 errtype = PyExc_IndentationError;
1205 if (err->expected == INDENT)
1206 msg = "expected an indented block";
1207 else if (err->token == INDENT)
1208 msg = "unexpected indent";
1209 else if (err->token == DEDENT)
1210 msg = "unexpected unindent";
1211 else {
1212 errtype = PyExc_SyntaxError;
1213 msg = "invalid syntax";
1214 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001215 break;
1216 case E_TOKEN:
1217 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001218 break;
1219 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001220 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001221 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001222 return;
1223 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001224 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001225 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001226 return;
1227 case E_EOF:
1228 msg = "unexpected EOF while parsing";
1229 break;
Fred Drake85f36392000-07-11 17:53:00 +00001230 case E_TABSPACE:
1231 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001232 msg = "inconsistent use of tabs and spaces in indentation";
1233 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001234 case E_OVERFLOW:
1235 msg = "expression too long";
1236 break;
Fred Drake85f36392000-07-11 17:53:00 +00001237 case E_DEDENT:
1238 errtype = PyExc_IndentationError;
1239 msg = "unindent does not match any outer indentation level";
1240 break;
1241 case E_TOODEEP:
1242 errtype = PyExc_IndentationError;
1243 msg = "too many levels of indentation";
1244 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001245 default:
1246 fprintf(stderr, "error=%d\n", err->error);
1247 msg = "unknown parsing error";
1248 break;
1249 }
Guido van Rossum82598051997-03-05 00:20:32 +00001250 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001251 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001252 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001253 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001254}
1255
1256/* Print fatal error message and abort */
1257
1258void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001259Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001260{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001261 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001262#ifdef macintosh
1263 for (;;);
1264#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001265#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001266 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001267 OutputDebugString(msg);
1268 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001269#ifdef _DEBUG
1270 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001271#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001272#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001273 abort();
1274}
1275
1276/* Clean up and exit */
1277
Guido van Rossuma110aa61994-08-29 12:50:44 +00001278#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001279#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001280int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001281#endif
1282
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001283#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001284static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001285static int nexitfuncs = 0;
1286
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001287int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001288{
1289 if (nexitfuncs >= NEXITFUNCS)
1290 return -1;
1291 exitfuncs[nexitfuncs++] = func;
1292 return 0;
1293}
1294
Guido van Rossumcc283f51997-08-05 02:22:03 +00001295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001296call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001297{
Guido van Rossum82598051997-03-05 00:20:32 +00001298 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001299
1300 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001301 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001302 Py_INCREF(exitfunc);
1303 PySys_SetObject("exitfunc", (PyObject *)NULL);
1304 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001305 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001306 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1307 PySys_WriteStderr("Error in sys.exitfunc:\n");
1308 }
Guido van Rossum82598051997-03-05 00:20:32 +00001309 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001310 }
Guido van Rossum82598051997-03-05 00:20:32 +00001311 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001312 }
1313
Guido van Rossum0829c751998-02-28 04:31:39 +00001314 if (Py_FlushLine())
1315 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001316}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001317
Guido van Rossumcc283f51997-08-05 02:22:03 +00001318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001319call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001320{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001321 while (nexitfuncs > 0)
1322 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001323
1324 fflush(stdout);
1325 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001326}
1327
1328void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001329Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001330{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001331 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001332
Jack Jansen66a89771995-10-27 13:22:14 +00001333#ifdef macintosh
1334 PyMac_Exit(sts);
1335#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001336 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001337#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001338}
1339
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001340static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001342{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001343#ifdef HAVE_SIGNAL_H
1344#ifdef SIGPIPE
1345 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001346#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001347#ifdef SIGXFZ
1348 signal(SIGXFZ, SIG_IGN);
1349#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001350#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001351 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001352}
1353
Guido van Rossumaae0d321996-05-22 16:35:33 +00001354#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001355/* Ask a yes/no question */
1356
Guido van Rossum59bff391992-09-03 20:28:00 +00001357int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001358_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001359{
1360 char buf[256];
1361
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362 fprintf(stderr, "%s [ny] ", prompt);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001363 if (fgets(buf, sizeof buf, stdin) == NULL)
1364 return 0;
1365 return buf[0] == 'y' || buf[0] == 'Y';
1366}
1367#endif
1368
Guido van Rossuma110aa61994-08-29 12:50:44 +00001369#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001370
1371/* Check for file descriptor connected to interactive device.
1372 Pretend that stdin is always interactive, other files never. */
1373
1374int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001375isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001376{
1377 return fd == fileno(stdin);
1378}
1379
1380#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001381
1382/*
1383 * The file descriptor fd is considered ``interactive'' if either
1384 * a) isatty(fd) is TRUE, or
1385 * b) the -i flag was given, and the filename associated with
1386 * the descriptor is NULL or "<stdin>" or "???".
1387 */
1388int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001389Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001390{
1391 if (isatty((int)fileno(fp)))
1392 return 1;
1393 if (!Py_InteractiveFlag)
1394 return 0;
1395 return (filename == NULL) ||
1396 (strcmp(filename, "<stdin>") == 0) ||
1397 (strcmp(filename, "???") == 0);
1398}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001399
1400
1401#if defined(USE_STACKCHECK)
1402#if defined(WIN32) && defined(_MSC_VER)
1403
1404/* Stack checking for Microsoft C */
1405
1406#include <malloc.h>
1407#include <excpt.h>
1408
Fred Drakee8de31c2000-08-31 05:38:39 +00001409/*
1410 * Return non-zero when we run out of memory on the stack; zero otherwise.
1411 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001412int
Fred Drake399739f2000-08-31 05:52:44 +00001413PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001414{
1415 __try {
1416 /* _alloca throws a stack overflow exception if there's
1417 not enough space left on the stack */
1418 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1419 return 0;
1420 } __except (EXCEPTION_EXECUTE_HANDLER) {
1421 /* just ignore all errors */
1422 }
1423 return 1;
1424}
1425
1426#endif /* WIN32 && _MSC_VER */
1427
1428/* Alternate implementations can be added here... */
1429
1430#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001431
1432
1433/* Wrappers around sigaction() or signal(). */
1434
1435PyOS_sighandler_t
1436PyOS_getsig(int sig)
1437{
1438#ifdef HAVE_SIGACTION
1439 struct sigaction context;
1440 sigaction(sig, NULL, &context);
1441 return context.sa_handler;
1442#else
1443 PyOS_sighandler_t handler;
1444 handler = signal(sig, SIG_IGN);
1445 signal(sig, handler);
1446 return handler;
1447#endif
1448}
1449
1450PyOS_sighandler_t
1451PyOS_setsig(int sig, PyOS_sighandler_t handler)
1452{
1453#ifdef HAVE_SIGACTION
1454 struct sigaction context;
1455 PyOS_sighandler_t oldhandler;
1456 sigaction(sig, NULL, &context);
1457 oldhandler = context.sa_handler;
1458 context.sa_handler = handler;
1459 sigaction(sig, &context, NULL);
1460 return oldhandler;
1461#else
1462 return signal(sig, handler);
1463#endif
1464}