blob: 7812de46bdc52a2a82549730588bb918b58e71d9 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009******************************************************************/
10
11/* Python interpreter top-level routines, including init/exit */
12
Guido van Rossum82598051997-03-05 00:20:32 +000013#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014
15#include "grammar.h"
16#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +000017#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000018#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000019#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000020#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000021#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000022#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000023
Guido van Rossum80bb9651996-12-05 23:27:02 +000024#ifdef HAVE_UNISTD_H
25#include <unistd.h>
26#endif
27
Guido van Rossuma110aa61994-08-29 12:50:44 +000028#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000029#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000030#endif
31
Guido van Rossum9b38a141996-09-11 23:12:24 +000032#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000033#undef BYTE
34#include "windows.h"
35#endif
36
Jack Jansencbf630f2000-07-11 21:59:16 +000037#ifdef macintosh
38#include "macglue.h"
39#endif
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000040extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041
Guido van Rossum82598051997-03-05 00:20:32 +000042extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossumb73cc041993-11-01 16:28:59 +000044/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static void initmain(void);
46static void initsite(void);
47static PyObject *run_err_node(node *n, char *filename,
48 PyObject *globals, PyObject *locals);
49static PyObject *run_node(node *n, char *filename,
50 PyObject *globals, PyObject *locals);
51static PyObject *run_pyc_file(FILE *fp, char *filename,
52 PyObject *globals, PyObject *locals);
53static void err_input(perrdetail *);
54static void initsigs(void);
55static void call_sys_exitfunc(void);
56static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000057
Guido van Rossumbffd6832000-01-20 22:32:56 +000058#ifdef Py_TRACE_REFS
59int _Py_AskYesNo(char *prompt);
60#endif
61
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000062extern void _PyUnicode_Init(void);
63extern void _PyUnicode_Fini(void);
64extern void _PyCodecRegistry_Init(void);
65extern void _PyCodecRegistry_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000066
67
Guido van Rossum82598051997-03-05 00:20:32 +000068int Py_DebugFlag; /* Needed by parser.c */
69int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000070int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000071int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000072int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000073int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000074int Py_UnicodeFlag = 0; /* Needed by compile.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000075
Guido van Rossum25ce5661997-08-02 03:10:38 +000076static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000077
Thomas Wouters7e474022000-07-16 12:04:32 +000078/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000079
80int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000081Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000082{
83 return initialized;
84}
85
Guido van Rossum25ce5661997-08-02 03:10:38 +000086/* Global initializations. Can be undone by Py_Finalize(). Don't
87 call this twice without an intervening Py_Finalize() call. When
88 initializations fail, a fatal error is issued and the function does
89 not return. On return, the first thread and interpreter state have
90 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000091
Guido van Rossum25ce5661997-08-02 03:10:38 +000092 Locking: you must hold the interpreter lock while calling this.
93 (If the lock has not yet been initialized, that's equivalent to
94 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000095
Guido van Rossum25ce5661997-08-02 03:10:38 +000096*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000097
98void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000099Py_Initialize(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102 PyThreadState *tstate;
103 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000104 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000105
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000106 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000107 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000108 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000109
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000110 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
111 Py_DebugFlag = 1;
112 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
113 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000114 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
115 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000116
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 interp = PyInterpreterState_New();
118 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 tstate = PyThreadState_New(interp);
122 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 (void) PyThreadState_Swap(tstate);
125
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 interp->modules = PyDict_New();
127 if (interp->modules == NULL)
128 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000129
Guido van Rossumc94044c2000-03-10 23:03:54 +0000130 /* Init codec registry */
131 _PyCodecRegistry_Init();
132
133 /* Init Unicode implementation; relies on the codec registry */
134 _PyUnicode_Init();
135
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000136 _PyCompareState_Key = PyString_InternFromString("cmp_state");
137
Barry Warsawf242aa02000-05-25 23:09:49 +0000138 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139 if (bimod == NULL)
140 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000141 interp->builtins = PyModule_GetDict(bimod);
142 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000143
144 sysmod = _PySys_Init();
145 if (sysmod == NULL)
146 Py_FatalError("Py_Initialize: can't initialize sys");
147 interp->sysdict = PyModule_GetDict(sysmod);
148 Py_INCREF(interp->sysdict);
149 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151 PyDict_SetItemString(interp->sysdict, "modules",
152 interp->modules);
153
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000154 _PyImport_Init();
155
Barry Warsawf242aa02000-05-25 23:09:49 +0000156 /* initialize builtin exceptions */
157 init_exceptions();
158
Barry Warsaw035574d1997-08-29 22:07:17 +0000159 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000160 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000161
Guido van Rossum25ce5661997-08-02 03:10:38 +0000162 initsigs(); /* Signal handling stuff, including initintr() */
163
164 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000165 if (!Py_NoSiteFlag)
166 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167}
168
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000169#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000170extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000171#endif
172
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173/* Undo the effect of Py_Initialize().
174
175 Beware: if multiple interpreter and/or thread states exist, these
176 are not wiped out; only the current thread and interpreter state
177 are deleted. But since everything else is deleted, those other
178 interpreter and thread states should no longer be used.
179
180 (XXX We should do better, e.g. wipe out all interpreters and
181 threads.)
182
183 Locking: as above.
184
185*/
186
187void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000188Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189{
190 PyInterpreterState *interp;
191 PyThreadState *tstate;
192
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000193 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000194 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000195 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000197 call_sys_exitfunc();
198
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000199 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200 tstate = PyThreadState_Get();
201 interp = tstate->interp;
202
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203 /* Disable signal handling */
204 PyOS_FiniInterrupts();
205
Guido van Rossumc94044c2000-03-10 23:03:54 +0000206 /* Cleanup Unicode implementation */
207 _PyUnicode_Fini();
208
209 /* Cleanup Codec registry */
210 _PyCodecRegistry_Fini();
211
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000212 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000214
Guido van Rossum1707aad1997-12-08 23:43:45 +0000215 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
216 _PyImport_Fini();
217
218 /* Debugging stuff */
219#ifdef COUNT_ALLOCS
220 dump_counts();
221#endif
222
223#ifdef Py_REF_DEBUG
224 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
225#endif
226
227#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000228 if (
229#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
230 getenv("PYTHONDUMPREFS") &&
231#endif /* MS_WINDOWS */
232 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000233 _Py_PrintReferences(stderr);
234 }
235#endif /* Py_TRACE_REFS */
236
Barry Warsaw035574d1997-08-29 22:07:17 +0000237 /* Now we decref the exception classes. After this point nothing
238 can raise an exception. That's okay, because each Fini() method
239 below has been checked to make sure no exceptions are ever
240 raised.
241 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000242 fini_exceptions();
243
244 /* Delete current thread */
245 PyInterpreterState_Clear(interp);
246 PyThreadState_Swap(NULL);
247 PyInterpreterState_Delete(interp);
248
Guido van Rossumcc283f51997-08-05 02:22:03 +0000249 PyMethod_Fini();
250 PyFrame_Fini();
251 PyCFunction_Fini();
252 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000254 PyInt_Fini();
255 PyFloat_Fini();
256
257 /* XXX Still allocated:
258 - various static ad-hoc pointers to interned strings
259 - int and float free list blocks
260 - whatever various modules and libraries allocate
261 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262
263 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000264
265 call_ll_exitfuncs();
266
Guido van Rossumcc283f51997-08-05 02:22:03 +0000267#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000268 _Py_ResetReferences();
269#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270}
271
272/* Create and initialize a new interpreter and thread, and return the
273 new thread. This requires that Py_Initialize() has been called
274 first.
275
276 Unsuccessful initialization yields a NULL pointer. Note that *no*
277 exception information is available even in this case -- the
278 exception information is held in the thread, and there is no
279 thread.
280
281 Locking: as above.
282
283*/
284
285PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000286Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000287{
288 PyInterpreterState *interp;
289 PyThreadState *tstate, *save_tstate;
290 PyObject *bimod, *sysmod;
291
292 if (!initialized)
293 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
294
295 interp = PyInterpreterState_New();
296 if (interp == NULL)
297 return NULL;
298
299 tstate = PyThreadState_New(interp);
300 if (tstate == NULL) {
301 PyInterpreterState_Delete(interp);
302 return NULL;
303 }
304
305 save_tstate = PyThreadState_Swap(tstate);
306
307 /* XXX The following is lax in error checking */
308
309 interp->modules = PyDict_New();
310
311 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
312 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000313 interp->builtins = PyModule_GetDict(bimod);
314 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315 }
316 sysmod = _PyImport_FindExtension("sys", "sys");
317 if (bimod != NULL && sysmod != NULL) {
318 interp->sysdict = PyModule_GetDict(sysmod);
319 Py_INCREF(interp->sysdict);
320 PySys_SetPath(Py_GetPath());
321 PyDict_SetItemString(interp->sysdict, "modules",
322 interp->modules);
323 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000324 if (!Py_NoSiteFlag)
325 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326 }
327
328 if (!PyErr_Occurred())
329 return tstate;
330
331 /* Oops, it didn't work. Undo it all. */
332
333 PyErr_Print();
334 PyThreadState_Clear(tstate);
335 PyThreadState_Swap(save_tstate);
336 PyThreadState_Delete(tstate);
337 PyInterpreterState_Delete(interp);
338
339 return NULL;
340}
341
342/* Delete an interpreter and its last thread. This requires that the
343 given thread state is current, that the thread has no remaining
344 frames, and that it is its interpreter's only remaining thread.
345 It is a fatal error to violate these constraints.
346
347 (Py_Finalize() doesn't have these constraints -- it zaps
348 everything, regardless.)
349
350 Locking: as above.
351
352*/
353
354void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000355Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000356{
357 PyInterpreterState *interp = tstate->interp;
358
359 if (tstate != PyThreadState_Get())
360 Py_FatalError("Py_EndInterpreter: thread is not current");
361 if (tstate->frame != NULL)
362 Py_FatalError("Py_EndInterpreter: thread still has a frame");
363 if (tstate != interp->tstate_head || tstate->next != NULL)
364 Py_FatalError("Py_EndInterpreter: not the last thread");
365
366 PyImport_Cleanup();
367 PyInterpreterState_Clear(interp);
368 PyThreadState_Swap(NULL);
369 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000370}
371
372static char *progname = "python";
373
374void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000375Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000376{
377 if (pn && *pn)
378 progname = pn;
379}
380
381char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000382Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000383{
384 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385}
386
Guido van Rossuma61691e1998-02-06 22:27:24 +0000387static char *default_home = NULL;
388
389void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000390Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000391{
392 default_home = home;
393}
394
395char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000397{
398 char *home = default_home;
399 if (home == NULL)
400 home = getenv("PYTHONHOME");
401 return home;
402}
403
Guido van Rossum6135a871995-01-09 17:53:26 +0000404/* Create __main__ module */
405
406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000407initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000408{
Guido van Rossum82598051997-03-05 00:20:32 +0000409 PyObject *m, *d;
410 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000411 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000412 Py_FatalError("can't create __main__ module");
413 d = PyModule_GetDict(m);
414 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000415 PyObject *bimod = PyImport_ImportModule("__builtin__");
416 if (bimod == NULL ||
417 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000418 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000419 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000420 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421}
422
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000423/* Import the site module (not into __main__ though) */
424
425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000426initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000427{
428 PyObject *m, *f;
429 m = PyImport_ImportModule("site");
430 if (m == NULL) {
431 f = PySys_GetObject("stderr");
432 if (Py_VerboseFlag) {
433 PyFile_WriteString(
434 "'import site' failed; traceback:\n", f);
435 PyErr_Print();
436 }
437 else {
438 PyFile_WriteString(
439 "'import site' failed; use -v for traceback\n", f);
440 PyErr_Clear();
441 }
442 }
443 else {
444 Py_DECREF(m);
445 }
446}
447
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000448/* Parse input from a file and execute it */
449
450int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000452{
453 if (filename == NULL)
454 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000455 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000456 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457 else
Guido van Rossum82598051997-03-05 00:20:32 +0000458 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459}
460
461int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000462PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000463{
Guido van Rossum82598051997-03-05 00:20:32 +0000464 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000465 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000466 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000467 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000468 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
469 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470 }
Guido van Rossum82598051997-03-05 00:20:32 +0000471 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000472 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000473 PySys_SetObject("ps2", v = PyString_FromString("... "));
474 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475 }
476 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000477 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000478#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000479 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480#endif
481 if (ret == E_EOF)
482 return 0;
483 /*
484 if (ret == E_NOMEM)
485 return -1;
486 */
487 }
488}
489
490int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000491PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000492{
Guido van Rossum82598051997-03-05 00:20:32 +0000493 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000496 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000497 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000498 if (v != NULL) {
499 v = PyObject_Str(v);
500 if (v == NULL)
501 PyErr_Clear();
502 else if (PyString_Check(v))
503 ps1 = PyString_AsString(v);
504 }
Guido van Rossum82598051997-03-05 00:20:32 +0000505 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000506 if (w != NULL) {
507 w = PyObject_Str(w);
508 if (w == NULL)
509 PyErr_Clear();
510 else if (PyString_Check(w))
511 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512 }
Guido van Rossum82598051997-03-05 00:20:32 +0000513 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000514 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000515 Py_XDECREF(v);
516 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000517 if (n == NULL) {
518 if (err.error == E_EOF) {
519 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000520 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000521 return E_EOF;
522 }
523 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000524 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000525 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000526 }
Guido van Rossum82598051997-03-05 00:20:32 +0000527 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000528 if (m == NULL)
529 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000530 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000533 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000534 return -1;
535 }
Guido van Rossum82598051997-03-05 00:20:32 +0000536 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000537 if (Py_FlushLine())
538 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000539 return 0;
540}
541
542int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000543PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000544{
Guido van Rossum82598051997-03-05 00:20:32 +0000545 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000546 char *ext;
547
Guido van Rossum82598051997-03-05 00:20:32 +0000548 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000549 if (m == NULL)
550 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000551 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000552 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000553 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000554#ifdef macintosh
555 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Jack Jansencbf630f2000-07-11 21:59:16 +0000556 || PyMac_getfiletype(filename) == 'PYC '
557 || PyMac_getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000558#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000559 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000560 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000561 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000562 if( (fp = fopen(filename, "rb")) == NULL ) {
563 fprintf(stderr, "python: Can't reopen .pyc file\n");
564 return -1;
565 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000566 /* Turn on optimization if a .pyo file is given */
567 if (strcmp(ext, ".pyo") == 0)
568 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000569 v = run_pyc_file(fp, filename, d, d);
570 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000571 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000572 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000573 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000574 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000575 return -1;
576 }
Guido van Rossum82598051997-03-05 00:20:32 +0000577 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000578 if (Py_FlushLine())
579 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000580 return 0;
581}
582
583int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000584PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585{
Guido van Rossum82598051997-03-05 00:20:32 +0000586 PyObject *m, *d, *v;
587 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588 if (m == NULL)
589 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000590 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000591 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000593 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000594 return -1;
595 }
Guido van Rossum82598051997-03-05 00:20:32 +0000596 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000597 if (Py_FlushLine())
598 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000599 return 0;
600}
601
Barry Warsaw035574d1997-08-29 22:07:17 +0000602static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000603parse_syntax_error(PyObject *err, PyObject **message, char **filename,
604 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000605{
606 long hold;
607 PyObject *v;
608
609 /* old style errors */
610 if (PyTuple_Check(err))
611 return PyArg_Parse(err, "(O(ziiz))", message, filename,
612 lineno, offset, text);
613
614 /* new style errors. `err' is an instance */
615
616 if (! (v = PyObject_GetAttrString(err, "msg")))
617 goto finally;
618 *message = v;
619
620 if (!(v = PyObject_GetAttrString(err, "filename")))
621 goto finally;
622 if (v == Py_None)
623 *filename = NULL;
624 else if (! (*filename = PyString_AsString(v)))
625 goto finally;
626
627 Py_DECREF(v);
628 if (!(v = PyObject_GetAttrString(err, "lineno")))
629 goto finally;
630 hold = PyInt_AsLong(v);
631 Py_DECREF(v);
632 v = NULL;
633 if (hold < 0 && PyErr_Occurred())
634 goto finally;
635 *lineno = (int)hold;
636
637 if (!(v = PyObject_GetAttrString(err, "offset")))
638 goto finally;
639 hold = PyInt_AsLong(v);
640 Py_DECREF(v);
641 v = NULL;
642 if (hold < 0 && PyErr_Occurred())
643 goto finally;
644 *offset = (int)hold;
645
646 if (!(v = PyObject_GetAttrString(err, "text")))
647 goto finally;
648 if (v == Py_None)
649 *text = NULL;
650 else if (! (*text = PyString_AsString(v)))
651 goto finally;
652 Py_DECREF(v);
653 return 1;
654
655finally:
656 Py_XDECREF(v);
657 return 0;
658}
659
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000661PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000663 PyErr_PrintEx(1);
664}
665
666void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000668{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000669 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000670 PyObject *exception, *v, *tb, *f;
671 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000672 PyErr_NormalizeException(&exception, &v, &tb);
673
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000675 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000676
Barry Warsaw36b8f941997-08-26 18:09:48 +0000677 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000678 if (Py_FlushLine())
679 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000680 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000681 if (v == NULL || v == Py_None)
682 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000683 if (PyInstance_Check(v)) {
684 /* we expect the error code to be store in the
685 `code' attribute
686 */
687 PyObject *code = PyObject_GetAttrString(v, "code");
688 if (code) {
689 Py_DECREF(v);
690 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000691 if (v == Py_None)
692 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000693 }
694 /* if we failed to dig out the "code" attribute,
695 then just let the else clause below print the
696 error
697 */
698 }
Guido van Rossum82598051997-03-05 00:20:32 +0000699 if (PyInt_Check(v))
700 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000701 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000702 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000705 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000706 }
707 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000708 if (set_sys_last_vars) {
709 PySys_SetObject("last_type", exception);
710 PySys_SetObject("last_value", v);
711 PySys_SetObject("last_traceback", tb);
712 }
Guido van Rossum82598051997-03-05 00:20:32 +0000713 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000714 if (f == NULL)
715 fprintf(stderr, "lost sys.stderr\n");
716 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000717 if (Py_FlushLine())
718 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000719 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000720 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000721 if (err == 0 &&
722 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
723 {
Guido van Rossum82598051997-03-05 00:20:32 +0000724 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000725 char *filename, *text;
726 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000727 if (!parse_syntax_error(v, &message, &filename,
728 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000729 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000730 else {
731 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000732 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000734 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000735 else
Guido van Rossum82598051997-03-05 00:20:32 +0000736 PyFile_WriteString(filename, f);
737 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000738 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000739 PyFile_WriteString(buf, f);
740 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000741 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000742 char *nl;
743 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000744 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000745 offset--;
746 for (;;) {
747 nl = strchr(text, '\n');
748 if (nl == NULL ||
749 nl-text >= offset)
750 break;
751 offset -= (nl+1-text);
752 text = nl+1;
753 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000754 while (*text == ' ' || *text == '\t') {
755 text++;
756 offset--;
757 }
Guido van Rossum82598051997-03-05 00:20:32 +0000758 PyFile_WriteString(" ", f);
759 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000760 if (*text == '\0' ||
761 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000762 PyFile_WriteString("\n", f);
763 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764 offset--;
765 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000767 offset--;
768 }
Guido van Rossum82598051997-03-05 00:20:32 +0000769 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000770 }
Guido van Rossum82598051997-03-05 00:20:32 +0000771 Py_INCREF(message);
772 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000773 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000774 /* Can't be bothered to check all those
775 PyFile_WriteString() calls */
776 if (PyErr_Occurred())
777 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 }
779 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000780 if (err) {
781 /* Don't do anything else */
782 }
783 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000784 PyClassObject* exc = (PyClassObject*)exception;
785 PyObject* className = exc->cl_name;
786 PyObject* moduleName =
787 PyDict_GetItemString(exc->cl_dict, "__module__");
788
789 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000790 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000791 else {
792 char* modstr = PyString_AsString(moduleName);
793 if (modstr && strcmp(modstr, "exceptions"))
794 {
795 err = PyFile_WriteString(modstr, f);
796 err += PyFile_WriteString(".", f);
797 }
798 }
799 if (err == 0) {
800 if (className == NULL)
801 err = PyFile_WriteString("<unknown>", f);
802 else
803 err = PyFile_WriteObject(className, f,
804 Py_PRINT_RAW);
805 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000806 }
807 else
808 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
809 if (err == 0) {
810 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000811 PyObject *s = PyObject_Str(v);
812 /* only print colon if the str() of the
813 object is not the empty string
814 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000815 if (s == NULL)
816 err = -1;
817 else if (!PyString_Check(s) ||
818 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000819 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000820 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000821 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
822 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000823 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000824 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000825 if (err == 0)
826 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000827 }
Guido van Rossum82598051997-03-05 00:20:32 +0000828 Py_XDECREF(exception);
829 Py_XDECREF(v);
830 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000831 /* If an error happened here, don't show it.
832 XXX This is wrong, but too many callers rely on this behavior. */
833 if (err != 0)
834 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000835}
836
Guido van Rossum82598051997-03-05 00:20:32 +0000837PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000838PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000839{
Guido van Rossum82598051997-03-05 00:20:32 +0000840 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000841 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000842}
843
Guido van Rossum82598051997-03-05 00:20:32 +0000844PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000845PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
846 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847{
Guido van Rossum82598051997-03-05 00:20:32 +0000848 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000849 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850}
851
Guido van Rossum82598051997-03-05 00:20:32 +0000852static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000854{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000855 if (n == NULL)
856 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857 return run_node(n, filename, globals, locals);
858}
859
Guido van Rossum82598051997-03-05 00:20:32 +0000860static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861run_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000862{
Guido van Rossum82598051997-03-05 00:20:32 +0000863 PyCodeObject *co;
864 PyObject *v;
865 co = PyNode_Compile(n, filename);
866 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867 if (co == NULL)
868 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000869 v = PyEval_EvalCode(co, globals, locals);
870 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871 return v;
872}
873
Guido van Rossum82598051997-03-05 00:20:32 +0000874static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000875run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossumfdef2711994-09-14 13:31:04 +0000876{
Guido van Rossum82598051997-03-05 00:20:32 +0000877 PyCodeObject *co;
878 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000879 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000880 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000881
Guido van Rossum82598051997-03-05 00:20:32 +0000882 magic = PyMarshal_ReadLongFromFile(fp);
883 if (magic != PyImport_GetMagicNumber()) {
884 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000885 "Bad magic number in .pyc file");
886 return NULL;
887 }
Guido van Rossum82598051997-03-05 00:20:32 +0000888 (void) PyMarshal_ReadLongFromFile(fp);
889 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000890 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000891 if (v == NULL || !PyCode_Check(v)) {
892 Py_XDECREF(v);
893 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000894 "Bad code object in .pyc file");
895 return NULL;
896 }
Guido van Rossum82598051997-03-05 00:20:32 +0000897 co = (PyCodeObject *)v;
898 v = PyEval_EvalCode(co, globals, locals);
899 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000900 return v;
901}
902
Guido van Rossum82598051997-03-05 00:20:32 +0000903PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000904Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000905{
906 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000907 PyCodeObject *co;
908 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000909 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000910 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000911 co = PyNode_Compile(n, filename);
912 PyNode_Free(n);
913 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000914}
915
Guido van Rossuma110aa61994-08-29 12:50:44 +0000916/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000917
Guido van Rossuma110aa61994-08-29 12:50:44 +0000918node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000919PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000920{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000921 node *n;
922 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000923 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000924 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000925 if (n == NULL)
926 err_input(&err);
927 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000928}
929
Guido van Rossuma110aa61994-08-29 12:50:44 +0000930/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000931
Guido van Rossuma110aa61994-08-29 12:50:44 +0000932node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000933PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000934{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000935 node *n;
936 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000937 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000938 if (n == NULL)
939 err_input(&err);
940 return n;
941}
942
943/* Set the error appropriate to the given input error code (see errcode.h) */
944
945static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000946err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000947{
Fred Drake85f36392000-07-11 17:53:00 +0000948 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000949 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +0000950 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +0000951 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952 err->lineno, err->offset, err->text);
953 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000954 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000955 err->text = NULL;
956 }
957 switch (err->error) {
958 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +0000959 errtype = PyExc_IndentationError;
960 if (err->expected == INDENT)
961 msg = "expected an indented block";
962 else if (err->token == INDENT)
963 msg = "unexpected indent";
964 else if (err->token == DEDENT)
965 msg = "unexpected unindent";
966 else {
967 errtype = PyExc_SyntaxError;
968 msg = "invalid syntax";
969 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000970 break;
971 case E_TOKEN:
972 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +0000973 break;
974 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000975 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +0000976 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000977 return;
978 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000979 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +0000980 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000981 return;
982 case E_EOF:
983 msg = "unexpected EOF while parsing";
984 break;
Fred Drake85f36392000-07-11 17:53:00 +0000985 case E_TABSPACE:
986 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +0000987 msg = "inconsistent use of tabs and spaces in indentation";
988 break;
Jeremy Hylton94988062000-06-20 19:10:44 +0000989 case E_OVERFLOW:
990 msg = "expression too long";
991 break;
Fred Drake85f36392000-07-11 17:53:00 +0000992 case E_DEDENT:
993 errtype = PyExc_IndentationError;
994 msg = "unindent does not match any outer indentation level";
995 break;
996 case E_TOODEEP:
997 errtype = PyExc_IndentationError;
998 msg = "too many levels of indentation";
999 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001000 default:
1001 fprintf(stderr, "error=%d\n", err->error);
1002 msg = "unknown parsing error";
1003 break;
1004 }
Guido van Rossum82598051997-03-05 00:20:32 +00001005 w = Py_BuildValue("(sO)", msg, v);
1006 Py_XDECREF(v);
Fred Drake85f36392000-07-11 17:53:00 +00001007 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001008 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001009}
1010
1011/* Print fatal error message and abort */
1012
1013void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001014Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001015{
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
Guido van Rossum49b56061998-10-01 20:42:43 +00001034#include "pythread.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
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001039static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001040static int nexitfuncs = 0;
1041
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001042int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001043{
1044 if (nexitfuncs >= NEXITFUNCS)
1045 return -1;
1046 exitfuncs[nexitfuncs++] = func;
1047 return 0;
1048}
1049
Guido van Rossumcc283f51997-08-05 02:22:03 +00001050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001051call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001052{
Guido van Rossum82598051997-03-05 00:20:32 +00001053 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001054
1055 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001056 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001057 Py_INCREF(exitfunc);
1058 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001059 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001060 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001061 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001062 if (f)
1063 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001064 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001065 }
Guido van Rossum82598051997-03-05 00:20:32 +00001066 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001067 }
1068
Guido van Rossum0829c751998-02-28 04:31:39 +00001069 if (Py_FlushLine())
1070 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001071}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001072
Guido van Rossumcc283f51997-08-05 02:22:03 +00001073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001075{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001076 while (nexitfuncs > 0)
1077 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001078
1079 fflush(stdout);
1080 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001081}
1082
1083void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001084Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001085{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001086 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001087
Jack Jansen66a89771995-10-27 13:22:14 +00001088#ifdef macintosh
1089 PyMac_Exit(sts);
1090#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001091 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001092#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001093}
1094
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001096initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001097{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001098#ifdef HAVE_SIGNAL_H
1099#ifdef SIGPIPE
1100 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001101#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001102#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001103 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001104}
1105
Guido van Rossumaae0d321996-05-22 16:35:33 +00001106#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001107/* Ask a yes/no question */
1108
Guido van Rossum59bff391992-09-03 20:28:00 +00001109int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001110_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001111{
1112 char buf[256];
1113
1114 printf("%s [ny] ", prompt);
1115 if (fgets(buf, sizeof buf, stdin) == NULL)
1116 return 0;
1117 return buf[0] == 'y' || buf[0] == 'Y';
1118}
1119#endif
1120
Guido van Rossuma110aa61994-08-29 12:50:44 +00001121#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001122
1123/* Check for file descriptor connected to interactive device.
1124 Pretend that stdin is always interactive, other files never. */
1125
1126int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001127isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001128{
1129 return fd == fileno(stdin);
1130}
1131
1132#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001133
1134/*
1135 * The file descriptor fd is considered ``interactive'' if either
1136 * a) isatty(fd) is TRUE, or
1137 * b) the -i flag was given, and the filename associated with
1138 * the descriptor is NULL or "<stdin>" or "???".
1139 */
1140int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001141Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001142{
1143 if (isatty((int)fileno(fp)))
1144 return 1;
1145 if (!Py_InteractiveFlag)
1146 return 0;
1147 return (filename == NULL) ||
1148 (strcmp(filename, "<stdin>") == 0) ||
1149 (strcmp(filename, "???") == 0);
1150}