blob: c1c5d36c0f107d3ee6db1f077814be55061e372b [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029
30******************************************************************/
31
32/* Python interpreter top-level routines, including init/exit */
33
Guido van Rossum82598051997-03-05 00:20:32 +000034#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
36#include "grammar.h"
37#include "node.h"
38#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000039#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000040#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000042#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossum80bb9651996-12-05 23:27:02 +000044#ifdef HAVE_UNISTD_H
45#include <unistd.h>
46#endif
47
Guido van Rossuma110aa61994-08-29 12:50:44 +000048#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000049#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000050#endif
51
Guido van Rossum9b38a141996-09-11 23:12:24 +000052#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000053#undef BYTE
54#include "windows.h"
55#endif
56
Guido van Rossum82598051997-03-05 00:20:32 +000057extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000058
Guido van Rossum82598051997-03-05 00:20:32 +000059extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060
Guido van Rossumb73cc041993-11-01 16:28:59 +000061/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000062static void initmain Py_PROTO((void));
63static PyObject *run_err_node Py_PROTO((node *n, char *filename,
64 PyObject *globals, PyObject *locals));
65static PyObject *run_node Py_PROTO((node *n, char *filename,
66 PyObject *globals, PyObject *locals));
67static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
68 PyObject *globals, PyObject *locals));
69static void err_input Py_PROTO((perrdetail *));
70static void initsigs Py_PROTO((void));
Guido van Rossum25ce5661997-08-02 03:10:38 +000071static void finisigs Py_PROTO((void));
Guido van Rossumcc283f51997-08-05 02:22:03 +000072static void call_sys_exitfunc Py_PROTO((void));
73static void call_ll_exitfuncs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000074
Guido van Rossum82598051997-03-05 00:20:32 +000075int Py_DebugFlag; /* Needed by parser.c */
76int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000077int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
Guido van Rossum25ce5661997-08-02 03:10:38 +000079static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000080
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000081/* API to access the initialized flag -- useful for eroteric use */
82
83int
84Py_IsInitialized()
85{
86 return initialized;
87}
88
Guido van Rossum25ce5661997-08-02 03:10:38 +000089/* Global initializations. Can be undone by Py_Finalize(). Don't
90 call this twice without an intervening Py_Finalize() call. When
91 initializations fail, a fatal error is issued and the function does
92 not return. On return, the first thread and interpreter state have
93 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094
Guido van Rossum25ce5661997-08-02 03:10:38 +000095 Locking: you must hold the interpreter lock while calling this.
96 (If the lock has not yet been initialized, that's equivalent to
97 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000098
Guido van Rossum25ce5661997-08-02 03:10:38 +000099*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100
101void
102Py_Initialize()
103{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105 PyThreadState *tstate;
106 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000107 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000108
Guido van Rossumaa615051997-08-20 22:40:18 +0000109 if (++initialized > 1)
110 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
113 Py_DebugFlag = 1;
114 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
115 Py_VerboseFlag = 1;
116
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 interp = PyInterpreterState_New();
118 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 tstate = PyThreadState_New(interp);
122 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 (void) PyThreadState_Swap(tstate);
125
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 interp->modules = PyDict_New();
127 if (interp->modules == NULL)
128 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000129
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130 bimod = _PyBuiltin_Init();
131 if (bimod == NULL)
132 Py_FatalError("Py_Initialize: can't initialize __builtin__");
133 interp->builtins = PyModule_GetDict(bimod);
134 Py_INCREF(interp->builtins);
135 _PyImport_FixupExtension("__builtin__", "__builtin__");
136
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
147 _PyImport_Init();
148
149 initsigs(); /* Signal handling stuff, including initintr() */
150
151 initmain(); /* Module __main__ */
152}
153
154/* Undo the effect of Py_Initialize().
155
156 Beware: if multiple interpreter and/or thread states exist, these
157 are not wiped out; only the current thread and interpreter state
158 are deleted. But since everything else is deleted, those other
159 interpreter and thread states should no longer be used.
160
161 (XXX We should do better, e.g. wipe out all interpreters and
162 threads.)
163
164 Locking: as above.
165
166*/
167
168void
169Py_Finalize()
170{
171 PyInterpreterState *interp;
172 PyThreadState *tstate;
173
Guido van Rossumcc283f51997-08-05 02:22:03 +0000174 call_sys_exitfunc();
175
Guido van Rossumaa615051997-08-20 22:40:18 +0000176 if (--initialized > 0)
177 return;
178 if (initialized < 0)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000179 Py_FatalError("Py_Finalize: not initialized");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180
181 tstate = PyThreadState_Get();
182 interp = tstate->interp;
183
184 PyImport_Cleanup();
185 PyInterpreterState_Clear(interp);
186 PyThreadState_Swap(NULL);
187 PyInterpreterState_Delete(interp);
188
189 finisigs();
190 _PyImport_Fini();
191 _PyBuiltin_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000192 PyMethod_Fini();
193 PyFrame_Fini();
194 PyCFunction_Fini();
195 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000197 PyInt_Fini();
198 PyFloat_Fini();
199
200 /* XXX Still allocated:
201 - various static ad-hoc pointers to interned strings
202 - int and float free list blocks
203 - whatever various modules and libraries allocate
204 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000205
206 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000207
208 call_ll_exitfuncs();
209
210#ifdef COUNT_ALLOCS
211 dump_counts();
212#endif
213
214#ifdef Py_REF_DEBUG
215 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
216#endif
217
218#ifdef Py_TRACE_REFS
219 if (_Py_AskYesNo("Print left references?")) {
220 _Py_PrintReferences(stderr);
221 }
222 _Py_ResetReferences();
223#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000224}
225
226/* Create and initialize a new interpreter and thread, and return the
227 new thread. This requires that Py_Initialize() has been called
228 first.
229
230 Unsuccessful initialization yields a NULL pointer. Note that *no*
231 exception information is available even in this case -- the
232 exception information is held in the thread, and there is no
233 thread.
234
235 Locking: as above.
236
237*/
238
239PyThreadState *
240Py_NewInterpreter()
241{
242 PyInterpreterState *interp;
243 PyThreadState *tstate, *save_tstate;
244 PyObject *bimod, *sysmod;
245
246 if (!initialized)
247 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
248
249 interp = PyInterpreterState_New();
250 if (interp == NULL)
251 return NULL;
252
253 tstate = PyThreadState_New(interp);
254 if (tstate == NULL) {
255 PyInterpreterState_Delete(interp);
256 return NULL;
257 }
258
259 save_tstate = PyThreadState_Swap(tstate);
260
261 /* XXX The following is lax in error checking */
262
263 interp->modules = PyDict_New();
264
265 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
266 if (bimod != NULL) {
267 interp->builtins = PyModule_GetDict(bimod);
268 Py_INCREF(interp->builtins);
269 }
270 sysmod = _PyImport_FindExtension("sys", "sys");
271 if (bimod != NULL && sysmod != NULL) {
272 interp->sysdict = PyModule_GetDict(sysmod);
273 Py_INCREF(interp->sysdict);
274 PySys_SetPath(Py_GetPath());
275 PyDict_SetItemString(interp->sysdict, "modules",
276 interp->modules);
277 initmain();
278 }
279
280 if (!PyErr_Occurred())
281 return tstate;
282
283 /* Oops, it didn't work. Undo it all. */
284
285 PyErr_Print();
286 PyThreadState_Clear(tstate);
287 PyThreadState_Swap(save_tstate);
288 PyThreadState_Delete(tstate);
289 PyInterpreterState_Delete(interp);
290
291 return NULL;
292}
293
294/* Delete an interpreter and its last thread. This requires that the
295 given thread state is current, that the thread has no remaining
296 frames, and that it is its interpreter's only remaining thread.
297 It is a fatal error to violate these constraints.
298
299 (Py_Finalize() doesn't have these constraints -- it zaps
300 everything, regardless.)
301
302 Locking: as above.
303
304*/
305
306void
307Py_EndInterpreter(tstate)
308 PyThreadState *tstate;
309{
310 PyInterpreterState *interp = tstate->interp;
311
312 if (tstate != PyThreadState_Get())
313 Py_FatalError("Py_EndInterpreter: thread is not current");
314 if (tstate->frame != NULL)
315 Py_FatalError("Py_EndInterpreter: thread still has a frame");
316 if (tstate != interp->tstate_head || tstate->next != NULL)
317 Py_FatalError("Py_EndInterpreter: not the last thread");
318
319 PyImport_Cleanup();
320 PyInterpreterState_Clear(interp);
321 PyThreadState_Swap(NULL);
322 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000323}
324
325static char *progname = "python";
326
327void
328Py_SetProgramName(pn)
329 char *pn;
330{
331 if (pn && *pn)
332 progname = pn;
333}
334
335char *
336Py_GetProgramName()
337{
338 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000339}
340
Guido van Rossum6135a871995-01-09 17:53:26 +0000341/* Create __main__ module */
342
343static void
344initmain()
345{
Guido van Rossum82598051997-03-05 00:20:32 +0000346 PyObject *m, *d;
347 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000348 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000349 Py_FatalError("can't create __main__ module");
350 d = PyModule_GetDict(m);
351 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
352 if (PyDict_SetItemString(d, "__builtins__",
353 PyEval_GetBuiltins()))
354 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000355 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356}
357
358/* Parse input from a file and execute it */
359
360int
Guido van Rossum82598051997-03-05 00:20:32 +0000361PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000362 FILE *fp;
363 char *filename;
364{
365 if (filename == NULL)
366 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000367 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000368 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369 else
Guido van Rossum82598051997-03-05 00:20:32 +0000370 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371}
372
373int
Guido van Rossum82598051997-03-05 00:20:32 +0000374PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000375 FILE *fp;
376 char *filename;
377{
Guido van Rossum82598051997-03-05 00:20:32 +0000378 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000379 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000380 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000382 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
383 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384 }
Guido van Rossum82598051997-03-05 00:20:32 +0000385 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000386 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000387 PySys_SetObject("ps2", v = PyString_FromString("... "));
388 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000389 }
390 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000391 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000392#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000393 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394#endif
395 if (ret == E_EOF)
396 return 0;
397 /*
398 if (ret == E_NOMEM)
399 return -1;
400 */
401 }
402}
403
404int
Guido van Rossum82598051997-03-05 00:20:32 +0000405PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406 FILE *fp;
407 char *filename;
408{
Guido van Rossum82598051997-03-05 00:20:32 +0000409 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000411 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000413 v = PySys_GetObject("ps1");
414 w = PySys_GetObject("ps2");
415 if (v != NULL && PyString_Check(v)) {
416 Py_INCREF(v);
417 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 }
419 else {
420 v = NULL;
421 ps1 = "";
422 }
Guido van Rossum82598051997-03-05 00:20:32 +0000423 if (w != NULL && PyString_Check(w)) {
424 Py_INCREF(w);
425 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 }
427 else {
428 w = NULL;
429 ps2 = "";
430 }
Guido van Rossum82598051997-03-05 00:20:32 +0000431 Py_BEGIN_ALLOW_THREADS
432 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000433 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000434 Py_END_ALLOW_THREADS
435 Py_XDECREF(v);
436 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000437 if (n == NULL) {
438 if (err.error == E_EOF) {
439 if (err.text)
440 free(err.text);
441 return E_EOF;
442 }
443 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000444 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000445 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446 }
Guido van Rossum82598051997-03-05 00:20:32 +0000447 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000448 if (m == NULL)
449 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000450 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000452 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000453 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454 return -1;
455 }
Guido van Rossum82598051997-03-05 00:20:32 +0000456 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000457 if (Py_FlushLine())
458 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459 return 0;
460}
461
462int
Guido van Rossum82598051997-03-05 00:20:32 +0000463PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 FILE *fp;
465 char *filename;
466{
Guido van Rossum82598051997-03-05 00:20:32 +0000467 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000468 char *ext;
469
Guido van Rossum82598051997-03-05 00:20:32 +0000470 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 if (m == NULL)
472 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000473 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000474 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000475 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000476#ifdef macintosh
477 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000478 || getfiletype(filename) == 'PYC '
479 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000480#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000481 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000482 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000483 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000484 if( (fp = fopen(filename, "rb")) == NULL ) {
485 fprintf(stderr, "python: Can't reopen .pyc file\n");
486 return -1;
487 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000488 /* Turn on optimization if a .pyo file is given */
489 if (strcmp(ext, ".pyo") == 0)
490 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000491 v = run_pyc_file(fp, filename, d, d);
492 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000493 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000494 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000496 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497 return -1;
498 }
Guido van Rossum82598051997-03-05 00:20:32 +0000499 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000500 if (Py_FlushLine())
501 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 return 0;
503}
504
505int
Guido van Rossum82598051997-03-05 00:20:32 +0000506PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507 char *command;
508{
Guido van Rossum82598051997-03-05 00:20:32 +0000509 PyObject *m, *d, *v;
510 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511 if (m == NULL)
512 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000513 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000514 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000516 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000517 return -1;
518 }
Guido van Rossum82598051997-03-05 00:20:32 +0000519 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000520 if (Py_FlushLine())
521 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000522 return 0;
523}
524
525void
Guido van Rossum82598051997-03-05 00:20:32 +0000526PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000528 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000529 PyObject *exception, *v, *tb, *f;
530 PyErr_Fetch(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000532 return;
Barry Warsaw36b8f941997-08-26 18:09:48 +0000533 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000534 err = Py_FlushLine();
535 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000536 if (v == NULL || v == Py_None)
537 Py_Exit(0);
538 if (PyInt_Check(v))
539 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000541 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000542 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000544 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545 }
546 }
Guido van Rossum82598051997-03-05 00:20:32 +0000547 PySys_SetObject("last_type", exception);
548 PySys_SetObject("last_value", v);
549 PySys_SetObject("last_traceback", tb);
550 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000551 if (f == NULL)
552 fprintf(stderr, "lost sys.stderr\n");
553 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000554 err = Py_FlushLine();
555 fflush(stdout);
556 if (err == 0)
557 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000558 if (err == 0 &&
559 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
560 {
Guido van Rossum82598051997-03-05 00:20:32 +0000561 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000562 char *filename, *text;
563 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000564 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000565 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000566 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000567 else {
568 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000569 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000571 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000572 else
Guido van Rossum82598051997-03-05 00:20:32 +0000573 PyFile_WriteString(filename, f);
574 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000575 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000576 PyFile_WriteString(buf, f);
577 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000578 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000579 char *nl;
580 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000581 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000582 offset--;
583 for (;;) {
584 nl = strchr(text, '\n');
585 if (nl == NULL ||
586 nl-text >= offset)
587 break;
588 offset -= (nl+1-text);
589 text = nl+1;
590 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000591 while (*text == ' ' || *text == '\t') {
592 text++;
593 offset--;
594 }
Guido van Rossum82598051997-03-05 00:20:32 +0000595 PyFile_WriteString(" ", f);
596 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000597 if (*text == '\0' ||
598 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000599 PyFile_WriteString("\n", f);
600 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000601 offset--;
602 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000603 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000604 offset--;
605 }
Guido van Rossum82598051997-03-05 00:20:32 +0000606 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000607 }
Guido van Rossum82598051997-03-05 00:20:32 +0000608 Py_INCREF(message);
609 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000610 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000611 /* Can't be bothered to check all those
612 PyFile_WriteString() calls */
613 if (PyErr_Occurred())
614 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000615 }
616 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000617 if (err) {
618 /* Don't do anything else */
619 }
620 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000621 PyObject* className =
622 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000623 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000624 err = PyFile_WriteString("<unknown>", f);
625 else
626 err = PyFile_WriteObject(className, f,
627 Py_PRINT_RAW);
628 }
629 else
630 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
631 if (err == 0) {
632 if (v != NULL && v != Py_None) {
633 err = PyFile_WriteString(": ", f);
634 if (err == 0)
635 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000636 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000637 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000638 if (err == 0)
639 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000640 }
Guido van Rossum82598051997-03-05 00:20:32 +0000641 Py_XDECREF(exception);
642 Py_XDECREF(v);
643 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000644 /* If an error happened here, don't show it.
645 XXX This is wrong, but too many callers rely on this behavior. */
646 if (err != 0)
647 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000648}
649
Guido van Rossum82598051997-03-05 00:20:32 +0000650PyObject *
651PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652 char *str;
653 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000654 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000655{
Guido van Rossum82598051997-03-05 00:20:32 +0000656 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000657 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658}
659
Guido van Rossum82598051997-03-05 00:20:32 +0000660PyObject *
661PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662 FILE *fp;
663 char *filename;
664 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000665 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666{
Guido van Rossum82598051997-03-05 00:20:32 +0000667 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000668 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669}
670
Guido van Rossum82598051997-03-05 00:20:32 +0000671static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000672run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673 node *n;
674 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000675 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000677 if (n == NULL)
678 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679 return run_node(n, filename, globals, locals);
680}
681
Guido van Rossum82598051997-03-05 00:20:32 +0000682static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000683run_node(n, filename, globals, locals)
684 node *n;
685 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000686 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000687{
Guido van Rossum82598051997-03-05 00:20:32 +0000688 PyCodeObject *co;
689 PyObject *v;
690 co = PyNode_Compile(n, filename);
691 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000692 if (co == NULL)
693 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000694 v = PyEval_EvalCode(co, globals, locals);
695 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696 return v;
697}
698
Guido van Rossum82598051997-03-05 00:20:32 +0000699static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000700run_pyc_file(fp, filename, globals, locals)
701 FILE *fp;
702 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000704{
Guido van Rossum82598051997-03-05 00:20:32 +0000705 PyCodeObject *co;
706 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000707 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000708 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000709
Guido van Rossum82598051997-03-05 00:20:32 +0000710 magic = PyMarshal_ReadLongFromFile(fp);
711 if (magic != PyImport_GetMagicNumber()) {
712 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000713 "Bad magic number in .pyc file");
714 return NULL;
715 }
Guido van Rossum82598051997-03-05 00:20:32 +0000716 (void) PyMarshal_ReadLongFromFile(fp);
717 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000718 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000719 if (v == NULL || !PyCode_Check(v)) {
720 Py_XDECREF(v);
721 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000722 "Bad code object in .pyc file");
723 return NULL;
724 }
Guido van Rossum82598051997-03-05 00:20:32 +0000725 co = (PyCodeObject *)v;
726 v = PyEval_EvalCode(co, globals, locals);
727 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000728 return v;
729}
730
Guido van Rossum82598051997-03-05 00:20:32 +0000731PyObject *
732Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000733 char *str;
734 char *filename;
735 int start;
736{
737 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000738 PyCodeObject *co;
739 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000740 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000741 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000742 co = PyNode_Compile(n, filename);
743 PyNode_Free(n);
744 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000745}
746
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000748
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749node *
Guido van Rossum82598051997-03-05 00:20:32 +0000750PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000751 FILE *fp;
752 char *filename;
753 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000754{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000755 node *n;
756 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000757 Py_BEGIN_ALLOW_THREADS
758 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000760 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000761 if (n == NULL)
762 err_input(&err);
763 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000764}
765
Guido van Rossuma110aa61994-08-29 12:50:44 +0000766/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000767
Guido van Rossuma110aa61994-08-29 12:50:44 +0000768node *
Guido van Rossum82598051997-03-05 00:20:32 +0000769PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000770 char *str;
771 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000772{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000773 node *n;
774 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000775 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000776 if (n == NULL)
777 err_input(&err);
778 return n;
779}
780
781/* Set the error appropriate to the given input error code (see errcode.h) */
782
783static void
784err_input(err)
785 perrdetail *err;
786{
Guido van Rossum82598051997-03-05 00:20:32 +0000787 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000789 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000790 err->lineno, err->offset, err->text);
791 if (err->text != NULL) {
792 free(err->text);
793 err->text = NULL;
794 }
795 switch (err->error) {
796 case E_SYNTAX:
797 msg = "invalid syntax";
798 break;
799 case E_TOKEN:
800 msg = "invalid token";
801
802 break;
803 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000804 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000805 return;
806 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000807 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000808 return;
809 case E_EOF:
810 msg = "unexpected EOF while parsing";
811 break;
812 default:
813 fprintf(stderr, "error=%d\n", err->error);
814 msg = "unknown parsing error";
815 break;
816 }
Guido van Rossum82598051997-03-05 00:20:32 +0000817 w = Py_BuildValue("(sO)", msg, v);
818 Py_XDECREF(v);
819 PyErr_SetObject(PyExc_SyntaxError, w);
820 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000821}
822
823/* Print fatal error message and abort */
824
825void
Guido van Rossum82598051997-03-05 00:20:32 +0000826Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000827 char *msg;
828{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000829 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000830#ifdef macintosh
831 for (;;);
832#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000833#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000834 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000835 OutputDebugString(msg);
836 OutputDebugString("\n");
837#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000838 abort();
839}
840
841/* Clean up and exit */
842
Guido van Rossuma110aa61994-08-29 12:50:44 +0000843#ifdef WITH_THREAD
844#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000845int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000846#endif
847
Guido van Rossum1662dd51994-09-07 14:38:28 +0000848#define NEXITFUNCS 32
849static void (*exitfuncs[NEXITFUNCS])();
850static int nexitfuncs = 0;
851
852int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000853 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000854{
855 if (nexitfuncs >= NEXITFUNCS)
856 return -1;
857 exitfuncs[nexitfuncs++] = func;
858 return 0;
859}
860
Guido van Rossumcc283f51997-08-05 02:22:03 +0000861static void
862call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000863{
Guido van Rossum82598051997-03-05 00:20:32 +0000864 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000865
866 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000867 PyObject *res;
868 Py_INCREF(exitfunc);
869 PySys_SetObject("exitfunc", (PyObject *)NULL);
870 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000871 if (res == NULL) {
872 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000873 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000874 }
Guido van Rossum82598051997-03-05 00:20:32 +0000875 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000876 }
877
Guido van Rossum82598051997-03-05 00:20:32 +0000878 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000879}
Guido van Rossum1662dd51994-09-07 14:38:28 +0000880
Guido van Rossumcc283f51997-08-05 02:22:03 +0000881static void
882call_ll_exitfuncs()
883{
Guido van Rossum1662dd51994-09-07 14:38:28 +0000884 while (nexitfuncs > 0)
885 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000886
887 fflush(stdout);
888 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000889}
890
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000891#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000892extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000893#endif
894
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000895void
Guido van Rossum82598051997-03-05 00:20:32 +0000896Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000897 int sts;
898{
Guido van Rossumcc283f51997-08-05 02:22:03 +0000899 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000900
Jack Jansen66a89771995-10-27 13:22:14 +0000901#ifdef macintosh
902 PyMac_Exit(sts);
903#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000905#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000906}
907
Guido van Rossuma110aa61994-08-29 12:50:44 +0000908#ifdef HAVE_SIGNAL_H
909static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000910sighandler(sig)
911 int sig;
912{
913 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000914 /* Do essential exit processing only */
915 call_sys_exitfunc();
916 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +0000917#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000918 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000919#else
920 exit(1);
921#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000922 /*NOTREACHED*/
923}
924#endif
925
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000926static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000927initsigs()
928{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000929 RETSIGTYPE (*t)();
930#ifdef HAVE_SIGNAL_H
931#ifdef SIGPIPE
932 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000933#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000934#ifdef SIGHUP
935 t = signal(SIGHUP, SIG_IGN);
936 if (t == SIG_DFL)
937 signal(SIGHUP, sighandler);
938 else
939 signal(SIGHUP, t);
940#endif
941#ifdef SIGTERM
942 t = signal(SIGTERM, SIG_IGN);
943 if (t == SIG_DFL)
944 signal(SIGTERM, sighandler);
945 else
946 signal(SIGTERM, t);
947#endif
948#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000949 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000950}
951
Guido van Rossum25ce5661997-08-02 03:10:38 +0000952static void
953finisigs()
954{
955 PyOS_FiniInterrupts(); /* May imply finisignal() */
956}
957
Guido van Rossumaae0d321996-05-22 16:35:33 +0000958#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000959/* Ask a yes/no question */
960
Guido van Rossum59bff391992-09-03 20:28:00 +0000961int
Guido van Rossum82598051997-03-05 00:20:32 +0000962_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000963 char *prompt;
964{
965 char buf[256];
966
967 printf("%s [ny] ", prompt);
968 if (fgets(buf, sizeof buf, stdin) == NULL)
969 return 0;
970 return buf[0] == 'y' || buf[0] == 'Y';
971}
972#endif
973
Guido van Rossuma110aa61994-08-29 12:50:44 +0000974#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000975
976/* Check for file descriptor connected to interactive device.
977 Pretend that stdin is always interactive, other files never. */
978
979int
980isatty(fd)
981 int fd;
982{
983 return fd == fileno(stdin);
984}
985
986#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000987
988/*
989 * The file descriptor fd is considered ``interactive'' if either
990 * a) isatty(fd) is TRUE, or
991 * b) the -i flag was given, and the filename associated with
992 * the descriptor is NULL or "<stdin>" or "???".
993 */
994int
995Py_FdIsInteractive(fp, filename)
996 FILE *fp;
997 char *filename;
998{
999 if (isatty((int)fileno(fp)))
1000 return 1;
1001 if (!Py_InteractiveFlag)
1002 return 0;
1003 return (filename == NULL) ||
1004 (strcmp(filename, "<stdin>") == 0) ||
1005 (strcmp(filename, "???") == 0);
1006}