blob: c74b0623bb5e1a9b81c9bff92404b9fe01c74c6c [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 Rossum25ce5661997-08-02 03:10:38 +0000118 interp->modules = PyDict_New();
119 if (interp->modules == NULL)
120 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121
Guido van Rossumc94044c2000-03-10 23:03:54 +0000122 /* Init codec registry */
123 _PyCodecRegistry_Init();
124
125 /* Init Unicode implementation; relies on the codec registry */
126 _PyUnicode_Init();
127
Barry Warsawf242aa02000-05-25 23:09:49 +0000128 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129 if (bimod == NULL)
130 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000131 interp->builtins = PyModule_GetDict(bimod);
132 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133
134 sysmod = _PySys_Init();
135 if (sysmod == NULL)
136 Py_FatalError("Py_Initialize: can't initialize sys");
137 interp->sysdict = PyModule_GetDict(sysmod);
138 Py_INCREF(interp->sysdict);
139 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000140 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000141 PyDict_SetItemString(interp->sysdict, "modules",
142 interp->modules);
143
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000144 _PyImport_Init();
145
Barry Warsawf242aa02000-05-25 23:09:49 +0000146 /* initialize builtin exceptions */
147 init_exceptions();
148
Barry Warsaw035574d1997-08-29 22:07:17 +0000149 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000150 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000151
Guido van Rossum25ce5661997-08-02 03:10:38 +0000152 initsigs(); /* Signal handling stuff, including initintr() */
153
154 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000155 if (!Py_NoSiteFlag)
156 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000157}
158
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000159#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000160extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000161#endif
162
Guido van Rossum25ce5661997-08-02 03:10:38 +0000163/* Undo the effect of Py_Initialize().
164
165 Beware: if multiple interpreter and/or thread states exist, these
166 are not wiped out; only the current thread and interpreter state
167 are deleted. But since everything else is deleted, those other
168 interpreter and thread states should no longer be used.
169
170 (XXX We should do better, e.g. wipe out all interpreters and
171 threads.)
172
173 Locking: as above.
174
175*/
176
177void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000178Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000179{
180 PyInterpreterState *interp;
181 PyThreadState *tstate;
182
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000183 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000184 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000185
Tim Peters384fd102001-01-21 03:40:37 +0000186 /* The interpreter is still entirely intact at this point, and the
187 * exit funcs may be relying on that. In particular, if some thread
188 * or exit func is still waiting to do an import, the import machinery
189 * expects Py_IsInitialized() to return true. So don't say the
190 * interpreter is uninitialized until after the exit funcs have run.
191 * Note that Threading.py uses an exit func to do a join on all the
192 * threads created thru it, so this also protects pending imports in
193 * the threads created via Threading.
194 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000195 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000196 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000197
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000198 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 tstate = PyThreadState_Get();
200 interp = tstate->interp;
201
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000202 /* Disable signal handling */
203 PyOS_FiniInterrupts();
204
Guido van Rossumc94044c2000-03-10 23:03:54 +0000205 /* Cleanup Unicode implementation */
206 _PyUnicode_Fini();
207
208 /* Cleanup Codec registry */
209 _PyCodecRegistry_Fini();
210
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000211 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000212 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000213
Guido van Rossum1707aad1997-12-08 23:43:45 +0000214 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
215 _PyImport_Fini();
216
217 /* Debugging stuff */
218#ifdef COUNT_ALLOCS
219 dump_counts();
220#endif
221
222#ifdef Py_REF_DEBUG
223 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
224#endif
225
226#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000227 if (
228#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000229 Py_GETENV("PYTHONDUMPREFS") &&
Guido van Rossumeca47842000-04-27 23:44:15 +0000230#endif /* MS_WINDOWS */
231 _Py_AskYesNo("Print left references?")) {
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 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000241 fini_exceptions();
242
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 &&
557 flags->cf_flags & PyCF_GENERATORS) ?
558 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(
1010 str, start,
1011 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1012 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,
1029 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1030 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 Hyltonbc320242001-03-22 02:47:58 +00001086 if (v && flags) {
1087 if (co->co_flags & CO_NESTED)
Tim Peters5ba58662001-07-16 02:29:45 +00001088 flags->cf_flags |= PyCF_NESTED_SCOPES;
Tim Peters51d76f12001-07-16 03:11:48 +00001089 if (co->co_flags & CO_GENERATOR_ALLOWED)
Tim Peters5ba58662001-07-16 02:29:45 +00001090 flags->cf_flags |= PyCF_GENERATORS;
Marc-André Lemburg464fe3a2001-06-13 17:18:06 +00001091#if 0
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001092 fprintf(stderr, "run_pyc_file: nested_scopes: %d\n",
Tim Peters5ba58662001-07-16 02:29:45 +00001093 flags->cf_flags & PyCF_NESTED_SCOPES);
1094 fprintf(stderr, "run_pyc_file: generators: %d\n",
1095 flags->cf_flags & PyCF_GENERATORS);
Marc-André Lemburg464fe3a2001-06-13 17:18:06 +00001096#endif
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001097 }
Guido van Rossum82598051997-03-05 00:20:32 +00001098 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001099 return v;
1100}
1101
Guido van Rossum82598051997-03-05 00:20:32 +00001102PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001103Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001104{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001105 return Py_CompileStringFlags(str, filename, start, NULL);
1106}
1107
1108PyObject *
1109Py_CompileStringFlags(char *str, char *filename, int start,
1110 PyCompilerFlags *flags)
1111{
Guido van Rossum5b722181993-03-30 17:46:03 +00001112 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001113 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001114 n = PyParser_SimpleParseStringFlags(str, start,
1115 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1116 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001117 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001118 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001119 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001120 PyNode_Free(n);
1121 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001122}
1123
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001124struct symtable *
1125Py_SymtableString(char *str, char *filename, int start)
1126{
1127 node *n;
1128 struct symtable *st;
1129 n = PyParser_SimpleParseString(str, start);
1130 if (n == NULL)
1131 return NULL;
1132 st = PyNode_CompileSymtable(n, filename);
1133 PyNode_Free(n);
1134 return st;
1135}
1136
Guido van Rossuma110aa61994-08-29 12:50:44 +00001137/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001138
Guido van Rossuma110aa61994-08-29 12:50:44 +00001139node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001140PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001141{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001142 node *n;
1143 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001144 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1145 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001146 if (n == NULL)
1147 err_input(&err);
1148 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001149}
1150
Tim Petersfe2127d2001-07-16 05:37:24 +00001151node *
1152PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1153{
1154 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1155}
1156
Guido van Rossuma110aa61994-08-29 12:50:44 +00001157/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001158
Guido van Rossuma110aa61994-08-29 12:50:44 +00001159node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001160PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1161{
1162 node *n;
1163 perrdetail err;
1164 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1165 flags);
1166 if (n == NULL)
1167 err_input(&err);
1168 return n;
1169}
1170
1171node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001172PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001173{
Tim Petersfe2127d2001-07-16 05:37:24 +00001174 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001175}
1176
1177/* Set the error appropriate to the given input error code (see errcode.h) */
1178
1179static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001180err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001181{
Fred Drake85f36392000-07-11 17:53:00 +00001182 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001183 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001184 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001185 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001186 err->lineno, err->offset, err->text);
1187 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001188 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001189 err->text = NULL;
1190 }
1191 switch (err->error) {
1192 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001193 errtype = PyExc_IndentationError;
1194 if (err->expected == INDENT)
1195 msg = "expected an indented block";
1196 else if (err->token == INDENT)
1197 msg = "unexpected indent";
1198 else if (err->token == DEDENT)
1199 msg = "unexpected unindent";
1200 else {
1201 errtype = PyExc_SyntaxError;
1202 msg = "invalid syntax";
1203 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001204 break;
1205 case E_TOKEN:
1206 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001207 break;
1208 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001209 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001210 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001211 return;
1212 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001213 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001214 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001215 return;
1216 case E_EOF:
1217 msg = "unexpected EOF while parsing";
1218 break;
Fred Drake85f36392000-07-11 17:53:00 +00001219 case E_TABSPACE:
1220 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001221 msg = "inconsistent use of tabs and spaces in indentation";
1222 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001223 case E_OVERFLOW:
1224 msg = "expression too long";
1225 break;
Fred Drake85f36392000-07-11 17:53:00 +00001226 case E_DEDENT:
1227 errtype = PyExc_IndentationError;
1228 msg = "unindent does not match any outer indentation level";
1229 break;
1230 case E_TOODEEP:
1231 errtype = PyExc_IndentationError;
1232 msg = "too many levels of indentation";
1233 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001234 default:
1235 fprintf(stderr, "error=%d\n", err->error);
1236 msg = "unknown parsing error";
1237 break;
1238 }
Guido van Rossum82598051997-03-05 00:20:32 +00001239 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001240 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001241 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001242 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001243}
1244
1245/* Print fatal error message and abort */
1246
1247void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001248Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001249{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001250 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001251#ifdef macintosh
1252 for (;;);
1253#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001254#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001255 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001256 OutputDebugString(msg);
1257 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001258#ifdef _DEBUG
1259 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001260#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001261#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001262 abort();
1263}
1264
1265/* Clean up and exit */
1266
Guido van Rossuma110aa61994-08-29 12:50:44 +00001267#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001268#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001269int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001270#endif
1271
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001272#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001273static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001274static int nexitfuncs = 0;
1275
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001276int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001277{
1278 if (nexitfuncs >= NEXITFUNCS)
1279 return -1;
1280 exitfuncs[nexitfuncs++] = func;
1281 return 0;
1282}
1283
Guido van Rossumcc283f51997-08-05 02:22:03 +00001284static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001285call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001286{
Guido van Rossum82598051997-03-05 00:20:32 +00001287 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001288
1289 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001290 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001291 Py_INCREF(exitfunc);
1292 PySys_SetObject("exitfunc", (PyObject *)NULL);
1293 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001294 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001295 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1296 PySys_WriteStderr("Error in sys.exitfunc:\n");
1297 }
Guido van Rossum82598051997-03-05 00:20:32 +00001298 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001299 }
Guido van Rossum82598051997-03-05 00:20:32 +00001300 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001301 }
1302
Guido van Rossum0829c751998-02-28 04:31:39 +00001303 if (Py_FlushLine())
1304 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001305}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001306
Guido van Rossumcc283f51997-08-05 02:22:03 +00001307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001309{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001310 while (nexitfuncs > 0)
1311 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001312
1313 fflush(stdout);
1314 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001315}
1316
1317void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001318Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001319{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001320 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001321
Jack Jansen66a89771995-10-27 13:22:14 +00001322#ifdef macintosh
1323 PyMac_Exit(sts);
1324#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001325 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001326#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001327}
1328
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001330initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001331{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001332#ifdef HAVE_SIGNAL_H
1333#ifdef SIGPIPE
1334 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001335#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001336#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001337 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001338}
1339
Guido van Rossumaae0d321996-05-22 16:35:33 +00001340#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001341/* Ask a yes/no question */
1342
Guido van Rossum59bff391992-09-03 20:28:00 +00001343int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001344_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001345{
1346 char buf[256];
1347
1348 printf("%s [ny] ", prompt);
1349 if (fgets(buf, sizeof buf, stdin) == NULL)
1350 return 0;
1351 return buf[0] == 'y' || buf[0] == 'Y';
1352}
1353#endif
1354
Guido van Rossuma110aa61994-08-29 12:50:44 +00001355#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001356
1357/* Check for file descriptor connected to interactive device.
1358 Pretend that stdin is always interactive, other files never. */
1359
1360int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001361isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001362{
1363 return fd == fileno(stdin);
1364}
1365
1366#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001367
1368/*
1369 * The file descriptor fd is considered ``interactive'' if either
1370 * a) isatty(fd) is TRUE, or
1371 * b) the -i flag was given, and the filename associated with
1372 * the descriptor is NULL or "<stdin>" or "???".
1373 */
1374int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001375Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001376{
1377 if (isatty((int)fileno(fp)))
1378 return 1;
1379 if (!Py_InteractiveFlag)
1380 return 0;
1381 return (filename == NULL) ||
1382 (strcmp(filename, "<stdin>") == 0) ||
1383 (strcmp(filename, "???") == 0);
1384}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001385
1386
1387#if defined(USE_STACKCHECK)
1388#if defined(WIN32) && defined(_MSC_VER)
1389
1390/* Stack checking for Microsoft C */
1391
1392#include <malloc.h>
1393#include <excpt.h>
1394
Fred Drakee8de31c2000-08-31 05:38:39 +00001395/*
1396 * Return non-zero when we run out of memory on the stack; zero otherwise.
1397 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001398int
Fred Drake399739f2000-08-31 05:52:44 +00001399PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001400{
1401 __try {
1402 /* _alloca throws a stack overflow exception if there's
1403 not enough space left on the stack */
1404 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1405 return 0;
1406 } __except (EXCEPTION_EXECUTE_HANDLER) {
1407 /* just ignore all errors */
1408 }
1409 return 1;
1410}
1411
1412#endif /* WIN32 && _MSC_VER */
1413
1414/* Alternate implementations can be added here... */
1415
1416#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001417
1418
1419/* Wrappers around sigaction() or signal(). */
1420
1421PyOS_sighandler_t
1422PyOS_getsig(int sig)
1423{
1424#ifdef HAVE_SIGACTION
1425 struct sigaction context;
1426 sigaction(sig, NULL, &context);
1427 return context.sa_handler;
1428#else
1429 PyOS_sighandler_t handler;
1430 handler = signal(sig, SIG_IGN);
1431 signal(sig, handler);
1432 return handler;
1433#endif
1434}
1435
1436PyOS_sighandler_t
1437PyOS_setsig(int sig, PyOS_sighandler_t handler)
1438{
1439#ifdef HAVE_SIGACTION
1440 struct sigaction context;
1441 PyOS_sighandler_t oldhandler;
1442 sigaction(sig, NULL, &context);
1443 oldhandler = context.sa_handler;
1444 context.sa_handler = handler;
1445 sigaction(sig, &context, NULL);
1446 return oldhandler;
1447#else
1448 return signal(sig, handler);
1449#endif
1450}