blob: 4cd0e3f3c24a7c36ed331d093667f9bc3da87618 [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 Rossum78a1ed31997-05-22 22:35:04 +0000679 err = Py_FlushLine();
680 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000681 if (v == NULL || v == Py_None)
682 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000683 if (PyInstance_Check(v)) {
684 /* we expect the error code to be store in the
685 `code' attribute
686 */
687 PyObject *code = PyObject_GetAttrString(v, "code");
688 if (code) {
689 Py_DECREF(v);
690 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000691 if (v == Py_None)
692 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000693 }
694 /* if we failed to dig out the "code" attribute,
695 then just let the else clause below print the
696 error
697 */
698 }
Guido van Rossum82598051997-03-05 00:20:32 +0000699 if (PyInt_Check(v))
700 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000701 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000702 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000705 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000706 }
707 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000708 if (set_sys_last_vars) {
709 PySys_SetObject("last_type", exception);
710 PySys_SetObject("last_value", v);
711 PySys_SetObject("last_traceback", tb);
712 }
Guido van Rossum82598051997-03-05 00:20:32 +0000713 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000714 if (f == NULL)
715 fprintf(stderr, "lost sys.stderr\n");
716 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000717 err = Py_FlushLine();
718 fflush(stdout);
719 if (err == 0)
720 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000721 if (err == 0 &&
722 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
723 {
Guido van Rossum82598051997-03-05 00:20:32 +0000724 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000725 char *filename, *text;
726 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000727 if (!parse_syntax_error(v, &message, &filename,
728 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000729 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000730 else {
731 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000732 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000734 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000735 else
Guido van Rossum82598051997-03-05 00:20:32 +0000736 PyFile_WriteString(filename, f);
737 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000738 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000739 PyFile_WriteString(buf, f);
740 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000741 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000742 char *nl;
743 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000744 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000745 offset--;
746 for (;;) {
747 nl = strchr(text, '\n');
748 if (nl == NULL ||
749 nl-text >= offset)
750 break;
751 offset -= (nl+1-text);
752 text = nl+1;
753 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000754 while (*text == ' ' || *text == '\t') {
755 text++;
756 offset--;
757 }
Guido van Rossum82598051997-03-05 00:20:32 +0000758 PyFile_WriteString(" ", f);
759 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000760 if (*text == '\0' ||
761 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000762 PyFile_WriteString("\n", f);
763 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764 offset--;
765 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000767 offset--;
768 }
Guido van Rossum82598051997-03-05 00:20:32 +0000769 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000770 }
Guido van Rossum82598051997-03-05 00:20:32 +0000771 Py_INCREF(message);
772 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000773 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000774 /* Can't be bothered to check all those
775 PyFile_WriteString() calls */
776 if (PyErr_Occurred())
777 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 }
779 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000780 if (err) {
781 /* Don't do anything else */
782 }
783 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000784 PyClassObject* exc = (PyClassObject*)exception;
785 PyObject* className = exc->cl_name;
786 PyObject* moduleName =
787 PyDict_GetItemString(exc->cl_dict, "__module__");
788
789 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000790 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000791 else {
792 char* modstr = PyString_AsString(moduleName);
793 if (modstr && strcmp(modstr, "exceptions"))
794 {
795 err = PyFile_WriteString(modstr, f);
796 err += PyFile_WriteString(".", f);
797 }
798 }
799 if (err == 0) {
800 if (className == NULL)
801 err = PyFile_WriteString("<unknown>", f);
802 else
803 err = PyFile_WriteObject(className, f,
804 Py_PRINT_RAW);
805 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000806 }
807 else
808 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
809 if (err == 0) {
810 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000811 PyObject *s = PyObject_Str(v);
812 /* only print colon if the str() of the
813 object is not the empty string
814 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000815 if (s == NULL)
816 err = -1;
817 else if (!PyString_Check(s) ||
818 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000819 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000820 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000821 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
822 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000823 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000824 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000825 if (err == 0)
826 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000827 }
Guido van Rossum82598051997-03-05 00:20:32 +0000828 Py_XDECREF(exception);
829 Py_XDECREF(v);
830 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000831 /* If an error happened here, don't show it.
832 XXX This is wrong, but too many callers rely on this behavior. */
833 if (err != 0)
834 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000835}
836
Guido van Rossum82598051997-03-05 00:20:32 +0000837PyObject *
838PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000839 char *str;
840 int start;
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 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000844 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000845}
846
Guido van Rossum82598051997-03-05 00:20:32 +0000847PyObject *
848PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000849 FILE *fp;
850 char *filename;
851 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000852 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000853{
Guido van Rossum82598051997-03-05 00:20:32 +0000854 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000855 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000856}
857
Guido van Rossum82598051997-03-05 00:20:32 +0000858static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000859run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000860 node *n;
861 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000862 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000863{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000864 if (n == NULL)
865 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000866 return run_node(n, filename, globals, locals);
867}
868
Guido van Rossum82598051997-03-05 00:20:32 +0000869static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000870run_node(n, filename, globals, locals)
871 node *n;
872 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000873 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000874{
Guido van Rossum82598051997-03-05 00:20:32 +0000875 PyCodeObject *co;
876 PyObject *v;
877 co = PyNode_Compile(n, filename);
878 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000879 if (co == NULL)
880 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000881 v = PyEval_EvalCode(co, globals, locals);
882 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883 return v;
884}
885
Guido van Rossum82598051997-03-05 00:20:32 +0000886static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000887run_pyc_file(fp, filename, globals, locals)
888 FILE *fp;
889 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000890 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000891{
Guido van Rossum82598051997-03-05 00:20:32 +0000892 PyCodeObject *co;
893 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000894 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000895 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000896
Guido van Rossum82598051997-03-05 00:20:32 +0000897 magic = PyMarshal_ReadLongFromFile(fp);
898 if (magic != PyImport_GetMagicNumber()) {
899 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000900 "Bad magic number in .pyc file");
901 return NULL;
902 }
Guido van Rossum82598051997-03-05 00:20:32 +0000903 (void) PyMarshal_ReadLongFromFile(fp);
904 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000905 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000906 if (v == NULL || !PyCode_Check(v)) {
907 Py_XDECREF(v);
908 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000909 "Bad code object in .pyc file");
910 return NULL;
911 }
Guido van Rossum82598051997-03-05 00:20:32 +0000912 co = (PyCodeObject *)v;
913 v = PyEval_EvalCode(co, globals, locals);
914 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000915 return v;
916}
917
Guido van Rossum82598051997-03-05 00:20:32 +0000918PyObject *
919Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000920 char *str;
921 char *filename;
922 int start;
923{
924 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000925 PyCodeObject *co;
926 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000927 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000928 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000929 co = PyNode_Compile(n, filename);
930 PyNode_Free(n);
931 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000932}
933
Guido van Rossuma110aa61994-08-29 12:50:44 +0000934/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000935
Guido van Rossuma110aa61994-08-29 12:50:44 +0000936node *
Guido van Rossum82598051997-03-05 00:20:32 +0000937PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000938 FILE *fp;
939 char *filename;
940 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000941{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000942 node *n;
943 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000944 Py_BEGIN_ALLOW_THREADS
945 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000946 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000947 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000948 if (n == NULL)
949 err_input(&err);
950 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000951}
952
Guido van Rossuma110aa61994-08-29 12:50:44 +0000953/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000954
Guido van Rossuma110aa61994-08-29 12:50:44 +0000955node *
Guido van Rossum82598051997-03-05 00:20:32 +0000956PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000957 char *str;
958 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000959{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000960 node *n;
961 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000962 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000963 if (n == NULL)
964 err_input(&err);
965 return n;
966}
967
968/* Set the error appropriate to the given input error code (see errcode.h) */
969
970static void
971err_input(err)
972 perrdetail *err;
973{
Guido van Rossum82598051997-03-05 00:20:32 +0000974 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000975 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000976 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000977 err->lineno, err->offset, err->text);
978 if (err->text != NULL) {
979 free(err->text);
980 err->text = NULL;
981 }
982 switch (err->error) {
983 case E_SYNTAX:
984 msg = "invalid syntax";
985 break;
986 case E_TOKEN:
987 msg = "invalid token";
988
989 break;
990 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000991 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000992 return;
993 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000994 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000995 return;
996 case E_EOF:
997 msg = "unexpected EOF while parsing";
998 break;
999 default:
1000 fprintf(stderr, "error=%d\n", err->error);
1001 msg = "unknown parsing error";
1002 break;
1003 }
Guido van Rossum82598051997-03-05 00:20:32 +00001004 w = Py_BuildValue("(sO)", msg, v);
1005 Py_XDECREF(v);
1006 PyErr_SetObject(PyExc_SyntaxError, w);
1007 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001008}
1009
1010/* Print fatal error message and abort */
1011
1012void
Guido van Rossum82598051997-03-05 00:20:32 +00001013Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001014 char *msg;
1015{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001016 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001017#ifdef macintosh
1018 for (;;);
1019#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001020#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001021 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001022 OutputDebugString(msg);
1023 OutputDebugString("\n");
1024#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001025 abort();
1026}
1027
1028/* Clean up and exit */
1029
Guido van Rossuma110aa61994-08-29 12:50:44 +00001030#ifdef WITH_THREAD
1031#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001032int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001033#endif
1034
Guido van Rossum1662dd51994-09-07 14:38:28 +00001035#define NEXITFUNCS 32
1036static void (*exitfuncs[NEXITFUNCS])();
1037static int nexitfuncs = 0;
1038
1039int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001040 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001041{
1042 if (nexitfuncs >= NEXITFUNCS)
1043 return -1;
1044 exitfuncs[nexitfuncs++] = func;
1045 return 0;
1046}
1047
Guido van Rossumcc283f51997-08-05 02:22:03 +00001048static void
1049call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001050{
Guido van Rossum82598051997-03-05 00:20:32 +00001051 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001052
1053 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001054 PyObject *res;
1055 Py_INCREF(exitfunc);
1056 PySys_SetObject("exitfunc", (PyObject *)NULL);
1057 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001058 if (res == NULL) {
1059 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001060 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001061 }
Guido van Rossum82598051997-03-05 00:20:32 +00001062 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001063 }
1064
Guido van Rossum82598051997-03-05 00:20:32 +00001065 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001066}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001067
Guido van Rossumcc283f51997-08-05 02:22:03 +00001068static void
1069call_ll_exitfuncs()
1070{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001071 while (nexitfuncs > 0)
1072 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001073
1074 fflush(stdout);
1075 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001076}
1077
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001078#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001079extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001080#endif
1081
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001082void
Guido van Rossum82598051997-03-05 00:20:32 +00001083Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001084 int sts;
1085{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001086 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001087
Jack Jansen66a89771995-10-27 13:22:14 +00001088#ifdef macintosh
1089 PyMac_Exit(sts);
1090#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001091 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001092#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001093}
1094
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001095static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001096initsigs()
1097{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001098#ifdef HAVE_SIGNAL_H
1099#ifdef SIGPIPE
1100 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001101#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001102#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001103 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001104}
1105
Guido van Rossumaae0d321996-05-22 16:35:33 +00001106#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001107/* Ask a yes/no question */
1108
Guido van Rossum59bff391992-09-03 20:28:00 +00001109int
Guido van Rossum82598051997-03-05 00:20:32 +00001110_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001111 char *prompt;
1112{
1113 char buf[256];
1114
1115 printf("%s [ny] ", prompt);
1116 if (fgets(buf, sizeof buf, stdin) == NULL)
1117 return 0;
1118 return buf[0] == 'y' || buf[0] == 'Y';
1119}
1120#endif
1121
Guido van Rossuma110aa61994-08-29 12:50:44 +00001122#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001123
1124/* Check for file descriptor connected to interactive device.
1125 Pretend that stdin is always interactive, other files never. */
1126
1127int
1128isatty(fd)
1129 int fd;
1130{
1131 return fd == fileno(stdin);
1132}
1133
1134#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001135
1136/*
1137 * The file descriptor fd is considered ``interactive'' if either
1138 * a) isatty(fd) is TRUE, or
1139 * b) the -i flag was given, and the filename associated with
1140 * the descriptor is NULL or "<stdin>" or "???".
1141 */
1142int
1143Py_FdIsInteractive(fp, filename)
1144 FILE *fp;
1145 char *filename;
1146{
1147 if (isatty((int)fileno(fp)))
1148 return 1;
1149 if (!Py_InteractiveFlag)
1150 return 0;
1151 return (filename == NULL) ||
1152 (strcmp(filename, "<stdin>") == 0) ||
1153 (strcmp(filename, "???") == 0);
1154}