blob: f9b33fcd2669950650e5fd20d5b9968cf44e9688 [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 */
Barry Warsaw035574d1997-08-29 22:07:17 +000078int Py_UseClassExceptionsFlag; /* Needed by bltinmodule.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079
Guido van Rossum25ce5661997-08-02 03:10:38 +000080static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000081
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000082/* API to access the initialized flag -- useful for eroteric use */
83
84int
85Py_IsInitialized()
86{
87 return initialized;
88}
89
Guido van Rossum25ce5661997-08-02 03:10:38 +000090/* Global initializations. Can be undone by Py_Finalize(). Don't
91 call this twice without an intervening Py_Finalize() call. When
92 initializations fail, a fatal error is issued and the function does
93 not return. On return, the first thread and interpreter state have
94 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000095
Guido van Rossum25ce5661997-08-02 03:10:38 +000096 Locking: you must hold the interpreter lock while calling this.
97 (If the lock has not yet been initialized, that's equivalent to
98 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000099
Guido van Rossum25ce5661997-08-02 03:10:38 +0000100*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101
102void
103Py_Initialize()
104{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000105 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000106 PyThreadState *tstate;
107 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000108 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109
Guido van Rossumaa615051997-08-20 22:40:18 +0000110 if (++initialized > 1)
111 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000113 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
114 Py_DebugFlag = 1;
115 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
116 Py_VerboseFlag = 1;
117
Guido van Rossuma027efa1997-05-05 20:56:21 +0000118 interp = PyInterpreterState_New();
119 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000121
Guido van Rossuma027efa1997-05-05 20:56:21 +0000122 tstate = PyThreadState_New(interp);
123 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125 (void) PyThreadState_Swap(tstate);
126
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127 interp->modules = PyDict_New();
128 if (interp->modules == NULL)
129 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130
Barry Warsaw035574d1997-08-29 22:07:17 +0000131 bimod = _PyBuiltin_Init_1();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 if (bimod == NULL)
133 Py_FatalError("Py_Initialize: can't initialize __builtin__");
134 interp->builtins = PyModule_GetDict(bimod);
135 Py_INCREF(interp->builtins);
136 _PyImport_FixupExtension("__builtin__", "__builtin__");
137
138 sysmod = _PySys_Init();
139 if (sysmod == NULL)
140 Py_FatalError("Py_Initialize: can't initialize sys");
141 interp->sysdict = PyModule_GetDict(sysmod);
142 Py_INCREF(interp->sysdict);
143 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000144 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145 PyDict_SetItemString(interp->sysdict, "modules",
146 interp->modules);
147
Barry Warsaw035574d1997-08-29 22:07:17 +0000148 /* phase 2 of builtins */
149 _PyBuiltin_Init_2(interp->builtins);
150
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151 _PyImport_Init();
152
153 initsigs(); /* Signal handling stuff, including initintr() */
154
155 initmain(); /* Module __main__ */
156}
157
158/* Undo the effect of Py_Initialize().
159
160 Beware: if multiple interpreter and/or thread states exist, these
161 are not wiped out; only the current thread and interpreter state
162 are deleted. But since everything else is deleted, those other
163 interpreter and thread states should no longer be used.
164
165 (XXX We should do better, e.g. wipe out all interpreters and
166 threads.)
167
168 Locking: as above.
169
170*/
171
172void
173Py_Finalize()
174{
175 PyInterpreterState *interp;
176 PyThreadState *tstate;
177
Guido van Rossumcc283f51997-08-05 02:22:03 +0000178 call_sys_exitfunc();
179
Guido van Rossumaa615051997-08-20 22:40:18 +0000180 if (--initialized > 0)
181 return;
182 if (initialized < 0)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000183 Py_FatalError("Py_Finalize: not initialized");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000184
Barry Warsaw035574d1997-08-29 22:07:17 +0000185 /* We must call this before the current thread gets removed because
186 it decrefs class instances, which in turn save and restore the
187 current error state, which is a per thread data structure.
188 */
189 _PyBuiltin_Fini_1();
190
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191 tstate = PyThreadState_Get();
192 interp = tstate->interp;
193
194 PyImport_Cleanup();
195 PyInterpreterState_Clear(interp);
196 PyThreadState_Swap(NULL);
197 PyInterpreterState_Delete(interp);
198
199 finisigs();
200 _PyImport_Fini();
Barry Warsaw035574d1997-08-29 22:07:17 +0000201
202 /* Now we decref the exception classes. After this point nothing
203 can raise an exception. That's okay, because each Fini() method
204 below has been checked to make sure no exceptions are ever
205 raised.
206 */
207 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000208 PyMethod_Fini();
209 PyFrame_Fini();
210 PyCFunction_Fini();
211 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000212 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000213 PyInt_Fini();
214 PyFloat_Fini();
215
216 /* XXX Still allocated:
217 - various static ad-hoc pointers to interned strings
218 - int and float free list blocks
219 - whatever various modules and libraries allocate
220 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000221
222 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000223
224 call_ll_exitfuncs();
225
226#ifdef COUNT_ALLOCS
227 dump_counts();
228#endif
229
230#ifdef Py_REF_DEBUG
231 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
232#endif
233
234#ifdef Py_TRACE_REFS
235 if (_Py_AskYesNo("Print left references?")) {
236 _Py_PrintReferences(stderr);
237 }
238 _Py_ResetReferences();
239#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000240}
241
242/* Create and initialize a new interpreter and thread, and return the
243 new thread. This requires that Py_Initialize() has been called
244 first.
245
246 Unsuccessful initialization yields a NULL pointer. Note that *no*
247 exception information is available even in this case -- the
248 exception information is held in the thread, and there is no
249 thread.
250
251 Locking: as above.
252
253*/
254
255PyThreadState *
256Py_NewInterpreter()
257{
258 PyInterpreterState *interp;
259 PyThreadState *tstate, *save_tstate;
260 PyObject *bimod, *sysmod;
261
262 if (!initialized)
263 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
264
265 interp = PyInterpreterState_New();
266 if (interp == NULL)
267 return NULL;
268
269 tstate = PyThreadState_New(interp);
270 if (tstate == NULL) {
271 PyInterpreterState_Delete(interp);
272 return NULL;
273 }
274
275 save_tstate = PyThreadState_Swap(tstate);
276
277 /* XXX The following is lax in error checking */
278
279 interp->modules = PyDict_New();
280
281 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
282 if (bimod != NULL) {
283 interp->builtins = PyModule_GetDict(bimod);
284 Py_INCREF(interp->builtins);
285 }
286 sysmod = _PyImport_FindExtension("sys", "sys");
287 if (bimod != NULL && sysmod != NULL) {
288 interp->sysdict = PyModule_GetDict(sysmod);
289 Py_INCREF(interp->sysdict);
290 PySys_SetPath(Py_GetPath());
291 PyDict_SetItemString(interp->sysdict, "modules",
292 interp->modules);
293 initmain();
294 }
295
296 if (!PyErr_Occurred())
297 return tstate;
298
299 /* Oops, it didn't work. Undo it all. */
300
301 PyErr_Print();
302 PyThreadState_Clear(tstate);
303 PyThreadState_Swap(save_tstate);
304 PyThreadState_Delete(tstate);
305 PyInterpreterState_Delete(interp);
306
307 return NULL;
308}
309
310/* Delete an interpreter and its last thread. This requires that the
311 given thread state is current, that the thread has no remaining
312 frames, and that it is its interpreter's only remaining thread.
313 It is a fatal error to violate these constraints.
314
315 (Py_Finalize() doesn't have these constraints -- it zaps
316 everything, regardless.)
317
318 Locking: as above.
319
320*/
321
322void
323Py_EndInterpreter(tstate)
324 PyThreadState *tstate;
325{
326 PyInterpreterState *interp = tstate->interp;
327
328 if (tstate != PyThreadState_Get())
329 Py_FatalError("Py_EndInterpreter: thread is not current");
330 if (tstate->frame != NULL)
331 Py_FatalError("Py_EndInterpreter: thread still has a frame");
332 if (tstate != interp->tstate_head || tstate->next != NULL)
333 Py_FatalError("Py_EndInterpreter: not the last thread");
334
335 PyImport_Cleanup();
336 PyInterpreterState_Clear(interp);
337 PyThreadState_Swap(NULL);
338 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000339}
340
341static char *progname = "python";
342
343void
344Py_SetProgramName(pn)
345 char *pn;
346{
347 if (pn && *pn)
348 progname = pn;
349}
350
351char *
352Py_GetProgramName()
353{
354 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000355}
356
Guido van Rossum6135a871995-01-09 17:53:26 +0000357/* Create __main__ module */
358
359static void
360initmain()
361{
Guido van Rossum82598051997-03-05 00:20:32 +0000362 PyObject *m, *d;
363 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000364 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000365 Py_FatalError("can't create __main__ module");
366 d = PyModule_GetDict(m);
367 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
368 if (PyDict_SetItemString(d, "__builtins__",
369 PyEval_GetBuiltins()))
370 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000371 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000372}
373
374/* Parse input from a file and execute it */
375
376int
Guido van Rossum82598051997-03-05 00:20:32 +0000377PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000378 FILE *fp;
379 char *filename;
380{
381 if (filename == NULL)
382 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000383 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000384 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385 else
Guido van Rossum82598051997-03-05 00:20:32 +0000386 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387}
388
389int
Guido van Rossum82598051997-03-05 00:20:32 +0000390PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000391 FILE *fp;
392 char *filename;
393{
Guido van Rossum82598051997-03-05 00:20:32 +0000394 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000396 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000397 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000398 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
399 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000400 }
Guido van Rossum82598051997-03-05 00:20:32 +0000401 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000403 PySys_SetObject("ps2", v = PyString_FromString("... "));
404 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405 }
406 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000407 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000408#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000409 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410#endif
411 if (ret == E_EOF)
412 return 0;
413 /*
414 if (ret == E_NOMEM)
415 return -1;
416 */
417 }
418}
419
420int
Guido van Rossum82598051997-03-05 00:20:32 +0000421PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000422 FILE *fp;
423 char *filename;
424{
Guido van Rossum82598051997-03-05 00:20:32 +0000425 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000427 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000429 v = PySys_GetObject("ps1");
430 w = PySys_GetObject("ps2");
431 if (v != NULL && PyString_Check(v)) {
432 Py_INCREF(v);
433 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 }
435 else {
436 v = NULL;
437 ps1 = "";
438 }
Guido van Rossum82598051997-03-05 00:20:32 +0000439 if (w != NULL && PyString_Check(w)) {
440 Py_INCREF(w);
441 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000442 }
443 else {
444 w = NULL;
445 ps2 = "";
446 }
Guido van Rossum82598051997-03-05 00:20:32 +0000447 Py_BEGIN_ALLOW_THREADS
448 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000449 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000450 Py_END_ALLOW_THREADS
451 Py_XDECREF(v);
452 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000453 if (n == NULL) {
454 if (err.error == E_EOF) {
455 if (err.text)
456 free(err.text);
457 return E_EOF;
458 }
459 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000460 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000461 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462 }
Guido van Rossum82598051997-03-05 00:20:32 +0000463 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 if (m == NULL)
465 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000466 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000467 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000469 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470 return -1;
471 }
Guido van Rossum82598051997-03-05 00:20:32 +0000472 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000473 if (Py_FlushLine())
474 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475 return 0;
476}
477
478int
Guido van Rossum82598051997-03-05 00:20:32 +0000479PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480 FILE *fp;
481 char *filename;
482{
Guido van Rossum82598051997-03-05 00:20:32 +0000483 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000484 char *ext;
485
Guido van Rossum82598051997-03-05 00:20:32 +0000486 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487 if (m == NULL)
488 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000489 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000490 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000491 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000492#ifdef macintosh
493 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000494 || getfiletype(filename) == 'PYC '
495 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000496#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000497 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000498 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000499 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000500 if( (fp = fopen(filename, "rb")) == NULL ) {
501 fprintf(stderr, "python: Can't reopen .pyc file\n");
502 return -1;
503 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000504 /* Turn on optimization if a .pyo file is given */
505 if (strcmp(ext, ".pyo") == 0)
506 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000507 v = run_pyc_file(fp, filename, d, d);
508 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000509 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000510 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000512 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000513 return -1;
514 }
Guido van Rossum82598051997-03-05 00:20:32 +0000515 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000516 if (Py_FlushLine())
517 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 return 0;
519}
520
521int
Guido van Rossum82598051997-03-05 00:20:32 +0000522PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000523 char *command;
524{
Guido van Rossum82598051997-03-05 00:20:32 +0000525 PyObject *m, *d, *v;
526 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527 if (m == NULL)
528 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000529 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000530 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000532 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 return -1;
534 }
Guido van Rossum82598051997-03-05 00:20:32 +0000535 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000536 if (Py_FlushLine())
537 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000538 return 0;
539}
540
Barry Warsaw035574d1997-08-29 22:07:17 +0000541static int
542parse_syntax_error(err, message, filename, lineno, offset, text)
543 PyObject* err;
544 PyObject** message;
545 char** filename;
546 int* lineno;
547 int* offset;
548 char** text;
549{
550 long hold;
551 PyObject *v;
552
553 /* old style errors */
554 if (PyTuple_Check(err))
555 return PyArg_Parse(err, "(O(ziiz))", message, filename,
556 lineno, offset, text);
557
558 /* new style errors. `err' is an instance */
559
560 if (! (v = PyObject_GetAttrString(err, "msg")))
561 goto finally;
562 *message = v;
563
564 if (!(v = PyObject_GetAttrString(err, "filename")))
565 goto finally;
566 if (v == Py_None)
567 *filename = NULL;
568 else if (! (*filename = PyString_AsString(v)))
569 goto finally;
570
571 Py_DECREF(v);
572 if (!(v = PyObject_GetAttrString(err, "lineno")))
573 goto finally;
574 hold = PyInt_AsLong(v);
575 Py_DECREF(v);
576 v = NULL;
577 if (hold < 0 && PyErr_Occurred())
578 goto finally;
579 *lineno = (int)hold;
580
581 if (!(v = PyObject_GetAttrString(err, "offset")))
582 goto finally;
583 hold = PyInt_AsLong(v);
584 Py_DECREF(v);
585 v = NULL;
586 if (hold < 0 && PyErr_Occurred())
587 goto finally;
588 *offset = (int)hold;
589
590 if (!(v = PyObject_GetAttrString(err, "text")))
591 goto finally;
592 if (v == Py_None)
593 *text = NULL;
594 else if (! (*text = PyString_AsString(v)))
595 goto finally;
596 Py_DECREF(v);
597 return 1;
598
599finally:
600 Py_XDECREF(v);
601 return 0;
602}
603
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000604void
Guido van Rossum82598051997-03-05 00:20:32 +0000605PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000606{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000607 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000608 PyObject *exception, *v, *tb, *f;
609 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000610 PyErr_NormalizeException(&exception, &v, &tb);
611
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000612 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000613 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000614
Barry Warsaw36b8f941997-08-26 18:09:48 +0000615 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000616 err = Py_FlushLine();
617 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000618 if (v == NULL || v == Py_None)
619 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000620 if (PyInstance_Check(v)) {
621 /* we expect the error code to be store in the
622 `code' attribute
623 */
624 PyObject *code = PyObject_GetAttrString(v, "code");
625 if (code) {
626 Py_DECREF(v);
627 v = code;
628 }
629 /* if we failed to dig out the "code" attribute,
630 then just let the else clause below print the
631 error
632 */
633 }
Guido van Rossum82598051997-03-05 00:20:32 +0000634 if (PyInt_Check(v))
635 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000637 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000638 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000639 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000640 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000641 }
642 }
Guido van Rossum82598051997-03-05 00:20:32 +0000643 PySys_SetObject("last_type", exception);
644 PySys_SetObject("last_value", v);
645 PySys_SetObject("last_traceback", tb);
646 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000647 if (f == NULL)
648 fprintf(stderr, "lost sys.stderr\n");
649 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000650 err = Py_FlushLine();
651 fflush(stdout);
652 if (err == 0)
653 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000654 if (err == 0 &&
655 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
656 {
Guido van Rossum82598051997-03-05 00:20:32 +0000657 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000658 char *filename, *text;
659 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000660 if (!parse_syntax_error(v, &message, &filename,
661 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000662 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000663 else {
664 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000665 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000666 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000667 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000668 else
Guido van Rossum82598051997-03-05 00:20:32 +0000669 PyFile_WriteString(filename, f);
670 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000671 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000672 PyFile_WriteString(buf, f);
673 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000674 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000675 char *nl;
676 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000677 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000678 offset--;
679 for (;;) {
680 nl = strchr(text, '\n');
681 if (nl == NULL ||
682 nl-text >= offset)
683 break;
684 offset -= (nl+1-text);
685 text = nl+1;
686 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000687 while (*text == ' ' || *text == '\t') {
688 text++;
689 offset--;
690 }
Guido van Rossum82598051997-03-05 00:20:32 +0000691 PyFile_WriteString(" ", f);
692 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000693 if (*text == '\0' ||
694 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000695 PyFile_WriteString("\n", f);
696 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000697 offset--;
698 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000699 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000700 offset--;
701 }
Guido van Rossum82598051997-03-05 00:20:32 +0000702 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000703 }
Guido van Rossum82598051997-03-05 00:20:32 +0000704 Py_INCREF(message);
705 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000706 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000707 /* Can't be bothered to check all those
708 PyFile_WriteString() calls */
709 if (PyErr_Occurred())
710 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000711 }
712 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000713 if (err) {
714 /* Don't do anything else */
715 }
716 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000717 PyObject* className =
718 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000719 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000720 err = PyFile_WriteString("<unknown>", f);
721 else
722 err = PyFile_WriteObject(className, f,
723 Py_PRINT_RAW);
724 }
725 else
726 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
727 if (err == 0) {
728 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000729 PyObject *s = PyObject_Str(v);
730 /* only print colon if the str() of the
731 object is not the empty string
732 */
733 if (s && strcmp(PyString_AsString(s), ""))
734 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000735 if (err == 0)
736 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000737 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000738 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000739 if (err == 0)
740 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000741 }
Guido van Rossum82598051997-03-05 00:20:32 +0000742 Py_XDECREF(exception);
743 Py_XDECREF(v);
744 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000745 /* If an error happened here, don't show it.
746 XXX This is wrong, but too many callers rely on this behavior. */
747 if (err != 0)
748 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000749}
750
Guido van Rossum82598051997-03-05 00:20:32 +0000751PyObject *
752PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000753 char *str;
754 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000755 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000756{
Guido van Rossum82598051997-03-05 00:20:32 +0000757 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000758 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000759}
760
Guido van Rossum82598051997-03-05 00:20:32 +0000761PyObject *
762PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000763 FILE *fp;
764 char *filename;
765 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000767{
Guido van Rossum82598051997-03-05 00:20:32 +0000768 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000769 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000770}
771
Guido van Rossum82598051997-03-05 00:20:32 +0000772static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000773run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000774 node *n;
775 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000776 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000777{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 if (n == NULL)
779 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000780 return run_node(n, filename, globals, locals);
781}
782
Guido van Rossum82598051997-03-05 00:20:32 +0000783static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000784run_node(n, filename, globals, locals)
785 node *n;
786 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000787 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000788{
Guido van Rossum82598051997-03-05 00:20:32 +0000789 PyCodeObject *co;
790 PyObject *v;
791 co = PyNode_Compile(n, filename);
792 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000793 if (co == NULL)
794 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000795 v = PyEval_EvalCode(co, globals, locals);
796 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000797 return v;
798}
799
Guido van Rossum82598051997-03-05 00:20:32 +0000800static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000801run_pyc_file(fp, filename, globals, locals)
802 FILE *fp;
803 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000804 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000805{
Guido van Rossum82598051997-03-05 00:20:32 +0000806 PyCodeObject *co;
807 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000808 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000809 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000810
Guido van Rossum82598051997-03-05 00:20:32 +0000811 magic = PyMarshal_ReadLongFromFile(fp);
812 if (magic != PyImport_GetMagicNumber()) {
813 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000814 "Bad magic number in .pyc file");
815 return NULL;
816 }
Guido van Rossum82598051997-03-05 00:20:32 +0000817 (void) PyMarshal_ReadLongFromFile(fp);
818 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000819 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000820 if (v == NULL || !PyCode_Check(v)) {
821 Py_XDECREF(v);
822 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000823 "Bad code object in .pyc file");
824 return NULL;
825 }
Guido van Rossum82598051997-03-05 00:20:32 +0000826 co = (PyCodeObject *)v;
827 v = PyEval_EvalCode(co, globals, locals);
828 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000829 return v;
830}
831
Guido van Rossum82598051997-03-05 00:20:32 +0000832PyObject *
833Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000834 char *str;
835 char *filename;
836 int start;
837{
838 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000839 PyCodeObject *co;
840 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000841 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000842 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000843 co = PyNode_Compile(n, filename);
844 PyNode_Free(n);
845 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000846}
847
Guido van Rossuma110aa61994-08-29 12:50:44 +0000848/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000849
Guido van Rossuma110aa61994-08-29 12:50:44 +0000850node *
Guido van Rossum82598051997-03-05 00:20:32 +0000851PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000852 FILE *fp;
853 char *filename;
854 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000856 node *n;
857 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000858 Py_BEGIN_ALLOW_THREADS
859 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000860 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000861 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000862 if (n == NULL)
863 err_input(&err);
864 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000865}
866
Guido van Rossuma110aa61994-08-29 12:50:44 +0000867/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000868
Guido van Rossuma110aa61994-08-29 12:50:44 +0000869node *
Guido van Rossum82598051997-03-05 00:20:32 +0000870PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871 char *str;
872 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000874 node *n;
875 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000876 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000877 if (n == NULL)
878 err_input(&err);
879 return n;
880}
881
882/* Set the error appropriate to the given input error code (see errcode.h) */
883
884static void
885err_input(err)
886 perrdetail *err;
887{
Guido van Rossum82598051997-03-05 00:20:32 +0000888 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000889 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000890 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000891 err->lineno, err->offset, err->text);
892 if (err->text != NULL) {
893 free(err->text);
894 err->text = NULL;
895 }
896 switch (err->error) {
897 case E_SYNTAX:
898 msg = "invalid syntax";
899 break;
900 case E_TOKEN:
901 msg = "invalid token";
902
903 break;
904 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000905 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000906 return;
907 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000908 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000909 return;
910 case E_EOF:
911 msg = "unexpected EOF while parsing";
912 break;
913 default:
914 fprintf(stderr, "error=%d\n", err->error);
915 msg = "unknown parsing error";
916 break;
917 }
Guido van Rossum82598051997-03-05 00:20:32 +0000918 w = Py_BuildValue("(sO)", msg, v);
919 Py_XDECREF(v);
920 PyErr_SetObject(PyExc_SyntaxError, w);
921 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000922}
923
924/* Print fatal error message and abort */
925
926void
Guido van Rossum82598051997-03-05 00:20:32 +0000927Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000928 char *msg;
929{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000930 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000931#ifdef macintosh
932 for (;;);
933#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000934#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000935 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000936 OutputDebugString(msg);
937 OutputDebugString("\n");
938#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000939 abort();
940}
941
942/* Clean up and exit */
943
Guido van Rossuma110aa61994-08-29 12:50:44 +0000944#ifdef WITH_THREAD
945#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000946int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000947#endif
948
Guido van Rossum1662dd51994-09-07 14:38:28 +0000949#define NEXITFUNCS 32
950static void (*exitfuncs[NEXITFUNCS])();
951static int nexitfuncs = 0;
952
953int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000954 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000955{
956 if (nexitfuncs >= NEXITFUNCS)
957 return -1;
958 exitfuncs[nexitfuncs++] = func;
959 return 0;
960}
961
Guido van Rossumcc283f51997-08-05 02:22:03 +0000962static void
963call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000964{
Guido van Rossum82598051997-03-05 00:20:32 +0000965 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000966
967 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000968 PyObject *res;
969 Py_INCREF(exitfunc);
970 PySys_SetObject("exitfunc", (PyObject *)NULL);
971 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000972 if (res == NULL) {
973 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000974 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000975 }
Guido van Rossum82598051997-03-05 00:20:32 +0000976 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000977 }
978
Guido van Rossum82598051997-03-05 00:20:32 +0000979 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000980}
Guido van Rossum1662dd51994-09-07 14:38:28 +0000981
Guido van Rossumcc283f51997-08-05 02:22:03 +0000982static void
983call_ll_exitfuncs()
984{
Guido van Rossum1662dd51994-09-07 14:38:28 +0000985 while (nexitfuncs > 0)
986 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000987
988 fflush(stdout);
989 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000990}
991
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000992#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000993extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000994#endif
995
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000996void
Guido van Rossum82598051997-03-05 00:20:32 +0000997Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000998 int sts;
999{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001000 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001001
Jack Jansen66a89771995-10-27 13:22:14 +00001002#ifdef macintosh
1003 PyMac_Exit(sts);
1004#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001005 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001006#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001007}
1008
Guido van Rossuma110aa61994-08-29 12:50:44 +00001009#ifdef HAVE_SIGNAL_H
1010static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001011sighandler(sig)
1012 int sig;
1013{
1014 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +00001015 /* Do essential exit processing only */
1016 call_sys_exitfunc();
1017 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +00001018#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001019 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +00001020#else
1021 exit(1);
1022#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001023 /*NOTREACHED*/
1024}
1025#endif
1026
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001027static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001028initsigs()
1029{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001030 RETSIGTYPE (*t)();
1031#ifdef HAVE_SIGNAL_H
1032#ifdef SIGPIPE
1033 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001034#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001035#ifdef SIGHUP
1036 t = signal(SIGHUP, SIG_IGN);
1037 if (t == SIG_DFL)
1038 signal(SIGHUP, sighandler);
1039 else
1040 signal(SIGHUP, t);
1041#endif
1042#ifdef SIGTERM
1043 t = signal(SIGTERM, SIG_IGN);
1044 if (t == SIG_DFL)
1045 signal(SIGTERM, sighandler);
1046 else
1047 signal(SIGTERM, t);
1048#endif
1049#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001050 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001051}
1052
Guido van Rossum25ce5661997-08-02 03:10:38 +00001053static void
1054finisigs()
1055{
1056 PyOS_FiniInterrupts(); /* May imply finisignal() */
1057}
1058
Guido van Rossumaae0d321996-05-22 16:35:33 +00001059#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001060/* Ask a yes/no question */
1061
Guido van Rossum59bff391992-09-03 20:28:00 +00001062int
Guido van Rossum82598051997-03-05 00:20:32 +00001063_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001064 char *prompt;
1065{
1066 char buf[256];
1067
1068 printf("%s [ny] ", prompt);
1069 if (fgets(buf, sizeof buf, stdin) == NULL)
1070 return 0;
1071 return buf[0] == 'y' || buf[0] == 'Y';
1072}
1073#endif
1074
Guido van Rossuma110aa61994-08-29 12:50:44 +00001075#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001076
1077/* Check for file descriptor connected to interactive device.
1078 Pretend that stdin is always interactive, other files never. */
1079
1080int
1081isatty(fd)
1082 int fd;
1083{
1084 return fd == fileno(stdin);
1085}
1086
1087#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001088
1089/*
1090 * The file descriptor fd is considered ``interactive'' if either
1091 * a) isatty(fd) is TRUE, or
1092 * b) the -i flag was given, and the filename associated with
1093 * the descriptor is NULL or "<stdin>" or "???".
1094 */
1095int
1096Py_FdIsInteractive(fp, filename)
1097 FILE *fp;
1098 char *filename;
1099{
1100 if (isatty((int)fileno(fp)))
1101 return 1;
1102 if (!Py_InteractiveFlag)
1103 return 0;
1104 return (filename == NULL) ||
1105 (strcmp(filename, "<stdin>") == 0) ||
1106 (strcmp(filename, "???") == 0);
1107}