blob: 17d569d78f636d49df16053c67c44e1f1315db2a [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 Rossumbffd6832000-01-20 22:32:56 +000075#ifdef Py_TRACE_REFS
76int _Py_AskYesNo(char *prompt);
77#endif
78
Guido van Rossumc94044c2000-03-10 23:03:54 +000079extern void _PyUnicode_Init();
80extern void _PyUnicode_Fini();
81extern void _PyCodecRegistry_Init();
82extern void _PyCodecRegistry_Fini();
83
84
Guido van Rossum82598051997-03-05 00:20:32 +000085int Py_DebugFlag; /* Needed by parser.c */
86int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000087int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000088int Py_NoSiteFlag; /* Suppress 'import site' */
Guido van Rossum999e5e91997-10-03 19:46:02 +000089int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c */
Guido van Rossuma61691e1998-02-06 22:27:24 +000090int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000091
Guido van Rossum25ce5661997-08-02 03:10:38 +000092static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000094/* API to access the initialized flag -- useful for eroteric use */
95
96int
97Py_IsInitialized()
98{
99 return initialized;
100}
101
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102/* Global initializations. Can be undone by Py_Finalize(). Don't
103 call this twice without an intervening Py_Finalize() call. When
104 initializations fail, a fatal error is issued and the function does
105 not return. On return, the first thread and interpreter state have
106 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108 Locking: you must hold the interpreter lock while calling this.
109 (If the lock has not yet been initialized, that's equivalent to
110 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000111
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113
114void
115Py_Initialize()
116{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000118 PyThreadState *tstate;
119 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000121
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000122 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000123 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000124 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000126 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
127 Py_DebugFlag = 1;
128 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
129 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000130 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
131 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000132
Guido van Rossuma027efa1997-05-05 20:56:21 +0000133 interp = PyInterpreterState_New();
134 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000136
Guido van Rossuma027efa1997-05-05 20:56:21 +0000137 tstate = PyThreadState_New(interp);
138 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000140 (void) PyThreadState_Swap(tstate);
141
Guido van Rossum25ce5661997-08-02 03:10:38 +0000142 interp->modules = PyDict_New();
143 if (interp->modules == NULL)
144 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145
Guido van Rossumc94044c2000-03-10 23:03:54 +0000146 /* Init codec registry */
147 _PyCodecRegistry_Init();
148
149 /* Init Unicode implementation; relies on the codec registry */
150 _PyUnicode_Init();
151
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000152 _PyCompareState_Key = PyString_InternFromString("cmp_state");
153
Barry Warsaw035574d1997-08-29 22:07:17 +0000154 bimod = _PyBuiltin_Init_1();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000155 if (bimod == NULL)
156 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000157 interp->builtins = PyModule_GetDict(bimod);
158 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000159
160 sysmod = _PySys_Init();
161 if (sysmod == NULL)
162 Py_FatalError("Py_Initialize: can't initialize sys");
163 interp->sysdict = PyModule_GetDict(sysmod);
164 Py_INCREF(interp->sysdict);
165 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000166 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167 PyDict_SetItemString(interp->sysdict, "modules",
168 interp->modules);
169
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000170 _PyImport_Init();
171
Barry Warsaw035574d1997-08-29 22:07:17 +0000172 /* phase 2 of builtins */
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000173 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000174 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000175
Guido van Rossum25ce5661997-08-02 03:10:38 +0000176 initsigs(); /* Signal handling stuff, including initintr() */
177
178 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000179 if (!Py_NoSiteFlag)
180 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000181}
182
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000183#ifdef COUNT_ALLOCS
184extern void dump_counts Py_PROTO((void));
185#endif
186
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187/* Undo the effect of Py_Initialize().
188
189 Beware: if multiple interpreter and/or thread states exist, these
190 are not wiped out; only the current thread and interpreter state
191 are deleted. But since everything else is deleted, those other
192 interpreter and thread states should no longer be used.
193
194 (XXX We should do better, e.g. wipe out all interpreters and
195 threads.)
196
197 Locking: as above.
198
199*/
200
201void
202Py_Finalize()
203{
204 PyInterpreterState *interp;
205 PyThreadState *tstate;
206
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000207 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000208 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000209 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000210
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000211 call_sys_exitfunc();
212
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000213 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000214 tstate = PyThreadState_Get();
215 interp = tstate->interp;
216
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000217 /* Disable signal handling */
218 PyOS_FiniInterrupts();
219
220 /* Destroy PyExc_MemoryErrorInst */
221 _PyBuiltin_Fini_1();
222
Guido van Rossumc94044c2000-03-10 23:03:54 +0000223 /* Cleanup Unicode implementation */
224 _PyUnicode_Fini();
225
226 /* Cleanup Codec registry */
227 _PyCodecRegistry_Fini();
228
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000229 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000230 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000231
Guido van Rossum1707aad1997-12-08 23:43:45 +0000232 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
233 _PyImport_Fini();
234
235 /* Debugging stuff */
236#ifdef COUNT_ALLOCS
237 dump_counts();
238#endif
239
240#ifdef Py_REF_DEBUG
241 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
242#endif
243
244#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000245 if (
246#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
247 getenv("PYTHONDUMPREFS") &&
248#endif /* MS_WINDOWS */
249 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000250 _Py_PrintReferences(stderr);
251 }
252#endif /* Py_TRACE_REFS */
253
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000254 /* Delete current thread */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255 PyInterpreterState_Clear(interp);
256 PyThreadState_Swap(NULL);
257 PyInterpreterState_Delete(interp);
258
Barry Warsaw035574d1997-08-29 22:07:17 +0000259 /* Now we decref the exception classes. After this point nothing
260 can raise an exception. That's okay, because each Fini() method
261 below has been checked to make sure no exceptions are ever
262 raised.
263 */
264 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000265 PyMethod_Fini();
266 PyFrame_Fini();
267 PyCFunction_Fini();
268 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000269 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000270 PyInt_Fini();
271 PyFloat_Fini();
272
273 /* XXX Still allocated:
274 - various static ad-hoc pointers to interned strings
275 - int and float free list blocks
276 - whatever various modules and libraries allocate
277 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278
279 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000280
281 call_ll_exitfuncs();
282
Guido van Rossumcc283f51997-08-05 02:22:03 +0000283#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000284 _Py_ResetReferences();
285#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000286}
287
288/* Create and initialize a new interpreter and thread, and return the
289 new thread. This requires that Py_Initialize() has been called
290 first.
291
292 Unsuccessful initialization yields a NULL pointer. Note that *no*
293 exception information is available even in this case -- the
294 exception information is held in the thread, and there is no
295 thread.
296
297 Locking: as above.
298
299*/
300
301PyThreadState *
302Py_NewInterpreter()
303{
304 PyInterpreterState *interp;
305 PyThreadState *tstate, *save_tstate;
306 PyObject *bimod, *sysmod;
307
308 if (!initialized)
309 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
310
311 interp = PyInterpreterState_New();
312 if (interp == NULL)
313 return NULL;
314
315 tstate = PyThreadState_New(interp);
316 if (tstate == NULL) {
317 PyInterpreterState_Delete(interp);
318 return NULL;
319 }
320
321 save_tstate = PyThreadState_Swap(tstate);
322
323 /* XXX The following is lax in error checking */
324
325 interp->modules = PyDict_New();
326
327 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
328 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000329 interp->builtins = PyModule_GetDict(bimod);
330 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000331 }
332 sysmod = _PyImport_FindExtension("sys", "sys");
333 if (bimod != NULL && sysmod != NULL) {
334 interp->sysdict = PyModule_GetDict(sysmod);
335 Py_INCREF(interp->sysdict);
336 PySys_SetPath(Py_GetPath());
337 PyDict_SetItemString(interp->sysdict, "modules",
338 interp->modules);
339 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000340 if (!Py_NoSiteFlag)
341 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000342 }
343
344 if (!PyErr_Occurred())
345 return tstate;
346
347 /* Oops, it didn't work. Undo it all. */
348
349 PyErr_Print();
350 PyThreadState_Clear(tstate);
351 PyThreadState_Swap(save_tstate);
352 PyThreadState_Delete(tstate);
353 PyInterpreterState_Delete(interp);
354
355 return NULL;
356}
357
358/* Delete an interpreter and its last thread. This requires that the
359 given thread state is current, that the thread has no remaining
360 frames, and that it is its interpreter's only remaining thread.
361 It is a fatal error to violate these constraints.
362
363 (Py_Finalize() doesn't have these constraints -- it zaps
364 everything, regardless.)
365
366 Locking: as above.
367
368*/
369
370void
371Py_EndInterpreter(tstate)
372 PyThreadState *tstate;
373{
374 PyInterpreterState *interp = tstate->interp;
375
376 if (tstate != PyThreadState_Get())
377 Py_FatalError("Py_EndInterpreter: thread is not current");
378 if (tstate->frame != NULL)
379 Py_FatalError("Py_EndInterpreter: thread still has a frame");
380 if (tstate != interp->tstate_head || tstate->next != NULL)
381 Py_FatalError("Py_EndInterpreter: not the last thread");
382
383 PyImport_Cleanup();
384 PyInterpreterState_Clear(interp);
385 PyThreadState_Swap(NULL);
386 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000387}
388
389static char *progname = "python";
390
391void
392Py_SetProgramName(pn)
393 char *pn;
394{
395 if (pn && *pn)
396 progname = pn;
397}
398
399char *
400Py_GetProgramName()
401{
402 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000403}
404
Guido van Rossuma61691e1998-02-06 22:27:24 +0000405static char *default_home = NULL;
406
407void
408Py_SetPythonHome(home)
409 char *home;
410{
411 default_home = home;
412}
413
414char *
415Py_GetPythonHome()
416{
417 char *home = default_home;
418 if (home == NULL)
419 home = getenv("PYTHONHOME");
420 return home;
421}
422
Guido van Rossum6135a871995-01-09 17:53:26 +0000423/* Create __main__ module */
424
425static void
426initmain()
427{
Guido van Rossum82598051997-03-05 00:20:32 +0000428 PyObject *m, *d;
429 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000430 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000431 Py_FatalError("can't create __main__ module");
432 d = PyModule_GetDict(m);
433 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000434 PyObject *bimod = PyImport_ImportModule("__builtin__");
435 if (bimod == NULL ||
436 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000437 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000438 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000439 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440}
441
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000442/* Import the site module (not into __main__ though) */
443
444static void
445initsite()
446{
447 PyObject *m, *f;
448 m = PyImport_ImportModule("site");
449 if (m == NULL) {
450 f = PySys_GetObject("stderr");
451 if (Py_VerboseFlag) {
452 PyFile_WriteString(
453 "'import site' failed; traceback:\n", f);
454 PyErr_Print();
455 }
456 else {
457 PyFile_WriteString(
458 "'import site' failed; use -v for traceback\n", f);
459 PyErr_Clear();
460 }
461 }
462 else {
463 Py_DECREF(m);
464 }
465}
466
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000467/* Parse input from a file and execute it */
468
469int
Guido van Rossum82598051997-03-05 00:20:32 +0000470PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 FILE *fp;
472 char *filename;
473{
474 if (filename == NULL)
475 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000476 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000477 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478 else
Guido van Rossum82598051997-03-05 00:20:32 +0000479 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480}
481
482int
Guido van Rossum82598051997-03-05 00:20:32 +0000483PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000484 FILE *fp;
485 char *filename;
486{
Guido van Rossum82598051997-03-05 00:20:32 +0000487 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000488 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000489 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000490 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000491 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
492 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493 }
Guido van Rossum82598051997-03-05 00:20:32 +0000494 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000496 PySys_SetObject("ps2", v = PyString_FromString("... "));
497 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000498 }
499 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000500 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000501#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000502 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503#endif
504 if (ret == E_EOF)
505 return 0;
506 /*
507 if (ret == E_NOMEM)
508 return -1;
509 */
510 }
511}
512
513int
Guido van Rossum82598051997-03-05 00:20:32 +0000514PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 FILE *fp;
516 char *filename;
517{
Guido van Rossum82598051997-03-05 00:20:32 +0000518 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000519 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000520 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000521 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000522 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000523 if (v != NULL) {
524 v = PyObject_Str(v);
525 if (v == NULL)
526 PyErr_Clear();
527 else if (PyString_Check(v))
528 ps1 = PyString_AsString(v);
529 }
Guido van Rossum82598051997-03-05 00:20:32 +0000530 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000531 if (w != NULL) {
532 w = PyObject_Str(w);
533 if (w == NULL)
534 PyErr_Clear();
535 else if (PyString_Check(w))
536 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000537 }
Guido van Rossum82598051997-03-05 00:20:32 +0000538 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000539 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000540 Py_XDECREF(v);
541 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000542 if (n == NULL) {
543 if (err.error == E_EOF) {
544 if (err.text)
545 free(err.text);
546 return E_EOF;
547 }
548 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000549 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000550 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000551 }
Guido van Rossum82598051997-03-05 00:20:32 +0000552 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 if (m == NULL)
554 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000555 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000556 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000557 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000558 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000559 return -1;
560 }
Guido van Rossum82598051997-03-05 00:20:32 +0000561 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000562 if (Py_FlushLine())
563 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000564 return 0;
565}
566
567int
Guido van Rossum82598051997-03-05 00:20:32 +0000568PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000569 FILE *fp;
570 char *filename;
571{
Guido van Rossum82598051997-03-05 00:20:32 +0000572 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000573 char *ext;
574
Guido van Rossum82598051997-03-05 00:20:32 +0000575 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000576 if (m == NULL)
577 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000578 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000579 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000580 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000581#ifdef macintosh
582 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000583 || getfiletype(filename) == 'PYC '
584 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000585#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000586 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000587 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000588 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000589 if( (fp = fopen(filename, "rb")) == NULL ) {
590 fprintf(stderr, "python: Can't reopen .pyc file\n");
591 return -1;
592 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000593 /* Turn on optimization if a .pyo file is given */
594 if (strcmp(ext, ".pyo") == 0)
595 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000596 v = run_pyc_file(fp, filename, d, d);
597 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000598 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000599 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000600 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000601 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602 return -1;
603 }
Guido van Rossum82598051997-03-05 00:20:32 +0000604 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000605 if (Py_FlushLine())
606 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607 return 0;
608}
609
610int
Guido van Rossum82598051997-03-05 00:20:32 +0000611PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000612 char *command;
613{
Guido van Rossum82598051997-03-05 00:20:32 +0000614 PyObject *m, *d, *v;
615 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616 if (m == NULL)
617 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000618 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000619 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000621 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000622 return -1;
623 }
Guido van Rossum82598051997-03-05 00:20:32 +0000624 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000625 if (Py_FlushLine())
626 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000627 return 0;
628}
629
Barry Warsaw035574d1997-08-29 22:07:17 +0000630static int
631parse_syntax_error(err, message, filename, lineno, offset, text)
632 PyObject* err;
633 PyObject** message;
634 char** filename;
635 int* lineno;
636 int* offset;
637 char** text;
638{
639 long hold;
640 PyObject *v;
641
642 /* old style errors */
643 if (PyTuple_Check(err))
644 return PyArg_Parse(err, "(O(ziiz))", message, filename,
645 lineno, offset, text);
646
647 /* new style errors. `err' is an instance */
648
649 if (! (v = PyObject_GetAttrString(err, "msg")))
650 goto finally;
651 *message = v;
652
653 if (!(v = PyObject_GetAttrString(err, "filename")))
654 goto finally;
655 if (v == Py_None)
656 *filename = NULL;
657 else if (! (*filename = PyString_AsString(v)))
658 goto finally;
659
660 Py_DECREF(v);
661 if (!(v = PyObject_GetAttrString(err, "lineno")))
662 goto finally;
663 hold = PyInt_AsLong(v);
664 Py_DECREF(v);
665 v = NULL;
666 if (hold < 0 && PyErr_Occurred())
667 goto finally;
668 *lineno = (int)hold;
669
670 if (!(v = PyObject_GetAttrString(err, "offset")))
671 goto finally;
672 hold = PyInt_AsLong(v);
673 Py_DECREF(v);
674 v = NULL;
675 if (hold < 0 && PyErr_Occurred())
676 goto finally;
677 *offset = (int)hold;
678
679 if (!(v = PyObject_GetAttrString(err, "text")))
680 goto finally;
681 if (v == Py_None)
682 *text = NULL;
683 else if (! (*text = PyString_AsString(v)))
684 goto finally;
685 Py_DECREF(v);
686 return 1;
687
688finally:
689 Py_XDECREF(v);
690 return 0;
691}
692
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000693void
Guido van Rossum82598051997-03-05 00:20:32 +0000694PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000695{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000696 PyErr_PrintEx(1);
697}
698
699void
700PyErr_PrintEx(set_sys_last_vars)
701 int set_sys_last_vars;
702{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000703 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000704 PyObject *exception, *v, *tb, *f;
705 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000706 PyErr_NormalizeException(&exception, &v, &tb);
707
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000709 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000710
Barry Warsaw36b8f941997-08-26 18:09:48 +0000711 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000712 if (Py_FlushLine())
713 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000714 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000715 if (v == NULL || v == Py_None)
716 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000717 if (PyInstance_Check(v)) {
718 /* we expect the error code to be store in the
719 `code' attribute
720 */
721 PyObject *code = PyObject_GetAttrString(v, "code");
722 if (code) {
723 Py_DECREF(v);
724 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000725 if (v == Py_None)
726 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000727 }
728 /* if we failed to dig out the "code" attribute,
729 then just let the else clause below print the
730 error
731 */
732 }
Guido van Rossum82598051997-03-05 00:20:32 +0000733 if (PyInt_Check(v))
734 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000735 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000736 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000738 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000739 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000740 }
741 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000742 if (set_sys_last_vars) {
743 PySys_SetObject("last_type", exception);
744 PySys_SetObject("last_value", v);
745 PySys_SetObject("last_traceback", tb);
746 }
Guido van Rossum82598051997-03-05 00:20:32 +0000747 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000748 if (f == NULL)
749 fprintf(stderr, "lost sys.stderr\n");
750 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000751 if (Py_FlushLine())
752 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000753 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000754 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000755 if (err == 0 &&
756 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
757 {
Guido van Rossum82598051997-03-05 00:20:32 +0000758 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 char *filename, *text;
760 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000761 if (!parse_syntax_error(v, &message, &filename,
762 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000763 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764 else {
765 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000767 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000768 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000769 else
Guido van Rossum82598051997-03-05 00:20:32 +0000770 PyFile_WriteString(filename, f);
771 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000772 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000773 PyFile_WriteString(buf, f);
774 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000775 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000776 char *nl;
777 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000778 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000779 offset--;
780 for (;;) {
781 nl = strchr(text, '\n');
782 if (nl == NULL ||
783 nl-text >= offset)
784 break;
785 offset -= (nl+1-text);
786 text = nl+1;
787 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788 while (*text == ' ' || *text == '\t') {
789 text++;
790 offset--;
791 }
Guido van Rossum82598051997-03-05 00:20:32 +0000792 PyFile_WriteString(" ", f);
793 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000794 if (*text == '\0' ||
795 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000796 PyFile_WriteString("\n", f);
797 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000798 offset--;
799 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000800 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000801 offset--;
802 }
Guido van Rossum82598051997-03-05 00:20:32 +0000803 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000804 }
Guido van Rossum82598051997-03-05 00:20:32 +0000805 Py_INCREF(message);
806 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000807 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000808 /* Can't be bothered to check all those
809 PyFile_WriteString() calls */
810 if (PyErr_Occurred())
811 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000812 }
813 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000814 if (err) {
815 /* Don't do anything else */
816 }
817 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000818 PyClassObject* exc = (PyClassObject*)exception;
819 PyObject* className = exc->cl_name;
820 PyObject* moduleName =
821 PyDict_GetItemString(exc->cl_dict, "__module__");
822
823 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000824 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000825 else {
826 char* modstr = PyString_AsString(moduleName);
827 if (modstr && strcmp(modstr, "exceptions"))
828 {
829 err = PyFile_WriteString(modstr, f);
830 err += PyFile_WriteString(".", f);
831 }
832 }
833 if (err == 0) {
834 if (className == NULL)
835 err = PyFile_WriteString("<unknown>", f);
836 else
837 err = PyFile_WriteObject(className, f,
838 Py_PRINT_RAW);
839 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000840 }
841 else
842 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
843 if (err == 0) {
844 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000845 PyObject *s = PyObject_Str(v);
846 /* only print colon if the str() of the
847 object is not the empty string
848 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000849 if (s == NULL)
850 err = -1;
851 else if (!PyString_Check(s) ||
852 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000853 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000854 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000855 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
856 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000857 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000858 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000859 if (err == 0)
860 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000861 }
Guido van Rossum82598051997-03-05 00:20:32 +0000862 Py_XDECREF(exception);
863 Py_XDECREF(v);
864 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000865 /* If an error happened here, don't show it.
866 XXX This is wrong, but too many callers rely on this behavior. */
867 if (err != 0)
868 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000869}
870
Guido van Rossum82598051997-03-05 00:20:32 +0000871PyObject *
872PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873 char *str;
874 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000875 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000876{
Guido van Rossum82598051997-03-05 00:20:32 +0000877 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000878 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000879}
880
Guido van Rossum82598051997-03-05 00:20:32 +0000881PyObject *
882PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883 FILE *fp;
884 char *filename;
885 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000886 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000887{
Guido van Rossum82598051997-03-05 00:20:32 +0000888 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000889 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000890}
891
Guido van Rossum82598051997-03-05 00:20:32 +0000892static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000893run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000894 node *n;
895 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000896 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000897{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000898 if (n == NULL)
899 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000900 return run_node(n, filename, globals, locals);
901}
902
Guido van Rossum82598051997-03-05 00:20:32 +0000903static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904run_node(n, filename, globals, locals)
905 node *n;
906 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000907 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000908{
Guido van Rossum82598051997-03-05 00:20:32 +0000909 PyCodeObject *co;
910 PyObject *v;
911 co = PyNode_Compile(n, filename);
912 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000913 if (co == NULL)
914 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000915 v = PyEval_EvalCode(co, globals, locals);
916 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000917 return v;
918}
919
Guido van Rossum82598051997-03-05 00:20:32 +0000920static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000921run_pyc_file(fp, filename, globals, locals)
922 FILE *fp;
923 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000924 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000925{
Guido van Rossum82598051997-03-05 00:20:32 +0000926 PyCodeObject *co;
927 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000928 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000929 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000930
Guido van Rossum82598051997-03-05 00:20:32 +0000931 magic = PyMarshal_ReadLongFromFile(fp);
932 if (magic != PyImport_GetMagicNumber()) {
933 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000934 "Bad magic number in .pyc file");
935 return NULL;
936 }
Guido van Rossum82598051997-03-05 00:20:32 +0000937 (void) PyMarshal_ReadLongFromFile(fp);
938 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000939 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000940 if (v == NULL || !PyCode_Check(v)) {
941 Py_XDECREF(v);
942 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000943 "Bad code object in .pyc file");
944 return NULL;
945 }
Guido van Rossum82598051997-03-05 00:20:32 +0000946 co = (PyCodeObject *)v;
947 v = PyEval_EvalCode(co, globals, locals);
948 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000949 return v;
950}
951
Guido van Rossum82598051997-03-05 00:20:32 +0000952PyObject *
953Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000954 char *str;
955 char *filename;
956 int start;
957{
958 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000959 PyCodeObject *co;
960 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000962 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000963 co = PyNode_Compile(n, filename);
964 PyNode_Free(n);
965 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000966}
967
Guido van Rossuma110aa61994-08-29 12:50:44 +0000968/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000969
Guido van Rossuma110aa61994-08-29 12:50:44 +0000970node *
Guido van Rossum82598051997-03-05 00:20:32 +0000971PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000972 FILE *fp;
973 char *filename;
974 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000975{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000976 node *n;
977 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000978 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000979 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000980 if (n == NULL)
981 err_input(&err);
982 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000983}
984
Guido van Rossuma110aa61994-08-29 12:50:44 +0000985/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000986
Guido van Rossuma110aa61994-08-29 12:50:44 +0000987node *
Guido van Rossum82598051997-03-05 00:20:32 +0000988PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000989 char *str;
990 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000991{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000992 node *n;
993 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000994 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000995 if (n == NULL)
996 err_input(&err);
997 return n;
998}
999
1000/* Set the error appropriate to the given input error code (see errcode.h) */
1001
1002static void
1003err_input(err)
1004 perrdetail *err;
1005{
Guido van Rossum82598051997-03-05 00:20:32 +00001006 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001007 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +00001008 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +00001009 err->lineno, err->offset, err->text);
1010 if (err->text != NULL) {
1011 free(err->text);
1012 err->text = NULL;
1013 }
1014 switch (err->error) {
1015 case E_SYNTAX:
1016 msg = "invalid syntax";
1017 break;
1018 case E_TOKEN:
1019 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001020 break;
1021 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001022 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001023 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001024 return;
1025 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001026 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001027 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001028 return;
1029 case E_EOF:
1030 msg = "unexpected EOF while parsing";
1031 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001032 case E_INDENT:
1033 msg = "inconsistent use of tabs and spaces in indentation";
1034 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001035 default:
1036 fprintf(stderr, "error=%d\n", err->error);
1037 msg = "unknown parsing error";
1038 break;
1039 }
Guido van Rossum82598051997-03-05 00:20:32 +00001040 w = Py_BuildValue("(sO)", msg, v);
1041 Py_XDECREF(v);
1042 PyErr_SetObject(PyExc_SyntaxError, w);
1043 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001044}
1045
1046/* Print fatal error message and abort */
1047
1048void
Guido van Rossum82598051997-03-05 00:20:32 +00001049Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001050 char *msg;
1051{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001052 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001053#ifdef macintosh
1054 for (;;);
1055#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001056#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001057 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001058 OutputDebugString(msg);
1059 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001060#ifdef _DEBUG
1061 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001062#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001063#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001064 abort();
1065}
1066
1067/* Clean up and exit */
1068
Guido van Rossuma110aa61994-08-29 12:50:44 +00001069#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001070#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001071int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001072#endif
1073
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001074#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001075static void (*exitfuncs[NEXITFUNCS])();
1076static int nexitfuncs = 0;
1077
1078int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001079 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001080{
1081 if (nexitfuncs >= NEXITFUNCS)
1082 return -1;
1083 exitfuncs[nexitfuncs++] = func;
1084 return 0;
1085}
1086
Guido van Rossumcc283f51997-08-05 02:22:03 +00001087static void
1088call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001089{
Guido van Rossum82598051997-03-05 00:20:32 +00001090 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001091
1092 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001093 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001094 Py_INCREF(exitfunc);
1095 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001096 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001097 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001098 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001099 if (f)
1100 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001101 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001102 }
Guido van Rossum82598051997-03-05 00:20:32 +00001103 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001104 }
1105
Guido van Rossum0829c751998-02-28 04:31:39 +00001106 if (Py_FlushLine())
1107 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001108}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001109
Guido van Rossumcc283f51997-08-05 02:22:03 +00001110static void
1111call_ll_exitfuncs()
1112{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001113 while (nexitfuncs > 0)
1114 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001115
1116 fflush(stdout);
1117 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001118}
1119
1120void
Guido van Rossum82598051997-03-05 00:20:32 +00001121Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001122 int sts;
1123{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001124 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001125
Jack Jansen66a89771995-10-27 13:22:14 +00001126#ifdef macintosh
1127 PyMac_Exit(sts);
1128#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001129 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001130#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001131}
1132
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001133static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001134initsigs()
1135{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001136#ifdef HAVE_SIGNAL_H
1137#ifdef SIGPIPE
1138 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001139#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001140#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001141 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001142}
1143
Guido van Rossumaae0d321996-05-22 16:35:33 +00001144#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001145/* Ask a yes/no question */
1146
Guido van Rossum59bff391992-09-03 20:28:00 +00001147int
Guido van Rossum82598051997-03-05 00:20:32 +00001148_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001149 char *prompt;
1150{
1151 char buf[256];
1152
1153 printf("%s [ny] ", prompt);
1154 if (fgets(buf, sizeof buf, stdin) == NULL)
1155 return 0;
1156 return buf[0] == 'y' || buf[0] == 'Y';
1157}
1158#endif
1159
Guido van Rossuma110aa61994-08-29 12:50:44 +00001160#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001161
1162/* Check for file descriptor connected to interactive device.
1163 Pretend that stdin is always interactive, other files never. */
1164
1165int
1166isatty(fd)
1167 int fd;
1168{
1169 return fd == fileno(stdin);
1170}
1171
1172#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001173
1174/*
1175 * The file descriptor fd is considered ``interactive'' if either
1176 * a) isatty(fd) is TRUE, or
1177 * b) the -i flag was given, and the filename associated with
1178 * the descriptor is NULL or "<stdin>" or "???".
1179 */
1180int
1181Py_FdIsInteractive(fp, filename)
1182 FILE *fp;
1183 char *filename;
1184{
1185 if (isatty((int)fileno(fp)))
1186 return 1;
1187 if (!Py_InteractiveFlag)
1188 return 0;
1189 return (filename == NULL) ||
1190 (strcmp(filename, "<stdin>") == 0) ||
1191 (strcmp(filename, "???") == 0);
1192}