blob: 2be073bda0fa782984198fc63473e4a847a563ed [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 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000504 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000505 Py_XDECREF(v);
506 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000507 if (n == NULL) {
508 if (err.error == E_EOF) {
509 if (err.text)
510 free(err.text);
511 return E_EOF;
512 }
513 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000514 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000515 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000516 }
Guido van Rossum82598051997-03-05 00:20:32 +0000517 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 if (m == NULL)
519 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000520 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000521 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000522 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000523 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000524 return -1;
525 }
Guido van Rossum82598051997-03-05 00:20:32 +0000526 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000527 if (Py_FlushLine())
528 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000529 return 0;
530}
531
532int
Guido van Rossum82598051997-03-05 00:20:32 +0000533PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000534 FILE *fp;
535 char *filename;
536{
Guido van Rossum82598051997-03-05 00:20:32 +0000537 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000538 char *ext;
539
Guido van Rossum82598051997-03-05 00:20:32 +0000540 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541 if (m == NULL)
542 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000543 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000544 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000545 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000546#ifdef macintosh
547 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000548 || getfiletype(filename) == 'PYC '
549 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000550#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000551 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000552 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000553 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000554 if( (fp = fopen(filename, "rb")) == NULL ) {
555 fprintf(stderr, "python: Can't reopen .pyc file\n");
556 return -1;
557 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000558 /* Turn on optimization if a .pyo file is given */
559 if (strcmp(ext, ".pyo") == 0)
560 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000561 v = run_pyc_file(fp, filename, d, d);
562 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000563 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000564 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000565 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000566 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000567 return -1;
568 }
Guido van Rossum82598051997-03-05 00:20:32 +0000569 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000570 if (Py_FlushLine())
571 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 return 0;
573}
574
575int
Guido van Rossum82598051997-03-05 00:20:32 +0000576PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577 char *command;
578{
Guido van Rossum82598051997-03-05 00:20:32 +0000579 PyObject *m, *d, *v;
580 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000581 if (m == NULL)
582 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000583 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000584 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000586 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 return -1;
588 }
Guido van Rossum82598051997-03-05 00:20:32 +0000589 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000590 if (Py_FlushLine())
591 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592 return 0;
593}
594
Barry Warsaw035574d1997-08-29 22:07:17 +0000595static int
596parse_syntax_error(err, message, filename, lineno, offset, text)
597 PyObject* err;
598 PyObject** message;
599 char** filename;
600 int* lineno;
601 int* offset;
602 char** text;
603{
604 long hold;
605 PyObject *v;
606
607 /* old style errors */
608 if (PyTuple_Check(err))
609 return PyArg_Parse(err, "(O(ziiz))", message, filename,
610 lineno, offset, text);
611
612 /* new style errors. `err' is an instance */
613
614 if (! (v = PyObject_GetAttrString(err, "msg")))
615 goto finally;
616 *message = v;
617
618 if (!(v = PyObject_GetAttrString(err, "filename")))
619 goto finally;
620 if (v == Py_None)
621 *filename = NULL;
622 else if (! (*filename = PyString_AsString(v)))
623 goto finally;
624
625 Py_DECREF(v);
626 if (!(v = PyObject_GetAttrString(err, "lineno")))
627 goto finally;
628 hold = PyInt_AsLong(v);
629 Py_DECREF(v);
630 v = NULL;
631 if (hold < 0 && PyErr_Occurred())
632 goto finally;
633 *lineno = (int)hold;
634
635 if (!(v = PyObject_GetAttrString(err, "offset")))
636 goto finally;
637 hold = PyInt_AsLong(v);
638 Py_DECREF(v);
639 v = NULL;
640 if (hold < 0 && PyErr_Occurred())
641 goto finally;
642 *offset = (int)hold;
643
644 if (!(v = PyObject_GetAttrString(err, "text")))
645 goto finally;
646 if (v == Py_None)
647 *text = NULL;
648 else if (! (*text = PyString_AsString(v)))
649 goto finally;
650 Py_DECREF(v);
651 return 1;
652
653finally:
654 Py_XDECREF(v);
655 return 0;
656}
657
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000658void
Guido van Rossum82598051997-03-05 00:20:32 +0000659PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000661 PyErr_PrintEx(1);
662}
663
664void
665PyErr_PrintEx(set_sys_last_vars)
666 int set_sys_last_vars;
667{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000668 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000669 PyObject *exception, *v, *tb, *f;
670 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000671 PyErr_NormalizeException(&exception, &v, &tb);
672
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000673 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000674 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000675
Barry Warsaw36b8f941997-08-26 18:09:48 +0000676 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000677 if (Py_FlushLine())
678 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000679 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000680 if (v == NULL || v == Py_None)
681 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000682 if (PyInstance_Check(v)) {
683 /* we expect the error code to be store in the
684 `code' attribute
685 */
686 PyObject *code = PyObject_GetAttrString(v, "code");
687 if (code) {
688 Py_DECREF(v);
689 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000690 if (v == Py_None)
691 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000692 }
693 /* if we failed to dig out the "code" attribute,
694 then just let the else clause below print the
695 error
696 */
697 }
Guido van Rossum82598051997-03-05 00:20:32 +0000698 if (PyInt_Check(v))
699 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000700 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000701 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000702 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000703 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000704 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705 }
706 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000707 if (set_sys_last_vars) {
708 PySys_SetObject("last_type", exception);
709 PySys_SetObject("last_value", v);
710 PySys_SetObject("last_traceback", tb);
711 }
Guido van Rossum82598051997-03-05 00:20:32 +0000712 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000713 if (f == NULL)
714 fprintf(stderr, "lost sys.stderr\n");
715 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000716 if (Py_FlushLine())
717 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000718 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000719 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000720 if (err == 0 &&
721 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
722 {
Guido van Rossum82598051997-03-05 00:20:32 +0000723 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000724 char *filename, *text;
725 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000726 if (!parse_syntax_error(v, &message, &filename,
727 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000728 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000729 else {
730 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000731 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000732 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000733 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734 else
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyFile_WriteString(filename, f);
736 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000737 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000738 PyFile_WriteString(buf, f);
739 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000740 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000741 char *nl;
742 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000743 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000744 offset--;
745 for (;;) {
746 nl = strchr(text, '\n');
747 if (nl == NULL ||
748 nl-text >= offset)
749 break;
750 offset -= (nl+1-text);
751 text = nl+1;
752 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000753 while (*text == ' ' || *text == '\t') {
754 text++;
755 offset--;
756 }
Guido van Rossum82598051997-03-05 00:20:32 +0000757 PyFile_WriteString(" ", f);
758 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 if (*text == '\0' ||
760 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000761 PyFile_WriteString("\n", f);
762 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000763 offset--;
764 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000765 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000766 offset--;
767 }
Guido van Rossum82598051997-03-05 00:20:32 +0000768 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000769 }
Guido van Rossum82598051997-03-05 00:20:32 +0000770 Py_INCREF(message);
771 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000772 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000773 /* Can't be bothered to check all those
774 PyFile_WriteString() calls */
775 if (PyErr_Occurred())
776 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000777 }
778 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000779 if (err) {
780 /* Don't do anything else */
781 }
782 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000783 PyClassObject* exc = (PyClassObject*)exception;
784 PyObject* className = exc->cl_name;
785 PyObject* moduleName =
786 PyDict_GetItemString(exc->cl_dict, "__module__");
787
788 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000789 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000790 else {
791 char* modstr = PyString_AsString(moduleName);
792 if (modstr && strcmp(modstr, "exceptions"))
793 {
794 err = PyFile_WriteString(modstr, f);
795 err += PyFile_WriteString(".", f);
796 }
797 }
798 if (err == 0) {
799 if (className == NULL)
800 err = PyFile_WriteString("<unknown>", f);
801 else
802 err = PyFile_WriteObject(className, f,
803 Py_PRINT_RAW);
804 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000805 }
806 else
807 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
808 if (err == 0) {
809 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000810 PyObject *s = PyObject_Str(v);
811 /* only print colon if the str() of the
812 object is not the empty string
813 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000814 if (s == NULL)
815 err = -1;
816 else if (!PyString_Check(s) ||
817 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000818 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000819 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000820 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
821 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000822 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000823 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000824 if (err == 0)
825 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000826 }
Guido van Rossum82598051997-03-05 00:20:32 +0000827 Py_XDECREF(exception);
828 Py_XDECREF(v);
829 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000830 /* If an error happened here, don't show it.
831 XXX This is wrong, but too many callers rely on this behavior. */
832 if (err != 0)
833 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000834}
835
Guido van Rossum82598051997-03-05 00:20:32 +0000836PyObject *
837PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000838 char *str;
839 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000840 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000841{
Guido van Rossum82598051997-03-05 00:20:32 +0000842 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000843 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000844}
845
Guido van Rossum82598051997-03-05 00:20:32 +0000846PyObject *
847PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000848 FILE *fp;
849 char *filename;
850 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000851 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000852{
Guido van Rossum82598051997-03-05 00:20:32 +0000853 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000854 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855}
856
Guido van Rossum82598051997-03-05 00:20:32 +0000857static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000858run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 node *n;
860 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000861 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000862{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000863 if (n == NULL)
864 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000865 return run_node(n, filename, globals, locals);
866}
867
Guido van Rossum82598051997-03-05 00:20:32 +0000868static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000869run_node(n, filename, globals, locals)
870 node *n;
871 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000872 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873{
Guido van Rossum82598051997-03-05 00:20:32 +0000874 PyCodeObject *co;
875 PyObject *v;
876 co = PyNode_Compile(n, filename);
877 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000878 if (co == NULL)
879 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000880 v = PyEval_EvalCode(co, globals, locals);
881 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000882 return v;
883}
884
Guido van Rossum82598051997-03-05 00:20:32 +0000885static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000886run_pyc_file(fp, filename, globals, locals)
887 FILE *fp;
888 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000889 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000890{
Guido van Rossum82598051997-03-05 00:20:32 +0000891 PyCodeObject *co;
892 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000893 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000894 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000895
Guido van Rossum82598051997-03-05 00:20:32 +0000896 magic = PyMarshal_ReadLongFromFile(fp);
897 if (magic != PyImport_GetMagicNumber()) {
898 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000899 "Bad magic number in .pyc file");
900 return NULL;
901 }
Guido van Rossum82598051997-03-05 00:20:32 +0000902 (void) PyMarshal_ReadLongFromFile(fp);
903 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000904 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000905 if (v == NULL || !PyCode_Check(v)) {
906 Py_XDECREF(v);
907 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000908 "Bad code object in .pyc file");
909 return NULL;
910 }
Guido van Rossum82598051997-03-05 00:20:32 +0000911 co = (PyCodeObject *)v;
912 v = PyEval_EvalCode(co, globals, locals);
913 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000914 return v;
915}
916
Guido van Rossum82598051997-03-05 00:20:32 +0000917PyObject *
918Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000919 char *str;
920 char *filename;
921 int start;
922{
923 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000924 PyCodeObject *co;
925 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000926 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000927 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000928 co = PyNode_Compile(n, filename);
929 PyNode_Free(n);
930 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000931}
932
Guido van Rossuma110aa61994-08-29 12:50:44 +0000933/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000934
Guido van Rossuma110aa61994-08-29 12:50:44 +0000935node *
Guido van Rossum82598051997-03-05 00:20:32 +0000936PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000937 FILE *fp;
938 char *filename;
939 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000940{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 node *n;
942 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000943 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000944 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000945 if (n == NULL)
946 err_input(&err);
947 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000948}
949
Guido van Rossuma110aa61994-08-29 12:50:44 +0000950/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000951
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952node *
Guido van Rossum82598051997-03-05 00:20:32 +0000953PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000954 char *str;
955 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000956{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000957 node *n;
958 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000959 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000960 if (n == NULL)
961 err_input(&err);
962 return n;
963}
964
965/* Set the error appropriate to the given input error code (see errcode.h) */
966
967static void
968err_input(err)
969 perrdetail *err;
970{
Guido van Rossum82598051997-03-05 00:20:32 +0000971 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000972 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000973 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000974 err->lineno, err->offset, err->text);
975 if (err->text != NULL) {
976 free(err->text);
977 err->text = NULL;
978 }
979 switch (err->error) {
980 case E_SYNTAX:
981 msg = "invalid syntax";
982 break;
983 case E_TOKEN:
984 msg = "invalid token";
985
986 break;
987 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000988 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000989 return;
990 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000991 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000992 return;
993 case E_EOF:
994 msg = "unexpected EOF while parsing";
995 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +0000996 case E_INDENT:
997 msg = "inconsistent use of tabs and spaces in indentation";
998 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000999 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");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001024#ifdef _DEBUG
1025 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001026#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001027#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001028 abort();
1029}
1030
1031/* Clean up and exit */
1032
Guido van Rossuma110aa61994-08-29 12:50:44 +00001033#ifdef WITH_THREAD
1034#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001035int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001036#endif
1037
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001038#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001039static void (*exitfuncs[NEXITFUNCS])();
1040static int nexitfuncs = 0;
1041
1042int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001043 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001044{
1045 if (nexitfuncs >= NEXITFUNCS)
1046 return -1;
1047 exitfuncs[nexitfuncs++] = func;
1048 return 0;
1049}
1050
Guido van Rossumcc283f51997-08-05 02:22:03 +00001051static void
1052call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001053{
Guido van Rossum82598051997-03-05 00:20:32 +00001054 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001055
1056 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001057 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001058 Py_INCREF(exitfunc);
1059 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001060 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001061 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001062 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001063 if (f)
1064 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001065 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001066 }
Guido van Rossum82598051997-03-05 00:20:32 +00001067 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001068 }
1069
Guido van Rossum0829c751998-02-28 04:31:39 +00001070 if (Py_FlushLine())
1071 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001072}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001073
Guido van Rossumcc283f51997-08-05 02:22:03 +00001074static void
1075call_ll_exitfuncs()
1076{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001077 while (nexitfuncs > 0)
1078 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001079
1080 fflush(stdout);
1081 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001082}
1083
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001084#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001085extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001086#endif
1087
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001088void
Guido van Rossum82598051997-03-05 00:20:32 +00001089Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001090 int sts;
1091{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001092 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001093
Jack Jansen66a89771995-10-27 13:22:14 +00001094#ifdef macintosh
1095 PyMac_Exit(sts);
1096#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001097 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001098#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001099}
1100
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001101static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001102initsigs()
1103{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001104#ifdef HAVE_SIGNAL_H
1105#ifdef SIGPIPE
1106 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001107#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001108#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001109 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001110}
1111
Guido van Rossumaae0d321996-05-22 16:35:33 +00001112#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001113/* Ask a yes/no question */
1114
Guido van Rossum59bff391992-09-03 20:28:00 +00001115int
Guido van Rossum82598051997-03-05 00:20:32 +00001116_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001117 char *prompt;
1118{
1119 char buf[256];
1120
1121 printf("%s [ny] ", prompt);
1122 if (fgets(buf, sizeof buf, stdin) == NULL)
1123 return 0;
1124 return buf[0] == 'y' || buf[0] == 'Y';
1125}
1126#endif
1127
Guido van Rossuma110aa61994-08-29 12:50:44 +00001128#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001129
1130/* Check for file descriptor connected to interactive device.
1131 Pretend that stdin is always interactive, other files never. */
1132
1133int
1134isatty(fd)
1135 int fd;
1136{
1137 return fd == fileno(stdin);
1138}
1139
1140#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001141
1142/*
1143 * The file descriptor fd is considered ``interactive'' if either
1144 * a) isatty(fd) is TRUE, or
1145 * b) the -i flag was given, and the filename associated with
1146 * the descriptor is NULL or "<stdin>" or "???".
1147 */
1148int
1149Py_FdIsInteractive(fp, filename)
1150 FILE *fp;
1151 char *filename;
1152{
1153 if (isatty((int)fileno(fp)))
1154 return 1;
1155 if (!Py_InteractiveFlag)
1156 return 0;
1157 return (filename == NULL) ||
1158 (strcmp(filename, "<stdin>") == 0) ||
1159 (strcmp(filename, "???") == 0);
1160}