blob: 232ba55ac9a7aee62b6bd0d2b79f459f055b106d [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
2/* Python interpreter top-level routines, including init/exit */
3
Guido van Rossum82598051997-03-05 00:20:32 +00004#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00005
6#include "grammar.h"
7#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +00008#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000012#include "symtable.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000014#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000015
Guido van Rossum80bb9651996-12-05 23:27:02 +000016#ifdef HAVE_UNISTD_H
17#include <unistd.h>
18#endif
19
Guido van Rossuma110aa61994-08-29 12:50:44 +000020#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000022#endif
23
Guido van Rossum9b38a141996-09-11 23:12:24 +000024#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000025#undef BYTE
26#include "windows.h"
27#endif
28
Jack Jansencbf630f2000-07-11 21:59:16 +000029#ifdef macintosh
30#include "macglue.h"
31#endif
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000032extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000033
Guido van Rossum82598051997-03-05 00:20:32 +000034extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
Guido van Rossumb73cc041993-11-01 16:28:59 +000036/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000037static void initmain(void);
38static void initsite(void);
Jeremy Hylton9f324e92001-03-01 22:59:14 +000039static PyObject *run_err_node(node *, char *, PyObject *, PyObject *,
40 PyCompilerFlags *);
41static PyObject *run_node(node *, char *, PyObject *, PyObject *,
42 PyCompilerFlags *);
Jeremy Hyltonbc320242001-03-22 02:47:58 +000043static PyObject *run_pyc_file(FILE *, char *, PyObject *, PyObject *,
44 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static void err_input(perrdetail *);
46static void initsigs(void);
47static void call_sys_exitfunc(void);
48static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000049
Guido van Rossumbffd6832000-01-20 22:32:56 +000050#ifdef Py_TRACE_REFS
51int _Py_AskYesNo(char *prompt);
52#endif
53
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000054extern void _PyUnicode_Init(void);
55extern void _PyUnicode_Fini(void);
56extern void _PyCodecRegistry_Init(void);
57extern void _PyCodecRegistry_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000058
Guido van Rossum82598051997-03-05 00:20:32 +000059int Py_DebugFlag; /* Needed by parser.c */
60int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000061int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000062int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000063int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000064int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000065int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000066int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000067
Guido van Rossum25ce5661997-08-02 03:10:38 +000068static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069
Thomas Wouters7e474022000-07-16 12:04:32 +000070/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000071
72int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000073Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000074{
75 return initialized;
76}
77
Guido van Rossum25ce5661997-08-02 03:10:38 +000078/* Global initializations. Can be undone by Py_Finalize(). Don't
79 call this twice without an intervening Py_Finalize() call. When
80 initializations fail, a fatal error is issued and the function does
81 not return. On return, the first thread and interpreter state have
82 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083
Guido van Rossum25ce5661997-08-02 03:10:38 +000084 Locking: you must hold the interpreter lock while calling this.
85 (If the lock has not yet been initialized, that's equivalent to
86 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000087
Guido van Rossum25ce5661997-08-02 03:10:38 +000088*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000089
90void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000091Py_Initialize(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000092{
Guido van Rossuma027efa1997-05-05 20:56:21 +000093 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000094 PyThreadState *tstate;
95 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000096 char *p;
Guido van Rossum70d893a2001-08-16 08:21:42 +000097 extern void _Py_ReadyTypes(void);
Guido van Rossumad6dfda1997-07-19 19:17:22 +000098
Guido van Rossumdcc0c131997-08-29 22:32:42 +000099 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000100 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000101 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000103 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000104 Py_DebugFlag = Py_DebugFlag ? Py_DebugFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000105 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000106 Py_VerboseFlag = Py_VerboseFlag ? Py_VerboseFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000107 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000108 Py_OptimizeFlag = Py_OptimizeFlag ? Py_OptimizeFlag : 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109
Guido van Rossuma027efa1997-05-05 20:56:21 +0000110 interp = PyInterpreterState_New();
111 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000113
Guido van Rossuma027efa1997-05-05 20:56:21 +0000114 tstate = PyThreadState_New(interp);
115 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 (void) PyThreadState_Swap(tstate);
118
Guido van Rossum70d893a2001-08-16 08:21:42 +0000119 _Py_ReadyTypes();
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000120
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121 interp->modules = PyDict_New();
122 if (interp->modules == NULL)
123 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124
Guido van Rossumc94044c2000-03-10 23:03:54 +0000125 /* Init codec registry */
126 _PyCodecRegistry_Init();
127
128 /* Init Unicode implementation; relies on the codec registry */
129 _PyUnicode_Init();
130
Barry Warsawf242aa02000-05-25 23:09:49 +0000131 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 if (bimod == NULL)
133 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000134 interp->builtins = PyModule_GetDict(bimod);
135 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136
137 sysmod = _PySys_Init();
138 if (sysmod == NULL)
139 Py_FatalError("Py_Initialize: can't initialize sys");
140 interp->sysdict = PyModule_GetDict(sysmod);
141 Py_INCREF(interp->sysdict);
142 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000144 PyDict_SetItemString(interp->sysdict, "modules",
145 interp->modules);
146
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000147 _PyImport_Init();
148
Barry Warsawf242aa02000-05-25 23:09:49 +0000149 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000150 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000151 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000152
Barry Warsaw035574d1997-08-29 22:07:17 +0000153 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000154 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000155
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156 initsigs(); /* Signal handling stuff, including initintr() */
157
158 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000159 if (!Py_NoSiteFlag)
160 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000161}
162
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000163#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000164extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000165#endif
166
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167/* Undo the effect of Py_Initialize().
168
169 Beware: if multiple interpreter and/or thread states exist, these
170 are not wiped out; only the current thread and interpreter state
171 are deleted. But since everything else is deleted, those other
172 interpreter and thread states should no longer be used.
173
174 (XXX We should do better, e.g. wipe out all interpreters and
175 threads.)
176
177 Locking: as above.
178
179*/
180
181void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000182Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000183{
184 PyInterpreterState *interp;
185 PyThreadState *tstate;
186
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000187 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000188 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189
Tim Peters384fd102001-01-21 03:40:37 +0000190 /* The interpreter is still entirely intact at this point, and the
191 * exit funcs may be relying on that. In particular, if some thread
192 * or exit func is still waiting to do an import, the import machinery
193 * expects Py_IsInitialized() to return true. So don't say the
194 * interpreter is uninitialized until after the exit funcs have run.
195 * Note that Threading.py uses an exit func to do a join on all the
196 * threads created thru it, so this also protects pending imports in
197 * the threads created via Threading.
198 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000199 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000200 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000201
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000202 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000203 tstate = PyThreadState_Get();
204 interp = tstate->interp;
205
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000206 /* Disable signal handling */
207 PyOS_FiniInterrupts();
208
Guido van Rossumc94044c2000-03-10 23:03:54 +0000209 /* Cleanup Unicode implementation */
210 _PyUnicode_Fini();
211
212 /* Cleanup Codec registry */
213 _PyCodecRegistry_Fini();
214
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000215 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000217
Guido van Rossum1707aad1997-12-08 23:43:45 +0000218 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
219 _PyImport_Fini();
220
221 /* Debugging stuff */
222#ifdef COUNT_ALLOCS
223 dump_counts();
224#endif
225
226#ifdef Py_REF_DEBUG
227 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
228#endif
229
230#ifdef Py_TRACE_REFS
Guido van Rossum92e2d5c2001-08-09 16:37:16 +0000231 if (Py_GETENV("PYTHONDUMPREFS")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000232 _Py_PrintReferences(stderr);
233 }
234#endif /* Py_TRACE_REFS */
235
Barry Warsaw035574d1997-08-29 22:07:17 +0000236 /* Now we decref the exception classes. After this point nothing
237 can raise an exception. That's okay, because each Fini() method
238 below has been checked to make sure no exceptions are ever
239 raised.
240 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000241 _PyExc_Fini();
Barry Warsawf242aa02000-05-25 23:09:49 +0000242
243 /* Delete current thread */
244 PyInterpreterState_Clear(interp);
245 PyThreadState_Swap(NULL);
246 PyInterpreterState_Delete(interp);
247
Guido van Rossumcc283f51997-08-05 02:22:03 +0000248 PyMethod_Fini();
249 PyFrame_Fini();
250 PyCFunction_Fini();
251 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000252 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000253 PyInt_Fini();
254 PyFloat_Fini();
255
256 /* XXX Still allocated:
257 - various static ad-hoc pointers to interned strings
258 - int and float free list blocks
259 - whatever various modules and libraries allocate
260 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261
262 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000263
264 call_ll_exitfuncs();
265
Guido van Rossumcc283f51997-08-05 02:22:03 +0000266#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000267 _Py_ResetReferences();
268#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000269}
270
271/* Create and initialize a new interpreter and thread, and return the
272 new thread. This requires that Py_Initialize() has been called
273 first.
274
275 Unsuccessful initialization yields a NULL pointer. Note that *no*
276 exception information is available even in this case -- the
277 exception information is held in the thread, and there is no
278 thread.
279
280 Locking: as above.
281
282*/
283
284PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000285Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000286{
287 PyInterpreterState *interp;
288 PyThreadState *tstate, *save_tstate;
289 PyObject *bimod, *sysmod;
290
291 if (!initialized)
292 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
293
294 interp = PyInterpreterState_New();
295 if (interp == NULL)
296 return NULL;
297
298 tstate = PyThreadState_New(interp);
299 if (tstate == NULL) {
300 PyInterpreterState_Delete(interp);
301 return NULL;
302 }
303
304 save_tstate = PyThreadState_Swap(tstate);
305
306 /* XXX The following is lax in error checking */
307
308 interp->modules = PyDict_New();
309
310 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
311 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000312 interp->builtins = PyModule_GetDict(bimod);
313 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314 }
315 sysmod = _PyImport_FindExtension("sys", "sys");
316 if (bimod != NULL && sysmod != NULL) {
317 interp->sysdict = PyModule_GetDict(sysmod);
318 Py_INCREF(interp->sysdict);
319 PySys_SetPath(Py_GetPath());
320 PyDict_SetItemString(interp->sysdict, "modules",
321 interp->modules);
322 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000323 if (!Py_NoSiteFlag)
324 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000325 }
326
327 if (!PyErr_Occurred())
328 return tstate;
329
330 /* Oops, it didn't work. Undo it all. */
331
332 PyErr_Print();
333 PyThreadState_Clear(tstate);
334 PyThreadState_Swap(save_tstate);
335 PyThreadState_Delete(tstate);
336 PyInterpreterState_Delete(interp);
337
338 return NULL;
339}
340
341/* Delete an interpreter and its last thread. This requires that the
342 given thread state is current, that the thread has no remaining
343 frames, and that it is its interpreter's only remaining thread.
344 It is a fatal error to violate these constraints.
345
346 (Py_Finalize() doesn't have these constraints -- it zaps
347 everything, regardless.)
348
349 Locking: as above.
350
351*/
352
353void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000354Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000355{
356 PyInterpreterState *interp = tstate->interp;
357
358 if (tstate != PyThreadState_Get())
359 Py_FatalError("Py_EndInterpreter: thread is not current");
360 if (tstate->frame != NULL)
361 Py_FatalError("Py_EndInterpreter: thread still has a frame");
362 if (tstate != interp->tstate_head || tstate->next != NULL)
363 Py_FatalError("Py_EndInterpreter: not the last thread");
364
365 PyImport_Cleanup();
366 PyInterpreterState_Clear(interp);
367 PyThreadState_Swap(NULL);
368 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000369}
370
371static char *progname = "python";
372
373void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000375{
376 if (pn && *pn)
377 progname = pn;
378}
379
380char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000381Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000382{
383 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000384}
385
Guido van Rossuma61691e1998-02-06 22:27:24 +0000386static char *default_home = NULL;
387
388void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000389Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000390{
391 default_home = home;
392}
393
394char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000395Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000396{
397 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000398 if (home == NULL && !Py_IgnoreEnvironmentFlag)
399 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000400 return home;
401}
402
Guido van Rossum6135a871995-01-09 17:53:26 +0000403/* Create __main__ module */
404
405static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000406initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000407{
Guido van Rossum82598051997-03-05 00:20:32 +0000408 PyObject *m, *d;
409 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000410 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000411 Py_FatalError("can't create __main__ module");
412 d = PyModule_GetDict(m);
413 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000414 PyObject *bimod = PyImport_ImportModule("__builtin__");
415 if (bimod == NULL ||
416 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000417 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000418 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000419 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000420}
421
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000422/* Import the site module (not into __main__ though) */
423
424static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000425initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000426{
427 PyObject *m, *f;
428 m = PyImport_ImportModule("site");
429 if (m == NULL) {
430 f = PySys_GetObject("stderr");
431 if (Py_VerboseFlag) {
432 PyFile_WriteString(
433 "'import site' failed; traceback:\n", f);
434 PyErr_Print();
435 }
436 else {
437 PyFile_WriteString(
438 "'import site' failed; use -v for traceback\n", f);
439 PyErr_Clear();
440 }
441 }
442 else {
443 Py_DECREF(m);
444 }
445}
446
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000447/* Parse input from a file and execute it */
448
449int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000450PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000452 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
453}
454
455int
456PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
457{
458 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000459}
460
461int
462PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
463{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000464 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
465}
466
467int
468PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
469 PyCompilerFlags *flags)
470{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 if (filename == NULL)
472 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000473 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000474 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000475 if (closeit)
476 fclose(fp);
477 return err;
478 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000479 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000480 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481}
482
483int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000484PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000485{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000486 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
487}
488
489int
490PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
491{
Guido van Rossum82598051997-03-05 00:20:32 +0000492 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000494 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000495
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000496 if (flags == NULL) {
497 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000498 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000499 }
Guido van Rossum82598051997-03-05 00:20:32 +0000500 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000502 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
503 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504 }
Guido van Rossum82598051997-03-05 00:20:32 +0000505 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000507 PySys_SetObject("ps2", v = PyString_FromString("... "));
508 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 }
510 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000511 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000512#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000513 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000514#endif
515 if (ret == E_EOF)
516 return 0;
517 /*
518 if (ret == E_NOMEM)
519 return -1;
520 */
521 }
522}
523
524int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000525PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000526{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000527 return PyRun_InteractiveOneFlags(fp, filename, NULL);
528}
529
530int
531PyRun_InteractiveOneFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
532{
Guido van Rossum82598051997-03-05 00:20:32 +0000533 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000534 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000535 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000536 char *ps1 = "", *ps2 = "";
Tim Petersfe2127d2001-07-16 05:37:24 +0000537
Guido van Rossum82598051997-03-05 00:20:32 +0000538 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000539 if (v != NULL) {
540 v = PyObject_Str(v);
541 if (v == NULL)
542 PyErr_Clear();
543 else if (PyString_Check(v))
544 ps1 = PyString_AsString(v);
545 }
Guido van Rossum82598051997-03-05 00:20:32 +0000546 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000547 if (w != NULL) {
548 w = PyObject_Str(w);
549 if (w == NULL)
550 PyErr_Clear();
551 else if (PyString_Check(w))
552 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000554 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
555 Py_single_input, ps1, ps2, &err,
556 (flags &&
Jeremy Hyltonb857ba22001-08-10 21:41:33 +0000557 flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +0000558 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossum82598051997-03-05 00:20:32 +0000559 Py_XDECREF(v);
560 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000561 if (n == NULL) {
562 if (err.error == E_EOF) {
563 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000564 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000565 return E_EOF;
566 }
567 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000568 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000569 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000570 }
Guido van Rossum82598051997-03-05 00:20:32 +0000571 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 if (m == NULL)
573 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000574 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000575 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000576 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000577 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000578 return -1;
579 }
Guido van Rossum82598051997-03-05 00:20:32 +0000580 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000581 if (Py_FlushLine())
582 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583 return 0;
584}
585
586int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000589 return PyRun_SimpleFileEx(fp, filename, 0);
590}
591
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000592/* Check whether a file maybe a pyc file: Look at the extension,
593 the file type, and, if we may close it, at the first few bytes. */
594
595static int
596maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
597{
598 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
599 return 1;
600
601#ifdef macintosh
602 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
603 if (PyMac_getfiletype(filename) == 'PYC '
604 || PyMac_getfiletype(filename) == 'APPL')
605 return 1;
606#endif /* macintosh */
607
608 /* Only look into the file if we are allowed to close it, since
609 it then should also be seekable. */
610 if (closeit) {
611 /* Read only two bytes of the magic. If the file was opened in
612 text mode, the bytes 3 and 4 of the magic (\r\n) might not
613 be read as they are on disk. */
614 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
615 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000616 /* Mess: In case of -x, the stream is NOT at its start now,
617 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000618 which makes the current stream position formally undefined,
619 and a x-platform nightmare.
620 Unfortunately, we have no direct way to know whether -x
621 was specified. So we use a terrible hack: if the current
622 stream position is not 0, we assume -x was specified, and
623 give up. Bug 132850 on SourceForge spells out the
624 hopelessness of trying anything else (fseek and ftell
625 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000626 */
Tim Peters3e876562001-02-11 04:35:39 +0000627 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000628 if (ftell(fp) == 0) {
629 if (fread(buf, 1, 2, fp) == 2 &&
630 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
631 ispyc = 1;
632 rewind(fp);
633 }
Tim Peters3e876562001-02-11 04:35:39 +0000634 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000635 }
636 return 0;
637}
638
Guido van Rossum0df002c2000-08-27 19:21:52 +0000639int
640PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
641{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000642 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
643}
644
645int
646PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
647 PyCompilerFlags *flags)
648{
Guido van Rossum82598051997-03-05 00:20:32 +0000649 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000650 char *ext;
651
Guido van Rossum82598051997-03-05 00:20:32 +0000652 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653 if (m == NULL)
654 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000655 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000656 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000657 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000658 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000659 if (closeit)
660 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000661 if( (fp = fopen(filename, "rb")) == NULL ) {
662 fprintf(stderr, "python: Can't reopen .pyc file\n");
663 return -1;
664 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000665 /* Turn on optimization if a .pyo file is given */
666 if (strcmp(ext, ".pyo") == 0)
667 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000668 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000669 } else {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000670 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
671 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000672 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000674 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 return -1;
676 }
Guido van Rossum82598051997-03-05 00:20:32 +0000677 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000678 if (Py_FlushLine())
679 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680 return 0;
681}
682
683int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000684PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000685{
Guido van Rossum82598051997-03-05 00:20:32 +0000686 PyObject *m, *d, *v;
687 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000688 if (m == NULL)
689 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000690 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000691 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000692 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000693 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000694 return -1;
695 }
Guido van Rossum82598051997-03-05 00:20:32 +0000696 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000697 if (Py_FlushLine())
698 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000699 return 0;
700}
701
Barry Warsaw035574d1997-08-29 22:07:17 +0000702static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703parse_syntax_error(PyObject *err, PyObject **message, char **filename,
704 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000705{
706 long hold;
707 PyObject *v;
708
709 /* old style errors */
710 if (PyTuple_Check(err))
711 return PyArg_Parse(err, "(O(ziiz))", message, filename,
712 lineno, offset, text);
713
714 /* new style errors. `err' is an instance */
715
716 if (! (v = PyObject_GetAttrString(err, "msg")))
717 goto finally;
718 *message = v;
719
720 if (!(v = PyObject_GetAttrString(err, "filename")))
721 goto finally;
722 if (v == Py_None)
723 *filename = NULL;
724 else if (! (*filename = PyString_AsString(v)))
725 goto finally;
726
727 Py_DECREF(v);
728 if (!(v = PyObject_GetAttrString(err, "lineno")))
729 goto finally;
730 hold = PyInt_AsLong(v);
731 Py_DECREF(v);
732 v = NULL;
733 if (hold < 0 && PyErr_Occurred())
734 goto finally;
735 *lineno = (int)hold;
736
737 if (!(v = PyObject_GetAttrString(err, "offset")))
738 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000739 if (v == Py_None) {
740 *offset = -1;
741 Py_DECREF(v);
742 v = NULL;
743 } else {
744 hold = PyInt_AsLong(v);
745 Py_DECREF(v);
746 v = NULL;
747 if (hold < 0 && PyErr_Occurred())
748 goto finally;
749 *offset = (int)hold;
750 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000751
752 if (!(v = PyObject_GetAttrString(err, "text")))
753 goto finally;
754 if (v == Py_None)
755 *text = NULL;
756 else if (! (*text = PyString_AsString(v)))
757 goto finally;
758 Py_DECREF(v);
759 return 1;
760
761finally:
762 Py_XDECREF(v);
763 return 0;
764}
765
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000766void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000767PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000768{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000769 PyErr_PrintEx(1);
770}
771
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000772static void
773print_error_text(PyObject *f, int offset, char *text)
774{
775 char *nl;
776 if (offset >= 0) {
777 if (offset > 0 && offset == (int)strlen(text))
778 offset--;
779 for (;;) {
780 nl = strchr(text, '\n');
781 if (nl == NULL || nl-text >= offset)
782 break;
783 offset -= (nl+1-text);
784 text = nl+1;
785 }
786 while (*text == ' ' || *text == '\t') {
787 text++;
788 offset--;
789 }
790 }
791 PyFile_WriteString(" ", f);
792 PyFile_WriteString(text, f);
793 if (*text == '\0' || text[strlen(text)-1] != '\n')
794 PyFile_WriteString("\n", f);
795 if (offset == -1)
796 return;
797 PyFile_WriteString(" ", f);
798 offset--;
799 while (offset > 0) {
800 PyFile_WriteString(" ", f);
801 offset--;
802 }
803 PyFile_WriteString("^\n", f);
804}
805
Guido van Rossum66e8e862001-03-23 17:54:43 +0000806static void
807handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000808{
Guido van Rossum66e8e862001-03-23 17:54:43 +0000809 PyObject *exception, *value, *tb;
810 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000811 if (Py_FlushLine())
812 PyErr_Clear();
813 fflush(stdout);
814 if (value == NULL || value == Py_None)
815 Py_Exit(0);
816 if (PyInstance_Check(value)) {
817 /* The error code should be in the `code' attribute. */
818 PyObject *code = PyObject_GetAttrString(value, "code");
819 if (code) {
820 Py_DECREF(value);
821 value = code;
822 if (value == Py_None)
823 Py_Exit(0);
824 }
825 /* If we failed to dig out the 'code' attribute,
826 just let the else clause below print the error. */
827 }
828 if (PyInt_Check(value))
829 Py_Exit((int)PyInt_AsLong(value));
830 else {
831 PyObject_Print(value, stderr, Py_PRINT_RAW);
832 PySys_WriteStderr("\n");
833 Py_Exit(1);
834 }
835}
836
837void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000838PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000839{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000840 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000841
842 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
843 handle_system_exit();
844 }
Guido van Rossum82598051997-03-05 00:20:32 +0000845 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000846 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000847 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000848 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000849 if (set_sys_last_vars) {
850 PySys_SetObject("last_type", exception);
851 PySys_SetObject("last_value", v);
852 PySys_SetObject("last_traceback", tb);
853 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000854 hook = PySys_GetObject("excepthook");
855 if (hook) {
856 PyObject *args = Py_BuildValue("(OOO)",
857 exception, v ? v : Py_None, tb ? tb : Py_None);
858 PyObject *result = PyEval_CallObject(hook, args);
859 if (result == NULL) {
860 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000861 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
862 handle_system_exit();
863 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000864 PyErr_Fetch(&exception2, &v2, &tb2);
865 PyErr_NormalizeException(&exception2, &v2, &tb2);
866 if (Py_FlushLine())
867 PyErr_Clear();
868 fflush(stdout);
869 PySys_WriteStderr("Error in sys.excepthook:\n");
870 PyErr_Display(exception2, v2, tb2);
871 PySys_WriteStderr("\nOriginal exception was:\n");
872 PyErr_Display(exception, v, tb);
873 }
874 Py_XDECREF(result);
875 Py_XDECREF(args);
876 } else {
877 PySys_WriteStderr("sys.excepthook is missing\n");
878 PyErr_Display(exception, v, tb);
879 }
880 Py_XDECREF(exception);
881 Py_XDECREF(v);
882 Py_XDECREF(tb);
883}
884
885void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
886{
887 int err = 0;
888 PyObject *v = value;
889 PyObject *f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000890 if (f == NULL)
891 fprintf(stderr, "lost sys.stderr\n");
892 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000893 if (Py_FlushLine())
894 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000895 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000896 if (tb && tb != Py_None)
897 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000898 if (err == 0 &&
899 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
900 {
Guido van Rossum82598051997-03-05 00:20:32 +0000901 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000902 char *filename, *text;
903 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000904 if (!parse_syntax_error(v, &message, &filename,
905 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000906 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000907 else {
908 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000909 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000910 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000911 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000912 else
Guido van Rossum82598051997-03-05 00:20:32 +0000913 PyFile_WriteString(filename, f);
914 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000915 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000916 PyFile_WriteString(buf, f);
917 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000918 if (text != NULL)
919 print_error_text(f, offset, text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000920 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000921 /* Can't be bothered to check all those
922 PyFile_WriteString() calls */
923 if (PyErr_Occurred())
924 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000925 }
926 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000927 if (err) {
928 /* Don't do anything else */
929 }
930 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000931 PyClassObject* exc = (PyClassObject*)exception;
932 PyObject* className = exc->cl_name;
933 PyObject* moduleName =
934 PyDict_GetItemString(exc->cl_dict, "__module__");
935
936 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000937 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000938 else {
939 char* modstr = PyString_AsString(moduleName);
940 if (modstr && strcmp(modstr, "exceptions"))
941 {
942 err = PyFile_WriteString(modstr, f);
943 err += PyFile_WriteString(".", f);
944 }
945 }
946 if (err == 0) {
947 if (className == NULL)
948 err = PyFile_WriteString("<unknown>", f);
949 else
950 err = PyFile_WriteObject(className, f,
951 Py_PRINT_RAW);
952 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000953 }
954 else
955 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
956 if (err == 0) {
957 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000958 PyObject *s = PyObject_Str(v);
959 /* only print colon if the str() of the
960 object is not the empty string
961 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000962 if (s == NULL)
963 err = -1;
964 else if (!PyString_Check(s) ||
965 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000966 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000967 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000968 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
969 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000970 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000971 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000972 if (err == 0)
973 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000974 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000975 /* If an error happened here, don't show it.
976 XXX This is wrong, but too many callers rely on this behavior. */
977 if (err != 0)
978 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000979}
980
Guido van Rossum82598051997-03-05 00:20:32 +0000981PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000982PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000983{
Guido van Rossum82598051997-03-05 00:20:32 +0000984 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000985 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000986}
987
Guido van Rossum82598051997-03-05 00:20:32 +0000988PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000989PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
990 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000991{
Tim Peterse8682112000-08-27 20:18:17 +0000992 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000993}
994
995PyObject *
996PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000997 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +0000998{
999 node *n = PyParser_SimpleParseFile(fp, filename, start);
1000 if (closeit)
1001 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001002 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001003}
1004
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001005PyObject *
1006PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
1007 PyCompilerFlags *flags)
1008{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001009 return run_err_node(PyParser_SimpleParseStringFlags(
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001010 str, start,
1011 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001012 PyPARSE_YIELD_IS_KEYWORD : 0),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001013 "<string>", globals, locals, flags);
1014}
1015
1016PyObject *
1017PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
1018 PyObject *locals, PyCompilerFlags *flags)
1019{
1020 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1021 flags);
1022}
1023
1024PyObject *
1025PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
1026 PyObject *locals, int closeit, PyCompilerFlags *flags)
1027{
Tim Petersfe2127d2001-07-16 05:37:24 +00001028 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001029 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001030 PyPARSE_YIELD_IS_KEYWORD : 0);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001031 if (closeit)
1032 fclose(fp);
1033 return run_err_node(n, filename, globals, locals, flags);
1034}
1035
Guido van Rossum82598051997-03-05 00:20:32 +00001036static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001037run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1038 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001039{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001040 if (n == NULL)
1041 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001042 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001043}
1044
Guido van Rossum82598051997-03-05 00:20:32 +00001045static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001046run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1047 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001048{
Guido van Rossum82598051997-03-05 00:20:32 +00001049 PyCodeObject *co;
1050 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001051 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001052 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001053 if (co == NULL)
1054 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001055 v = PyEval_EvalCode(co, globals, locals);
1056 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001057 return v;
1058}
1059
Guido van Rossum82598051997-03-05 00:20:32 +00001060static PyObject *
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001061run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
1062 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001063{
Guido van Rossum82598051997-03-05 00:20:32 +00001064 PyCodeObject *co;
1065 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001066 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001067 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001068
Guido van Rossum82598051997-03-05 00:20:32 +00001069 magic = PyMarshal_ReadLongFromFile(fp);
1070 if (magic != PyImport_GetMagicNumber()) {
1071 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001072 "Bad magic number in .pyc file");
1073 return NULL;
1074 }
Guido van Rossum82598051997-03-05 00:20:32 +00001075 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001076 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001077 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001078 if (v == NULL || !PyCode_Check(v)) {
1079 Py_XDECREF(v);
1080 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001081 "Bad code object in .pyc file");
1082 return NULL;
1083 }
Guido van Rossum82598051997-03-05 00:20:32 +00001084 co = (PyCodeObject *)v;
1085 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001086 if (v && flags)
1087 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001088 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001089 return v;
1090}
1091
Guido van Rossum82598051997-03-05 00:20:32 +00001092PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001093Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001094{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001095 return Py_CompileStringFlags(str, filename, start, NULL);
1096}
1097
1098PyObject *
1099Py_CompileStringFlags(char *str, char *filename, int start,
1100 PyCompilerFlags *flags)
1101{
Guido van Rossum5b722181993-03-30 17:46:03 +00001102 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001103 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001104 n = PyParser_SimpleParseStringFlags(str, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001105 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001106 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001107 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001108 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001109 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001110 PyNode_Free(n);
1111 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001112}
1113
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001114struct symtable *
1115Py_SymtableString(char *str, char *filename, int start)
1116{
1117 node *n;
1118 struct symtable *st;
1119 n = PyParser_SimpleParseString(str, start);
1120 if (n == NULL)
1121 return NULL;
1122 st = PyNode_CompileSymtable(n, filename);
1123 PyNode_Free(n);
1124 return st;
1125}
1126
Guido van Rossuma110aa61994-08-29 12:50:44 +00001127/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001128
Guido van Rossuma110aa61994-08-29 12:50:44 +00001129node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001130PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001131{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001132 node *n;
1133 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001134 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1135 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001136 if (n == NULL)
1137 err_input(&err);
1138 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001139}
1140
Tim Petersfe2127d2001-07-16 05:37:24 +00001141node *
1142PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1143{
1144 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1145}
1146
Guido van Rossuma110aa61994-08-29 12:50:44 +00001147/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001148
Guido van Rossuma110aa61994-08-29 12:50:44 +00001149node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001150PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1151{
1152 node *n;
1153 perrdetail err;
1154 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1155 flags);
1156 if (n == NULL)
1157 err_input(&err);
1158 return n;
1159}
1160
1161node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001162PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001163{
Tim Petersfe2127d2001-07-16 05:37:24 +00001164 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001165}
1166
1167/* Set the error appropriate to the given input error code (see errcode.h) */
1168
1169static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001170err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001171{
Fred Drake85f36392000-07-11 17:53:00 +00001172 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001173 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001174 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001175 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001176 err->lineno, err->offset, err->text);
1177 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001178 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001179 err->text = NULL;
1180 }
1181 switch (err->error) {
1182 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001183 errtype = PyExc_IndentationError;
1184 if (err->expected == INDENT)
1185 msg = "expected an indented block";
1186 else if (err->token == INDENT)
1187 msg = "unexpected indent";
1188 else if (err->token == DEDENT)
1189 msg = "unexpected unindent";
1190 else {
1191 errtype = PyExc_SyntaxError;
1192 msg = "invalid syntax";
1193 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001194 break;
1195 case E_TOKEN:
1196 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001197 break;
1198 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001199 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001200 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001201 return;
1202 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001203 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001204 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001205 return;
1206 case E_EOF:
1207 msg = "unexpected EOF while parsing";
1208 break;
Fred Drake85f36392000-07-11 17:53:00 +00001209 case E_TABSPACE:
1210 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001211 msg = "inconsistent use of tabs and spaces in indentation";
1212 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001213 case E_OVERFLOW:
1214 msg = "expression too long";
1215 break;
Fred Drake85f36392000-07-11 17:53:00 +00001216 case E_DEDENT:
1217 errtype = PyExc_IndentationError;
1218 msg = "unindent does not match any outer indentation level";
1219 break;
1220 case E_TOODEEP:
1221 errtype = PyExc_IndentationError;
1222 msg = "too many levels of indentation";
1223 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001224 default:
1225 fprintf(stderr, "error=%d\n", err->error);
1226 msg = "unknown parsing error";
1227 break;
1228 }
Guido van Rossum82598051997-03-05 00:20:32 +00001229 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001230 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001231 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001232 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001233}
1234
1235/* Print fatal error message and abort */
1236
1237void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001238Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001239{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001240 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001241#ifdef macintosh
1242 for (;;);
1243#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001244#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001245 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001246 OutputDebugString(msg);
1247 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001248#ifdef _DEBUG
1249 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001250#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001251#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001252 abort();
1253}
1254
1255/* Clean up and exit */
1256
Guido van Rossuma110aa61994-08-29 12:50:44 +00001257#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001258#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001259int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001260#endif
1261
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001262#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001263static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001264static int nexitfuncs = 0;
1265
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001266int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001267{
1268 if (nexitfuncs >= NEXITFUNCS)
1269 return -1;
1270 exitfuncs[nexitfuncs++] = func;
1271 return 0;
1272}
1273
Guido van Rossumcc283f51997-08-05 02:22:03 +00001274static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001275call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001276{
Guido van Rossum82598051997-03-05 00:20:32 +00001277 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001278
1279 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001280 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001281 Py_INCREF(exitfunc);
1282 PySys_SetObject("exitfunc", (PyObject *)NULL);
1283 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001284 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001285 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1286 PySys_WriteStderr("Error in sys.exitfunc:\n");
1287 }
Guido van Rossum82598051997-03-05 00:20:32 +00001288 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001289 }
Guido van Rossum82598051997-03-05 00:20:32 +00001290 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001291 }
1292
Guido van Rossum0829c751998-02-28 04:31:39 +00001293 if (Py_FlushLine())
1294 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001295}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001296
Guido van Rossumcc283f51997-08-05 02:22:03 +00001297static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001298call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001299{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001300 while (nexitfuncs > 0)
1301 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001302
1303 fflush(stdout);
1304 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001305}
1306
1307void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001309{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001310 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001311
Jack Jansen66a89771995-10-27 13:22:14 +00001312#ifdef macintosh
1313 PyMac_Exit(sts);
1314#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001315 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001316#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001317}
1318
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001319static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001320initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001321{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001322#ifdef HAVE_SIGNAL_H
1323#ifdef SIGPIPE
1324 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001325#endif
Guido van Rossum70d893a2001-08-16 08:21:42 +00001326#ifdef SIGXFZ
1327 signal(SIGXFZ, SIG_IGN);
1328#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001329#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001330 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001331}
1332
Guido van Rossumaae0d321996-05-22 16:35:33 +00001333#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001334/* Ask a yes/no question */
1335
Guido van Rossum59bff391992-09-03 20:28:00 +00001336int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001337_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001338{
1339 char buf[256];
1340
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 fprintf(stderr, "%s [ny] ", prompt);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001342 if (fgets(buf, sizeof buf, stdin) == NULL)
1343 return 0;
1344 return buf[0] == 'y' || buf[0] == 'Y';
1345}
1346#endif
1347
Guido van Rossuma110aa61994-08-29 12:50:44 +00001348#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001349
1350/* Check for file descriptor connected to interactive device.
1351 Pretend that stdin is always interactive, other files never. */
1352
1353int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001354isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001355{
1356 return fd == fileno(stdin);
1357}
1358
1359#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001360
1361/*
1362 * The file descriptor fd is considered ``interactive'' if either
1363 * a) isatty(fd) is TRUE, or
1364 * b) the -i flag was given, and the filename associated with
1365 * the descriptor is NULL or "<stdin>" or "???".
1366 */
1367int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001368Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001369{
1370 if (isatty((int)fileno(fp)))
1371 return 1;
1372 if (!Py_InteractiveFlag)
1373 return 0;
1374 return (filename == NULL) ||
1375 (strcmp(filename, "<stdin>") == 0) ||
1376 (strcmp(filename, "???") == 0);
1377}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001378
1379
1380#if defined(USE_STACKCHECK)
1381#if defined(WIN32) && defined(_MSC_VER)
1382
1383/* Stack checking for Microsoft C */
1384
1385#include <malloc.h>
1386#include <excpt.h>
1387
Fred Drakee8de31c2000-08-31 05:38:39 +00001388/*
1389 * Return non-zero when we run out of memory on the stack; zero otherwise.
1390 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001391int
Fred Drake399739f2000-08-31 05:52:44 +00001392PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001393{
1394 __try {
1395 /* _alloca throws a stack overflow exception if there's
1396 not enough space left on the stack */
1397 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1398 return 0;
1399 } __except (EXCEPTION_EXECUTE_HANDLER) {
1400 /* just ignore all errors */
1401 }
1402 return 1;
1403}
1404
1405#endif /* WIN32 && _MSC_VER */
1406
1407/* Alternate implementations can be added here... */
1408
1409#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001410
1411
1412/* Wrappers around sigaction() or signal(). */
1413
1414PyOS_sighandler_t
1415PyOS_getsig(int sig)
1416{
1417#ifdef HAVE_SIGACTION
1418 struct sigaction context;
1419 sigaction(sig, NULL, &context);
1420 return context.sa_handler;
1421#else
1422 PyOS_sighandler_t handler;
1423 handler = signal(sig, SIG_IGN);
1424 signal(sig, handler);
1425 return handler;
1426#endif
1427}
1428
1429PyOS_sighandler_t
1430PyOS_setsig(int sig, PyOS_sighandler_t handler)
1431{
1432#ifdef HAVE_SIGACTION
1433 struct sigaction context;
1434 PyOS_sighandler_t oldhandler;
1435 sigaction(sig, NULL, &context);
1436 oldhandler = context.sa_handler;
1437 context.sa_handler = handler;
1438 sigaction(sig, &context, NULL);
1439 return oldhandler;
1440#else
1441 return signal(sig, handler);
1442#endif
1443}