blob: 381c98749ee08091e68d158ee1341ba4328bed11 [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 Rossum1984f1e1992-08-04 12:41:02 +000080
Guido van Rossum25ce5661997-08-02 03:10:38 +000081static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000083/* API to access the initialized flag -- useful for eroteric use */
84
85int
86Py_IsInitialized()
87{
88 return initialized;
89}
90
Guido van Rossum25ce5661997-08-02 03:10:38 +000091/* Global initializations. Can be undone by Py_Finalize(). Don't
92 call this twice without an intervening Py_Finalize() call. When
93 initializations fail, a fatal error is issued and the function does
94 not return. On return, the first thread and interpreter state have
95 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000096
Guido van Rossum25ce5661997-08-02 03:10:38 +000097 Locking: you must hold the interpreter lock while calling this.
98 (If the lock has not yet been initialized, that's equivalent to
99 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000100
Guido van Rossum25ce5661997-08-02 03:10:38 +0000101*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102
103void
104Py_Initialize()
105{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000106 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000107 PyThreadState *tstate;
108 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000110
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000111 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000112 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000113 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000115 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
116 Py_DebugFlag = 1;
117 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
118 Py_VerboseFlag = 1;
119
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120 interp = PyInterpreterState_New();
121 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000123
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 tstate = PyThreadState_New(interp);
125 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127 (void) PyThreadState_Swap(tstate);
128
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129 interp->modules = PyDict_New();
130 if (interp->modules == NULL)
131 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000132
Barry Warsaw035574d1997-08-29 22:07:17 +0000133 bimod = _PyBuiltin_Init_1();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134 if (bimod == NULL)
135 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000136 interp->builtins = PyModule_GetDict(bimod);
137 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000138
139 sysmod = _PySys_Init();
140 if (sysmod == NULL)
141 Py_FatalError("Py_Initialize: can't initialize sys");
142 interp->sysdict = PyModule_GetDict(sysmod);
143 Py_INCREF(interp->sysdict);
144 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000146 PyDict_SetItemString(interp->sysdict, "modules",
147 interp->modules);
148
Barry Warsaw035574d1997-08-29 22:07:17 +0000149 /* phase 2 of builtins */
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000150 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000151 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000152
Guido van Rossum25ce5661997-08-02 03:10:38 +0000153 _PyImport_Init();
154
155 initsigs(); /* Signal handling stuff, including initintr() */
156
157 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000158 if (!Py_NoSiteFlag)
159 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160}
161
162/* Undo the effect of Py_Initialize().
163
164 Beware: if multiple interpreter and/or thread states exist, these
165 are not wiped out; only the current thread and interpreter state
166 are deleted. But since everything else is deleted, those other
167 interpreter and thread states should no longer be used.
168
169 (XXX We should do better, e.g. wipe out all interpreters and
170 threads.)
171
172 Locking: as above.
173
174*/
175
176void
177Py_Finalize()
178{
179 PyInterpreterState *interp;
180 PyThreadState *tstate;
181
Guido van Rossumcc283f51997-08-05 02:22:03 +0000182 call_sys_exitfunc();
183
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000184 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000185 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000186 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000188 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189 tstate = PyThreadState_Get();
190 interp = tstate->interp;
191
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000192 /* Disable signal handling */
193 PyOS_FiniInterrupts();
194
195 /* Destroy PyExc_MemoryErrorInst */
196 _PyBuiltin_Fini_1();
197
198 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000200
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000201 /* Delete current thread */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 PyInterpreterState_Clear(interp);
203 PyThreadState_Swap(NULL);
204 PyInterpreterState_Delete(interp);
205
Guido van Rossum25ce5661997-08-02 03:10:38 +0000206 _PyImport_Fini();
Barry Warsaw035574d1997-08-29 22:07:17 +0000207
208 /* Now we decref the exception classes. After this point nothing
209 can raise an exception. That's okay, because each Fini() method
210 below has been checked to make sure no exceptions are ever
211 raised.
212 */
213 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000214 PyMethod_Fini();
215 PyFrame_Fini();
216 PyCFunction_Fini();
217 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000218 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000219 PyInt_Fini();
220 PyFloat_Fini();
221
222 /* XXX Still allocated:
223 - various static ad-hoc pointers to interned strings
224 - int and float free list blocks
225 - whatever various modules and libraries allocate
226 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000227
228 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000229
230 call_ll_exitfuncs();
231
232#ifdef COUNT_ALLOCS
233 dump_counts();
234#endif
235
236#ifdef Py_REF_DEBUG
237 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
238#endif
239
240#ifdef Py_TRACE_REFS
241 if (_Py_AskYesNo("Print left references?")) {
242 _Py_PrintReferences(stderr);
243 }
244 _Py_ResetReferences();
245#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246}
247
248/* Create and initialize a new interpreter and thread, and return the
249 new thread. This requires that Py_Initialize() has been called
250 first.
251
252 Unsuccessful initialization yields a NULL pointer. Note that *no*
253 exception information is available even in this case -- the
254 exception information is held in the thread, and there is no
255 thread.
256
257 Locking: as above.
258
259*/
260
261PyThreadState *
262Py_NewInterpreter()
263{
264 PyInterpreterState *interp;
265 PyThreadState *tstate, *save_tstate;
266 PyObject *bimod, *sysmod;
267
268 if (!initialized)
269 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
270
271 interp = PyInterpreterState_New();
272 if (interp == NULL)
273 return NULL;
274
275 tstate = PyThreadState_New(interp);
276 if (tstate == NULL) {
277 PyInterpreterState_Delete(interp);
278 return NULL;
279 }
280
281 save_tstate = PyThreadState_Swap(tstate);
282
283 /* XXX The following is lax in error checking */
284
285 interp->modules = PyDict_New();
286
287 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
288 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000289 interp->builtins = PyModule_GetDict(bimod);
290 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291 }
292 sysmod = _PyImport_FindExtension("sys", "sys");
293 if (bimod != NULL && sysmod != NULL) {
294 interp->sysdict = PyModule_GetDict(sysmod);
295 Py_INCREF(interp->sysdict);
296 PySys_SetPath(Py_GetPath());
297 PyDict_SetItemString(interp->sysdict, "modules",
298 interp->modules);
299 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000300 if (!Py_NoSiteFlag)
301 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000302 }
303
304 if (!PyErr_Occurred())
305 return tstate;
306
307 /* Oops, it didn't work. Undo it all. */
308
309 PyErr_Print();
310 PyThreadState_Clear(tstate);
311 PyThreadState_Swap(save_tstate);
312 PyThreadState_Delete(tstate);
313 PyInterpreterState_Delete(interp);
314
315 return NULL;
316}
317
318/* Delete an interpreter and its last thread. This requires that the
319 given thread state is current, that the thread has no remaining
320 frames, and that it is its interpreter's only remaining thread.
321 It is a fatal error to violate these constraints.
322
323 (Py_Finalize() doesn't have these constraints -- it zaps
324 everything, regardless.)
325
326 Locking: as above.
327
328*/
329
330void
331Py_EndInterpreter(tstate)
332 PyThreadState *tstate;
333{
334 PyInterpreterState *interp = tstate->interp;
335
336 if (tstate != PyThreadState_Get())
337 Py_FatalError("Py_EndInterpreter: thread is not current");
338 if (tstate->frame != NULL)
339 Py_FatalError("Py_EndInterpreter: thread still has a frame");
340 if (tstate != interp->tstate_head || tstate->next != NULL)
341 Py_FatalError("Py_EndInterpreter: not the last thread");
342
343 PyImport_Cleanup();
344 PyInterpreterState_Clear(interp);
345 PyThreadState_Swap(NULL);
346 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000347}
348
349static char *progname = "python";
350
351void
352Py_SetProgramName(pn)
353 char *pn;
354{
355 if (pn && *pn)
356 progname = pn;
357}
358
359char *
360Py_GetProgramName()
361{
362 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000363}
364
Guido van Rossum6135a871995-01-09 17:53:26 +0000365/* Create __main__ module */
366
367static void
368initmain()
369{
Guido van Rossum82598051997-03-05 00:20:32 +0000370 PyObject *m, *d;
371 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000372 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000373 Py_FatalError("can't create __main__ module");
374 d = PyModule_GetDict(m);
375 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
376 if (PyDict_SetItemString(d, "__builtins__",
377 PyEval_GetBuiltins()))
378 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000379 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000380}
381
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000382/* Import the site module (not into __main__ though) */
383
384static void
385initsite()
386{
387 PyObject *m, *f;
388 m = PyImport_ImportModule("site");
389 if (m == NULL) {
390 f = PySys_GetObject("stderr");
391 if (Py_VerboseFlag) {
392 PyFile_WriteString(
393 "'import site' failed; traceback:\n", f);
394 PyErr_Print();
395 }
396 else {
397 PyFile_WriteString(
398 "'import site' failed; use -v for traceback\n", f);
399 PyErr_Clear();
400 }
401 }
402 else {
403 Py_DECREF(m);
404 }
405}
406
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000407/* Parse input from a file and execute it */
408
409int
Guido van Rossum82598051997-03-05 00:20:32 +0000410PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000411 FILE *fp;
412 char *filename;
413{
414 if (filename == NULL)
415 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000416 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000417 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 else
Guido van Rossum82598051997-03-05 00:20:32 +0000419 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000420}
421
422int
Guido van Rossum82598051997-03-05 00:20:32 +0000423PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000424 FILE *fp;
425 char *filename;
426{
Guido van Rossum82598051997-03-05 00:20:32 +0000427 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000429 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000430 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000431 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
432 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000433 }
Guido van Rossum82598051997-03-05 00:20:32 +0000434 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000435 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000436 PySys_SetObject("ps2", v = PyString_FromString("... "));
437 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000438 }
439 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000440 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000441#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000442 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000443#endif
444 if (ret == E_EOF)
445 return 0;
446 /*
447 if (ret == E_NOMEM)
448 return -1;
449 */
450 }
451}
452
453int
Guido van Rossum82598051997-03-05 00:20:32 +0000454PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000455 FILE *fp;
456 char *filename;
457{
Guido van Rossum82598051997-03-05 00:20:32 +0000458 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000460 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000461 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000462 v = PySys_GetObject("ps1");
463 w = PySys_GetObject("ps2");
464 if (v != NULL && PyString_Check(v)) {
465 Py_INCREF(v);
466 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000467 }
468 else {
469 v = NULL;
470 ps1 = "";
471 }
Guido van Rossum82598051997-03-05 00:20:32 +0000472 if (w != NULL && PyString_Check(w)) {
473 Py_INCREF(w);
474 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475 }
476 else {
477 w = NULL;
478 ps2 = "";
479 }
Guido van Rossum82598051997-03-05 00:20:32 +0000480 Py_BEGIN_ALLOW_THREADS
481 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000482 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000483 Py_END_ALLOW_THREADS
484 Py_XDECREF(v);
485 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000486 if (n == NULL) {
487 if (err.error == E_EOF) {
488 if (err.text)
489 free(err.text);
490 return E_EOF;
491 }
492 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000493 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000494 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 }
Guido van Rossum82598051997-03-05 00:20:32 +0000496 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497 if (m == NULL)
498 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000499 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000500 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000502 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503 return -1;
504 }
Guido van Rossum82598051997-03-05 00:20:32 +0000505 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000506 if (Py_FlushLine())
507 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000508 return 0;
509}
510
511int
Guido van Rossum82598051997-03-05 00:20:32 +0000512PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000513 FILE *fp;
514 char *filename;
515{
Guido van Rossum82598051997-03-05 00:20:32 +0000516 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000517 char *ext;
518
Guido van Rossum82598051997-03-05 00:20:32 +0000519 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000520 if (m == NULL)
521 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000522 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000523 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000524 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000525#ifdef macintosh
526 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000527 || getfiletype(filename) == 'PYC '
528 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000529#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000530 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000531 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000532 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000533 if( (fp = fopen(filename, "rb")) == NULL ) {
534 fprintf(stderr, "python: Can't reopen .pyc file\n");
535 return -1;
536 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000537 /* Turn on optimization if a .pyo file is given */
538 if (strcmp(ext, ".pyo") == 0)
539 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000540 v = run_pyc_file(fp, filename, d, d);
541 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000542 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000543 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000544 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000545 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000546 return -1;
547 }
Guido van Rossum82598051997-03-05 00:20:32 +0000548 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000549 if (Py_FlushLine())
550 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000551 return 0;
552}
553
554int
Guido van Rossum82598051997-03-05 00:20:32 +0000555PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000556 char *command;
557{
Guido van Rossum82598051997-03-05 00:20:32 +0000558 PyObject *m, *d, *v;
559 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560 if (m == NULL)
561 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000562 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000563 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000564 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000565 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000566 return -1;
567 }
Guido van Rossum82598051997-03-05 00:20:32 +0000568 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000569 if (Py_FlushLine())
570 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000571 return 0;
572}
573
Barry Warsaw035574d1997-08-29 22:07:17 +0000574static int
575parse_syntax_error(err, message, filename, lineno, offset, text)
576 PyObject* err;
577 PyObject** message;
578 char** filename;
579 int* lineno;
580 int* offset;
581 char** text;
582{
583 long hold;
584 PyObject *v;
585
586 /* old style errors */
587 if (PyTuple_Check(err))
588 return PyArg_Parse(err, "(O(ziiz))", message, filename,
589 lineno, offset, text);
590
591 /* new style errors. `err' is an instance */
592
593 if (! (v = PyObject_GetAttrString(err, "msg")))
594 goto finally;
595 *message = v;
596
597 if (!(v = PyObject_GetAttrString(err, "filename")))
598 goto finally;
599 if (v == Py_None)
600 *filename = NULL;
601 else if (! (*filename = PyString_AsString(v)))
602 goto finally;
603
604 Py_DECREF(v);
605 if (!(v = PyObject_GetAttrString(err, "lineno")))
606 goto finally;
607 hold = PyInt_AsLong(v);
608 Py_DECREF(v);
609 v = NULL;
610 if (hold < 0 && PyErr_Occurred())
611 goto finally;
612 *lineno = (int)hold;
613
614 if (!(v = PyObject_GetAttrString(err, "offset")))
615 goto finally;
616 hold = PyInt_AsLong(v);
617 Py_DECREF(v);
618 v = NULL;
619 if (hold < 0 && PyErr_Occurred())
620 goto finally;
621 *offset = (int)hold;
622
623 if (!(v = PyObject_GetAttrString(err, "text")))
624 goto finally;
625 if (v == Py_None)
626 *text = NULL;
627 else if (! (*text = PyString_AsString(v)))
628 goto finally;
629 Py_DECREF(v);
630 return 1;
631
632finally:
633 Py_XDECREF(v);
634 return 0;
635}
636
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000637void
Guido van Rossum82598051997-03-05 00:20:32 +0000638PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000639{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000640 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000641 PyObject *exception, *v, *tb, *f;
642 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000643 PyErr_NormalizeException(&exception, &v, &tb);
644
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000646 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000647
Barry Warsaw36b8f941997-08-26 18:09:48 +0000648 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000649 err = Py_FlushLine();
650 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000651 if (v == NULL || v == Py_None)
652 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000653 if (PyInstance_Check(v)) {
654 /* we expect the error code to be store in the
655 `code' attribute
656 */
657 PyObject *code = PyObject_GetAttrString(v, "code");
658 if (code) {
659 Py_DECREF(v);
660 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000661 if (v == Py_None)
662 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000663 }
664 /* if we failed to dig out the "code" attribute,
665 then just let the else clause below print the
666 error
667 */
668 }
Guido van Rossum82598051997-03-05 00:20:32 +0000669 if (PyInt_Check(v))
670 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000672 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000673 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000675 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000676 }
677 }
Guido van Rossum82598051997-03-05 00:20:32 +0000678 PySys_SetObject("last_type", exception);
679 PySys_SetObject("last_value", v);
680 PySys_SetObject("last_traceback", tb);
681 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000682 if (f == NULL)
683 fprintf(stderr, "lost sys.stderr\n");
684 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000685 err = Py_FlushLine();
686 fflush(stdout);
687 if (err == 0)
688 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000689 if (err == 0 &&
690 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
691 {
Guido van Rossum82598051997-03-05 00:20:32 +0000692 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000693 char *filename, *text;
694 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000695 if (!parse_syntax_error(v, &message, &filename,
696 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000697 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000698 else {
699 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000700 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000701 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000702 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000703 else
Guido van Rossum82598051997-03-05 00:20:32 +0000704 PyFile_WriteString(filename, f);
705 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000706 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000707 PyFile_WriteString(buf, f);
708 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000709 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000710 char *nl;
711 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000712 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000713 offset--;
714 for (;;) {
715 nl = strchr(text, '\n');
716 if (nl == NULL ||
717 nl-text >= offset)
718 break;
719 offset -= (nl+1-text);
720 text = nl+1;
721 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000722 while (*text == ' ' || *text == '\t') {
723 text++;
724 offset--;
725 }
Guido van Rossum82598051997-03-05 00:20:32 +0000726 PyFile_WriteString(" ", f);
727 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000728 if (*text == '\0' ||
729 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000730 PyFile_WriteString("\n", f);
731 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000732 offset--;
733 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000734 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000735 offset--;
736 }
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000738 }
Guido van Rossum82598051997-03-05 00:20:32 +0000739 Py_INCREF(message);
740 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000741 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000742 /* Can't be bothered to check all those
743 PyFile_WriteString() calls */
744 if (PyErr_Occurred())
745 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000746 }
747 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000748 if (err) {
749 /* Don't do anything else */
750 }
751 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000752 PyClassObject* exc = (PyClassObject*)exception;
753 PyObject* className = exc->cl_name;
754 PyObject* moduleName =
755 PyDict_GetItemString(exc->cl_dict, "__module__");
756
757 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000758 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000759 else {
760 char* modstr = PyString_AsString(moduleName);
761 if (modstr && strcmp(modstr, "exceptions"))
762 {
763 err = PyFile_WriteString(modstr, f);
764 err += PyFile_WriteString(".", f);
765 }
766 }
767 if (err == 0) {
768 if (className == NULL)
769 err = PyFile_WriteString("<unknown>", f);
770 else
771 err = PyFile_WriteObject(className, f,
772 Py_PRINT_RAW);
773 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000774 }
775 else
776 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
777 if (err == 0) {
778 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000779 PyObject *s = PyObject_Str(v);
780 /* only print colon if the str() of the
781 object is not the empty string
782 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000783 if (s == NULL)
784 err = -1;
785 else if (!PyString_Check(s) ||
786 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000787 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000788 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000789 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
790 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000791 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000792 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000793 if (err == 0)
794 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000795 }
Guido van Rossum82598051997-03-05 00:20:32 +0000796 Py_XDECREF(exception);
797 Py_XDECREF(v);
798 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000799 /* If an error happened here, don't show it.
800 XXX This is wrong, but too many callers rely on this behavior. */
801 if (err != 0)
802 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000803}
804
Guido van Rossum82598051997-03-05 00:20:32 +0000805PyObject *
806PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000807 char *str;
808 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000809 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000810{
Guido van Rossum82598051997-03-05 00:20:32 +0000811 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000812 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000813}
814
Guido van Rossum82598051997-03-05 00:20:32 +0000815PyObject *
816PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000817 FILE *fp;
818 char *filename;
819 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000820 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000821{
Guido van Rossum82598051997-03-05 00:20:32 +0000822 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000823 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000824}
825
Guido van Rossum82598051997-03-05 00:20:32 +0000826static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000827run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000828 node *n;
829 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000830 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000831{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000832 if (n == NULL)
833 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000834 return run_node(n, filename, globals, locals);
835}
836
Guido van Rossum82598051997-03-05 00:20:32 +0000837static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000838run_node(n, filename, globals, locals)
839 node *n;
840 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000841 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000842{
Guido van Rossum82598051997-03-05 00:20:32 +0000843 PyCodeObject *co;
844 PyObject *v;
845 co = PyNode_Compile(n, filename);
846 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847 if (co == NULL)
848 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000849 v = PyEval_EvalCode(co, globals, locals);
850 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000851 return v;
852}
853
Guido van Rossum82598051997-03-05 00:20:32 +0000854static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000855run_pyc_file(fp, filename, globals, locals)
856 FILE *fp;
857 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000858 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000859{
Guido van Rossum82598051997-03-05 00:20:32 +0000860 PyCodeObject *co;
861 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000862 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000863 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000864
Guido van Rossum82598051997-03-05 00:20:32 +0000865 magic = PyMarshal_ReadLongFromFile(fp);
866 if (magic != PyImport_GetMagicNumber()) {
867 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000868 "Bad magic number in .pyc file");
869 return NULL;
870 }
Guido van Rossum82598051997-03-05 00:20:32 +0000871 (void) PyMarshal_ReadLongFromFile(fp);
872 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000873 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000874 if (v == NULL || !PyCode_Check(v)) {
875 Py_XDECREF(v);
876 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000877 "Bad code object in .pyc file");
878 return NULL;
879 }
Guido van Rossum82598051997-03-05 00:20:32 +0000880 co = (PyCodeObject *)v;
881 v = PyEval_EvalCode(co, globals, locals);
882 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000883 return v;
884}
885
Guido van Rossum82598051997-03-05 00:20:32 +0000886PyObject *
887Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000888 char *str;
889 char *filename;
890 int start;
891{
892 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000893 PyCodeObject *co;
894 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000895 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000896 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000897 co = PyNode_Compile(n, filename);
898 PyNode_Free(n);
899 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000900}
901
Guido van Rossuma110aa61994-08-29 12:50:44 +0000902/* Simplified interface to parsefile -- 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_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000906 FILE *fp;
907 char *filename;
908 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000909{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000910 node *n;
911 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000912 Py_BEGIN_ALLOW_THREADS
913 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000914 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000915 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000916 if (n == NULL)
917 err_input(&err);
918 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000919}
920
Guido van Rossuma110aa61994-08-29 12:50:44 +0000921/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000922
Guido van Rossuma110aa61994-08-29 12:50:44 +0000923node *
Guido van Rossum82598051997-03-05 00:20:32 +0000924PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000925 char *str;
926 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000927{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000928 node *n;
929 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000930 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000931 if (n == NULL)
932 err_input(&err);
933 return n;
934}
935
936/* Set the error appropriate to the given input error code (see errcode.h) */
937
938static void
939err_input(err)
940 perrdetail *err;
941{
Guido van Rossum82598051997-03-05 00:20:32 +0000942 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000943 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000944 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000945 err->lineno, err->offset, err->text);
946 if (err->text != NULL) {
947 free(err->text);
948 err->text = NULL;
949 }
950 switch (err->error) {
951 case E_SYNTAX:
952 msg = "invalid syntax";
953 break;
954 case E_TOKEN:
955 msg = "invalid token";
956
957 break;
958 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000959 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000960 return;
961 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000962 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000963 return;
964 case E_EOF:
965 msg = "unexpected EOF while parsing";
966 break;
967 default:
968 fprintf(stderr, "error=%d\n", err->error);
969 msg = "unknown parsing error";
970 break;
971 }
Guido van Rossum82598051997-03-05 00:20:32 +0000972 w = Py_BuildValue("(sO)", msg, v);
973 Py_XDECREF(v);
974 PyErr_SetObject(PyExc_SyntaxError, w);
975 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000976}
977
978/* Print fatal error message and abort */
979
980void
Guido van Rossum82598051997-03-05 00:20:32 +0000981Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000982 char *msg;
983{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000984 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000985#ifdef macintosh
986 for (;;);
987#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000988#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000989 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000990 OutputDebugString(msg);
991 OutputDebugString("\n");
992#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000993 abort();
994}
995
996/* Clean up and exit */
997
Guido van Rossuma110aa61994-08-29 12:50:44 +0000998#ifdef WITH_THREAD
999#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001000int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001001#endif
1002
Guido van Rossum1662dd51994-09-07 14:38:28 +00001003#define NEXITFUNCS 32
1004static void (*exitfuncs[NEXITFUNCS])();
1005static int nexitfuncs = 0;
1006
1007int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001008 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001009{
1010 if (nexitfuncs >= NEXITFUNCS)
1011 return -1;
1012 exitfuncs[nexitfuncs++] = func;
1013 return 0;
1014}
1015
Guido van Rossumcc283f51997-08-05 02:22:03 +00001016static void
1017call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001018{
Guido van Rossum82598051997-03-05 00:20:32 +00001019 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001020
1021 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001022 PyObject *res;
1023 Py_INCREF(exitfunc);
1024 PySys_SetObject("exitfunc", (PyObject *)NULL);
1025 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001026 if (res == NULL) {
1027 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001028 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001029 }
Guido van Rossum82598051997-03-05 00:20:32 +00001030 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001031 }
1032
Guido van Rossum82598051997-03-05 00:20:32 +00001033 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001034}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001035
Guido van Rossumcc283f51997-08-05 02:22:03 +00001036static void
1037call_ll_exitfuncs()
1038{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001039 while (nexitfuncs > 0)
1040 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001041
1042 fflush(stdout);
1043 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001044}
1045
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001046#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001047extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001048#endif
1049
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001050void
Guido van Rossum82598051997-03-05 00:20:32 +00001051Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001052 int sts;
1053{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001054 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001055
Jack Jansen66a89771995-10-27 13:22:14 +00001056#ifdef macintosh
1057 PyMac_Exit(sts);
1058#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001059 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001060#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001061}
1062
Guido van Rossuma110aa61994-08-29 12:50:44 +00001063#ifdef HAVE_SIGNAL_H
1064static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001065sighandler(sig)
1066 int sig;
1067{
1068 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +00001069 /* Do essential exit processing only */
1070 call_sys_exitfunc();
1071 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +00001072#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001073 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +00001074#else
1075 exit(1);
1076#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001077 /*NOTREACHED*/
1078}
1079#endif
1080
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001081static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001082initsigs()
1083{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001084 RETSIGTYPE (*t)();
1085#ifdef HAVE_SIGNAL_H
1086#ifdef SIGPIPE
1087 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001088#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001089#ifdef SIGHUP
1090 t = signal(SIGHUP, SIG_IGN);
1091 if (t == SIG_DFL)
1092 signal(SIGHUP, sighandler);
1093 else
1094 signal(SIGHUP, t);
1095#endif
1096#ifdef SIGTERM
1097 t = signal(SIGTERM, SIG_IGN);
1098 if (t == SIG_DFL)
1099 signal(SIGTERM, sighandler);
1100 else
1101 signal(SIGTERM, t);
1102#endif
1103#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001104 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001105}
1106
Guido van Rossumaae0d321996-05-22 16:35:33 +00001107#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001108/* Ask a yes/no question */
1109
Guido van Rossum59bff391992-09-03 20:28:00 +00001110int
Guido van Rossum82598051997-03-05 00:20:32 +00001111_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001112 char *prompt;
1113{
1114 char buf[256];
1115
1116 printf("%s [ny] ", prompt);
1117 if (fgets(buf, sizeof buf, stdin) == NULL)
1118 return 0;
1119 return buf[0] == 'y' || buf[0] == 'Y';
1120}
1121#endif
1122
Guido van Rossuma110aa61994-08-29 12:50:44 +00001123#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001124
1125/* Check for file descriptor connected to interactive device.
1126 Pretend that stdin is always interactive, other files never. */
1127
1128int
1129isatty(fd)
1130 int fd;
1131{
1132 return fd == fileno(stdin);
1133}
1134
1135#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001136
1137/*
1138 * The file descriptor fd is considered ``interactive'' if either
1139 * a) isatty(fd) is TRUE, or
1140 * b) the -i flag was given, and the filename associated with
1141 * the descriptor is NULL or "<stdin>" or "???".
1142 */
1143int
1144Py_FdIsInteractive(fp, filename)
1145 FILE *fp;
1146 char *filename;
1147{
1148 if (isatty((int)fileno(fp)))
1149 return 1;
1150 if (!Py_InteractiveFlag)
1151 return 0;
1152 return (filename == NULL) ||
1153 (strcmp(filename, "<stdin>") == 0) ||
1154 (strcmp(filename, "???") == 0);
1155}