blob: 15161f8e17c4fe8d41c10b1b5bf831bf9fd90568 [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 Rossumcc283f51997-08-05 02:22:03 +000072static void call_sys_exitfunc Py_PROTO((void));
73static void call_ll_exitfuncs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000074
Guido van Rossum82598051997-03-05 00:20:32 +000075int Py_DebugFlag; /* Needed by parser.c */
76int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000077int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000078int Py_NoSiteFlag; /* Suppress 'import site' */
Guido van Rossum999e5e91997-10-03 19:46:02 +000079int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c */
Guido van Rossum3a44e1b1997-11-03 21:58:47 +000080int Py_UsingLocale = 0; /* needed by compile.c, modified by localemodule */
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__");
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000137 Py_INCREF(bimod);
138 interp->builtins = bimod;
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 */
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000151 _PyBuiltin_Init_2(PyModule_GetDict(bimod));
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
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000189 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190 tstate = PyThreadState_Get();
191 interp = tstate->interp;
192
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000193 /* Disable signal handling */
194 PyOS_FiniInterrupts();
195
196 /* Destroy PyExc_MemoryErrorInst */
197 _PyBuiltin_Fini_1();
198
199 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000201
202 /* Delete current thread
Guido van Rossum25ce5661997-08-02 03:10:38 +0000203 PyInterpreterState_Clear(interp);
204 PyThreadState_Swap(NULL);
205 PyInterpreterState_Delete(interp);
206
Guido van Rossum25ce5661997-08-02 03:10:38 +0000207 _PyImport_Fini();
Barry Warsaw035574d1997-08-29 22:07:17 +0000208
209 /* Now we decref the exception classes. After this point nothing
210 can raise an exception. That's okay, because each Fini() method
211 below has been checked to make sure no exceptions are ever
212 raised.
213 */
214 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000215 PyMethod_Fini();
216 PyFrame_Fini();
217 PyCFunction_Fini();
218 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000219 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000220 PyInt_Fini();
221 PyFloat_Fini();
222
223 /* XXX Still allocated:
224 - various static ad-hoc pointers to interned strings
225 - int and float free list blocks
226 - whatever various modules and libraries allocate
227 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000228
229 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000230
231 call_ll_exitfuncs();
232
233#ifdef COUNT_ALLOCS
234 dump_counts();
235#endif
236
237#ifdef Py_REF_DEBUG
238 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
239#endif
240
241#ifdef Py_TRACE_REFS
242 if (_Py_AskYesNo("Print left references?")) {
243 _Py_PrintReferences(stderr);
244 }
245 _Py_ResetReferences();
246#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000247}
248
249/* Create and initialize a new interpreter and thread, and return the
250 new thread. This requires that Py_Initialize() has been called
251 first.
252
253 Unsuccessful initialization yields a NULL pointer. Note that *no*
254 exception information is available even in this case -- the
255 exception information is held in the thread, and there is no
256 thread.
257
258 Locking: as above.
259
260*/
261
262PyThreadState *
263Py_NewInterpreter()
264{
265 PyInterpreterState *interp;
266 PyThreadState *tstate, *save_tstate;
267 PyObject *bimod, *sysmod;
268
269 if (!initialized)
270 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
271
272 interp = PyInterpreterState_New();
273 if (interp == NULL)
274 return NULL;
275
276 tstate = PyThreadState_New(interp);
277 if (tstate == NULL) {
278 PyInterpreterState_Delete(interp);
279 return NULL;
280 }
281
282 save_tstate = PyThreadState_Swap(tstate);
283
284 /* XXX The following is lax in error checking */
285
286 interp->modules = PyDict_New();
287
288 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
289 if (bimod != NULL) {
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000290 Py_INCREF(bimod);
291 interp->builtins = bimod;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292 }
293 sysmod = _PyImport_FindExtension("sys", "sys");
294 if (bimod != NULL && sysmod != NULL) {
295 interp->sysdict = PyModule_GetDict(sysmod);
296 Py_INCREF(interp->sysdict);
297 PySys_SetPath(Py_GetPath());
298 PyDict_SetItemString(interp->sysdict, "modules",
299 interp->modules);
300 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000301 if (!Py_NoSiteFlag)
302 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000303 }
304
305 if (!PyErr_Occurred())
306 return tstate;
307
308 /* Oops, it didn't work. Undo it all. */
309
310 PyErr_Print();
311 PyThreadState_Clear(tstate);
312 PyThreadState_Swap(save_tstate);
313 PyThreadState_Delete(tstate);
314 PyInterpreterState_Delete(interp);
315
316 return NULL;
317}
318
319/* Delete an interpreter and its last thread. This requires that the
320 given thread state is current, that the thread has no remaining
321 frames, and that it is its interpreter's only remaining thread.
322 It is a fatal error to violate these constraints.
323
324 (Py_Finalize() doesn't have these constraints -- it zaps
325 everything, regardless.)
326
327 Locking: as above.
328
329*/
330
331void
332Py_EndInterpreter(tstate)
333 PyThreadState *tstate;
334{
335 PyInterpreterState *interp = tstate->interp;
336
337 if (tstate != PyThreadState_Get())
338 Py_FatalError("Py_EndInterpreter: thread is not current");
339 if (tstate->frame != NULL)
340 Py_FatalError("Py_EndInterpreter: thread still has a frame");
341 if (tstate != interp->tstate_head || tstate->next != NULL)
342 Py_FatalError("Py_EndInterpreter: not the last thread");
343
344 PyImport_Cleanup();
345 PyInterpreterState_Clear(interp);
346 PyThreadState_Swap(NULL);
347 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000348}
349
350static char *progname = "python";
351
352void
353Py_SetProgramName(pn)
354 char *pn;
355{
356 if (pn && *pn)
357 progname = pn;
358}
359
360char *
361Py_GetProgramName()
362{
363 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000364}
365
Guido van Rossum6135a871995-01-09 17:53:26 +0000366/* Create __main__ module */
367
368static void
369initmain()
370{
Guido van Rossum82598051997-03-05 00:20:32 +0000371 PyObject *m, *d;
372 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000373 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000374 Py_FatalError("can't create __main__ module");
375 d = PyModule_GetDict(m);
376 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
377 if (PyDict_SetItemString(d, "__builtins__",
378 PyEval_GetBuiltins()))
379 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000380 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381}
382
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000383/* Import the site module (not into __main__ though) */
384
385static void
386initsite()
387{
388 PyObject *m, *f;
389 m = PyImport_ImportModule("site");
390 if (m == NULL) {
391 f = PySys_GetObject("stderr");
392 if (Py_VerboseFlag) {
393 PyFile_WriteString(
394 "'import site' failed; traceback:\n", f);
395 PyErr_Print();
396 }
397 else {
398 PyFile_WriteString(
399 "'import site' failed; use -v for traceback\n", f);
400 PyErr_Clear();
401 }
402 }
403 else {
404 Py_DECREF(m);
405 }
406}
407
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000408/* Parse input from a file and execute it */
409
410int
Guido van Rossum82598051997-03-05 00:20:32 +0000411PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 FILE *fp;
413 char *filename;
414{
415 if (filename == NULL)
416 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000417 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000418 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000419 else
Guido van Rossum82598051997-03-05 00:20:32 +0000420 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421}
422
423int
Guido van Rossum82598051997-03-05 00:20:32 +0000424PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000425 FILE *fp;
426 char *filename;
427{
Guido van Rossum82598051997-03-05 00:20:32 +0000428 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000429 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000430 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000432 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
433 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 }
Guido van Rossum82598051997-03-05 00:20:32 +0000435 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000436 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000437 PySys_SetObject("ps2", v = PyString_FromString("... "));
438 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439 }
440 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000441 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000442#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000443 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000444#endif
445 if (ret == E_EOF)
446 return 0;
447 /*
448 if (ret == E_NOMEM)
449 return -1;
450 */
451 }
452}
453
454int
Guido van Rossum82598051997-03-05 00:20:32 +0000455PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456 FILE *fp;
457 char *filename;
458{
Guido van Rossum82598051997-03-05 00:20:32 +0000459 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000461 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000463 v = PySys_GetObject("ps1");
464 w = PySys_GetObject("ps2");
465 if (v != NULL && PyString_Check(v)) {
466 Py_INCREF(v);
467 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 }
469 else {
470 v = NULL;
471 ps1 = "";
472 }
Guido van Rossum82598051997-03-05 00:20:32 +0000473 if (w != NULL && PyString_Check(w)) {
474 Py_INCREF(w);
475 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000476 }
477 else {
478 w = NULL;
479 ps2 = "";
480 }
Guido van Rossum82598051997-03-05 00:20:32 +0000481 Py_BEGIN_ALLOW_THREADS
482 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000483 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000484 Py_END_ALLOW_THREADS
485 Py_XDECREF(v);
486 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000487 if (n == NULL) {
488 if (err.error == E_EOF) {
489 if (err.text)
490 free(err.text);
491 return E_EOF;
492 }
493 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000494 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496 }
Guido van Rossum82598051997-03-05 00:20:32 +0000497 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000498 if (m == NULL)
499 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000500 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000503 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504 return -1;
505 }
Guido van Rossum82598051997-03-05 00:20:32 +0000506 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000507 if (Py_FlushLine())
508 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 return 0;
510}
511
512int
Guido van Rossum82598051997-03-05 00:20:32 +0000513PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000514 FILE *fp;
515 char *filename;
516{
Guido van Rossum82598051997-03-05 00:20:32 +0000517 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000518 char *ext;
519
Guido van Rossum82598051997-03-05 00:20:32 +0000520 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000521 if (m == NULL)
522 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000523 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000524 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000525 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000526#ifdef macintosh
527 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000528 || getfiletype(filename) == 'PYC '
529 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000530#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000531 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000532 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000533 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000534 if( (fp = fopen(filename, "rb")) == NULL ) {
535 fprintf(stderr, "python: Can't reopen .pyc file\n");
536 return -1;
537 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000538 /* Turn on optimization if a .pyo file is given */
539 if (strcmp(ext, ".pyo") == 0)
540 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000541 v = run_pyc_file(fp, filename, d, d);
542 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000543 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000544 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000546 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000547 return -1;
548 }
Guido van Rossum82598051997-03-05 00:20:32 +0000549 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000550 if (Py_FlushLine())
551 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552 return 0;
553}
554
555int
Guido van Rossum82598051997-03-05 00:20:32 +0000556PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000557 char *command;
558{
Guido van Rossum82598051997-03-05 00:20:32 +0000559 PyObject *m, *d, *v;
560 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000561 if (m == NULL)
562 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000563 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000564 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000565 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000566 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000567 return -1;
568 }
Guido van Rossum82598051997-03-05 00:20:32 +0000569 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000570 if (Py_FlushLine())
571 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 return 0;
573}
574
Barry Warsaw035574d1997-08-29 22:07:17 +0000575static int
576parse_syntax_error(err, message, filename, lineno, offset, text)
577 PyObject* err;
578 PyObject** message;
579 char** filename;
580 int* lineno;
581 int* offset;
582 char** text;
583{
584 long hold;
585 PyObject *v;
586
587 /* old style errors */
588 if (PyTuple_Check(err))
589 return PyArg_Parse(err, "(O(ziiz))", message, filename,
590 lineno, offset, text);
591
592 /* new style errors. `err' is an instance */
593
594 if (! (v = PyObject_GetAttrString(err, "msg")))
595 goto finally;
596 *message = v;
597
598 if (!(v = PyObject_GetAttrString(err, "filename")))
599 goto finally;
600 if (v == Py_None)
601 *filename = NULL;
602 else if (! (*filename = PyString_AsString(v)))
603 goto finally;
604
605 Py_DECREF(v);
606 if (!(v = PyObject_GetAttrString(err, "lineno")))
607 goto finally;
608 hold = PyInt_AsLong(v);
609 Py_DECREF(v);
610 v = NULL;
611 if (hold < 0 && PyErr_Occurred())
612 goto finally;
613 *lineno = (int)hold;
614
615 if (!(v = PyObject_GetAttrString(err, "offset")))
616 goto finally;
617 hold = PyInt_AsLong(v);
618 Py_DECREF(v);
619 v = NULL;
620 if (hold < 0 && PyErr_Occurred())
621 goto finally;
622 *offset = (int)hold;
623
624 if (!(v = PyObject_GetAttrString(err, "text")))
625 goto finally;
626 if (v == Py_None)
627 *text = NULL;
628 else if (! (*text = PyString_AsString(v)))
629 goto finally;
630 Py_DECREF(v);
631 return 1;
632
633finally:
634 Py_XDECREF(v);
635 return 0;
636}
637
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638void
Guido van Rossum82598051997-03-05 00:20:32 +0000639PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000640{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000641 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000642 PyObject *exception, *v, *tb, *f;
643 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000644 PyErr_NormalizeException(&exception, &v, &tb);
645
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000647 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000648
Barry Warsaw36b8f941997-08-26 18:09:48 +0000649 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000650 err = Py_FlushLine();
651 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000652 if (v == NULL || v == Py_None)
653 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000654 if (PyInstance_Check(v)) {
655 /* we expect the error code to be store in the
656 `code' attribute
657 */
658 PyObject *code = PyObject_GetAttrString(v, "code");
659 if (code) {
660 Py_DECREF(v);
661 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000662 if (v == Py_None)
663 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000664 }
665 /* if we failed to dig out the "code" attribute,
666 then just let the else clause below print the
667 error
668 */
669 }
Guido van Rossum82598051997-03-05 00:20:32 +0000670 if (PyInt_Check(v))
671 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000673 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000674 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000676 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 }
678 }
Guido van Rossum82598051997-03-05 00:20:32 +0000679 PySys_SetObject("last_type", exception);
680 PySys_SetObject("last_value", v);
681 PySys_SetObject("last_traceback", tb);
682 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000683 if (f == NULL)
684 fprintf(stderr, "lost sys.stderr\n");
685 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000686 err = Py_FlushLine();
687 fflush(stdout);
688 if (err == 0)
689 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000690 if (err == 0 &&
691 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
692 {
Guido van Rossum82598051997-03-05 00:20:32 +0000693 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694 char *filename, *text;
695 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000696 if (!parse_syntax_error(v, &message, &filename,
697 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000698 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699 else {
700 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000701 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000702 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000704 else
Guido van Rossum82598051997-03-05 00:20:32 +0000705 PyFile_WriteString(filename, f);
706 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000707 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000708 PyFile_WriteString(buf, f);
709 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000710 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000711 char *nl;
712 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000713 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000714 offset--;
715 for (;;) {
716 nl = strchr(text, '\n');
717 if (nl == NULL ||
718 nl-text >= offset)
719 break;
720 offset -= (nl+1-text);
721 text = nl+1;
722 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000723 while (*text == ' ' || *text == '\t') {
724 text++;
725 offset--;
726 }
Guido van Rossum82598051997-03-05 00:20:32 +0000727 PyFile_WriteString(" ", f);
728 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000729 if (*text == '\0' ||
730 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000731 PyFile_WriteString("\n", f);
732 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733 offset--;
734 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000736 offset--;
737 }
Guido van Rossum82598051997-03-05 00:20:32 +0000738 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 }
Guido van Rossum82598051997-03-05 00:20:32 +0000740 Py_INCREF(message);
741 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000743 /* Can't be bothered to check all those
744 PyFile_WriteString() calls */
745 if (PyErr_Occurred())
746 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747 }
748 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000749 if (err) {
750 /* Don't do anything else */
751 }
752 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000753 PyClassObject* exc = (PyClassObject*)exception;
754 PyObject* className = exc->cl_name;
755 PyObject* moduleName =
756 PyDict_GetItemString(exc->cl_dict, "__module__");
757
758 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000759 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000760 else {
761 char* modstr = PyString_AsString(moduleName);
762 if (modstr && strcmp(modstr, "exceptions"))
763 {
764 err = PyFile_WriteString(modstr, f);
765 err += PyFile_WriteString(".", f);
766 }
767 }
768 if (err == 0) {
769 if (className == NULL)
770 err = PyFile_WriteString("<unknown>", f);
771 else
772 err = PyFile_WriteObject(className, f,
773 Py_PRINT_RAW);
774 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000775 }
776 else
777 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
778 if (err == 0) {
779 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000780 PyObject *s = PyObject_Str(v);
781 /* only print colon if the str() of the
782 object is not the empty string
783 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000784 if (s == NULL)
785 err = -1;
786 else if (!PyString_Check(s) ||
787 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000788 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000789 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000790 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
791 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000792 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000793 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000794 if (err == 0)
795 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000796 }
Guido van Rossum82598051997-03-05 00:20:32 +0000797 Py_XDECREF(exception);
798 Py_XDECREF(v);
799 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000800 /* If an error happened here, don't show it.
801 XXX This is wrong, but too many callers rely on this behavior. */
802 if (err != 0)
803 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000804}
805
Guido van Rossum82598051997-03-05 00:20:32 +0000806PyObject *
807PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000808 char *str;
809 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000810 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000811{
Guido van Rossum82598051997-03-05 00:20:32 +0000812 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000813 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000814}
815
Guido van Rossum82598051997-03-05 00:20:32 +0000816PyObject *
817PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000818 FILE *fp;
819 char *filename;
820 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000821 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000822{
Guido van Rossum82598051997-03-05 00:20:32 +0000823 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000824 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000825}
826
Guido van Rossum82598051997-03-05 00:20:32 +0000827static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000828run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000829 node *n;
830 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000831 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000832{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000833 if (n == NULL)
834 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000835 return run_node(n, filename, globals, locals);
836}
837
Guido van Rossum82598051997-03-05 00:20:32 +0000838static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000839run_node(n, filename, globals, locals)
840 node *n;
841 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000842 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843{
Guido van Rossum82598051997-03-05 00:20:32 +0000844 PyCodeObject *co;
845 PyObject *v;
846 co = PyNode_Compile(n, filename);
847 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000848 if (co == NULL)
849 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000850 v = PyEval_EvalCode(co, globals, locals);
851 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000852 return v;
853}
854
Guido van Rossum82598051997-03-05 00:20:32 +0000855static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000856run_pyc_file(fp, filename, globals, locals)
857 FILE *fp;
858 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000859 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000860{
Guido van Rossum82598051997-03-05 00:20:32 +0000861 PyCodeObject *co;
862 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000863 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000864 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000865
Guido van Rossum82598051997-03-05 00:20:32 +0000866 magic = PyMarshal_ReadLongFromFile(fp);
867 if (magic != PyImport_GetMagicNumber()) {
868 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000869 "Bad magic number in .pyc file");
870 return NULL;
871 }
Guido van Rossum82598051997-03-05 00:20:32 +0000872 (void) PyMarshal_ReadLongFromFile(fp);
873 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000874 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000875 if (v == NULL || !PyCode_Check(v)) {
876 Py_XDECREF(v);
877 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000878 "Bad code object in .pyc file");
879 return NULL;
880 }
Guido van Rossum82598051997-03-05 00:20:32 +0000881 co = (PyCodeObject *)v;
882 v = PyEval_EvalCode(co, globals, locals);
883 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000884 return v;
885}
886
Guido van Rossum82598051997-03-05 00:20:32 +0000887PyObject *
888Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000889 char *str;
890 char *filename;
891 int start;
892{
893 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000894 PyCodeObject *co;
895 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000896 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000897 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000898 co = PyNode_Compile(n, filename);
899 PyNode_Free(n);
900 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000901}
902
Guido van Rossuma110aa61994-08-29 12:50:44 +0000903/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904
Guido van Rossuma110aa61994-08-29 12:50:44 +0000905node *
Guido van Rossum82598051997-03-05 00:20:32 +0000906PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000907 FILE *fp;
908 char *filename;
909 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000910{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000911 node *n;
912 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000913 Py_BEGIN_ALLOW_THREADS
914 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000915 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000916 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000917 if (n == NULL)
918 err_input(&err);
919 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000920}
921
Guido van Rossuma110aa61994-08-29 12:50:44 +0000922/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000923
Guido van Rossuma110aa61994-08-29 12:50:44 +0000924node *
Guido van Rossum82598051997-03-05 00:20:32 +0000925PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000926 char *str;
927 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000928{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000929 node *n;
930 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000931 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000932 if (n == NULL)
933 err_input(&err);
934 return n;
935}
936
937/* Set the error appropriate to the given input error code (see errcode.h) */
938
939static void
940err_input(err)
941 perrdetail *err;
942{
Guido van Rossum82598051997-03-05 00:20:32 +0000943 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000944 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000945 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000946 err->lineno, err->offset, err->text);
947 if (err->text != NULL) {
948 free(err->text);
949 err->text = NULL;
950 }
951 switch (err->error) {
952 case E_SYNTAX:
953 msg = "invalid syntax";
954 break;
955 case E_TOKEN:
956 msg = "invalid token";
957
958 break;
959 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000960 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961 return;
962 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000963 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964 return;
965 case E_EOF:
966 msg = "unexpected EOF while parsing";
967 break;
968 default:
969 fprintf(stderr, "error=%d\n", err->error);
970 msg = "unknown parsing error";
971 break;
972 }
Guido van Rossum82598051997-03-05 00:20:32 +0000973 w = Py_BuildValue("(sO)", msg, v);
974 Py_XDECREF(v);
975 PyErr_SetObject(PyExc_SyntaxError, w);
976 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000977}
978
979/* Print fatal error message and abort */
980
981void
Guido van Rossum82598051997-03-05 00:20:32 +0000982Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000983 char *msg;
984{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000985 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000986#ifdef macintosh
987 for (;;);
988#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000989#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000990 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000991 OutputDebugString(msg);
992 OutputDebugString("\n");
993#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000994 abort();
995}
996
997/* Clean up and exit */
998
Guido van Rossuma110aa61994-08-29 12:50:44 +0000999#ifdef WITH_THREAD
1000#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001001int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001002#endif
1003
Guido van Rossum1662dd51994-09-07 14:38:28 +00001004#define NEXITFUNCS 32
1005static void (*exitfuncs[NEXITFUNCS])();
1006static int nexitfuncs = 0;
1007
1008int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001009 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001010{
1011 if (nexitfuncs >= NEXITFUNCS)
1012 return -1;
1013 exitfuncs[nexitfuncs++] = func;
1014 return 0;
1015}
1016
Guido van Rossumcc283f51997-08-05 02:22:03 +00001017static void
1018call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001019{
Guido van Rossum82598051997-03-05 00:20:32 +00001020 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001021
1022 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001023 PyObject *res;
1024 Py_INCREF(exitfunc);
1025 PySys_SetObject("exitfunc", (PyObject *)NULL);
1026 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001027 if (res == NULL) {
1028 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001029 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001030 }
Guido van Rossum82598051997-03-05 00:20:32 +00001031 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001032 }
1033
Guido van Rossum82598051997-03-05 00:20:32 +00001034 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001035}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001036
Guido van Rossumcc283f51997-08-05 02:22:03 +00001037static void
1038call_ll_exitfuncs()
1039{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001040 while (nexitfuncs > 0)
1041 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001042
1043 fflush(stdout);
1044 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001045}
1046
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001047#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001048extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001049#endif
1050
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001051void
Guido van Rossum82598051997-03-05 00:20:32 +00001052Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001053 int sts;
1054{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001055 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001056
Jack Jansen66a89771995-10-27 13:22:14 +00001057#ifdef macintosh
1058 PyMac_Exit(sts);
1059#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001060 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001061#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001062}
1063
Guido van Rossuma110aa61994-08-29 12:50:44 +00001064#ifdef HAVE_SIGNAL_H
1065static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001066sighandler(sig)
1067 int sig;
1068{
1069 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +00001070 /* Do essential exit processing only */
1071 call_sys_exitfunc();
1072 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +00001073#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001074 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +00001075#else
1076 exit(1);
1077#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001078 /*NOTREACHED*/
1079}
1080#endif
1081
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001082static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001083initsigs()
1084{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001085 RETSIGTYPE (*t)();
1086#ifdef HAVE_SIGNAL_H
1087#ifdef SIGPIPE
1088 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001089#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001090#ifdef SIGHUP
1091 t = signal(SIGHUP, SIG_IGN);
1092 if (t == SIG_DFL)
1093 signal(SIGHUP, sighandler);
1094 else
1095 signal(SIGHUP, t);
1096#endif
1097#ifdef SIGTERM
1098 t = signal(SIGTERM, SIG_IGN);
1099 if (t == SIG_DFL)
1100 signal(SIGTERM, sighandler);
1101 else
1102 signal(SIGTERM, t);
1103#endif
1104#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001105 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001106}
1107
Guido van Rossumaae0d321996-05-22 16:35:33 +00001108#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001109/* Ask a yes/no question */
1110
Guido van Rossum59bff391992-09-03 20:28:00 +00001111int
Guido van Rossum82598051997-03-05 00:20:32 +00001112_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001113 char *prompt;
1114{
1115 char buf[256];
1116
1117 printf("%s [ny] ", prompt);
1118 if (fgets(buf, sizeof buf, stdin) == NULL)
1119 return 0;
1120 return buf[0] == 'y' || buf[0] == 'Y';
1121}
1122#endif
1123
Guido van Rossuma110aa61994-08-29 12:50:44 +00001124#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001125
1126/* Check for file descriptor connected to interactive device.
1127 Pretend that stdin is always interactive, other files never. */
1128
1129int
1130isatty(fd)
1131 int fd;
1132{
1133 return fd == fileno(stdin);
1134}
1135
1136#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001137
1138/*
1139 * The file descriptor fd is considered ``interactive'' if either
1140 * a) isatty(fd) is TRUE, or
1141 * b) the -i flag was given, and the filename associated with
1142 * the descriptor is NULL or "<stdin>" or "???".
1143 */
1144int
1145Py_FdIsInteractive(fp, filename)
1146 FILE *fp;
1147 char *filename;
1148{
1149 if (isatty((int)fileno(fp)))
1150 return 1;
1151 if (!Py_InteractiveFlag)
1152 return 0;
1153 return (filename == NULL) ||
1154 (strcmp(filename, "<stdin>") == 0) ||
1155 (strcmp(filename, "???") == 0);
1156}