blob: e6162305f477decc5a571b882b70822ff88cc2f2 [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
Tim Peters6d6c1a32001-08-02 04:15:00 +0000118 if (PyType_InitDict(&PyType_Type) < 0)
119 Py_FatalError("Py_Initialize: can't initialize 'type'");
120
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121 interp->modules = PyDict_New();
122 if (interp->modules == NULL)
123 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124
Guido van Rossumc94044c2000-03-10 23:03:54 +0000125 /* Init codec registry */
126 _PyCodecRegistry_Init();
127
128 /* Init Unicode implementation; relies on the codec registry */
129 _PyUnicode_Init();
130
Barry Warsawf242aa02000-05-25 23:09:49 +0000131 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 if (bimod == NULL)
133 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000134 interp->builtins = PyModule_GetDict(bimod);
135 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136
137 sysmod = _PySys_Init();
138 if (sysmod == NULL)
139 Py_FatalError("Py_Initialize: can't initialize sys");
140 interp->sysdict = PyModule_GetDict(sysmod);
141 Py_INCREF(interp->sysdict);
142 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000144 PyDict_SetItemString(interp->sysdict, "modules",
145 interp->modules);
146
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000147 _PyImport_Init();
148
Barry Warsawf242aa02000-05-25 23:09:49 +0000149 /* initialize builtin exceptions */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000150 _PyExc_Init();
Barry Warsawf242aa02000-05-25 23:09:49 +0000151
Barry Warsaw035574d1997-08-29 22:07:17 +0000152 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000153 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000154
Guido van Rossum25ce5661997-08-02 03:10:38 +0000155 initsigs(); /* Signal handling stuff, including initintr() */
156
157 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000158 if (!Py_NoSiteFlag)
159 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160}
161
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000162#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000163extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000164#endif
165
Guido van Rossum25ce5661997-08-02 03:10:38 +0000166/* Undo the effect of Py_Initialize().
167
168 Beware: if multiple interpreter and/or thread states exist, these
169 are not wiped out; only the current thread and interpreter state
170 are deleted. But since everything else is deleted, those other
171 interpreter and thread states should no longer be used.
172
173 (XXX We should do better, e.g. wipe out all interpreters and
174 threads.)
175
176 Locking: as above.
177
178*/
179
180void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000181Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000182{
183 PyInterpreterState *interp;
184 PyThreadState *tstate;
185
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000186 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000187 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188
Tim Peters384fd102001-01-21 03:40:37 +0000189 /* The interpreter is still entirely intact at this point, and the
190 * exit funcs may be relying on that. In particular, if some thread
191 * or exit func is still waiting to do an import, the import machinery
192 * expects Py_IsInitialized() to return true. So don't say the
193 * interpreter is uninitialized until after the exit funcs have run.
194 * Note that Threading.py uses an exit func to do a join on all the
195 * threads created thru it, so this also protects pending imports in
196 * the threads created via Threading.
197 */
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000198 call_sys_exitfunc();
Tim Peters384fd102001-01-21 03:40:37 +0000199 initialized = 0;
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000200
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000201 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 tstate = PyThreadState_Get();
203 interp = tstate->interp;
204
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000205 /* Disable signal handling */
206 PyOS_FiniInterrupts();
207
Guido van Rossumc94044c2000-03-10 23:03:54 +0000208 /* Cleanup Unicode implementation */
209 _PyUnicode_Fini();
210
211 /* Cleanup Codec registry */
212 _PyCodecRegistry_Fini();
213
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000214 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000215 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000216
Guido van Rossum1707aad1997-12-08 23:43:45 +0000217 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
218 _PyImport_Fini();
219
220 /* Debugging stuff */
221#ifdef COUNT_ALLOCS
222 dump_counts();
223#endif
224
225#ifdef Py_REF_DEBUG
226 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
227#endif
228
229#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000230 if (
231#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
Neil Schemenauer7d4bb9f2001-07-23 16:30:27 +0000232 Py_GETENV("PYTHONDUMPREFS") &&
Guido van Rossumeca47842000-04-27 23:44:15 +0000233#endif /* MS_WINDOWS */
234 _Py_AskYesNo("Print left references?")) {
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 &&
560 flags->cf_flags & PyCF_GENERATORS) ?
561 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(
1013 str, start,
1014 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1015 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,
1032 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1033 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 Hyltonbc320242001-03-22 02:47:58 +00001089 if (v && flags) {
1090 if (co->co_flags & CO_NESTED)
Tim Peters5ba58662001-07-16 02:29:45 +00001091 flags->cf_flags |= PyCF_NESTED_SCOPES;
Tim Peters51d76f12001-07-16 03:11:48 +00001092 if (co->co_flags & CO_GENERATOR_ALLOWED)
Tim Peters5ba58662001-07-16 02:29:45 +00001093 flags->cf_flags |= PyCF_GENERATORS;
Marc-André Lemburg464fe3a2001-06-13 17:18:06 +00001094#if 0
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001095 fprintf(stderr, "run_pyc_file: nested_scopes: %d\n",
Tim Peters5ba58662001-07-16 02:29:45 +00001096 flags->cf_flags & PyCF_NESTED_SCOPES);
1097 fprintf(stderr, "run_pyc_file: generators: %d\n",
1098 flags->cf_flags & PyCF_GENERATORS);
Marc-André Lemburg464fe3a2001-06-13 17:18:06 +00001099#endif
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001100 }
Guido van Rossum82598051997-03-05 00:20:32 +00001101 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +00001102 return v;
1103}
1104
Guido van Rossum82598051997-03-05 00:20:32 +00001105PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001106Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +00001107{
Jeremy Hyltonbc320242001-03-22 02:47:58 +00001108 return Py_CompileStringFlags(str, filename, start, NULL);
1109}
1110
1111PyObject *
1112Py_CompileStringFlags(char *str, char *filename, int start,
1113 PyCompilerFlags *flags)
1114{
Guido van Rossum5b722181993-03-30 17:46:03 +00001115 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +00001116 PyCodeObject *co;
Tim Petersfe2127d2001-07-16 05:37:24 +00001117 n = PyParser_SimpleParseStringFlags(str, start,
1118 (flags && flags->cf_flags & PyCF_GENERATORS) ?
1119 PyPARSE_YIELD_IS_KEYWORD : 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001120 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001121 return NULL;
Jeremy Hylton673a4fd2001-03-26 19:53:38 +00001122 co = PyNode_CompileFlags(n, filename, flags);
Guido van Rossum82598051997-03-05 00:20:32 +00001123 PyNode_Free(n);
1124 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +00001125}
1126
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001127struct symtable *
1128Py_SymtableString(char *str, char *filename, int start)
1129{
1130 node *n;
1131 struct symtable *st;
1132 n = PyParser_SimpleParseString(str, start);
1133 if (n == NULL)
1134 return NULL;
1135 st = PyNode_CompileSymtable(n, filename);
1136 PyNode_Free(n);
1137 return st;
1138}
1139
Guido van Rossuma110aa61994-08-29 12:50:44 +00001140/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001141
Guido van Rossuma110aa61994-08-29 12:50:44 +00001142node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001143PyParser_SimpleParseFileFlags(FILE *fp, char *filename, int start, int flags)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001144{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001145 node *n;
1146 perrdetail err;
Tim Petersfe2127d2001-07-16 05:37:24 +00001147 n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, start,
1148 (char *)0, (char *)0, &err, flags);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001149 if (n == NULL)
1150 err_input(&err);
1151 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001152}
1153
Tim Petersfe2127d2001-07-16 05:37:24 +00001154node *
1155PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
1156{
1157 return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
1158}
1159
Guido van Rossuma110aa61994-08-29 12:50:44 +00001160/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001161
Guido van Rossuma110aa61994-08-29 12:50:44 +00001162node *
Tim Petersfe2127d2001-07-16 05:37:24 +00001163PyParser_SimpleParseStringFlags(char *str, int start, int flags)
1164{
1165 node *n;
1166 perrdetail err;
1167 n = PyParser_ParseStringFlags(str, &_PyParser_Grammar, start, &err,
1168 flags);
1169 if (n == NULL)
1170 err_input(&err);
1171 return n;
1172}
1173
1174node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001175PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001176{
Tim Petersfe2127d2001-07-16 05:37:24 +00001177 return PyParser_SimpleParseStringFlags(str, start, 0);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001178}
1179
1180/* Set the error appropriate to the given input error code (see errcode.h) */
1181
1182static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001183err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +00001184{
Fred Drake85f36392000-07-11 17:53:00 +00001185 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001186 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +00001187 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +00001188 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001189 err->lineno, err->offset, err->text);
1190 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +00001191 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001192 err->text = NULL;
1193 }
1194 switch (err->error) {
1195 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001196 errtype = PyExc_IndentationError;
1197 if (err->expected == INDENT)
1198 msg = "expected an indented block";
1199 else if (err->token == INDENT)
1200 msg = "unexpected indent";
1201 else if (err->token == DEDENT)
1202 msg = "unexpected unindent";
1203 else {
1204 errtype = PyExc_SyntaxError;
1205 msg = "invalid syntax";
1206 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001207 break;
1208 case E_TOKEN:
1209 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001210 break;
1211 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001212 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001213 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001214 return;
1215 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001216 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001217 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001218 return;
1219 case E_EOF:
1220 msg = "unexpected EOF while parsing";
1221 break;
Fred Drake85f36392000-07-11 17:53:00 +00001222 case E_TABSPACE:
1223 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001224 msg = "inconsistent use of tabs and spaces in indentation";
1225 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001226 case E_OVERFLOW:
1227 msg = "expression too long";
1228 break;
Fred Drake85f36392000-07-11 17:53:00 +00001229 case E_DEDENT:
1230 errtype = PyExc_IndentationError;
1231 msg = "unindent does not match any outer indentation level";
1232 break;
1233 case E_TOODEEP:
1234 errtype = PyExc_IndentationError;
1235 msg = "too many levels of indentation";
1236 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001237 default:
1238 fprintf(stderr, "error=%d\n", err->error);
1239 msg = "unknown parsing error";
1240 break;
1241 }
Guido van Rossum82598051997-03-05 00:20:32 +00001242 w = Py_BuildValue("(sO)", msg, v);
Guido van Rossum41318302001-03-23 04:01:07 +00001243 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001244 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001245 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001246}
1247
1248/* Print fatal error message and abort */
1249
1250void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001251Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001252{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001253 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001254#ifdef macintosh
1255 for (;;);
1256#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001257#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001258 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001259 OutputDebugString(msg);
1260 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001261#ifdef _DEBUG
1262 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001263#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001264#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001265 abort();
1266}
1267
1268/* Clean up and exit */
1269
Guido van Rossuma110aa61994-08-29 12:50:44 +00001270#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001271#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001272int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001273#endif
1274
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001275#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001276static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001277static int nexitfuncs = 0;
1278
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001279int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001280{
1281 if (nexitfuncs >= NEXITFUNCS)
1282 return -1;
1283 exitfuncs[nexitfuncs++] = func;
1284 return 0;
1285}
1286
Guido van Rossumcc283f51997-08-05 02:22:03 +00001287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001288call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001289{
Guido van Rossum82598051997-03-05 00:20:32 +00001290 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001291
1292 if (exitfunc) {
Fred Drake6a12d8d2001-03-23 17:34:02 +00001293 PyObject *res;
Guido van Rossum82598051997-03-05 00:20:32 +00001294 Py_INCREF(exitfunc);
1295 PySys_SetObject("exitfunc", (PyObject *)NULL);
1296 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001297 if (res == NULL) {
Ka-Ping Yee26fabb02001-03-23 15:36:41 +00001298 if (!PyErr_ExceptionMatches(PyExc_SystemExit)) {
1299 PySys_WriteStderr("Error in sys.exitfunc:\n");
1300 }
Guido van Rossum82598051997-03-05 00:20:32 +00001301 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001302 }
Guido van Rossum82598051997-03-05 00:20:32 +00001303 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001304 }
1305
Guido van Rossum0829c751998-02-28 04:31:39 +00001306 if (Py_FlushLine())
1307 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001308}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001309
Guido van Rossumcc283f51997-08-05 02:22:03 +00001310static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001311call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001312{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001313 while (nexitfuncs > 0)
1314 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001315
1316 fflush(stdout);
1317 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001318}
1319
1320void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001321Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001322{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001323 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001324
Jack Jansen66a89771995-10-27 13:22:14 +00001325#ifdef macintosh
1326 PyMac_Exit(sts);
1327#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001328 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001329#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001330}
1331
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001332static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001333initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001334{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001335#ifdef HAVE_SIGNAL_H
1336#ifdef SIGPIPE
1337 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001338#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001339#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001340 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001341}
1342
Guido van Rossumaae0d321996-05-22 16:35:33 +00001343#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001344/* Ask a yes/no question */
1345
Guido van Rossum59bff391992-09-03 20:28:00 +00001346int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001347_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001348{
1349 char buf[256];
1350
Tim Peters6d6c1a32001-08-02 04:15:00 +00001351 fprintf(stderr, "%s [ny] ", prompt);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001352 if (fgets(buf, sizeof buf, stdin) == NULL)
1353 return 0;
1354 return buf[0] == 'y' || buf[0] == 'Y';
1355}
1356#endif
1357
Guido van Rossuma110aa61994-08-29 12:50:44 +00001358#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001359
1360/* Check for file descriptor connected to interactive device.
1361 Pretend that stdin is always interactive, other files never. */
1362
1363int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001365{
1366 return fd == fileno(stdin);
1367}
1368
1369#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001370
1371/*
1372 * The file descriptor fd is considered ``interactive'' if either
1373 * a) isatty(fd) is TRUE, or
1374 * b) the -i flag was given, and the filename associated with
1375 * the descriptor is NULL or "<stdin>" or "???".
1376 */
1377int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001378Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001379{
1380 if (isatty((int)fileno(fp)))
1381 return 1;
1382 if (!Py_InteractiveFlag)
1383 return 0;
1384 return (filename == NULL) ||
1385 (strcmp(filename, "<stdin>") == 0) ||
1386 (strcmp(filename, "???") == 0);
1387}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001388
1389
1390#if defined(USE_STACKCHECK)
1391#if defined(WIN32) && defined(_MSC_VER)
1392
1393/* Stack checking for Microsoft C */
1394
1395#include <malloc.h>
1396#include <excpt.h>
1397
Fred Drakee8de31c2000-08-31 05:38:39 +00001398/*
1399 * Return non-zero when we run out of memory on the stack; zero otherwise.
1400 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001401int
Fred Drake399739f2000-08-31 05:52:44 +00001402PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001403{
1404 __try {
1405 /* _alloca throws a stack overflow exception if there's
1406 not enough space left on the stack */
1407 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1408 return 0;
1409 } __except (EXCEPTION_EXECUTE_HANDLER) {
1410 /* just ignore all errors */
1411 }
1412 return 1;
1413}
1414
1415#endif /* WIN32 && _MSC_VER */
1416
1417/* Alternate implementations can be added here... */
1418
1419#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001420
1421
1422/* Wrappers around sigaction() or signal(). */
1423
1424PyOS_sighandler_t
1425PyOS_getsig(int sig)
1426{
1427#ifdef HAVE_SIGACTION
1428 struct sigaction context;
1429 sigaction(sig, NULL, &context);
1430 return context.sa_handler;
1431#else
1432 PyOS_sighandler_t handler;
1433 handler = signal(sig, SIG_IGN);
1434 signal(sig, handler);
1435 return handler;
1436#endif
1437}
1438
1439PyOS_sighandler_t
1440PyOS_setsig(int sig, PyOS_sighandler_t handler)
1441{
1442#ifdef HAVE_SIGACTION
1443 struct sigaction context;
1444 PyOS_sighandler_t oldhandler;
1445 sigaction(sig, NULL, &context);
1446 oldhandler = context.sa_handler;
1447 context.sa_handler = handler;
1448 sigaction(sig, &context, NULL);
1449 return oldhandler;
1450#else
1451 return signal(sig, handler);
1452#endif
1453}