blob: dfdc711a707a1f33833bc4e23255ed1a6b5bfa54 [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));
Guido van Rossumdcc0c131997-08-29 22:32:42 +000063static void initsite Py_PROTO((void));
Guido van Rossum82598051997-03-05 00:20:32 +000064static PyObject *run_err_node Py_PROTO((node *n, char *filename,
65 PyObject *globals, PyObject *locals));
66static PyObject *run_node Py_PROTO((node *n, char *filename,
67 PyObject *globals, PyObject *locals));
68static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
69 PyObject *globals, PyObject *locals));
70static void err_input Py_PROTO((perrdetail *));
71static void initsigs Py_PROTO((void));
Guido van Rossum25ce5661997-08-02 03:10:38 +000072static void finisigs Py_PROTO((void));
Guido van Rossumcc283f51997-08-05 02:22:03 +000073static void call_sys_exitfunc Py_PROTO((void));
74static void call_ll_exitfuncs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000075
Guido van Rossum82598051997-03-05 00:20:32 +000076int Py_DebugFlag; /* Needed by parser.c */
77int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000078int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000079int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw035574d1997-08-29 22:07:17 +000080int Py_UseClassExceptionsFlag; /* Needed by bltinmodule.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000081
Guido van Rossum25ce5661997-08-02 03:10:38 +000082static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000084/* API to access the initialized flag -- useful for eroteric use */
85
86int
87Py_IsInitialized()
88{
89 return initialized;
90}
91
Guido van Rossum25ce5661997-08-02 03:10:38 +000092/* Global initializations. Can be undone by Py_Finalize(). Don't
93 call this twice without an intervening Py_Finalize() call. When
94 initializations fail, a fatal error is issued and the function does
95 not return. On return, the first thread and interpreter state have
96 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097
Guido van Rossum25ce5661997-08-02 03:10:38 +000098 Locking: you must hold the interpreter lock while calling this.
99 (If the lock has not yet been initialized, that's equivalent to
100 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000101
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000103
104void
105Py_Initialize()
106{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108 PyThreadState *tstate;
109 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000110 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000111
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000112 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000113 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000114 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000116 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
117 Py_DebugFlag = 1;
118 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
119 Py_VerboseFlag = 1;
120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 interp = PyInterpreterState_New();
122 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000124
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125 tstate = PyThreadState_New(interp);
126 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000128 (void) PyThreadState_Swap(tstate);
129
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130 interp->modules = PyDict_New();
131 if (interp->modules == NULL)
132 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000133
Barry Warsaw035574d1997-08-29 22:07:17 +0000134 bimod = _PyBuiltin_Init_1();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135 if (bimod == NULL)
136 Py_FatalError("Py_Initialize: can't initialize __builtin__");
137 interp->builtins = PyModule_GetDict(bimod);
138 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139
140 sysmod = _PySys_Init();
141 if (sysmod == NULL)
142 Py_FatalError("Py_Initialize: can't initialize sys");
143 interp->sysdict = PyModule_GetDict(sysmod);
144 Py_INCREF(interp->sysdict);
145 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyDict_SetItemString(interp->sysdict, "modules",
148 interp->modules);
149
Barry Warsaw035574d1997-08-29 22:07:17 +0000150 /* phase 2 of builtins */
151 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000152 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000153
Guido van Rossum25ce5661997-08-02 03:10:38 +0000154 _PyImport_Init();
155
156 initsigs(); /* Signal handling stuff, including initintr() */
157
158 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000159 if (!Py_NoSiteFlag)
160 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000161}
162
163/* Undo the effect of Py_Initialize().
164
165 Beware: if multiple interpreter and/or thread states exist, these
166 are not wiped out; only the current thread and interpreter state
167 are deleted. But since everything else is deleted, those other
168 interpreter and thread states should no longer be used.
169
170 (XXX We should do better, e.g. wipe out all interpreters and
171 threads.)
172
173 Locking: as above.
174
175*/
176
177void
178Py_Finalize()
179{
180 PyInterpreterState *interp;
181 PyThreadState *tstate;
182
Guido van Rossumcc283f51997-08-05 02:22:03 +0000183 call_sys_exitfunc();
184
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000185 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000186 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000187 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188
Barry Warsaw035574d1997-08-29 22:07:17 +0000189 /* We must call this before the current thread gets removed because
190 it decrefs class instances, which in turn save and restore the
191 current error state, which is a per thread data structure.
192 */
193 _PyBuiltin_Fini_1();
194
Guido van Rossum25ce5661997-08-02 03:10:38 +0000195 tstate = PyThreadState_Get();
196 interp = tstate->interp;
197
198 PyImport_Cleanup();
199 PyInterpreterState_Clear(interp);
200 PyThreadState_Swap(NULL);
201 PyInterpreterState_Delete(interp);
202
203 finisigs();
204 _PyImport_Fini();
Barry Warsaw035574d1997-08-29 22:07:17 +0000205
206 /* Now we decref the exception classes. After this point nothing
207 can raise an exception. That's okay, because each Fini() method
208 below has been checked to make sure no exceptions are ever
209 raised.
210 */
211 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000212 PyMethod_Fini();
213 PyFrame_Fini();
214 PyCFunction_Fini();
215 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000217 PyInt_Fini();
218 PyFloat_Fini();
219
220 /* XXX Still allocated:
221 - various static ad-hoc pointers to interned strings
222 - int and float free list blocks
223 - whatever various modules and libraries allocate
224 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000225
226 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000227
228 call_ll_exitfuncs();
229
230#ifdef COUNT_ALLOCS
231 dump_counts();
232#endif
233
234#ifdef Py_REF_DEBUG
235 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
236#endif
237
238#ifdef Py_TRACE_REFS
239 if (_Py_AskYesNo("Print left references?")) {
240 _Py_PrintReferences(stderr);
241 }
242 _Py_ResetReferences();
243#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244}
245
246/* Create and initialize a new interpreter and thread, and return the
247 new thread. This requires that Py_Initialize() has been called
248 first.
249
250 Unsuccessful initialization yields a NULL pointer. Note that *no*
251 exception information is available even in this case -- the
252 exception information is held in the thread, and there is no
253 thread.
254
255 Locking: as above.
256
257*/
258
259PyThreadState *
260Py_NewInterpreter()
261{
262 PyInterpreterState *interp;
263 PyThreadState *tstate, *save_tstate;
264 PyObject *bimod, *sysmod;
265
266 if (!initialized)
267 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
268
269 interp = PyInterpreterState_New();
270 if (interp == NULL)
271 return NULL;
272
273 tstate = PyThreadState_New(interp);
274 if (tstate == NULL) {
275 PyInterpreterState_Delete(interp);
276 return NULL;
277 }
278
279 save_tstate = PyThreadState_Swap(tstate);
280
281 /* XXX The following is lax in error checking */
282
283 interp->modules = PyDict_New();
284
285 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
286 if (bimod != NULL) {
287 interp->builtins = PyModule_GetDict(bimod);
288 Py_INCREF(interp->builtins);
289 }
290 sysmod = _PyImport_FindExtension("sys", "sys");
291 if (bimod != NULL && sysmod != NULL) {
292 interp->sysdict = PyModule_GetDict(sysmod);
293 Py_INCREF(interp->sysdict);
294 PySys_SetPath(Py_GetPath());
295 PyDict_SetItemString(interp->sysdict, "modules",
296 interp->modules);
297 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000298 if (!Py_NoSiteFlag)
299 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000300 }
301
302 if (!PyErr_Occurred())
303 return tstate;
304
305 /* Oops, it didn't work. Undo it all. */
306
307 PyErr_Print();
308 PyThreadState_Clear(tstate);
309 PyThreadState_Swap(save_tstate);
310 PyThreadState_Delete(tstate);
311 PyInterpreterState_Delete(interp);
312
313 return NULL;
314}
315
316/* Delete an interpreter and its last thread. This requires that the
317 given thread state is current, that the thread has no remaining
318 frames, and that it is its interpreter's only remaining thread.
319 It is a fatal error to violate these constraints.
320
321 (Py_Finalize() doesn't have these constraints -- it zaps
322 everything, regardless.)
323
324 Locking: as above.
325
326*/
327
328void
329Py_EndInterpreter(tstate)
330 PyThreadState *tstate;
331{
332 PyInterpreterState *interp = tstate->interp;
333
334 if (tstate != PyThreadState_Get())
335 Py_FatalError("Py_EndInterpreter: thread is not current");
336 if (tstate->frame != NULL)
337 Py_FatalError("Py_EndInterpreter: thread still has a frame");
338 if (tstate != interp->tstate_head || tstate->next != NULL)
339 Py_FatalError("Py_EndInterpreter: not the last thread");
340
341 PyImport_Cleanup();
342 PyInterpreterState_Clear(interp);
343 PyThreadState_Swap(NULL);
344 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000345}
346
347static char *progname = "python";
348
349void
350Py_SetProgramName(pn)
351 char *pn;
352{
353 if (pn && *pn)
354 progname = pn;
355}
356
357char *
358Py_GetProgramName()
359{
360 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000361}
362
Guido van Rossum6135a871995-01-09 17:53:26 +0000363/* Create __main__ module */
364
365static void
366initmain()
367{
Guido van Rossum82598051997-03-05 00:20:32 +0000368 PyObject *m, *d;
369 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000370 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000371 Py_FatalError("can't create __main__ module");
372 d = PyModule_GetDict(m);
373 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
374 if (PyDict_SetItemString(d, "__builtins__",
375 PyEval_GetBuiltins()))
376 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000377 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000378}
379
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000380/* Import the site module (not into __main__ though) */
381
382static void
383initsite()
384{
385 PyObject *m, *f;
386 m = PyImport_ImportModule("site");
387 if (m == NULL) {
388 f = PySys_GetObject("stderr");
389 if (Py_VerboseFlag) {
390 PyFile_WriteString(
391 "'import site' failed; traceback:\n", f);
392 PyErr_Print();
393 }
394 else {
395 PyFile_WriteString(
396 "'import site' failed; use -v for traceback\n", f);
397 PyErr_Clear();
398 }
399 }
400 else {
401 Py_DECREF(m);
402 }
403}
404
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405/* Parse input from a file and execute it */
406
407int
Guido van Rossum82598051997-03-05 00:20:32 +0000408PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000409 FILE *fp;
410 char *filename;
411{
412 if (filename == NULL)
413 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000414 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000415 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000416 else
Guido van Rossum82598051997-03-05 00:20:32 +0000417 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418}
419
420int
Guido van Rossum82598051997-03-05 00:20:32 +0000421PyRun_InteractiveLoop(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 *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000427 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000429 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
430 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431 }
Guido van Rossum82598051997-03-05 00:20:32 +0000432 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000433 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000434 PySys_SetObject("ps2", v = PyString_FromString("... "));
435 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000436 }
437 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000438 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000439#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000440 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000441#endif
442 if (ret == E_EOF)
443 return 0;
444 /*
445 if (ret == E_NOMEM)
446 return -1;
447 */
448 }
449}
450
451int
Guido van Rossum82598051997-03-05 00:20:32 +0000452PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453 FILE *fp;
454 char *filename;
455{
Guido van Rossum82598051997-03-05 00:20:32 +0000456 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000458 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000460 v = PySys_GetObject("ps1");
461 w = PySys_GetObject("ps2");
462 if (v != NULL && PyString_Check(v)) {
463 Py_INCREF(v);
464 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000465 }
466 else {
467 v = NULL;
468 ps1 = "";
469 }
Guido van Rossum82598051997-03-05 00:20:32 +0000470 if (w != NULL && PyString_Check(w)) {
471 Py_INCREF(w);
472 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000473 }
474 else {
475 w = NULL;
476 ps2 = "";
477 }
Guido van Rossum82598051997-03-05 00:20:32 +0000478 Py_BEGIN_ALLOW_THREADS
479 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000480 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000481 Py_END_ALLOW_THREADS
482 Py_XDECREF(v);
483 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000484 if (n == NULL) {
485 if (err.error == E_EOF) {
486 if (err.text)
487 free(err.text);
488 return E_EOF;
489 }
490 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000491 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000492 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493 }
Guido van Rossum82598051997-03-05 00:20:32 +0000494 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 if (m == NULL)
496 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000497 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000498 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000500 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501 return -1;
502 }
Guido van Rossum82598051997-03-05 00:20:32 +0000503 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000504 if (Py_FlushLine())
505 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506 return 0;
507}
508
509int
Guido van Rossum82598051997-03-05 00:20:32 +0000510PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511 FILE *fp;
512 char *filename;
513{
Guido van Rossum82598051997-03-05 00:20:32 +0000514 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000515 char *ext;
516
Guido van Rossum82598051997-03-05 00:20:32 +0000517 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 if (m == NULL)
519 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000520 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000521 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000522 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000523#ifdef macintosh
524 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000525 || getfiletype(filename) == 'PYC '
526 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000527#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000528 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000529 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000530 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000531 if( (fp = fopen(filename, "rb")) == NULL ) {
532 fprintf(stderr, "python: Can't reopen .pyc file\n");
533 return -1;
534 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000535 /* Turn on optimization if a .pyo file is given */
536 if (strcmp(ext, ".pyo") == 0)
537 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000538 v = run_pyc_file(fp, filename, d, d);
539 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000540 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000541 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000542 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000543 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000544 return -1;
545 }
Guido van Rossum82598051997-03-05 00:20:32 +0000546 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000547 if (Py_FlushLine())
548 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000549 return 0;
550}
551
552int
Guido van Rossum82598051997-03-05 00:20:32 +0000553PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000554 char *command;
555{
Guido van Rossum82598051997-03-05 00:20:32 +0000556 PyObject *m, *d, *v;
557 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000558 if (m == NULL)
559 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000560 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000561 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000562 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000563 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000564 return -1;
565 }
Guido van Rossum82598051997-03-05 00:20:32 +0000566 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000567 if (Py_FlushLine())
568 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000569 return 0;
570}
571
Barry Warsaw035574d1997-08-29 22:07:17 +0000572static int
573parse_syntax_error(err, message, filename, lineno, offset, text)
574 PyObject* err;
575 PyObject** message;
576 char** filename;
577 int* lineno;
578 int* offset;
579 char** text;
580{
581 long hold;
582 PyObject *v;
583
584 /* old style errors */
585 if (PyTuple_Check(err))
586 return PyArg_Parse(err, "(O(ziiz))", message, filename,
587 lineno, offset, text);
588
589 /* new style errors. `err' is an instance */
590
591 if (! (v = PyObject_GetAttrString(err, "msg")))
592 goto finally;
593 *message = v;
594
595 if (!(v = PyObject_GetAttrString(err, "filename")))
596 goto finally;
597 if (v == Py_None)
598 *filename = NULL;
599 else if (! (*filename = PyString_AsString(v)))
600 goto finally;
601
602 Py_DECREF(v);
603 if (!(v = PyObject_GetAttrString(err, "lineno")))
604 goto finally;
605 hold = PyInt_AsLong(v);
606 Py_DECREF(v);
607 v = NULL;
608 if (hold < 0 && PyErr_Occurred())
609 goto finally;
610 *lineno = (int)hold;
611
612 if (!(v = PyObject_GetAttrString(err, "offset")))
613 goto finally;
614 hold = PyInt_AsLong(v);
615 Py_DECREF(v);
616 v = NULL;
617 if (hold < 0 && PyErr_Occurred())
618 goto finally;
619 *offset = (int)hold;
620
621 if (!(v = PyObject_GetAttrString(err, "text")))
622 goto finally;
623 if (v == Py_None)
624 *text = NULL;
625 else if (! (*text = PyString_AsString(v)))
626 goto finally;
627 Py_DECREF(v);
628 return 1;
629
630finally:
631 Py_XDECREF(v);
632 return 0;
633}
634
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635void
Guido van Rossum82598051997-03-05 00:20:32 +0000636PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000637{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000638 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000639 PyObject *exception, *v, *tb, *f;
640 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000641 PyErr_NormalizeException(&exception, &v, &tb);
642
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000644 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000645
Barry Warsaw36b8f941997-08-26 18:09:48 +0000646 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000647 err = Py_FlushLine();
648 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000649 if (v == NULL || v == Py_None)
650 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000651 if (PyInstance_Check(v)) {
652 /* we expect the error code to be store in the
653 `code' attribute
654 */
655 PyObject *code = PyObject_GetAttrString(v, "code");
656 if (code) {
657 Py_DECREF(v);
658 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000659 if (v == Py_None)
660 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000661 }
662 /* if we failed to dig out the "code" attribute,
663 then just let the else clause below print the
664 error
665 */
666 }
Guido van Rossum82598051997-03-05 00:20:32 +0000667 if (PyInt_Check(v))
668 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000670 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000671 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000673 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674 }
675 }
Guido van Rossum82598051997-03-05 00:20:32 +0000676 PySys_SetObject("last_type", exception);
677 PySys_SetObject("last_value", v);
678 PySys_SetObject("last_traceback", tb);
679 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000680 if (f == NULL)
681 fprintf(stderr, "lost sys.stderr\n");
682 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000683 err = Py_FlushLine();
684 fflush(stdout);
685 if (err == 0)
686 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000687 if (err == 0 &&
688 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
689 {
Guido van Rossum82598051997-03-05 00:20:32 +0000690 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000691 char *filename, *text;
692 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000693 if (!parse_syntax_error(v, &message, &filename,
694 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000695 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000696 else {
697 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000698 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000700 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000701 else
Guido van Rossum82598051997-03-05 00:20:32 +0000702 PyFile_WriteString(filename, f);
703 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000704 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000705 PyFile_WriteString(buf, f);
706 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000707 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000708 char *nl;
709 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000710 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000711 offset--;
712 for (;;) {
713 nl = strchr(text, '\n');
714 if (nl == NULL ||
715 nl-text >= offset)
716 break;
717 offset -= (nl+1-text);
718 text = nl+1;
719 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000720 while (*text == ' ' || *text == '\t') {
721 text++;
722 offset--;
723 }
Guido van Rossum82598051997-03-05 00:20:32 +0000724 PyFile_WriteString(" ", f);
725 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000726 if (*text == '\0' ||
727 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000728 PyFile_WriteString("\n", f);
729 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000730 offset--;
731 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000732 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733 offset--;
734 }
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000736 }
Guido van Rossum82598051997-03-05 00:20:32 +0000737 Py_INCREF(message);
738 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000740 /* Can't be bothered to check all those
741 PyFile_WriteString() calls */
742 if (PyErr_Occurred())
743 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000744 }
745 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000746 if (err) {
747 /* Don't do anything else */
748 }
749 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000750 PyClassObject* exc = (PyClassObject*)exception;
751 PyObject* className = exc->cl_name;
752 PyObject* moduleName =
753 PyDict_GetItemString(exc->cl_dict, "__module__");
754
755 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000756 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000757 else {
758 char* modstr = PyString_AsString(moduleName);
759 if (modstr && strcmp(modstr, "exceptions"))
760 {
761 err = PyFile_WriteString(modstr, f);
762 err += PyFile_WriteString(".", f);
763 }
764 }
765 if (err == 0) {
766 if (className == NULL)
767 err = PyFile_WriteString("<unknown>", f);
768 else
769 err = PyFile_WriteObject(className, f,
770 Py_PRINT_RAW);
771 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000772 }
773 else
774 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
775 if (err == 0) {
776 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000777 PyObject *s = PyObject_Str(v);
778 /* only print colon if the str() of the
779 object is not the empty string
780 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000781 if (s == NULL)
782 err = -1;
783 else if (!PyString_Check(s) ||
784 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000785 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000786 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000787 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
788 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000789 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000790 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000791 if (err == 0)
792 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000793 }
Guido van Rossum82598051997-03-05 00:20:32 +0000794 Py_XDECREF(exception);
795 Py_XDECREF(v);
796 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000797 /* If an error happened here, don't show it.
798 XXX This is wrong, but too many callers rely on this behavior. */
799 if (err != 0)
800 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000801}
802
Guido van Rossum82598051997-03-05 00:20:32 +0000803PyObject *
804PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000805 char *str;
806 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000807 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000808{
Guido van Rossum82598051997-03-05 00:20:32 +0000809 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000810 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000811}
812
Guido van Rossum82598051997-03-05 00:20:32 +0000813PyObject *
814PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000815 FILE *fp;
816 char *filename;
817 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000818 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000819{
Guido van Rossum82598051997-03-05 00:20:32 +0000820 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000821 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000822}
823
Guido van Rossum82598051997-03-05 00:20:32 +0000824static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000825run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000826 node *n;
827 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000828 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000829{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000830 if (n == NULL)
831 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000832 return run_node(n, filename, globals, locals);
833}
834
Guido van Rossum82598051997-03-05 00:20:32 +0000835static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836run_node(n, filename, globals, locals)
837 node *n;
838 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000839 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000840{
Guido van Rossum82598051997-03-05 00:20:32 +0000841 PyCodeObject *co;
842 PyObject *v;
843 co = PyNode_Compile(n, filename);
844 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000845 if (co == NULL)
846 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000847 v = PyEval_EvalCode(co, globals, locals);
848 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000849 return v;
850}
851
Guido van Rossum82598051997-03-05 00:20:32 +0000852static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000853run_pyc_file(fp, filename, globals, locals)
854 FILE *fp;
855 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000856 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000857{
Guido van Rossum82598051997-03-05 00:20:32 +0000858 PyCodeObject *co;
859 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000860 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000861 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000862
Guido van Rossum82598051997-03-05 00:20:32 +0000863 magic = PyMarshal_ReadLongFromFile(fp);
864 if (magic != PyImport_GetMagicNumber()) {
865 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000866 "Bad magic number in .pyc file");
867 return NULL;
868 }
Guido van Rossum82598051997-03-05 00:20:32 +0000869 (void) PyMarshal_ReadLongFromFile(fp);
870 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000871 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000872 if (v == NULL || !PyCode_Check(v)) {
873 Py_XDECREF(v);
874 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000875 "Bad code object in .pyc file");
876 return NULL;
877 }
Guido van Rossum82598051997-03-05 00:20:32 +0000878 co = (PyCodeObject *)v;
879 v = PyEval_EvalCode(co, globals, locals);
880 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000881 return v;
882}
883
Guido van Rossum82598051997-03-05 00:20:32 +0000884PyObject *
885Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000886 char *str;
887 char *filename;
888 int start;
889{
890 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000891 PyCodeObject *co;
892 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000893 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000894 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000895 co = PyNode_Compile(n, filename);
896 PyNode_Free(n);
897 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000898}
899
Guido van Rossuma110aa61994-08-29 12:50:44 +0000900/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000901
Guido van Rossuma110aa61994-08-29 12:50:44 +0000902node *
Guido van Rossum82598051997-03-05 00:20:32 +0000903PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904 FILE *fp;
905 char *filename;
906 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000907{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000908 node *n;
909 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000910 Py_BEGIN_ALLOW_THREADS
911 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000912 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000913 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000914 if (n == NULL)
915 err_input(&err);
916 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000917}
918
Guido van Rossuma110aa61994-08-29 12:50:44 +0000919/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000920
Guido van Rossuma110aa61994-08-29 12:50:44 +0000921node *
Guido van Rossum82598051997-03-05 00:20:32 +0000922PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000923 char *str;
924 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000925{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000926 node *n;
927 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000928 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000929 if (n == NULL)
930 err_input(&err);
931 return n;
932}
933
934/* Set the error appropriate to the given input error code (see errcode.h) */
935
936static void
937err_input(err)
938 perrdetail *err;
939{
Guido van Rossum82598051997-03-05 00:20:32 +0000940 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000942 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000943 err->lineno, err->offset, err->text);
944 if (err->text != NULL) {
945 free(err->text);
946 err->text = NULL;
947 }
948 switch (err->error) {
949 case E_SYNTAX:
950 msg = "invalid syntax";
951 break;
952 case E_TOKEN:
953 msg = "invalid token";
954
955 break;
956 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000957 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000958 return;
959 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000960 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961 return;
962 case E_EOF:
963 msg = "unexpected EOF while parsing";
964 break;
965 default:
966 fprintf(stderr, "error=%d\n", err->error);
967 msg = "unknown parsing error";
968 break;
969 }
Guido van Rossum82598051997-03-05 00:20:32 +0000970 w = Py_BuildValue("(sO)", msg, v);
971 Py_XDECREF(v);
972 PyErr_SetObject(PyExc_SyntaxError, w);
973 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000974}
975
976/* Print fatal error message and abort */
977
978void
Guido van Rossum82598051997-03-05 00:20:32 +0000979Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000980 char *msg;
981{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000982 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000983#ifdef macintosh
984 for (;;);
985#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000986#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000987 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000988 OutputDebugString(msg);
989 OutputDebugString("\n");
990#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000991 abort();
992}
993
994/* Clean up and exit */
995
Guido van Rossuma110aa61994-08-29 12:50:44 +0000996#ifdef WITH_THREAD
997#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000998int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000999#endif
1000
Guido van Rossum1662dd51994-09-07 14:38:28 +00001001#define NEXITFUNCS 32
1002static void (*exitfuncs[NEXITFUNCS])();
1003static int nexitfuncs = 0;
1004
1005int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001006 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001007{
1008 if (nexitfuncs >= NEXITFUNCS)
1009 return -1;
1010 exitfuncs[nexitfuncs++] = func;
1011 return 0;
1012}
1013
Guido van Rossumcc283f51997-08-05 02:22:03 +00001014static void
1015call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001016{
Guido van Rossum82598051997-03-05 00:20:32 +00001017 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001018
1019 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001020 PyObject *res;
1021 Py_INCREF(exitfunc);
1022 PySys_SetObject("exitfunc", (PyObject *)NULL);
1023 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001024 if (res == NULL) {
1025 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001026 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001027 }
Guido van Rossum82598051997-03-05 00:20:32 +00001028 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001029 }
1030
Guido van Rossum82598051997-03-05 00:20:32 +00001031 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001032}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001033
Guido van Rossumcc283f51997-08-05 02:22:03 +00001034static void
1035call_ll_exitfuncs()
1036{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001037 while (nexitfuncs > 0)
1038 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001039
1040 fflush(stdout);
1041 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001042}
1043
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001044#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001045extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001046#endif
1047
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001048void
Guido van Rossum82598051997-03-05 00:20:32 +00001049Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001050 int sts;
1051{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001052 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001053
Jack Jansen66a89771995-10-27 13:22:14 +00001054#ifdef macintosh
1055 PyMac_Exit(sts);
1056#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001057 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001058#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001059}
1060
Guido van Rossuma110aa61994-08-29 12:50:44 +00001061#ifdef HAVE_SIGNAL_H
1062static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001063sighandler(sig)
1064 int sig;
1065{
1066 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +00001067 /* Do essential exit processing only */
1068 call_sys_exitfunc();
1069 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +00001070#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001071 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +00001072#else
1073 exit(1);
1074#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001075 /*NOTREACHED*/
1076}
1077#endif
1078
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001079static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001080initsigs()
1081{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001082 RETSIGTYPE (*t)();
1083#ifdef HAVE_SIGNAL_H
1084#ifdef SIGPIPE
1085 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001086#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001087#ifdef SIGHUP
1088 t = signal(SIGHUP, SIG_IGN);
1089 if (t == SIG_DFL)
1090 signal(SIGHUP, sighandler);
1091 else
1092 signal(SIGHUP, t);
1093#endif
1094#ifdef SIGTERM
1095 t = signal(SIGTERM, SIG_IGN);
1096 if (t == SIG_DFL)
1097 signal(SIGTERM, sighandler);
1098 else
1099 signal(SIGTERM, t);
1100#endif
1101#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001102 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001103}
1104
Guido van Rossum25ce5661997-08-02 03:10:38 +00001105static void
1106finisigs()
1107{
1108 PyOS_FiniInterrupts(); /* May imply finisignal() */
1109}
1110
Guido van Rossumaae0d321996-05-22 16:35:33 +00001111#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001112/* Ask a yes/no question */
1113
Guido van Rossum59bff391992-09-03 20:28:00 +00001114int
Guido van Rossum82598051997-03-05 00:20:32 +00001115_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001116 char *prompt;
1117{
1118 char buf[256];
1119
1120 printf("%s [ny] ", prompt);
1121 if (fgets(buf, sizeof buf, stdin) == NULL)
1122 return 0;
1123 return buf[0] == 'y' || buf[0] == 'Y';
1124}
1125#endif
1126
Guido van Rossuma110aa61994-08-29 12:50:44 +00001127#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001128
1129/* Check for file descriptor connected to interactive device.
1130 Pretend that stdin is always interactive, other files never. */
1131
1132int
1133isatty(fd)
1134 int fd;
1135{
1136 return fd == fileno(stdin);
1137}
1138
1139#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001140
1141/*
1142 * The file descriptor fd is considered ``interactive'' if either
1143 * a) isatty(fd) is TRUE, or
1144 * b) the -i flag was given, and the filename associated with
1145 * the descriptor is NULL or "<stdin>" or "???".
1146 */
1147int
1148Py_FdIsInteractive(fp, filename)
1149 FILE *fp;
1150 char *filename;
1151{
1152 if (isatty((int)fileno(fp)))
1153 return 1;
1154 if (!Py_InteractiveFlag)
1155 return 0;
1156 return (filename == NULL) ||
1157 (strcmp(filename, "<stdin>") == 0) ||
1158 (strcmp(filename, "???") == 0);
1159}