blob: 16aba5c3bcd2e7705ec6412f5ae01f49c54d964d [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 Rossuma61691e1998-02-06 22:27:24 +000080int Py_FrozenFlag; /* Needed by getpath.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__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000137 interp->builtins = PyModule_GetDict(bimod);
138 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139
140 sysmod = _PySys_Init();
141 if (sysmod == NULL)
142 Py_FatalError("Py_Initialize: can't initialize sys");
143 interp->sysdict = PyModule_GetDict(sysmod);
144 Py_INCREF(interp->sysdict);
145 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyDict_SetItemString(interp->sysdict, "modules",
148 interp->modules);
149
Barry Warsaw035574d1997-08-29 22:07:17 +0000150 /* phase 2 of builtins */
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000151 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000152 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000153
Guido van Rossum25ce5661997-08-02 03:10:38 +0000154 _PyImport_Init();
155
156 initsigs(); /* Signal handling stuff, including initintr() */
157
158 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000159 if (!Py_NoSiteFlag)
160 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000161}
162
163/* Undo the effect of Py_Initialize().
164
165 Beware: if multiple interpreter and/or thread states exist, these
166 are not wiped out; only the current thread and interpreter state
167 are deleted. But since everything else is deleted, those other
168 interpreter and thread states should no longer be used.
169
170 (XXX We should do better, e.g. wipe out all interpreters and
171 threads.)
172
173 Locking: as above.
174
175*/
176
177void
178Py_Finalize()
179{
180 PyInterpreterState *interp;
181 PyThreadState *tstate;
182
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000183 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000184 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000185 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000186
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000187 call_sys_exitfunc();
188
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000189 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190 tstate = PyThreadState_Get();
191 interp = tstate->interp;
192
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000193 /* Disable signal handling */
194 PyOS_FiniInterrupts();
195
196 /* Destroy PyExc_MemoryErrorInst */
197 _PyBuiltin_Fini_1();
198
199 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000201
Guido van Rossum1707aad1997-12-08 23:43:45 +0000202 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
203 _PyImport_Fini();
204
205 /* Debugging stuff */
206#ifdef COUNT_ALLOCS
207 dump_counts();
208#endif
209
210#ifdef Py_REF_DEBUG
211 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
212#endif
213
214#ifdef Py_TRACE_REFS
215 if (_Py_AskYesNo("Print left references?")) {
216 _Py_PrintReferences(stderr);
217 }
218#endif /* Py_TRACE_REFS */
219
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000220 /* Delete current thread */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000221 PyInterpreterState_Clear(interp);
222 PyThreadState_Swap(NULL);
223 PyInterpreterState_Delete(interp);
224
Barry Warsaw035574d1997-08-29 22:07:17 +0000225 /* Now we decref the exception classes. After this point nothing
226 can raise an exception. That's okay, because each Fini() method
227 below has been checked to make sure no exceptions are ever
228 raised.
229 */
230 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000231 PyMethod_Fini();
232 PyFrame_Fini();
233 PyCFunction_Fini();
234 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000235 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000236 PyInt_Fini();
237 PyFloat_Fini();
238
239 /* XXX Still allocated:
240 - various static ad-hoc pointers to interned strings
241 - int and float free list blocks
242 - whatever various modules and libraries allocate
243 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244
245 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000246
247 call_ll_exitfuncs();
248
Guido van Rossumcc283f51997-08-05 02:22:03 +0000249#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000250 _Py_ResetReferences();
251#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000252}
253
254/* Create and initialize a new interpreter and thread, and return the
255 new thread. This requires that Py_Initialize() has been called
256 first.
257
258 Unsuccessful initialization yields a NULL pointer. Note that *no*
259 exception information is available even in this case -- the
260 exception information is held in the thread, and there is no
261 thread.
262
263 Locking: as above.
264
265*/
266
267PyThreadState *
268Py_NewInterpreter()
269{
270 PyInterpreterState *interp;
271 PyThreadState *tstate, *save_tstate;
272 PyObject *bimod, *sysmod;
273
274 if (!initialized)
275 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
276
277 interp = PyInterpreterState_New();
278 if (interp == NULL)
279 return NULL;
280
281 tstate = PyThreadState_New(interp);
282 if (tstate == NULL) {
283 PyInterpreterState_Delete(interp);
284 return NULL;
285 }
286
287 save_tstate = PyThreadState_Swap(tstate);
288
289 /* XXX The following is lax in error checking */
290
291 interp->modules = PyDict_New();
292
293 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
294 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000295 interp->builtins = PyModule_GetDict(bimod);
296 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000297 }
298 sysmod = _PyImport_FindExtension("sys", "sys");
299 if (bimod != NULL && sysmod != NULL) {
300 interp->sysdict = PyModule_GetDict(sysmod);
301 Py_INCREF(interp->sysdict);
302 PySys_SetPath(Py_GetPath());
303 PyDict_SetItemString(interp->sysdict, "modules",
304 interp->modules);
305 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000306 if (!Py_NoSiteFlag)
307 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000308 }
309
310 if (!PyErr_Occurred())
311 return tstate;
312
313 /* Oops, it didn't work. Undo it all. */
314
315 PyErr_Print();
316 PyThreadState_Clear(tstate);
317 PyThreadState_Swap(save_tstate);
318 PyThreadState_Delete(tstate);
319 PyInterpreterState_Delete(interp);
320
321 return NULL;
322}
323
324/* Delete an interpreter and its last thread. This requires that the
325 given thread state is current, that the thread has no remaining
326 frames, and that it is its interpreter's only remaining thread.
327 It is a fatal error to violate these constraints.
328
329 (Py_Finalize() doesn't have these constraints -- it zaps
330 everything, regardless.)
331
332 Locking: as above.
333
334*/
335
336void
337Py_EndInterpreter(tstate)
338 PyThreadState *tstate;
339{
340 PyInterpreterState *interp = tstate->interp;
341
342 if (tstate != PyThreadState_Get())
343 Py_FatalError("Py_EndInterpreter: thread is not current");
344 if (tstate->frame != NULL)
345 Py_FatalError("Py_EndInterpreter: thread still has a frame");
346 if (tstate != interp->tstate_head || tstate->next != NULL)
347 Py_FatalError("Py_EndInterpreter: not the last thread");
348
349 PyImport_Cleanup();
350 PyInterpreterState_Clear(interp);
351 PyThreadState_Swap(NULL);
352 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000353}
354
355static char *progname = "python";
356
357void
358Py_SetProgramName(pn)
359 char *pn;
360{
361 if (pn && *pn)
362 progname = pn;
363}
364
365char *
366Py_GetProgramName()
367{
368 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000369}
370
Guido van Rossuma61691e1998-02-06 22:27:24 +0000371static char *default_home = NULL;
372
373void
374Py_SetPythonHome(home)
375 char *home;
376{
377 default_home = home;
378}
379
380char *
381Py_GetPythonHome()
382{
383 char *home = default_home;
384 if (home == NULL)
385 home = getenv("PYTHONHOME");
386 return home;
387}
388
Guido van Rossum6135a871995-01-09 17:53:26 +0000389/* Create __main__ module */
390
391static void
392initmain()
393{
Guido van Rossum82598051997-03-05 00:20:32 +0000394 PyObject *m, *d;
395 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000396 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000397 Py_FatalError("can't create __main__ module");
398 d = PyModule_GetDict(m);
399 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000400 PyObject *bimod = PyImport_ImportModule("__builtin__");
401 if (bimod == NULL ||
402 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000403 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000404 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000405}
406
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000407/* Import the site module (not into __main__ though) */
408
409static void
410initsite()
411{
412 PyObject *m, *f;
413 m = PyImport_ImportModule("site");
414 if (m == NULL) {
415 f = PySys_GetObject("stderr");
416 if (Py_VerboseFlag) {
417 PyFile_WriteString(
418 "'import site' failed; traceback:\n", f);
419 PyErr_Print();
420 }
421 else {
422 PyFile_WriteString(
423 "'import site' failed; use -v for traceback\n", f);
424 PyErr_Clear();
425 }
426 }
427 else {
428 Py_DECREF(m);
429 }
430}
431
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000432/* Parse input from a file and execute it */
433
434int
Guido van Rossum82598051997-03-05 00:20:32 +0000435PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000436 FILE *fp;
437 char *filename;
438{
439 if (filename == NULL)
440 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000441 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000442 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000443 else
Guido van Rossum82598051997-03-05 00:20:32 +0000444 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000445}
446
447int
Guido van Rossum82598051997-03-05 00:20:32 +0000448PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000449 FILE *fp;
450 char *filename;
451{
Guido van Rossum82598051997-03-05 00:20:32 +0000452 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000454 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000455 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000456 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
457 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000458 }
Guido van Rossum82598051997-03-05 00:20:32 +0000459 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000461 PySys_SetObject("ps2", v = PyString_FromString("... "));
462 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000463 }
464 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000465 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000466#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000467 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468#endif
469 if (ret == E_EOF)
470 return 0;
471 /*
472 if (ret == E_NOMEM)
473 return -1;
474 */
475 }
476}
477
478int
Guido van Rossum82598051997-03-05 00:20:32 +0000479PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480 FILE *fp;
481 char *filename;
482{
Guido van Rossum82598051997-03-05 00:20:32 +0000483 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000484 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000485 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000486 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000487 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000488 if (v != NULL) {
489 v = PyObject_Str(v);
490 if (v == NULL)
491 PyErr_Clear();
492 else if (PyString_Check(v))
493 ps1 = PyString_AsString(v);
494 }
Guido van Rossum82598051997-03-05 00:20:32 +0000495 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000496 if (w != NULL) {
497 w = PyObject_Str(w);
498 if (w == NULL)
499 PyErr_Clear();
500 else if (PyString_Check(w))
501 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 }
Guido van Rossum82598051997-03-05 00:20:32 +0000503 Py_BEGIN_ALLOW_THREADS
504 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000505 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000506 Py_END_ALLOW_THREADS
507 Py_XDECREF(v);
508 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000509 if (n == NULL) {
510 if (err.error == E_EOF) {
511 if (err.text)
512 free(err.text);
513 return E_EOF;
514 }
515 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000516 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000517 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 }
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 Rossum1984f1e1992-08-04 12:41:02 +0000523 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000524 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000525 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000526 return -1;
527 }
Guido van Rossum82598051997-03-05 00:20:32 +0000528 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000529 if (Py_FlushLine())
530 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 return 0;
532}
533
534int
Guido van Rossum82598051997-03-05 00:20:32 +0000535PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536 FILE *fp;
537 char *filename;
538{
Guido van Rossum82598051997-03-05 00:20:32 +0000539 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000540 char *ext;
541
Guido van Rossum82598051997-03-05 00:20:32 +0000542 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543 if (m == NULL)
544 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000545 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000546 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000547 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000548#ifdef macintosh
549 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000550 || getfiletype(filename) == 'PYC '
551 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000552#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000553 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000554 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000555 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000556 if( (fp = fopen(filename, "rb")) == NULL ) {
557 fprintf(stderr, "python: Can't reopen .pyc file\n");
558 return -1;
559 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000560 /* Turn on optimization if a .pyo file is given */
561 if (strcmp(ext, ".pyo") == 0)
562 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000563 v = run_pyc_file(fp, filename, d, d);
564 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000565 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000566 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000567 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000568 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000569 return -1;
570 }
Guido van Rossum82598051997-03-05 00:20:32 +0000571 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000572 if (Py_FlushLine())
573 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000574 return 0;
575}
576
577int
Guido van Rossum82598051997-03-05 00:20:32 +0000578PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000579 char *command;
580{
Guido van Rossum82598051997-03-05 00:20:32 +0000581 PyObject *m, *d, *v;
582 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583 if (m == NULL)
584 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000585 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000586 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000588 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589 return -1;
590 }
Guido van Rossum82598051997-03-05 00:20:32 +0000591 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000592 if (Py_FlushLine())
593 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000594 return 0;
595}
596
Barry Warsaw035574d1997-08-29 22:07:17 +0000597static int
598parse_syntax_error(err, message, filename, lineno, offset, text)
599 PyObject* err;
600 PyObject** message;
601 char** filename;
602 int* lineno;
603 int* offset;
604 char** text;
605{
606 long hold;
607 PyObject *v;
608
609 /* old style errors */
610 if (PyTuple_Check(err))
611 return PyArg_Parse(err, "(O(ziiz))", message, filename,
612 lineno, offset, text);
613
614 /* new style errors. `err' is an instance */
615
616 if (! (v = PyObject_GetAttrString(err, "msg")))
617 goto finally;
618 *message = v;
619
620 if (!(v = PyObject_GetAttrString(err, "filename")))
621 goto finally;
622 if (v == Py_None)
623 *filename = NULL;
624 else if (! (*filename = PyString_AsString(v)))
625 goto finally;
626
627 Py_DECREF(v);
628 if (!(v = PyObject_GetAttrString(err, "lineno")))
629 goto finally;
630 hold = PyInt_AsLong(v);
631 Py_DECREF(v);
632 v = NULL;
633 if (hold < 0 && PyErr_Occurred())
634 goto finally;
635 *lineno = (int)hold;
636
637 if (!(v = PyObject_GetAttrString(err, "offset")))
638 goto finally;
639 hold = PyInt_AsLong(v);
640 Py_DECREF(v);
641 v = NULL;
642 if (hold < 0 && PyErr_Occurred())
643 goto finally;
644 *offset = (int)hold;
645
646 if (!(v = PyObject_GetAttrString(err, "text")))
647 goto finally;
648 if (v == Py_None)
649 *text = NULL;
650 else if (! (*text = PyString_AsString(v)))
651 goto finally;
652 Py_DECREF(v);
653 return 1;
654
655finally:
656 Py_XDECREF(v);
657 return 0;
658}
659
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660void
Guido van Rossum82598051997-03-05 00:20:32 +0000661PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000663 PyErr_PrintEx(1);
664}
665
666void
667PyErr_PrintEx(set_sys_last_vars)
668 int set_sys_last_vars;
669{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000670 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000671 PyObject *exception, *v, *tb, *f;
672 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000673 PyErr_NormalizeException(&exception, &v, &tb);
674
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000676 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000677
Barry Warsaw36b8f941997-08-26 18:09:48 +0000678 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000679 if (Py_FlushLine())
680 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000681 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000682 if (v == NULL || v == Py_None)
683 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000684 if (PyInstance_Check(v)) {
685 /* we expect the error code to be store in the
686 `code' attribute
687 */
688 PyObject *code = PyObject_GetAttrString(v, "code");
689 if (code) {
690 Py_DECREF(v);
691 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000692 if (v == Py_None)
693 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000694 }
695 /* if we failed to dig out the "code" attribute,
696 then just let the else clause below print the
697 error
698 */
699 }
Guido van Rossum82598051997-03-05 00:20:32 +0000700 if (PyInt_Check(v))
701 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000703 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000704 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000706 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707 }
708 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000709 if (set_sys_last_vars) {
710 PySys_SetObject("last_type", exception);
711 PySys_SetObject("last_value", v);
712 PySys_SetObject("last_traceback", tb);
713 }
Guido van Rossum82598051997-03-05 00:20:32 +0000714 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000715 if (f == NULL)
716 fprintf(stderr, "lost sys.stderr\n");
717 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000718 if (Py_FlushLine())
719 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000720 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000721 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000722 if (err == 0 &&
723 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
724 {
Guido van Rossum82598051997-03-05 00:20:32 +0000725 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000726 char *filename, *text;
727 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000728 if (!parse_syntax_error(v, &message, &filename,
729 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000730 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000731 else {
732 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000733 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000736 else
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyFile_WriteString(filename, f);
738 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000740 PyFile_WriteString(buf, f);
741 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000743 char *nl;
744 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000745 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000746 offset--;
747 for (;;) {
748 nl = strchr(text, '\n');
749 if (nl == NULL ||
750 nl-text >= offset)
751 break;
752 offset -= (nl+1-text);
753 text = nl+1;
754 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000755 while (*text == ' ' || *text == '\t') {
756 text++;
757 offset--;
758 }
Guido van Rossum82598051997-03-05 00:20:32 +0000759 PyFile_WriteString(" ", f);
760 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000761 if (*text == '\0' ||
762 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000763 PyFile_WriteString("\n", f);
764 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000765 offset--;
766 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000767 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000768 offset--;
769 }
Guido van Rossum82598051997-03-05 00:20:32 +0000770 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000771 }
Guido van Rossum82598051997-03-05 00:20:32 +0000772 Py_INCREF(message);
773 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000775 /* Can't be bothered to check all those
776 PyFile_WriteString() calls */
777 if (PyErr_Occurred())
778 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000779 }
780 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000781 if (err) {
782 /* Don't do anything else */
783 }
784 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000785 PyClassObject* exc = (PyClassObject*)exception;
786 PyObject* className = exc->cl_name;
787 PyObject* moduleName =
788 PyDict_GetItemString(exc->cl_dict, "__module__");
789
790 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000791 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000792 else {
793 char* modstr = PyString_AsString(moduleName);
794 if (modstr && strcmp(modstr, "exceptions"))
795 {
796 err = PyFile_WriteString(modstr, f);
797 err += PyFile_WriteString(".", f);
798 }
799 }
800 if (err == 0) {
801 if (className == NULL)
802 err = PyFile_WriteString("<unknown>", f);
803 else
804 err = PyFile_WriteObject(className, f,
805 Py_PRINT_RAW);
806 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000807 }
808 else
809 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
810 if (err == 0) {
811 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000812 PyObject *s = PyObject_Str(v);
813 /* only print colon if the str() of the
814 object is not the empty string
815 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000816 if (s == NULL)
817 err = -1;
818 else if (!PyString_Check(s) ||
819 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000820 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000821 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000822 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
823 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000824 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000825 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000826 if (err == 0)
827 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000828 }
Guido van Rossum82598051997-03-05 00:20:32 +0000829 Py_XDECREF(exception);
830 Py_XDECREF(v);
831 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000832 /* If an error happened here, don't show it.
833 XXX This is wrong, but too many callers rely on this behavior. */
834 if (err != 0)
835 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836}
837
Guido van Rossum82598051997-03-05 00:20:32 +0000838PyObject *
839PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000840 char *str;
841 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000842 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843{
Guido van Rossum82598051997-03-05 00:20:32 +0000844 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000845 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000846}
847
Guido van Rossum82598051997-03-05 00:20:32 +0000848PyObject *
849PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850 FILE *fp;
851 char *filename;
852 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000853 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000854{
Guido van Rossum82598051997-03-05 00:20:32 +0000855 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000856 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857}
858
Guido van Rossum82598051997-03-05 00:20:32 +0000859static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000860run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000861 node *n;
862 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000863 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000864{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000865 if (n == NULL)
866 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867 return run_node(n, filename, globals, locals);
868}
869
Guido van Rossum82598051997-03-05 00:20:32 +0000870static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871run_node(n, filename, globals, locals)
872 node *n;
873 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000874 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000875{
Guido van Rossum82598051997-03-05 00:20:32 +0000876 PyCodeObject *co;
877 PyObject *v;
878 co = PyNode_Compile(n, filename);
879 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000880 if (co == NULL)
881 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000882 v = PyEval_EvalCode(co, globals, locals);
883 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884 return v;
885}
886
Guido van Rossum82598051997-03-05 00:20:32 +0000887static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000888run_pyc_file(fp, filename, globals, locals)
889 FILE *fp;
890 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000891 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000892{
Guido van Rossum82598051997-03-05 00:20:32 +0000893 PyCodeObject *co;
894 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000895 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000896 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000897
Guido van Rossum82598051997-03-05 00:20:32 +0000898 magic = PyMarshal_ReadLongFromFile(fp);
899 if (magic != PyImport_GetMagicNumber()) {
900 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000901 "Bad magic number in .pyc file");
902 return NULL;
903 }
Guido van Rossum82598051997-03-05 00:20:32 +0000904 (void) PyMarshal_ReadLongFromFile(fp);
905 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000906 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000907 if (v == NULL || !PyCode_Check(v)) {
908 Py_XDECREF(v);
909 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000910 "Bad code object in .pyc file");
911 return NULL;
912 }
Guido van Rossum82598051997-03-05 00:20:32 +0000913 co = (PyCodeObject *)v;
914 v = PyEval_EvalCode(co, globals, locals);
915 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000916 return v;
917}
918
Guido van Rossum82598051997-03-05 00:20:32 +0000919PyObject *
920Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000921 char *str;
922 char *filename;
923 int start;
924{
925 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000926 PyCodeObject *co;
927 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000928 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000929 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000930 co = PyNode_Compile(n, filename);
931 PyNode_Free(n);
932 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000933}
934
Guido van Rossuma110aa61994-08-29 12:50:44 +0000935/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000936
Guido van Rossuma110aa61994-08-29 12:50:44 +0000937node *
Guido van Rossum82598051997-03-05 00:20:32 +0000938PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000939 FILE *fp;
940 char *filename;
941 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000942{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000943 node *n;
944 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000945 Py_BEGIN_ALLOW_THREADS
946 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000947 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000948 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000949 if (n == NULL)
950 err_input(&err);
951 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000952}
953
Guido van Rossuma110aa61994-08-29 12:50:44 +0000954/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000955
Guido van Rossuma110aa61994-08-29 12:50:44 +0000956node *
Guido van Rossum82598051997-03-05 00:20:32 +0000957PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958 char *str;
959 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000960{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961 node *n;
962 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000963 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964 if (n == NULL)
965 err_input(&err);
966 return n;
967}
968
969/* Set the error appropriate to the given input error code (see errcode.h) */
970
971static void
972err_input(err)
973 perrdetail *err;
974{
Guido van Rossum82598051997-03-05 00:20:32 +0000975 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000976 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000977 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000978 err->lineno, err->offset, err->text);
979 if (err->text != NULL) {
980 free(err->text);
981 err->text = NULL;
982 }
983 switch (err->error) {
984 case E_SYNTAX:
985 msg = "invalid syntax";
986 break;
987 case E_TOKEN:
988 msg = "invalid token";
989
990 break;
991 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000992 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000993 return;
994 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000995 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000996 return;
997 case E_EOF:
998 msg = "unexpected EOF while parsing";
999 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001000 case E_INDENT:
1001 msg = "inconsistent use of tabs and spaces in indentation";
1002 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001003 default:
1004 fprintf(stderr, "error=%d\n", err->error);
1005 msg = "unknown parsing error";
1006 break;
1007 }
Guido van Rossum82598051997-03-05 00:20:32 +00001008 w = Py_BuildValue("(sO)", msg, v);
1009 Py_XDECREF(v);
1010 PyErr_SetObject(PyExc_SyntaxError, w);
1011 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001012}
1013
1014/* Print fatal error message and abort */
1015
1016void
Guido van Rossum82598051997-03-05 00:20:32 +00001017Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001018 char *msg;
1019{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001020 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001021#ifdef macintosh
1022 for (;;);
1023#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001024#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001025 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001026 OutputDebugString(msg);
1027 OutputDebugString("\n");
1028#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001029 abort();
1030}
1031
1032/* Clean up and exit */
1033
Guido van Rossuma110aa61994-08-29 12:50:44 +00001034#ifdef WITH_THREAD
1035#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001036int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001037#endif
1038
Guido van Rossum1662dd51994-09-07 14:38:28 +00001039#define NEXITFUNCS 32
1040static void (*exitfuncs[NEXITFUNCS])();
1041static int nexitfuncs = 0;
1042
1043int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001044 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001045{
1046 if (nexitfuncs >= NEXITFUNCS)
1047 return -1;
1048 exitfuncs[nexitfuncs++] = func;
1049 return 0;
1050}
1051
Guido van Rossumcc283f51997-08-05 02:22:03 +00001052static void
1053call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001054{
Guido van Rossum82598051997-03-05 00:20:32 +00001055 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001056
1057 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001058 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001059 Py_INCREF(exitfunc);
1060 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001061 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001062 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001063 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001064 if (f)
1065 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001066 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001067 }
Guido van Rossum82598051997-03-05 00:20:32 +00001068 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001069 }
1070
Guido van Rossum0829c751998-02-28 04:31:39 +00001071 if (Py_FlushLine())
1072 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001073}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001074
Guido van Rossumcc283f51997-08-05 02:22:03 +00001075static void
1076call_ll_exitfuncs()
1077{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001078 while (nexitfuncs > 0)
1079 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001080
1081 fflush(stdout);
1082 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001083}
1084
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001085#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001086extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001087#endif
1088
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001089void
Guido van Rossum82598051997-03-05 00:20:32 +00001090Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001091 int sts;
1092{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001093 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001094
Jack Jansen66a89771995-10-27 13:22:14 +00001095#ifdef macintosh
1096 PyMac_Exit(sts);
1097#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001098 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001099#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001100}
1101
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001102static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001103initsigs()
1104{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001105#ifdef HAVE_SIGNAL_H
1106#ifdef SIGPIPE
1107 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001108#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001109#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001110 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001111}
1112
Guido van Rossumaae0d321996-05-22 16:35:33 +00001113#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001114/* Ask a yes/no question */
1115
Guido van Rossum59bff391992-09-03 20:28:00 +00001116int
Guido van Rossum82598051997-03-05 00:20:32 +00001117_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001118 char *prompt;
1119{
1120 char buf[256];
1121
1122 printf("%s [ny] ", prompt);
1123 if (fgets(buf, sizeof buf, stdin) == NULL)
1124 return 0;
1125 return buf[0] == 'y' || buf[0] == 'Y';
1126}
1127#endif
1128
Guido van Rossuma110aa61994-08-29 12:50:44 +00001129#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001130
1131/* Check for file descriptor connected to interactive device.
1132 Pretend that stdin is always interactive, other files never. */
1133
1134int
1135isatty(fd)
1136 int fd;
1137{
1138 return fd == fileno(stdin);
1139}
1140
1141#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001142
1143/*
1144 * The file descriptor fd is considered ``interactive'' if either
1145 * a) isatty(fd) is TRUE, or
1146 * b) the -i flag was given, and the filename associated with
1147 * the descriptor is NULL or "<stdin>" or "???".
1148 */
1149int
1150Py_FdIsInteractive(fp, filename)
1151 FILE *fp;
1152 char *filename;
1153{
1154 if (isatty((int)fileno(fp)))
1155 return 1;
1156 if (!Py_InteractiveFlag)
1157 return 0;
1158 return (filename == NULL) ||
1159 (strcmp(filename, "<stdin>") == 0) ||
1160 (strcmp(filename, "???") == 0);
1161}