blob: 63646161eafa4ea8557754de8adf0b56da6c8505 [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);
139 _PyImport_FixupExtension("__builtin__", "__builtin__");
140
141 sysmod = _PySys_Init();
142 if (sysmod == NULL)
143 Py_FatalError("Py_Initialize: can't initialize sys");
144 interp->sysdict = PyModule_GetDict(sysmod);
145 Py_INCREF(interp->sysdict);
146 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000147 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000148 PyDict_SetItemString(interp->sysdict, "modules",
149 interp->modules);
150
Barry Warsaw035574d1997-08-29 22:07:17 +0000151 /* phase 2 of builtins */
152 _PyBuiltin_Init_2(interp->builtins);
153
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;
659 }
660 /* if we failed to dig out the "code" attribute,
661 then just let the else clause below print the
662 error
663 */
664 }
Guido van Rossum82598051997-03-05 00:20:32 +0000665 if (PyInt_Check(v))
666 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000668 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000669 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000671 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 }
673 }
Guido van Rossum82598051997-03-05 00:20:32 +0000674 PySys_SetObject("last_type", exception);
675 PySys_SetObject("last_value", v);
676 PySys_SetObject("last_traceback", tb);
677 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000678 if (f == NULL)
679 fprintf(stderr, "lost sys.stderr\n");
680 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000681 err = Py_FlushLine();
682 fflush(stdout);
683 if (err == 0)
684 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000685 if (err == 0 &&
686 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
687 {
Guido van Rossum82598051997-03-05 00:20:32 +0000688 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000689 char *filename, *text;
690 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000691 if (!parse_syntax_error(v, &message, &filename,
692 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000693 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694 else {
695 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000696 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000697 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000698 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699 else
Guido van Rossum82598051997-03-05 00:20:32 +0000700 PyFile_WriteString(filename, f);
701 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000702 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyFile_WriteString(buf, f);
704 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000705 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000706 char *nl;
707 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000708 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000709 offset--;
710 for (;;) {
711 nl = strchr(text, '\n');
712 if (nl == NULL ||
713 nl-text >= offset)
714 break;
715 offset -= (nl+1-text);
716 text = nl+1;
717 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000718 while (*text == ' ' || *text == '\t') {
719 text++;
720 offset--;
721 }
Guido van Rossum82598051997-03-05 00:20:32 +0000722 PyFile_WriteString(" ", f);
723 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000724 if (*text == '\0' ||
725 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000726 PyFile_WriteString("\n", f);
727 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000728 offset--;
729 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000730 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000731 offset--;
732 }
Guido van Rossum82598051997-03-05 00:20:32 +0000733 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734 }
Guido van Rossum82598051997-03-05 00:20:32 +0000735 Py_INCREF(message);
736 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000737 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000738 /* Can't be bothered to check all those
739 PyFile_WriteString() calls */
740 if (PyErr_Occurred())
741 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742 }
743 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000744 if (err) {
745 /* Don't do anything else */
746 }
747 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000748 PyClassObject* exc = (PyClassObject*)exception;
749 PyObject* className = exc->cl_name;
750 PyObject* moduleName =
751 PyDict_GetItemString(exc->cl_dict, "__module__");
752
753 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000754 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000755 else {
756 char* modstr = PyString_AsString(moduleName);
757 if (modstr && strcmp(modstr, "exceptions"))
758 {
759 err = PyFile_WriteString(modstr, f);
760 err += PyFile_WriteString(".", f);
761 }
762 }
763 if (err == 0) {
764 if (className == NULL)
765 err = PyFile_WriteString("<unknown>", f);
766 else
767 err = PyFile_WriteObject(className, f,
768 Py_PRINT_RAW);
769 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000770 }
771 else
772 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
773 if (err == 0) {
774 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000775 PyObject *s = PyObject_Str(v);
776 /* only print colon if the str() of the
777 object is not the empty string
778 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000779 if (s == NULL)
780 err = -1;
781 else if (!PyString_Check(s) ||
782 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000783 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000784 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000785 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
786 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000787 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000788 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000789 if (err == 0)
790 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000791 }
Guido van Rossum82598051997-03-05 00:20:32 +0000792 Py_XDECREF(exception);
793 Py_XDECREF(v);
794 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000795 /* If an error happened here, don't show it.
796 XXX This is wrong, but too many callers rely on this behavior. */
797 if (err != 0)
798 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000799}
800
Guido van Rossum82598051997-03-05 00:20:32 +0000801PyObject *
802PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000803 char *str;
804 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000805 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000806{
Guido van Rossum82598051997-03-05 00:20:32 +0000807 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000808 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000809}
810
Guido van Rossum82598051997-03-05 00:20:32 +0000811PyObject *
812PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000813 FILE *fp;
814 char *filename;
815 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000816 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000817{
Guido van Rossum82598051997-03-05 00:20:32 +0000818 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000819 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000820}
821
Guido van Rossum82598051997-03-05 00:20:32 +0000822static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000823run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000824 node *n;
825 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000826 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000827{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000828 if (n == NULL)
829 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000830 return run_node(n, filename, globals, locals);
831}
832
Guido van Rossum82598051997-03-05 00:20:32 +0000833static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000834run_node(n, filename, globals, locals)
835 node *n;
836 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000837 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000838{
Guido van Rossum82598051997-03-05 00:20:32 +0000839 PyCodeObject *co;
840 PyObject *v;
841 co = PyNode_Compile(n, filename);
842 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843 if (co == NULL)
844 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000845 v = PyEval_EvalCode(co, globals, locals);
846 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847 return v;
848}
849
Guido van Rossum82598051997-03-05 00:20:32 +0000850static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000851run_pyc_file(fp, filename, globals, locals)
852 FILE *fp;
853 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000854 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000855{
Guido van Rossum82598051997-03-05 00:20:32 +0000856 PyCodeObject *co;
857 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000858 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000859 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000860
Guido van Rossum82598051997-03-05 00:20:32 +0000861 magic = PyMarshal_ReadLongFromFile(fp);
862 if (magic != PyImport_GetMagicNumber()) {
863 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000864 "Bad magic number in .pyc file");
865 return NULL;
866 }
Guido van Rossum82598051997-03-05 00:20:32 +0000867 (void) PyMarshal_ReadLongFromFile(fp);
868 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000869 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000870 if (v == NULL || !PyCode_Check(v)) {
871 Py_XDECREF(v);
872 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000873 "Bad code object in .pyc file");
874 return NULL;
875 }
Guido van Rossum82598051997-03-05 00:20:32 +0000876 co = (PyCodeObject *)v;
877 v = PyEval_EvalCode(co, globals, locals);
878 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000879 return v;
880}
881
Guido van Rossum82598051997-03-05 00:20:32 +0000882PyObject *
883Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000884 char *str;
885 char *filename;
886 int start;
887{
888 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000889 PyCodeObject *co;
890 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000891 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000892 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000893 co = PyNode_Compile(n, filename);
894 PyNode_Free(n);
895 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000896}
897
Guido van Rossuma110aa61994-08-29 12:50:44 +0000898/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000899
Guido van Rossuma110aa61994-08-29 12:50:44 +0000900node *
Guido van Rossum82598051997-03-05 00:20:32 +0000901PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000902 FILE *fp;
903 char *filename;
904 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000905{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000906 node *n;
907 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000908 Py_BEGIN_ALLOW_THREADS
909 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000910 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000911 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000912 if (n == NULL)
913 err_input(&err);
914 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000915}
916
Guido van Rossuma110aa61994-08-29 12:50:44 +0000917/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000918
Guido van Rossuma110aa61994-08-29 12:50:44 +0000919node *
Guido van Rossum82598051997-03-05 00:20:32 +0000920PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000921 char *str;
922 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000923{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000924 node *n;
925 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000926 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000927 if (n == NULL)
928 err_input(&err);
929 return n;
930}
931
932/* Set the error appropriate to the given input error code (see errcode.h) */
933
934static void
935err_input(err)
936 perrdetail *err;
937{
Guido van Rossum82598051997-03-05 00:20:32 +0000938 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000939 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000940 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 err->lineno, err->offset, err->text);
942 if (err->text != NULL) {
943 free(err->text);
944 err->text = NULL;
945 }
946 switch (err->error) {
947 case E_SYNTAX:
948 msg = "invalid syntax";
949 break;
950 case E_TOKEN:
951 msg = "invalid token";
952
953 break;
954 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000955 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000956 return;
957 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000958 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000959 return;
960 case E_EOF:
961 msg = "unexpected EOF while parsing";
962 break;
963 default:
964 fprintf(stderr, "error=%d\n", err->error);
965 msg = "unknown parsing error";
966 break;
967 }
Guido van Rossum82598051997-03-05 00:20:32 +0000968 w = Py_BuildValue("(sO)", msg, v);
969 Py_XDECREF(v);
970 PyErr_SetObject(PyExc_SyntaxError, w);
971 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000972}
973
974/* Print fatal error message and abort */
975
976void
Guido van Rossum82598051997-03-05 00:20:32 +0000977Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000978 char *msg;
979{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000980 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000981#ifdef macintosh
982 for (;;);
983#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000984#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000985 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000986 OutputDebugString(msg);
987 OutputDebugString("\n");
988#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000989 abort();
990}
991
992/* Clean up and exit */
993
Guido van Rossuma110aa61994-08-29 12:50:44 +0000994#ifdef WITH_THREAD
995#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000996int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000997#endif
998
Guido van Rossum1662dd51994-09-07 14:38:28 +0000999#define NEXITFUNCS 32
1000static void (*exitfuncs[NEXITFUNCS])();
1001static int nexitfuncs = 0;
1002
1003int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001004 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001005{
1006 if (nexitfuncs >= NEXITFUNCS)
1007 return -1;
1008 exitfuncs[nexitfuncs++] = func;
1009 return 0;
1010}
1011
Guido van Rossumcc283f51997-08-05 02:22:03 +00001012static void
1013call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001014{
Guido van Rossum82598051997-03-05 00:20:32 +00001015 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001016
1017 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001018 PyObject *res;
1019 Py_INCREF(exitfunc);
1020 PySys_SetObject("exitfunc", (PyObject *)NULL);
1021 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001022 if (res == NULL) {
1023 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001024 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001025 }
Guido van Rossum82598051997-03-05 00:20:32 +00001026 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001027 }
1028
Guido van Rossum82598051997-03-05 00:20:32 +00001029 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001030}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001031
Guido van Rossumcc283f51997-08-05 02:22:03 +00001032static void
1033call_ll_exitfuncs()
1034{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001035 while (nexitfuncs > 0)
1036 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001037
1038 fflush(stdout);
1039 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001040}
1041
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001042#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001043extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001044#endif
1045
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001046void
Guido van Rossum82598051997-03-05 00:20:32 +00001047Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001048 int sts;
1049{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001050 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001051
Jack Jansen66a89771995-10-27 13:22:14 +00001052#ifdef macintosh
1053 PyMac_Exit(sts);
1054#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001055 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001056#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001057}
1058
Guido van Rossuma110aa61994-08-29 12:50:44 +00001059#ifdef HAVE_SIGNAL_H
1060static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001061sighandler(sig)
1062 int sig;
1063{
1064 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +00001065 /* Do essential exit processing only */
1066 call_sys_exitfunc();
1067 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +00001068#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001069 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +00001070#else
1071 exit(1);
1072#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001073 /*NOTREACHED*/
1074}
1075#endif
1076
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001077static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001078initsigs()
1079{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001080 RETSIGTYPE (*t)();
1081#ifdef HAVE_SIGNAL_H
1082#ifdef SIGPIPE
1083 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001084#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001085#ifdef SIGHUP
1086 t = signal(SIGHUP, SIG_IGN);
1087 if (t == SIG_DFL)
1088 signal(SIGHUP, sighandler);
1089 else
1090 signal(SIGHUP, t);
1091#endif
1092#ifdef SIGTERM
1093 t = signal(SIGTERM, SIG_IGN);
1094 if (t == SIG_DFL)
1095 signal(SIGTERM, sighandler);
1096 else
1097 signal(SIGTERM, t);
1098#endif
1099#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001100 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001101}
1102
Guido van Rossum25ce5661997-08-02 03:10:38 +00001103static void
1104finisigs()
1105{
1106 PyOS_FiniInterrupts(); /* May imply finisignal() */
1107}
1108
Guido van Rossumaae0d321996-05-22 16:35:33 +00001109#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001110/* Ask a yes/no question */
1111
Guido van Rossum59bff391992-09-03 20:28:00 +00001112int
Guido van Rossum82598051997-03-05 00:20:32 +00001113_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001114 char *prompt;
1115{
1116 char buf[256];
1117
1118 printf("%s [ny] ", prompt);
1119 if (fgets(buf, sizeof buf, stdin) == NULL)
1120 return 0;
1121 return buf[0] == 'y' || buf[0] == 'Y';
1122}
1123#endif
1124
Guido van Rossuma110aa61994-08-29 12:50:44 +00001125#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001126
1127/* Check for file descriptor connected to interactive device.
1128 Pretend that stdin is always interactive, other files never. */
1129
1130int
1131isatty(fd)
1132 int fd;
1133{
1134 return fd == fileno(stdin);
1135}
1136
1137#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001138
1139/*
1140 * The file descriptor fd is considered ``interactive'' if either
1141 * a) isatty(fd) is TRUE, or
1142 * b) the -i flag was given, and the filename associated with
1143 * the descriptor is NULL or "<stdin>" or "???".
1144 */
1145int
1146Py_FdIsInteractive(fp, filename)
1147 FILE *fp;
1148 char *filename;
1149{
1150 if (isatty((int)fileno(fp)))
1151 return 1;
1152 if (!Py_InteractiveFlag)
1153 return 0;
1154 return (filename == NULL) ||
1155 (strcmp(filename, "<stdin>") == 0) ||
1156 (strcmp(filename, "???") == 0);
1157}