blob: 610ec7a1f50ba9a461493cf3dc695a7122368590 [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)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000748 PyObject* className =
749 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000750 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000751 err = PyFile_WriteString("<unknown>", f);
752 else
753 err = PyFile_WriteObject(className, f,
754 Py_PRINT_RAW);
755 }
756 else
757 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
758 if (err == 0) {
759 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000760 PyObject *s = PyObject_Str(v);
761 /* only print colon if the str() of the
762 object is not the empty string
763 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000764 if (s == NULL)
765 err = -1;
766 else if (!PyString_Check(s) ||
767 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000768 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000769 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000770 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
771 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000772 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000773 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000774 if (err == 0)
775 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000776 }
Guido van Rossum82598051997-03-05 00:20:32 +0000777 Py_XDECREF(exception);
778 Py_XDECREF(v);
779 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000780 /* If an error happened here, don't show it.
781 XXX This is wrong, but too many callers rely on this behavior. */
782 if (err != 0)
783 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000784}
785
Guido van Rossum82598051997-03-05 00:20:32 +0000786PyObject *
787PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000788 char *str;
789 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000790 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000791{
Guido van Rossum82598051997-03-05 00:20:32 +0000792 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000793 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000794}
795
Guido van Rossum82598051997-03-05 00:20:32 +0000796PyObject *
797PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000798 FILE *fp;
799 char *filename;
800 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000801 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000802{
Guido van Rossum82598051997-03-05 00:20:32 +0000803 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000804 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000805}
806
Guido van Rossum82598051997-03-05 00:20:32 +0000807static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000808run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000809 node *n;
810 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000811 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000812{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000813 if (n == NULL)
814 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000815 return run_node(n, filename, globals, locals);
816}
817
Guido van Rossum82598051997-03-05 00:20:32 +0000818static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000819run_node(n, filename, globals, locals)
820 node *n;
821 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000822 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000823{
Guido van Rossum82598051997-03-05 00:20:32 +0000824 PyCodeObject *co;
825 PyObject *v;
826 co = PyNode_Compile(n, filename);
827 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000828 if (co == NULL)
829 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000830 v = PyEval_EvalCode(co, globals, locals);
831 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000832 return v;
833}
834
Guido van Rossum82598051997-03-05 00:20:32 +0000835static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000836run_pyc_file(fp, filename, globals, locals)
837 FILE *fp;
838 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000839 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000840{
Guido van Rossum82598051997-03-05 00:20:32 +0000841 PyCodeObject *co;
842 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000843 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000844 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000845
Guido van Rossum82598051997-03-05 00:20:32 +0000846 magic = PyMarshal_ReadLongFromFile(fp);
847 if (magic != PyImport_GetMagicNumber()) {
848 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000849 "Bad magic number in .pyc file");
850 return NULL;
851 }
Guido van Rossum82598051997-03-05 00:20:32 +0000852 (void) PyMarshal_ReadLongFromFile(fp);
853 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000854 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000855 if (v == NULL || !PyCode_Check(v)) {
856 Py_XDECREF(v);
857 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000858 "Bad code object in .pyc file");
859 return NULL;
860 }
Guido van Rossum82598051997-03-05 00:20:32 +0000861 co = (PyCodeObject *)v;
862 v = PyEval_EvalCode(co, globals, locals);
863 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000864 return v;
865}
866
Guido van Rossum82598051997-03-05 00:20:32 +0000867PyObject *
868Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000869 char *str;
870 char *filename;
871 int start;
872{
873 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000874 PyCodeObject *co;
875 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000876 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000877 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000878 co = PyNode_Compile(n, filename);
879 PyNode_Free(n);
880 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000881}
882
Guido van Rossuma110aa61994-08-29 12:50:44 +0000883/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884
Guido van Rossuma110aa61994-08-29 12:50:44 +0000885node *
Guido van Rossum82598051997-03-05 00:20:32 +0000886PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000887 FILE *fp;
888 char *filename;
889 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000890{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000891 node *n;
892 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000893 Py_BEGIN_ALLOW_THREADS
894 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000895 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000896 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000897 if (n == NULL)
898 err_input(&err);
899 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000900}
901
Guido van Rossuma110aa61994-08-29 12:50:44 +0000902/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000903
Guido van Rossuma110aa61994-08-29 12:50:44 +0000904node *
Guido van Rossum82598051997-03-05 00:20:32 +0000905PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000906 char *str;
907 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000908{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000909 node *n;
910 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000911 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000912 if (n == NULL)
913 err_input(&err);
914 return n;
915}
916
917/* Set the error appropriate to the given input error code (see errcode.h) */
918
919static void
920err_input(err)
921 perrdetail *err;
922{
Guido van Rossum82598051997-03-05 00:20:32 +0000923 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000924 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000925 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000926 err->lineno, err->offset, err->text);
927 if (err->text != NULL) {
928 free(err->text);
929 err->text = NULL;
930 }
931 switch (err->error) {
932 case E_SYNTAX:
933 msg = "invalid syntax";
934 break;
935 case E_TOKEN:
936 msg = "invalid token";
937
938 break;
939 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000940 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 return;
942 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000943 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000944 return;
945 case E_EOF:
946 msg = "unexpected EOF while parsing";
947 break;
948 default:
949 fprintf(stderr, "error=%d\n", err->error);
950 msg = "unknown parsing error";
951 break;
952 }
Guido van Rossum82598051997-03-05 00:20:32 +0000953 w = Py_BuildValue("(sO)", msg, v);
954 Py_XDECREF(v);
955 PyErr_SetObject(PyExc_SyntaxError, w);
956 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000957}
958
959/* Print fatal error message and abort */
960
961void
Guido van Rossum82598051997-03-05 00:20:32 +0000962Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000963 char *msg;
964{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000965 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000966#ifdef macintosh
967 for (;;);
968#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000969#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000970 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000971 OutputDebugString(msg);
972 OutputDebugString("\n");
973#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000974 abort();
975}
976
977/* Clean up and exit */
978
Guido van Rossuma110aa61994-08-29 12:50:44 +0000979#ifdef WITH_THREAD
980#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000981int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000982#endif
983
Guido van Rossum1662dd51994-09-07 14:38:28 +0000984#define NEXITFUNCS 32
985static void (*exitfuncs[NEXITFUNCS])();
986static int nexitfuncs = 0;
987
988int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000989 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000990{
991 if (nexitfuncs >= NEXITFUNCS)
992 return -1;
993 exitfuncs[nexitfuncs++] = func;
994 return 0;
995}
996
Guido van Rossumcc283f51997-08-05 02:22:03 +0000997static void
998call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000999{
Guido van Rossum82598051997-03-05 00:20:32 +00001000 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001001
1002 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001003 PyObject *res;
1004 Py_INCREF(exitfunc);
1005 PySys_SetObject("exitfunc", (PyObject *)NULL);
1006 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001007 if (res == NULL) {
1008 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001009 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001010 }
Guido van Rossum82598051997-03-05 00:20:32 +00001011 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001012 }
1013
Guido van Rossum82598051997-03-05 00:20:32 +00001014 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001015}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001016
Guido van Rossumcc283f51997-08-05 02:22:03 +00001017static void
1018call_ll_exitfuncs()
1019{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001020 while (nexitfuncs > 0)
1021 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001022
1023 fflush(stdout);
1024 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001025}
1026
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001027#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001028extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001029#endif
1030
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001031void
Guido van Rossum82598051997-03-05 00:20:32 +00001032Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001033 int sts;
1034{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001035 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001036
Jack Jansen66a89771995-10-27 13:22:14 +00001037#ifdef macintosh
1038 PyMac_Exit(sts);
1039#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001040 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001041#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001042}
1043
Guido van Rossuma110aa61994-08-29 12:50:44 +00001044#ifdef HAVE_SIGNAL_H
1045static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001046sighandler(sig)
1047 int sig;
1048{
1049 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +00001050 /* Do essential exit processing only */
1051 call_sys_exitfunc();
1052 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +00001053#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001054 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +00001055#else
1056 exit(1);
1057#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001058 /*NOTREACHED*/
1059}
1060#endif
1061
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001062static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001063initsigs()
1064{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001065 RETSIGTYPE (*t)();
1066#ifdef HAVE_SIGNAL_H
1067#ifdef SIGPIPE
1068 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001069#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001070#ifdef SIGHUP
1071 t = signal(SIGHUP, SIG_IGN);
1072 if (t == SIG_DFL)
1073 signal(SIGHUP, sighandler);
1074 else
1075 signal(SIGHUP, t);
1076#endif
1077#ifdef SIGTERM
1078 t = signal(SIGTERM, SIG_IGN);
1079 if (t == SIG_DFL)
1080 signal(SIGTERM, sighandler);
1081 else
1082 signal(SIGTERM, t);
1083#endif
1084#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001085 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001086}
1087
Guido van Rossum25ce5661997-08-02 03:10:38 +00001088static void
1089finisigs()
1090{
1091 PyOS_FiniInterrupts(); /* May imply finisignal() */
1092}
1093
Guido van Rossumaae0d321996-05-22 16:35:33 +00001094#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001095/* Ask a yes/no question */
1096
Guido van Rossum59bff391992-09-03 20:28:00 +00001097int
Guido van Rossum82598051997-03-05 00:20:32 +00001098_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001099 char *prompt;
1100{
1101 char buf[256];
1102
1103 printf("%s [ny] ", prompt);
1104 if (fgets(buf, sizeof buf, stdin) == NULL)
1105 return 0;
1106 return buf[0] == 'y' || buf[0] == 'Y';
1107}
1108#endif
1109
Guido van Rossuma110aa61994-08-29 12:50:44 +00001110#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001111
1112/* Check for file descriptor connected to interactive device.
1113 Pretend that stdin is always interactive, other files never. */
1114
1115int
1116isatty(fd)
1117 int fd;
1118{
1119 return fd == fileno(stdin);
1120}
1121
1122#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001123
1124/*
1125 * The file descriptor fd is considered ``interactive'' if either
1126 * a) isatty(fd) is TRUE, or
1127 * b) the -i flag was given, and the filename associated with
1128 * the descriptor is NULL or "<stdin>" or "???".
1129 */
1130int
1131Py_FdIsInteractive(fp, filename)
1132 FILE *fp;
1133 char *filename;
1134{
1135 if (isatty((int)fileno(fp)))
1136 return 1;
1137 if (!Py_InteractiveFlag)
1138 return 0;
1139 return (filename == NULL) ||
1140 (strcmp(filename, "<stdin>") == 0) ||
1141 (strcmp(filename, "???") == 0);
1142}