blob: f579f44dc7e70b0706ce95fc1f210b469a3d0eda [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
2/* Python interpreter top-level routines, including init/exit */
3
Guido van Rossum82598051997-03-05 00:20:32 +00004#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00005
6#include "grammar.h"
7#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +00008#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000012#include "symtable.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000013#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000014#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000015
Guido van Rossum80bb9651996-12-05 23:27:02 +000016#ifdef HAVE_UNISTD_H
17#include <unistd.h>
18#endif
19
Guido van Rossuma110aa61994-08-29 12:50:44 +000020#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000022#endif
23
Guido van Rossum9b38a141996-09-11 23:12:24 +000024#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000025#undef BYTE
26#include "windows.h"
27#endif
28
Jack Jansencbf630f2000-07-11 21:59:16 +000029#ifdef macintosh
30#include "macglue.h"
31#endif
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000032extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000033
Guido van Rossum82598051997-03-05 00:20:32 +000034extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
Guido van Rossumb73cc041993-11-01 16:28:59 +000036/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000037static void initmain(void);
38static void initsite(void);
Jeremy Hylton9f324e92001-03-01 22:59:14 +000039static PyObject *run_err_node(node *, char *, PyObject *, PyObject *,
40 PyCompilerFlags *);
41static PyObject *run_node(node *, char *, PyObject *, PyObject *,
42 PyCompilerFlags *);
Jeremy Hyltonbc320242001-03-22 02:47:58 +000043static PyObject *run_pyc_file(FILE *, char *, PyObject *, PyObject *,
44 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static void err_input(perrdetail *);
46static void initsigs(void);
47static void call_sys_exitfunc(void);
48static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000049
Guido van Rossumbffd6832000-01-20 22:32:56 +000050#ifdef Py_TRACE_REFS
51int _Py_AskYesNo(char *prompt);
52#endif
53
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000054extern void _PyUnicode_Init(void);
55extern void _PyUnicode_Fini(void);
56extern void _PyCodecRegistry_Init(void);
57extern void _PyCodecRegistry_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000058
Guido van Rossum82598051997-03-05 00:20:32 +000059int Py_DebugFlag; /* Needed by parser.c */
60int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000061int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000062int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000063int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000064int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000065int Py_UnicodeFlag = 0; /* Needed by compile.c */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +000066int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000067
Guido van Rossum25ce5661997-08-02 03:10:38 +000068static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069
Thomas Wouters7e474022000-07-16 12:04:32 +000070/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000071
72int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000073Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000074{
75 return initialized;
76}
77
Guido van Rossum25ce5661997-08-02 03:10:38 +000078/* Global initializations. Can be undone by Py_Finalize(). Don't
79 call this twice without an intervening Py_Finalize() call. When
80 initializations fail, a fatal error is issued and the function does
81 not return. On return, the first thread and interpreter state have
82 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083
Guido van Rossum25ce5661997-08-02 03:10:38 +000084 Locking: you must hold the interpreter lock while calling this.
85 (If the lock has not yet been initialized, that's equivalent to
86 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000087
Guido van Rossum25ce5661997-08-02 03:10:38 +000088*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000089
90void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000091Py_Initialize(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000092{
Guido van Rossuma027efa1997-05-05 20:56:21 +000093 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000094 PyThreadState *tstate;
95 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000096 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000097
Guido van Rossumdcc0c131997-08-29 22:32:42 +000098 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +000099 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000100 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000101
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000102 if ((p = Py_GETENV("PYTHONDEBUG")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000103 Py_DebugFlag = Py_DebugFlag ? Py_DebugFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000104 if ((p = Py_GETENV("PYTHONVERBOSE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000105 Py_VerboseFlag = Py_VerboseFlag ? Py_VerboseFlag : 1;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000106 if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000107 Py_OptimizeFlag = Py_OptimizeFlag ? Py_OptimizeFlag : 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000108
Guido van Rossuma027efa1997-05-05 20:56:21 +0000109 interp = PyInterpreterState_New();
110 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113 tstate = PyThreadState_New(interp);
114 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116 (void) PyThreadState_Swap(tstate);
117
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000118 if (PyType_Ready(&PyType_Type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000119 Py_FatalError("Py_Initialize: can't initialize 'type'");
120
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000121 if (PyType_Ready(&PyList_Type) < 0)
122 Py_FatalError("Py_Initialize: can't initialize 'list'");
123
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124 interp->modules = PyDict_New();
125 if (interp->modules == NULL)
126 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127
Guido van Rossumc94044c2000-03-10 23:03:54 +0000128 /* Init codec registry */
129 _PyCodecRegistry_Init();
130
131 /* Init Unicode implementation; relies on the codec registry */
132 _PyUnicode_Init();
133
Barry Warsawf242aa02000-05-25 23:09:49 +0000134 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135 if (bimod == NULL)
136 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000137 interp->builtins = PyModule_GetDict(bimod);
138 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139
140 sysmod = _PySys_Init();
141 if (sysmod == NULL)
142 Py_FatalError("Py_Initialize: can't initialize sys");
143 interp->sysdict = PyModule_GetDict(sysmod);
144 Py_INCREF(interp->sysdict);
145 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyDict_SetItemString(interp->sysdict, "modules",
148 interp->modules);
149
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000150 _PyImport_Init();
151
Barry Warsawf242aa02000-05-25 23:09:49 +0000152 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153 _PyExc_Init();
Barry Warsaw5821bc52001-08-13 23:04:56 +0000154 _PyImport_FixupExtension("exceptions", "exceptions");
Barry Warsawf242aa02000-05-25 23:09:49 +0000155
Barry Warsaw035574d1997-08-29 22:07:17 +0000156 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000157 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000158
Guido van Rossum25ce5661997-08-02 03:10:38 +0000159 initsigs(); /* Signal handling stuff, including initintr() */
160
161 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000162 if (!Py_NoSiteFlag)
163 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164}
165
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000166#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000167extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000168#endif
169
Guido van Rossum25ce5661997-08-02 03:10:38 +0000170/* Undo the effect of Py_Initialize().
171
172 Beware: if multiple interpreter and/or thread states exist, these
173 are not wiped out; only the current thread and interpreter state
174 are deleted. But since everything else is deleted, those other
175 interpreter and thread states should no longer be used.
176
177 (XXX We should do better, e.g. wipe out all interpreters and
178 threads.)
179
180 Locking: as above.
181
182*/
183
184void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000185Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000186{
187 PyInterpreterState *interp;
188 PyThreadState *tstate;
189
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000190 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000191 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000192
Tim Peters384fd102001-01-21 03:40:37 +0000193 /* The interpreter is still entirely intact at this point, and the
194 * exit funcs may be relying on that. In particular, if some thread
195 * or exit func is still waiting to do an import, the import machinery
196 * expects Py_IsInitialized() to return true. So don't say the
197 * interpreter is uninitialized until after the exit funcs have run.
198 * Note that Threading.py uses an exit func to do a join on all the
199 * threads created thru it, so this also protects pending imports in
200 * the threads created via Threading.
201 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000202 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000203 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000204
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000205 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000206 tstate = PyThreadState_Get();
207 interp = tstate->interp;
208
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000209 /* Disable signal handling */
210 PyOS_FiniInterrupts();
211
Guido van Rossumc94044c2000-03-10 23:03:54 +0000212 /* Cleanup Unicode implementation */
213 _PyUnicode_Fini();
214
215 /* Cleanup Codec registry */
216 _PyCodecRegistry_Fini();
217
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000218 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000219 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000220
Guido van Rossum1707aad1997-12-08 23:43:45 +0000221 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
222 _PyImport_Fini();
223
224 /* Debugging stuff */
225#ifdef COUNT_ALLOCS
226 dump_counts();
227#endif
228
229#ifdef Py_REF_DEBUG
230 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
231#endif
232
233#ifdef Py_TRACE_REFS
Guido van Rossum92e2d5c2001-08-09 16:37:16 +0000234 if (Py_GETENV("PYTHONDUMPREFS")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000235 _Py_PrintReferences(stderr);
236 }
237#endif /* Py_TRACE_REFS */
238
Barry Warsaw035574d1997-08-29 22:07:17 +0000239 /* Now we decref the exception classes. After this point nothing
240 can raise an exception. That's okay, because each Fini() method
241 below has been checked to make sure no exceptions are ever
242 raised.
243 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000244 _PyExc_Fini();
Barry Warsawf242aa02000-05-25 23:09:49 +0000245
246 /* Delete current thread */
247 PyInterpreterState_Clear(interp);
248 PyThreadState_Swap(NULL);
249 PyInterpreterState_Delete(interp);
250
Guido van Rossumcc283f51997-08-05 02:22:03 +0000251 PyMethod_Fini();
252 PyFrame_Fini();
253 PyCFunction_Fini();
254 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000256 PyInt_Fini();
257 PyFloat_Fini();
258
259 /* XXX Still allocated:
260 - various static ad-hoc pointers to interned strings
261 - int and float free list blocks
262 - whatever various modules and libraries allocate
263 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264
265 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000266
267 call_ll_exitfuncs();
268
Guido van Rossumcc283f51997-08-05 02:22:03 +0000269#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000270 _Py_ResetReferences();
271#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272}
273
274/* Create and initialize a new interpreter and thread, and return the
275 new thread. This requires that Py_Initialize() has been called
276 first.
277
278 Unsuccessful initialization yields a NULL pointer. Note that *no*
279 exception information is available even in this case -- the
280 exception information is held in the thread, and there is no
281 thread.
282
283 Locking: as above.
284
285*/
286
287PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000288Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000289{
290 PyInterpreterState *interp;
291 PyThreadState *tstate, *save_tstate;
292 PyObject *bimod, *sysmod;
293
294 if (!initialized)
295 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
296
297 interp = PyInterpreterState_New();
298 if (interp == NULL)
299 return NULL;
300
301 tstate = PyThreadState_New(interp);
302 if (tstate == NULL) {
303 PyInterpreterState_Delete(interp);
304 return NULL;
305 }
306
307 save_tstate = PyThreadState_Swap(tstate);
308
309 /* XXX The following is lax in error checking */
310
311 interp->modules = PyDict_New();
312
313 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
314 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000315 interp->builtins = PyModule_GetDict(bimod);
316 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000317 }
318 sysmod = _PyImport_FindExtension("sys", "sys");
319 if (bimod != NULL && sysmod != NULL) {
320 interp->sysdict = PyModule_GetDict(sysmod);
321 Py_INCREF(interp->sysdict);
322 PySys_SetPath(Py_GetPath());
323 PyDict_SetItemString(interp->sysdict, "modules",
324 interp->modules);
325 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000326 if (!Py_NoSiteFlag)
327 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000328 }
329
330 if (!PyErr_Occurred())
331 return tstate;
332
333 /* Oops, it didn't work. Undo it all. */
334
335 PyErr_Print();
336 PyThreadState_Clear(tstate);
337 PyThreadState_Swap(save_tstate);
338 PyThreadState_Delete(tstate);
339 PyInterpreterState_Delete(interp);
340
341 return NULL;
342}
343
344/* Delete an interpreter and its last thread. This requires that the
345 given thread state is current, that the thread has no remaining
346 frames, and that it is its interpreter's only remaining thread.
347 It is a fatal error to violate these constraints.
348
349 (Py_Finalize() doesn't have these constraints -- it zaps
350 everything, regardless.)
351
352 Locking: as above.
353
354*/
355
356void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000357Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000358{
359 PyInterpreterState *interp = tstate->interp;
360
361 if (tstate != PyThreadState_Get())
362 Py_FatalError("Py_EndInterpreter: thread is not current");
363 if (tstate->frame != NULL)
364 Py_FatalError("Py_EndInterpreter: thread still has a frame");
365 if (tstate != interp->tstate_head || tstate->next != NULL)
366 Py_FatalError("Py_EndInterpreter: not the last thread");
367
368 PyImport_Cleanup();
369 PyInterpreterState_Clear(interp);
370 PyThreadState_Swap(NULL);
371 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000372}
373
374static char *progname = "python";
375
376void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000377Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000378{
379 if (pn && *pn)
380 progname = pn;
381}
382
383char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000384Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000385{
386 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000387}
388
Guido van Rossuma61691e1998-02-06 22:27:24 +0000389static char *default_home = NULL;
390
391void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000392Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000393{
394 default_home = home;
395}
396
397char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000399{
400 char *home = default_home;
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000401 if (home == NULL && !Py_IgnoreEnvironmentFlag)
402 home = Py_GETENV("PYTHONHOME");
Guido van Rossuma61691e1998-02-06 22:27:24 +0000403 return home;
404}
405
Guido van Rossum6135a871995-01-09 17:53:26 +0000406/* Create __main__ module */
407
408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000409initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000410{
Guido van Rossum82598051997-03-05 00:20:32 +0000411 PyObject *m, *d;
412 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000413 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000414 Py_FatalError("can't create __main__ module");
415 d = PyModule_GetDict(m);
416 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000417 PyObject *bimod = PyImport_ImportModule("__builtin__");
418 if (bimod == NULL ||
419 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000420 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000421 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000422 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000423}
424
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000425/* Import the site module (not into __main__ though) */
426
427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000428initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000429{
430 PyObject *m, *f;
431 m = PyImport_ImportModule("site");
432 if (m == NULL) {
433 f = PySys_GetObject("stderr");
434 if (Py_VerboseFlag) {
435 PyFile_WriteString(
436 "'import site' failed; traceback:\n", f);
437 PyErr_Print();
438 }
439 else {
440 PyFile_WriteString(
441 "'import site' failed; use -v for traceback\n", f);
442 PyErr_Clear();
443 }
444 }
445 else {
446 Py_DECREF(m);
447 }
448}
449
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000450/* Parse input from a file and execute it */
451
452int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000453PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000455 return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
456}
457
458int
459PyRun_AnyFileFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
460{
461 return PyRun_AnyFileExFlags(fp, filename, 0, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000462}
463
464int
465PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
466{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000467 return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
468}
469
470int
471PyRun_AnyFileExFlags(FILE *fp, char *filename, int closeit,
472 PyCompilerFlags *flags)
473{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474 if (filename == NULL)
475 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000476 if (Py_FdIsInteractive(fp, filename)) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000477 int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000478 if (closeit)
479 fclose(fp);
480 return err;
481 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000482 else
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000483 return PyRun_SimpleFileExFlags(fp, filename, closeit, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000484}
485
486int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000487PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000488{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000489 return PyRun_InteractiveLoopFlags(fp, filename, NULL);
490}
491
492int
493PyRun_InteractiveLoopFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
494{
Guido van Rossum82598051997-03-05 00:20:32 +0000495 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496 int ret;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000497 PyCompilerFlags local_flags;
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000498
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000499 if (flags == NULL) {
500 flags = &local_flags;
Tim Peters5ba58662001-07-16 02:29:45 +0000501 local_flags.cf_flags = 0;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000502 }
Guido van Rossum82598051997-03-05 00:20:32 +0000503 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000505 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
506 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507 }
Guido van Rossum82598051997-03-05 00:20:32 +0000508 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000510 PySys_SetObject("ps2", v = PyString_FromString("... "));
511 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512 }
513 for (;;) {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000514 ret = PyRun_InteractiveOneFlags(fp, filename, flags);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000515#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000516 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000517#endif
518 if (ret == E_EOF)
519 return 0;
520 /*
521 if (ret == E_NOMEM)
522 return -1;
523 */
524 }
525}
526
527int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000528PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000529{
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000530 return PyRun_InteractiveOneFlags(fp, filename, NULL);
531}
532
533int
534PyRun_InteractiveOneFlags(FILE *fp, char *filename, PyCompilerFlags *flags)
535{
Guido van Rossum82598051997-03-05 00:20:32 +0000536 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000537 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000538 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000539 char *ps1 = "", *ps2 = "";
Tim Petersfe2127d2001-07-16 05:37:24 +0000540
Guido van Rossum82598051997-03-05 00:20:32 +0000541 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000542 if (v != NULL) {
543 v = PyObject_Str(v);
544 if (v == NULL)
545 PyErr_Clear();
546 else if (PyString_Check(v))
547 ps1 = PyString_AsString(v);
548 }
Guido van Rossum82598051997-03-05 00:20:32 +0000549 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000550 if (w != NULL) {
551 w = PyObject_Str(w);
552 if (w == NULL)
553 PyErr_Clear();
554 else if (PyString_Check(w))
555 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000556 }
Tim Petersfe2127d2001-07-16 05:37:24 +0000557 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar,
558 Py_single_input, ps1, ps2, &err,
559 (flags &&
Jeremy Hyltonb857ba22001-08-10 21:41:33 +0000560 flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +0000561 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossum82598051997-03-05 00:20:32 +0000562 Py_XDECREF(v);
563 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000564 if (n == NULL) {
565 if (err.error == E_EOF) {
566 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000567 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000568 return E_EOF;
569 }
570 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000571 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000572 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000573 }
Guido van Rossum82598051997-03-05 00:20:32 +0000574 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000575 if (m == NULL)
576 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000577 d = PyModule_GetDict(m);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000578 v = run_node(n, filename, d, d, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000579 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000580 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000581 return -1;
582 }
Guido van Rossum82598051997-03-05 00:20:32 +0000583 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000584 if (Py_FlushLine())
585 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 return 0;
587}
588
589int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000590PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000592 return PyRun_SimpleFileEx(fp, filename, 0);
593}
594
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000595/* Check whether a file maybe a pyc file: Look at the extension,
596 the file type, and, if we may close it, at the first few bytes. */
597
598static int
599maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
600{
601 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
602 return 1;
603
604#ifdef macintosh
605 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
606 if (PyMac_getfiletype(filename) == 'PYC '
607 || PyMac_getfiletype(filename) == 'APPL')
608 return 1;
609#endif /* macintosh */
610
611 /* Only look into the file if we are allowed to close it, since
612 it then should also be seekable. */
613 if (closeit) {
614 /* Read only two bytes of the magic. If the file was opened in
615 text mode, the bytes 3 and 4 of the magic (\r\n) might not
616 be read as they are on disk. */
617 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
618 unsigned char buf[2];
Tim Peters3e876562001-02-11 04:35:39 +0000619 /* Mess: In case of -x, the stream is NOT at its start now,
620 and ungetc() was used to push back the first newline,
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000621 which makes the current stream position formally undefined,
622 and a x-platform nightmare.
623 Unfortunately, we have no direct way to know whether -x
624 was specified. So we use a terrible hack: if the current
625 stream position is not 0, we assume -x was specified, and
626 give up. Bug 132850 on SourceForge spells out the
627 hopelessness of trying anything else (fseek and ftell
628 don't work predictably x-platform for text-mode files).
Tim Peters3e876562001-02-11 04:35:39 +0000629 */
Tim Peters3e876562001-02-11 04:35:39 +0000630 int ispyc = 0;
Tim Peters6f5a4ef2001-02-17 22:02:34 +0000631 if (ftell(fp) == 0) {
632 if (fread(buf, 1, 2, fp) == 2 &&
633 ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
634 ispyc = 1;
635 rewind(fp);
636 }
Tim Peters3e876562001-02-11 04:35:39 +0000637 return ispyc;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000638 }
639 return 0;
640}
641
Guido van Rossum0df002c2000-08-27 19:21:52 +0000642int
643PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
644{
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000645 return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
646}
647
648int
649PyRun_SimpleFileExFlags(FILE *fp, char *filename, int closeit,
650 PyCompilerFlags *flags)
651{
Guido van Rossum82598051997-03-05 00:20:32 +0000652 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000653 char *ext;
654
Guido van Rossum82598051997-03-05 00:20:32 +0000655 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656 if (m == NULL)
657 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000658 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000659 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000660 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000661 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000662 if (closeit)
663 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000664 if( (fp = fopen(filename, "rb")) == NULL ) {
665 fprintf(stderr, "python: Can't reopen .pyc file\n");
666 return -1;
667 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000668 /* Turn on optimization if a .pyo file is given */
669 if (strcmp(ext, ".pyo") == 0)
670 Py_OptimizeFlag = 1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000671 v = run_pyc_file(fp, filename, d, d, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000672 } else {
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000673 v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
674 closeit, flags);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000675 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000677 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678 return -1;
679 }
Guido van Rossum82598051997-03-05 00:20:32 +0000680 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000681 if (Py_FlushLine())
682 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000683 return 0;
684}
685
686int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000687PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000688{
Guido van Rossum82598051997-03-05 00:20:32 +0000689 PyObject *m, *d, *v;
690 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000691 if (m == NULL)
692 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000693 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000694 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000695 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000696 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000697 return -1;
698 }
Guido van Rossum82598051997-03-05 00:20:32 +0000699 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000700 if (Py_FlushLine())
701 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702 return 0;
703}
704
Barry Warsaw035574d1997-08-29 22:07:17 +0000705static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000706parse_syntax_error(PyObject *err, PyObject **message, char **filename,
707 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000708{
709 long hold;
710 PyObject *v;
711
712 /* old style errors */
713 if (PyTuple_Check(err))
714 return PyArg_Parse(err, "(O(ziiz))", message, filename,
715 lineno, offset, text);
716
717 /* new style errors. `err' is an instance */
718
719 if (! (v = PyObject_GetAttrString(err, "msg")))
720 goto finally;
721 *message = v;
722
723 if (!(v = PyObject_GetAttrString(err, "filename")))
724 goto finally;
725 if (v == Py_None)
726 *filename = NULL;
727 else if (! (*filename = PyString_AsString(v)))
728 goto finally;
729
730 Py_DECREF(v);
731 if (!(v = PyObject_GetAttrString(err, "lineno")))
732 goto finally;
733 hold = PyInt_AsLong(v);
734 Py_DECREF(v);
735 v = NULL;
736 if (hold < 0 && PyErr_Occurred())
737 goto finally;
738 *lineno = (int)hold;
739
740 if (!(v = PyObject_GetAttrString(err, "offset")))
741 goto finally;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000742 if (v == Py_None) {
743 *offset = -1;
744 Py_DECREF(v);
745 v = NULL;
746 } else {
747 hold = PyInt_AsLong(v);
748 Py_DECREF(v);
749 v = NULL;
750 if (hold < 0 && PyErr_Occurred())
751 goto finally;
752 *offset = (int)hold;
753 }
Barry Warsaw035574d1997-08-29 22:07:17 +0000754
755 if (!(v = PyObject_GetAttrString(err, "text")))
756 goto finally;
757 if (v == Py_None)
758 *text = NULL;
759 else if (! (*text = PyString_AsString(v)))
760 goto finally;
761 Py_DECREF(v);
762 return 1;
763
764finally:
765 Py_XDECREF(v);
766 return 0;
767}
768
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000769void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000771{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000772 PyErr_PrintEx(1);
773}
774
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000775static void
776print_error_text(PyObject *f, int offset, char *text)
777{
778 char *nl;
779 if (offset >= 0) {
780 if (offset > 0 && offset == (int)strlen(text))
781 offset--;
782 for (;;) {
783 nl = strchr(text, '\n');
784 if (nl == NULL || nl-text >= offset)
785 break;
786 offset -= (nl+1-text);
787 text = nl+1;
788 }
789 while (*text == ' ' || *text == '\t') {
790 text++;
791 offset--;
792 }
793 }
794 PyFile_WriteString(" ", f);
795 PyFile_WriteString(text, f);
796 if (*text == '\0' || text[strlen(text)-1] != '\n')
797 PyFile_WriteString("\n", f);
798 if (offset == -1)
799 return;
800 PyFile_WriteString(" ", f);
801 offset--;
802 while (offset > 0) {
803 PyFile_WriteString(" ", f);
804 offset--;
805 }
806 PyFile_WriteString("^\n", f);
807}
808
Guido van Rossum66e8e862001-03-23 17:54:43 +0000809static void
810handle_system_exit(void)
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000811{
Guido van Rossum66e8e862001-03-23 17:54:43 +0000812 PyObject *exception, *value, *tb;
813 PyErr_Fetch(&exception, &value, &tb);
Ka-Ping Yee26fabb02001-03-23 15:36:41 +0000814 if (Py_FlushLine())
815 PyErr_Clear();
816 fflush(stdout);
817 if (value == NULL || value == Py_None)
818 Py_Exit(0);
819 if (PyInstance_Check(value)) {
820 /* The error code should be in the `code' attribute. */
821 PyObject *code = PyObject_GetAttrString(value, "code");
822 if (code) {
823 Py_DECREF(value);
824 value = code;
825 if (value == Py_None)
826 Py_Exit(0);
827 }
828 /* If we failed to dig out the 'code' attribute,
829 just let the else clause below print the error. */
830 }
831 if (PyInt_Check(value))
832 Py_Exit((int)PyInt_AsLong(value));
833 else {
834 PyObject_Print(value, stderr, Py_PRINT_RAW);
835 PySys_WriteStderr("\n");
836 Py_Exit(1);
837 }
838}
839
840void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000841PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000842{
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000843 PyObject *exception, *v, *tb, *hook;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000844
845 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
846 handle_system_exit();
847 }
Guido van Rossum82598051997-03-05 00:20:32 +0000848 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000849 PyErr_NormalizeException(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000851 return;
Guido van Rossuma61691e1998-02-06 22:27:24 +0000852 if (set_sys_last_vars) {
853 PySys_SetObject("last_type", exception);
854 PySys_SetObject("last_value", v);
855 PySys_SetObject("last_traceback", tb);
856 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000857 hook = PySys_GetObject("excepthook");
858 if (hook) {
859 PyObject *args = Py_BuildValue("(OOO)",
860 exception, v ? v : Py_None, tb ? tb : Py_None);
861 PyObject *result = PyEval_CallObject(hook, args);
862 if (result == NULL) {
863 PyObject *exception2, *v2, *tb2;
Guido van Rossum66e8e862001-03-23 17:54:43 +0000864 if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
865 handle_system_exit();
866 }
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000867 PyErr_Fetch(&exception2, &v2, &tb2);
868 PyErr_NormalizeException(&exception2, &v2, &tb2);
869 if (Py_FlushLine())
870 PyErr_Clear();
871 fflush(stdout);
872 PySys_WriteStderr("Error in sys.excepthook:\n");
873 PyErr_Display(exception2, v2, tb2);
874 PySys_WriteStderr("\nOriginal exception was:\n");
875 PyErr_Display(exception, v, tb);
876 }
877 Py_XDECREF(result);
878 Py_XDECREF(args);
879 } else {
880 PySys_WriteStderr("sys.excepthook is missing\n");
881 PyErr_Display(exception, v, tb);
882 }
883 Py_XDECREF(exception);
884 Py_XDECREF(v);
885 Py_XDECREF(tb);
886}
887
888void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb)
889{
890 int err = 0;
891 PyObject *v = value;
892 PyObject *f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000893 if (f == NULL)
894 fprintf(stderr, "lost sys.stderr\n");
895 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000896 if (Py_FlushLine())
897 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000898 fflush(stdout);
Ka-Ping Yeeb5c51322001-03-23 02:46:52 +0000899 if (tb && tb != Py_None)
900 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000901 if (err == 0 &&
902 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
903 {
Guido van Rossum82598051997-03-05 00:20:32 +0000904 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000905 char *filename, *text;
906 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000907 if (!parse_syntax_error(v, &message, &filename,
908 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000909 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000910 else {
911 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000912 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000913 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000914 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000915 else
Guido van Rossum82598051997-03-05 00:20:32 +0000916 PyFile_WriteString(filename, f);
917 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000918 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000919 PyFile_WriteString(buf, f);
920 PyFile_WriteString("\n", f);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000921 if (text != NULL)
922 print_error_text(f, offset, text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000923 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000924 /* Can't be bothered to check all those
925 PyFile_WriteString() calls */
926 if (PyErr_Occurred())
927 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000928 }
929 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000930 if (err) {
931 /* Don't do anything else */
932 }
933 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000934 PyClassObject* exc = (PyClassObject*)exception;
935 PyObject* className = exc->cl_name;
936 PyObject* moduleName =
937 PyDict_GetItemString(exc->cl_dict, "__module__");
938
939 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000940 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000941 else {
942 char* modstr = PyString_AsString(moduleName);
943 if (modstr && strcmp(modstr, "exceptions"))
944 {
945 err = PyFile_WriteString(modstr, f);
946 err += PyFile_WriteString(".", f);
947 }
948 }
949 if (err == 0) {
950 if (className == NULL)
951 err = PyFile_WriteString("<unknown>", f);
952 else
953 err = PyFile_WriteObject(className, f,
954 Py_PRINT_RAW);
955 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000956 }
957 else
958 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
959 if (err == 0) {
960 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000961 PyObject *s = PyObject_Str(v);
962 /* only print colon if the str() of the
963 object is not the empty string
964 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000965 if (s == NULL)
966 err = -1;
967 else if (!PyString_Check(s) ||
968 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000969 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000970 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000971 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
972 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000973 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000974 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000975 if (err == 0)
976 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000977 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000978 /* If an error happened here, don't show it.
979 XXX This is wrong, but too many callers rely on this behavior. */
980 if (err != 0)
981 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000982}
983
Guido van Rossum82598051997-03-05 00:20:32 +0000984PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000985PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000986{
Guido van Rossum82598051997-03-05 00:20:32 +0000987 return run_err_node(PyParser_SimpleParseString(str, start),
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000988 "<string>", globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000989}
990
Guido van Rossum82598051997-03-05 00:20:32 +0000991PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000992PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
993 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000994{
Tim Peterse8682112000-08-27 20:18:17 +0000995 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000996}
997
998PyObject *
999PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001000 PyObject *locals, int closeit)
Guido van Rossum0df002c2000-08-27 19:21:52 +00001001{
1002 node *n = PyParser_SimpleParseFile(fp, filename, start);
1003 if (closeit)
1004 fclose(fp);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001005 return run_err_node(n, filename, globals, locals, NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001006}
1007
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001008PyObject *
1009PyRun_StringFlags(char *str, int start, PyObject *globals, PyObject *locals,
1010 PyCompilerFlags *flags)
1011{
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001012 return run_err_node(PyParser_SimpleParseStringFlags(
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001013 str, start,
1014 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Guido van Rossuma1b3a472001-07-16 16:51:33 +00001015 PyPARSE_YIELD_IS_KEYWORD : 0),
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001016 "<string>", globals, locals, flags);
1017}
1018
1019PyObject *
1020PyRun_FileFlags(FILE *fp, char *filename, int start, PyObject *globals,
1021 PyObject *locals, PyCompilerFlags *flags)
1022{
1023 return PyRun_FileExFlags(fp, filename, start, globals, locals, 0,
1024 flags);
1025}
1026
1027PyObject *
1028PyRun_FileExFlags(FILE *fp, char *filename, int start, PyObject *globals,
1029 PyObject *locals, int closeit, PyCompilerFlags *flags)
1030{
Tim Petersfe2127d2001-07-16 05:37:24 +00001031 node *n = PyParser_SimpleParseFileFlags(fp, filename, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001032 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001033 PyPARSE_YIELD_IS_KEYWORD : 0);
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001034 if (closeit)
1035 fclose(fp);
1036 return run_err_node(n, filename, globals, locals, flags);
1037}
1038
Guido van Rossum82598051997-03-05 00:20:32 +00001039static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001040run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1041 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001042{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001043 if (n == NULL)
1044 return NULL;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001045 return run_node(n, filename, globals, locals, flags);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001046}
1047
Guido van Rossum82598051997-03-05 00:20:32 +00001048static PyObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001049run_node(node *n, char *filename, PyObject *globals, PyObject *locals,
1050 PyCompilerFlags *flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001051{
Guido van Rossum82598051997-03-05 00:20:32 +00001052 PyCodeObject *co;
1053 PyObject *v;
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001054 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001055 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001056 if (co == NULL)
1057 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001058 v = PyEval_EvalCode(co, globals, locals);
1059 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001060 return v;
1061}
1062
Guido van Rossum82598051997-03-05 00:20:32 +00001063static PyObject *
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001064run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals,
1065 PyCompilerFlags *flags)
Guido van Rossumfdef2711994-09-14 13:31:04 +00001066{
Guido van Rossum82598051997-03-05 00:20:32 +00001067 PyCodeObject *co;
1068 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +00001069 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +00001070 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001071
Guido van Rossum82598051997-03-05 00:20:32 +00001072 magic = PyMarshal_ReadLongFromFile(fp);
1073 if (magic != PyImport_GetMagicNumber()) {
1074 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001075 "Bad magic number in .pyc file");
1076 return NULL;
1077 }
Guido van Rossum82598051997-03-05 00:20:32 +00001078 (void) PyMarshal_ReadLongFromFile(fp);
Tim Petersd9b9ac82001-01-28 00:27:39 +00001079 v = PyMarshal_ReadLastObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001080 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +00001081 if (v == NULL || !PyCode_Check(v)) {
1082 Py_XDECREF(v);
1083 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +00001084 "Bad code object in .pyc file");
1085 return NULL;
1086 }
Guido van Rossum82598051997-03-05 00:20:32 +00001087 co = (PyCodeObject *)v;
1088 v = PyEval_EvalCode(co, globals, locals);
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001089 if (v && flags)
1090 flags->cf_flags |= (co->co_flags & PyCF_MASK);
Guido van Rossum82598051997-03-05 00:20:32 +00001091 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001092 return v;
1093}
1094
Guido van Rossum82598051997-03-05 00:20:32 +00001095PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001096Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001097{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001098 return Py_CompileStringFlags(str, filename, start, NULL);
1099}
1100
1101PyObject *
1102Py_CompileStringFlags(char *str, char *filename, int start,
1103 PyCompilerFlags *flags)
1104{
Guido van Rossum5b722181993-03-30 17:46:03 +00001105 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001106 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001107 n = PyParser_SimpleParseStringFlags(str, start,
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00001108 (flags && flags->cf_flags & CO_GENERATOR_ALLOWED) ?
Tim Petersfe2127d2001-07-16 05:37:24 +00001109 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001110 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001111 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001112 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001113 PyNode_Free(n);
1114 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001115}
1116
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001117struct symtable *
1118Py_SymtableString(char *str, char *filename, int start)
1119{
1120 node *n;
1121 struct symtable *st;
1122 n = PyParser_SimpleParseString(str, start);
1123 if (n == NULL)
1124 return NULL;
1125 st = PyNode_CompileSymtable(n, filename);
1126 PyNode_Free(n);
1127 return st;
1128}
1129
Guido van Rossuma110aa61994-08-29 12:50:44 +00001130/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001131
Guido van Rossuma110aa61994-08-29 12:50:44 +00001132node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001133PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001134{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001135 node *n;
1136 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001137 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1138 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001139 if (n == NULL)
1140 err_input(&err);
1141 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001142}
1143
Tim Petersfe2127d2001-07-16 05:37:24 +00001144node *
1145PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1146{
1147 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1148}
1149
Guido van Rossuma110aa61994-08-29 12:50:44 +00001150/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001151
Guido van Rossuma110aa61994-08-29 12:50:44 +00001152node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001153PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1154{
1155 node *n;
1156 perrdetail err;
1157 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1158 flags);
1159 if (n == NULL)
1160 err_input(&err);
1161 return n;
1162}
1163
1164node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001165PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001166{
Tim Petersfe2127d2001-07-16 05:37:24 +00001167 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001168}
1169
1170/* Set the error appropriate to the given input error code (see errcode.h) */
1171
1172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001173err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001174{
Fred Drake85f36392000-07-11 17:53:00 +00001175 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001176 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001177 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001178 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001179 err->lineno, err->offset, err->text);
1180 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001181 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001182 err->text = NULL;
1183 }
1184 switch (err->error) {
1185 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001186 errtype = PyExc_IndentationError;
1187 if (err->expected == INDENT)
1188 msg = "expected an indented block";
1189 else if (err->token == INDENT)
1190 msg = "unexpected indent";
1191 else if (err->token == DEDENT)
1192 msg = "unexpected unindent";
1193 else {
1194 errtype = PyExc_SyntaxError;
1195 msg = "invalid syntax";
1196 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001197 break;
1198 case E_TOKEN:
1199 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001200 break;
1201 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001202 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001203 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001204 return;
1205 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001206 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001207 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001208 return;
1209 case E_EOF:
1210 msg = "unexpected EOF while parsing";
1211 break;
Fred Drake85f36392000-07-11 17:53:00 +00001212 case E_TABSPACE:
1213 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001214 msg = "inconsistent use of tabs and spaces in indentation";
1215 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001216 case E_OVERFLOW:
1217 msg = "expression too long";
1218 break;
Fred Drake85f36392000-07-11 17:53:00 +00001219 case E_DEDENT:
1220 errtype = PyExc_IndentationError;
1221 msg = "unindent does not match any outer indentation level";
1222 break;
1223 case E_TOODEEP:
1224 errtype = PyExc_IndentationError;
1225 msg = "too many levels of indentation";
1226 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001227 default:
1228 fprintf(stderr, "error=%d\n", err->error);
1229 msg = "unknown parsing error";
1230 break;
1231 }
Guido van Rossum82598051997-03-05 00:20:32 +00001232 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001233 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001234 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001235 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001236}
1237
1238/* Print fatal error message and abort */
1239
1240void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001241Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001242{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001243 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001244#ifdef macintosh
1245 for (;;);
1246#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001247#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001248 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001249 OutputDebugString(msg);
1250 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001251#ifdef _DEBUG
1252 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001253#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001254#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001255 abort();
1256}
1257
1258/* Clean up and exit */
1259
Guido van Rossuma110aa61994-08-29 12:50:44 +00001260#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001261#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001262int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001263#endif
1264
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001265#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001266static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001267static int nexitfuncs = 0;
1268
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001269int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001270{
1271 if (nexitfuncs >= NEXITFUNCS)
1272 return -1;
1273 exitfuncs[nexitfuncs++] = func;
1274 return 0;
1275}
1276
Guido van Rossumcc283f51997-08-05 02:22:03 +00001277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001278call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001279{
Guido van Rossum82598051997-03-05 00:20:32 +00001280 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001281
1282 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001283 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001284 Py_INCREF(exitfunc);
1285 PySys_SetObject("exitfunc", (PyObject *)NULL);
1286 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001287 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001288 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1289 PySys_WriteStderr("Error in sys.exitfunc:\n");
1290 }
Guido van Rossum82598051997-03-05 00:20:32 +00001291 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001292 }
Guido van Rossum82598051997-03-05 00:20:32 +00001293 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001294 }
1295
Guido van Rossum0829c751998-02-28 04:31:39 +00001296 if (Py_FlushLine())
1297 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001298}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001299
Guido van Rossumcc283f51997-08-05 02:22:03 +00001300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001301call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001302{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001303 while (nexitfuncs > 0)
1304 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001305
1306 fflush(stdout);
1307 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001308}
1309
1310void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001311Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001312{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001313 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001314
Jack Jansen66a89771995-10-27 13:22:14 +00001315#ifdef macintosh
1316 PyMac_Exit(sts);
1317#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001318 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001319#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001320}
1321
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001322static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001323initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001324{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001325#ifdef HAVE_SIGNAL_H
1326#ifdef SIGPIPE
1327 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001328#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}