blob: e29e719d10946630fae582b493c5d2f8cb47573b [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001
2/* Python interpreter top-level routines, including init/exit */
3
Guido van Rossum82598051997-03-05 00:20:32 +00004#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00005
6#include "grammar.h"
7#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +00008#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000010#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000012#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000013#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014
Guido van Rossum80bb9651996-12-05 23:27:02 +000015#ifdef HAVE_UNISTD_H
16#include <unistd.h>
17#endif
18
Guido van Rossuma110aa61994-08-29 12:50:44 +000019#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000020#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000021#endif
22
Guido van Rossum9b38a141996-09-11 23:12:24 +000023#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000024#undef BYTE
25#include "windows.h"
26#endif
27
Jack Jansencbf630f2000-07-11 21:59:16 +000028#ifdef macintosh
29#include "macglue.h"
30#endif
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000031extern char *Py_GetPath(void);
Guido van Rossum1984f1e1992-08-04 12:41:02 +000032
Guido van Rossum82598051997-03-05 00:20:32 +000033extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000034
Guido van Rossumb73cc041993-11-01 16:28:59 +000035/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static void initmain(void);
37static void initsite(void);
38static PyObject *run_err_node(node *n, char *filename,
39 PyObject *globals, PyObject *locals);
40static PyObject *run_node(node *n, char *filename,
41 PyObject *globals, PyObject *locals);
42static PyObject *run_pyc_file(FILE *fp, char *filename,
43 PyObject *globals, PyObject *locals);
44static void err_input(perrdetail *);
45static void initsigs(void);
46static void call_sys_exitfunc(void);
47static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000048
Guido van Rossumbffd6832000-01-20 22:32:56 +000049#ifdef Py_TRACE_REFS
50int _Py_AskYesNo(char *prompt);
51#endif
52
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000053extern void _PyUnicode_Init(void);
54extern void _PyUnicode_Fini(void);
55extern void _PyCodecRegistry_Init(void);
56extern void _PyCodecRegistry_Fini(void);
Guido van Rossumc94044c2000-03-10 23:03:54 +000057
58
Guido van Rossum82598051997-03-05 00:20:32 +000059int Py_DebugFlag; /* Needed by parser.c */
60int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000061int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000062int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000063int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000064int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000065int Py_UnicodeFlag = 0; /* Needed by compile.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000066
Guido van Rossum25ce5661997-08-02 03:10:38 +000067static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000068
Thomas Wouters7e474022000-07-16 12:04:32 +000069/* API to access the initialized flag -- useful for esoteric use */
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000070
71int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000072Py_IsInitialized(void)
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000073{
74 return initialized;
75}
76
Guido van Rossum25ce5661997-08-02 03:10:38 +000077/* Global initializations. Can be undone by Py_Finalize(). Don't
78 call this twice without an intervening Py_Finalize() call. When
79 initializations fail, a fatal error is issued and the function does
80 not return. On return, the first thread and interpreter state have
81 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082
Guido van Rossum25ce5661997-08-02 03:10:38 +000083 Locking: you must hold the interpreter lock while calling this.
84 (If the lock has not yet been initialized, that's equivalent to
85 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000086
Guido van Rossum25ce5661997-08-02 03:10:38 +000087*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000088
89void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000090Py_Initialize(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000091{
Guido van Rossuma027efa1997-05-05 20:56:21 +000092 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000093 PyThreadState *tstate;
94 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000095 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000096
Guido van Rossumdcc0c131997-08-29 22:32:42 +000097 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +000098 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +000099 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000100
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000101 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000102 Py_DebugFlag = Py_DebugFlag ? Py_DebugFlag : 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000103 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000104 Py_VerboseFlag = Py_VerboseFlag ? Py_VerboseFlag : 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000105 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
Marc-André Lemburgdc3d6062000-08-25 21:00:46 +0000106 Py_OptimizeFlag = Py_OptimizeFlag ? Py_OptimizeFlag : 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000107
Guido van Rossuma027efa1997-05-05 20:56:21 +0000108 interp = PyInterpreterState_New();
109 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000111
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112 tstate = PyThreadState_New(interp);
113 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000115 (void) PyThreadState_Swap(tstate);
116
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117 interp->modules = PyDict_New();
118 if (interp->modules == NULL)
119 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120
Guido van Rossumc94044c2000-03-10 23:03:54 +0000121 /* Init codec registry */
122 _PyCodecRegistry_Init();
123
124 /* Init Unicode implementation; relies on the codec registry */
125 _PyUnicode_Init();
126
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000127 _PyCompareState_Key = PyString_InternFromString("cmp_state");
128
Barry Warsawf242aa02000-05-25 23:09:49 +0000129 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130 if (bimod == NULL)
131 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000132 interp->builtins = PyModule_GetDict(bimod);
133 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134
135 sysmod = _PySys_Init();
136 if (sysmod == NULL)
137 Py_FatalError("Py_Initialize: can't initialize sys");
138 interp->sysdict = PyModule_GetDict(sysmod);
139 Py_INCREF(interp->sysdict);
140 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000141 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000142 PyDict_SetItemString(interp->sysdict, "modules",
143 interp->modules);
144
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000145 _PyImport_Init();
146
Barry Warsawf242aa02000-05-25 23:09:49 +0000147 /* initialize builtin exceptions */
148 init_exceptions();
149
Barry Warsaw035574d1997-08-29 22:07:17 +0000150 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000151 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000152
Guido van Rossum25ce5661997-08-02 03:10:38 +0000153 initsigs(); /* Signal handling stuff, including initintr() */
154
155 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000156 if (!Py_NoSiteFlag)
157 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000158}
159
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000160#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000161extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000162#endif
163
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164/* Undo the effect of Py_Initialize().
165
166 Beware: if multiple interpreter and/or thread states exist, these
167 are not wiped out; only the current thread and interpreter state
168 are deleted. But since everything else is deleted, those other
169 interpreter and thread states should no longer be used.
170
171 (XXX We should do better, e.g. wipe out all interpreters and
172 threads.)
173
174 Locking: as above.
175
176*/
177
178void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000179Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180{
181 PyInterpreterState *interp;
182 PyThreadState *tstate;
183
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000184 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000185 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000186 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000188 call_sys_exitfunc();
189
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000190 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191 tstate = PyThreadState_Get();
192 interp = tstate->interp;
193
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000194 /* Disable signal handling */
195 PyOS_FiniInterrupts();
196
Guido van Rossumc94044c2000-03-10 23:03:54 +0000197 /* Cleanup Unicode implementation */
198 _PyUnicode_Fini();
199
200 /* Cleanup Codec registry */
201 _PyCodecRegistry_Fini();
202
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000204 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000205
Guido van Rossum1707aad1997-12-08 23:43:45 +0000206 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
207 _PyImport_Fini();
208
209 /* Debugging stuff */
210#ifdef COUNT_ALLOCS
211 dump_counts();
212#endif
213
214#ifdef Py_REF_DEBUG
215 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
216#endif
217
218#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000219 if (
220#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
221 getenv("PYTHONDUMPREFS") &&
222#endif /* MS_WINDOWS */
223 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000224 _Py_PrintReferences(stderr);
225 }
226#endif /* Py_TRACE_REFS */
227
Barry Warsaw035574d1997-08-29 22:07:17 +0000228 /* Now we decref the exception classes. After this point nothing
229 can raise an exception. That's okay, because each Fini() method
230 below has been checked to make sure no exceptions are ever
231 raised.
232 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000233 fini_exceptions();
234
235 /* Delete current thread */
236 PyInterpreterState_Clear(interp);
237 PyThreadState_Swap(NULL);
238 PyInterpreterState_Delete(interp);
239
Guido van Rossumcc283f51997-08-05 02:22:03 +0000240 PyMethod_Fini();
241 PyFrame_Fini();
242 PyCFunction_Fini();
243 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000244 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000245 PyInt_Fini();
246 PyFloat_Fini();
247
248 /* XXX Still allocated:
249 - various static ad-hoc pointers to interned strings
250 - int and float free list blocks
251 - whatever various modules and libraries allocate
252 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253
254 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000255
256 call_ll_exitfuncs();
257
Guido van Rossumcc283f51997-08-05 02:22:03 +0000258#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000259 _Py_ResetReferences();
260#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000261}
262
263/* Create and initialize a new interpreter and thread, and return the
264 new thread. This requires that Py_Initialize() has been called
265 first.
266
267 Unsuccessful initialization yields a NULL pointer. Note that *no*
268 exception information is available even in this case -- the
269 exception information is held in the thread, and there is no
270 thread.
271
272 Locking: as above.
273
274*/
275
276PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000277Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000278{
279 PyInterpreterState *interp;
280 PyThreadState *tstate, *save_tstate;
281 PyObject *bimod, *sysmod;
282
283 if (!initialized)
284 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
285
286 interp = PyInterpreterState_New();
287 if (interp == NULL)
288 return NULL;
289
290 tstate = PyThreadState_New(interp);
291 if (tstate == NULL) {
292 PyInterpreterState_Delete(interp);
293 return NULL;
294 }
295
296 save_tstate = PyThreadState_Swap(tstate);
297
298 /* XXX The following is lax in error checking */
299
300 interp->modules = PyDict_New();
301
302 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
303 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000304 interp->builtins = PyModule_GetDict(bimod);
305 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000306 }
307 sysmod = _PyImport_FindExtension("sys", "sys");
308 if (bimod != NULL && sysmod != NULL) {
309 interp->sysdict = PyModule_GetDict(sysmod);
310 Py_INCREF(interp->sysdict);
311 PySys_SetPath(Py_GetPath());
312 PyDict_SetItemString(interp->sysdict, "modules",
313 interp->modules);
314 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000315 if (!Py_NoSiteFlag)
316 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000317 }
318
319 if (!PyErr_Occurred())
320 return tstate;
321
322 /* Oops, it didn't work. Undo it all. */
323
324 PyErr_Print();
325 PyThreadState_Clear(tstate);
326 PyThreadState_Swap(save_tstate);
327 PyThreadState_Delete(tstate);
328 PyInterpreterState_Delete(interp);
329
330 return NULL;
331}
332
333/* Delete an interpreter and its last thread. This requires that the
334 given thread state is current, that the thread has no remaining
335 frames, and that it is its interpreter's only remaining thread.
336 It is a fatal error to violate these constraints.
337
338 (Py_Finalize() doesn't have these constraints -- it zaps
339 everything, regardless.)
340
341 Locking: as above.
342
343*/
344
345void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000346Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000347{
348 PyInterpreterState *interp = tstate->interp;
349
350 if (tstate != PyThreadState_Get())
351 Py_FatalError("Py_EndInterpreter: thread is not current");
352 if (tstate->frame != NULL)
353 Py_FatalError("Py_EndInterpreter: thread still has a frame");
354 if (tstate != interp->tstate_head || tstate->next != NULL)
355 Py_FatalError("Py_EndInterpreter: not the last thread");
356
357 PyImport_Cleanup();
358 PyInterpreterState_Clear(interp);
359 PyThreadState_Swap(NULL);
360 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000361}
362
363static char *progname = "python";
364
365void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000366Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000367{
368 if (pn && *pn)
369 progname = pn;
370}
371
372char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000373Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000374{
375 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376}
377
Guido van Rossuma61691e1998-02-06 22:27:24 +0000378static char *default_home = NULL;
379
380void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000381Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000382{
383 default_home = home;
384}
385
386char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000387Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000388{
389 char *home = default_home;
390 if (home == NULL)
391 home = getenv("PYTHONHOME");
392 return home;
393}
394
Guido van Rossum6135a871995-01-09 17:53:26 +0000395/* Create __main__ module */
396
397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000398initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000399{
Guido van Rossum82598051997-03-05 00:20:32 +0000400 PyObject *m, *d;
401 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000402 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000403 Py_FatalError("can't create __main__ module");
404 d = PyModule_GetDict(m);
405 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000406 PyObject *bimod = PyImport_ImportModule("__builtin__");
407 if (bimod == NULL ||
408 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000409 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000410 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000411 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412}
413
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000414/* Import the site module (not into __main__ though) */
415
416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000417initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000418{
419 PyObject *m, *f;
420 m = PyImport_ImportModule("site");
421 if (m == NULL) {
422 f = PySys_GetObject("stderr");
423 if (Py_VerboseFlag) {
424 PyFile_WriteString(
425 "'import site' failed; traceback:\n", f);
426 PyErr_Print();
427 }
428 else {
429 PyFile_WriteString(
430 "'import site' failed; use -v for traceback\n", f);
431 PyErr_Clear();
432 }
433 }
434 else {
435 Py_DECREF(m);
436 }
437}
438
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439/* Parse input from a file and execute it */
440
441int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000442PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000443{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000444 return PyRun_AnyFileEx(fp, filename, 0);
445}
446
447int
448PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
449{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000450 if (filename == NULL)
451 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000452 if (Py_FdIsInteractive(fp, filename)) {
453 int err = PyRun_InteractiveLoop(fp, filename);
454 if (closeit)
455 fclose(fp);
456 return err;
457 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000458 else
Guido van Rossum0df002c2000-08-27 19:21:52 +0000459 return PyRun_SimpleFileEx(fp, filename, closeit);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460}
461
462int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000463PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464{
Guido van Rossum82598051997-03-05 00:20:32 +0000465 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000466 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000467 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000469 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
470 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 }
Guido van Rossum82598051997-03-05 00:20:32 +0000472 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000473 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000474 PySys_SetObject("ps2", v = PyString_FromString("... "));
475 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000476 }
477 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000478 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000479#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000480 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481#endif
482 if (ret == E_EOF)
483 return 0;
484 /*
485 if (ret == E_NOMEM)
486 return -1;
487 */
488 }
489}
490
491int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000492PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493{
Guido van Rossum82598051997-03-05 00:20:32 +0000494 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000496 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000497 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000498 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000499 if (v != NULL) {
500 v = PyObject_Str(v);
501 if (v == NULL)
502 PyErr_Clear();
503 else if (PyString_Check(v))
504 ps1 = PyString_AsString(v);
505 }
Guido van Rossum82598051997-03-05 00:20:32 +0000506 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000507 if (w != NULL) {
508 w = PyObject_Str(w);
509 if (w == NULL)
510 PyErr_Clear();
511 else if (PyString_Check(w))
512 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000513 }
Guido van Rossum82598051997-03-05 00:20:32 +0000514 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000515 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000516 Py_XDECREF(v);
517 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000518 if (n == NULL) {
519 if (err.error == E_EOF) {
520 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000521 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000522 return E_EOF;
523 }
524 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000525 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000526 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527 }
Guido van Rossum82598051997-03-05 00:20:32 +0000528 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000529 if (m == NULL)
530 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000531 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000534 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535 return -1;
536 }
Guido van Rossum82598051997-03-05 00:20:32 +0000537 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000538 if (Py_FlushLine())
539 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 return 0;
541}
542
543int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000544PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000546 return PyRun_SimpleFileEx(fp, filename, 0);
547}
548
549int
550PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
551{
Guido van Rossum82598051997-03-05 00:20:32 +0000552 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000553 char *ext;
554
Guido van Rossum82598051997-03-05 00:20:32 +0000555 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000556 if (m == NULL)
557 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000558 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000559 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000560 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000561#ifdef macintosh
562 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Jack Jansencbf630f2000-07-11 21:59:16 +0000563 || PyMac_getfiletype(filename) == 'PYC '
564 || PyMac_getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000565#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000566 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000567 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000568 if (closeit)
569 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000570 if( (fp = fopen(filename, "rb")) == NULL ) {
571 fprintf(stderr, "python: Can't reopen .pyc file\n");
572 return -1;
573 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000574 /* Turn on optimization if a .pyo file is given */
575 if (strcmp(ext, ".pyo") == 0)
576 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000577 v = run_pyc_file(fp, filename, d, d);
578 } else {
Guido van Rossum0df002c2000-08-27 19:21:52 +0000579 v = PyRun_FileEx(fp, filename, Py_file_input, d, d, closeit);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000580 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000581 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000582 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583 return -1;
584 }
Guido van Rossum82598051997-03-05 00:20:32 +0000585 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000586 if (Py_FlushLine())
587 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588 return 0;
589}
590
591int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000592PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000593{
Guido van Rossum82598051997-03-05 00:20:32 +0000594 PyObject *m, *d, *v;
595 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596 if (m == NULL)
597 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000598 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000599 v = PyRun_String(command, Py_file_input, d, d);
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
Barry Warsaw035574d1997-08-29 22:07:17 +0000610static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000611parse_syntax_error(PyObject *err, PyObject **message, char **filename,
612 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000613{
614 long hold;
615 PyObject *v;
616
617 /* old style errors */
618 if (PyTuple_Check(err))
619 return PyArg_Parse(err, "(O(ziiz))", message, filename,
620 lineno, offset, text);
621
622 /* new style errors. `err' is an instance */
623
624 if (! (v = PyObject_GetAttrString(err, "msg")))
625 goto finally;
626 *message = v;
627
628 if (!(v = PyObject_GetAttrString(err, "filename")))
629 goto finally;
630 if (v == Py_None)
631 *filename = NULL;
632 else if (! (*filename = PyString_AsString(v)))
633 goto finally;
634
635 Py_DECREF(v);
636 if (!(v = PyObject_GetAttrString(err, "lineno")))
637 goto finally;
638 hold = PyInt_AsLong(v);
639 Py_DECREF(v);
640 v = NULL;
641 if (hold < 0 && PyErr_Occurred())
642 goto finally;
643 *lineno = (int)hold;
644
645 if (!(v = PyObject_GetAttrString(err, "offset")))
646 goto finally;
647 hold = PyInt_AsLong(v);
648 Py_DECREF(v);
649 v = NULL;
650 if (hold < 0 && PyErr_Occurred())
651 goto finally;
652 *offset = (int)hold;
653
654 if (!(v = PyObject_GetAttrString(err, "text")))
655 goto finally;
656 if (v == Py_None)
657 *text = NULL;
658 else if (! (*text = PyString_AsString(v)))
659 goto finally;
660 Py_DECREF(v);
661 return 1;
662
663finally:
664 Py_XDECREF(v);
665 return 0;
666}
667
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000669PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000671 PyErr_PrintEx(1);
672}
673
674void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000675PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000676{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000677 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000678 PyObject *exception, *v, *tb, *f;
679 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000680 PyErr_NormalizeException(&exception, &v, &tb);
681
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000682 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000683 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000684
Barry Warsaw36b8f941997-08-26 18:09:48 +0000685 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000686 if (Py_FlushLine())
687 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000688 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000689 if (v == NULL || v == Py_None)
690 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000691 if (PyInstance_Check(v)) {
692 /* we expect the error code to be store in the
693 `code' attribute
694 */
695 PyObject *code = PyObject_GetAttrString(v, "code");
696 if (code) {
697 Py_DECREF(v);
698 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000699 if (v == Py_None)
700 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000701 }
702 /* if we failed to dig out the "code" attribute,
703 then just let the else clause below print the
704 error
705 */
706 }
Guido van Rossum82598051997-03-05 00:20:32 +0000707 if (PyInt_Check(v))
708 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000709 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000710 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000711 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000712 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000713 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000714 }
715 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000716 if (set_sys_last_vars) {
717 PySys_SetObject("last_type", exception);
718 PySys_SetObject("last_value", v);
719 PySys_SetObject("last_traceback", tb);
720 }
Guido van Rossum82598051997-03-05 00:20:32 +0000721 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000722 if (f == NULL)
723 fprintf(stderr, "lost sys.stderr\n");
724 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000725 if (Py_FlushLine())
726 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000727 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000728 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000729 if (err == 0 &&
730 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
731 {
Guido van Rossum82598051997-03-05 00:20:32 +0000732 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733 char *filename, *text;
734 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000735 if (!parse_syntax_error(v, &message, &filename,
736 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000738 else {
739 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000740 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000741 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000742 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000743 else
Guido van Rossum82598051997-03-05 00:20:32 +0000744 PyFile_WriteString(filename, f);
745 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000746 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000747 PyFile_WriteString(buf, f);
748 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000750 char *nl;
751 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000752 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000753 offset--;
754 for (;;) {
755 nl = strchr(text, '\n');
756 if (nl == NULL ||
757 nl-text >= offset)
758 break;
759 offset -= (nl+1-text);
760 text = nl+1;
761 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000762 while (*text == ' ' || *text == '\t') {
763 text++;
764 offset--;
765 }
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyFile_WriteString(" ", f);
767 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000768 if (*text == '\0' ||
769 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000770 PyFile_WriteString("\n", f);
771 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000772 offset--;
773 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000774 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000775 offset--;
776 }
Guido van Rossum82598051997-03-05 00:20:32 +0000777 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 }
Guido van Rossum82598051997-03-05 00:20:32 +0000779 Py_INCREF(message);
780 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000781 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000782 /* Can't be bothered to check all those
783 PyFile_WriteString() calls */
784 if (PyErr_Occurred())
785 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000786 }
787 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000788 if (err) {
789 /* Don't do anything else */
790 }
791 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000792 PyClassObject* exc = (PyClassObject*)exception;
793 PyObject* className = exc->cl_name;
794 PyObject* moduleName =
795 PyDict_GetItemString(exc->cl_dict, "__module__");
796
797 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000798 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000799 else {
800 char* modstr = PyString_AsString(moduleName);
801 if (modstr && strcmp(modstr, "exceptions"))
802 {
803 err = PyFile_WriteString(modstr, f);
804 err += PyFile_WriteString(".", f);
805 }
806 }
807 if (err == 0) {
808 if (className == NULL)
809 err = PyFile_WriteString("<unknown>", f);
810 else
811 err = PyFile_WriteObject(className, f,
812 Py_PRINT_RAW);
813 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000814 }
815 else
816 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
817 if (err == 0) {
818 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000819 PyObject *s = PyObject_Str(v);
820 /* only print colon if the str() of the
821 object is not the empty string
822 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000823 if (s == NULL)
824 err = -1;
825 else if (!PyString_Check(s) ||
826 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000827 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000828 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000829 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
830 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000831 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000832 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000833 if (err == 0)
834 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000835 }
Guido van Rossum82598051997-03-05 00:20:32 +0000836 Py_XDECREF(exception);
837 Py_XDECREF(v);
838 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000839 /* If an error happened here, don't show it.
840 XXX This is wrong, but too many callers rely on this behavior. */
841 if (err != 0)
842 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843}
844
Guido van Rossum82598051997-03-05 00:20:32 +0000845PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000846PyRun_String(char *str, int start, PyObject *globals, 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_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000849 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850}
851
Guido van Rossum82598051997-03-05 00:20:32 +0000852PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
854 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855{
Tim Peterse8682112000-08-27 20:18:17 +0000856 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000857}
858
859PyObject *
860PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
861 PyObject *locals, int closeit)
862{
863 node *n = PyParser_SimpleParseFile(fp, filename, start);
864 if (closeit)
865 fclose(fp);
866 return run_err_node(n, filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867}
868
Guido van Rossum82598051997-03-05 00:20:32 +0000869static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000870run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000872 if (n == NULL)
873 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000874 return run_node(n, filename, globals, locals);
875}
876
Guido van Rossum82598051997-03-05 00:20:32 +0000877static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000878run_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000879{
Guido van Rossum82598051997-03-05 00:20:32 +0000880 PyCodeObject *co;
881 PyObject *v;
882 co = PyNode_Compile(n, filename);
883 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884 if (co == NULL)
885 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000886 v = PyEval_EvalCode(co, globals, locals);
887 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000888 return v;
889}
890
Guido van Rossum82598051997-03-05 00:20:32 +0000891static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000892run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossumfdef2711994-09-14 13:31:04 +0000893{
Guido van Rossum82598051997-03-05 00:20:32 +0000894 PyCodeObject *co;
895 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000896 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +0000897 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000898
Guido van Rossum82598051997-03-05 00:20:32 +0000899 magic = PyMarshal_ReadLongFromFile(fp);
900 if (magic != PyImport_GetMagicNumber()) {
901 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000902 "Bad magic number in .pyc file");
903 return NULL;
904 }
Guido van Rossum82598051997-03-05 00:20:32 +0000905 (void) PyMarshal_ReadLongFromFile(fp);
906 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000907 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000908 if (v == NULL || !PyCode_Check(v)) {
909 Py_XDECREF(v);
910 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000911 "Bad code object in .pyc file");
912 return NULL;
913 }
Guido van Rossum82598051997-03-05 00:20:32 +0000914 co = (PyCodeObject *)v;
915 v = PyEval_EvalCode(co, globals, locals);
916 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000917 return v;
918}
919
Guido van Rossum82598051997-03-05 00:20:32 +0000920PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000922{
923 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000924 PyCodeObject *co;
925 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000926 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000927 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000928 co = PyNode_Compile(n, filename);
929 PyNode_Free(n);
930 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000931}
932
Guido van Rossuma110aa61994-08-29 12:50:44 +0000933/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000934
Guido van Rossuma110aa61994-08-29 12:50:44 +0000935node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000936PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000937{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000938 node *n;
939 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000940 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000942 if (n == NULL)
943 err_input(&err);
944 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000945}
946
Guido van Rossuma110aa61994-08-29 12:50:44 +0000947/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000948
Guido van Rossuma110aa61994-08-29 12:50:44 +0000949node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000950PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000951{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952 node *n;
953 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000954 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000955 if (n == NULL)
956 err_input(&err);
957 return n;
958}
959
960/* Set the error appropriate to the given input error code (see errcode.h) */
961
962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000963err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964{
Fred Drake85f36392000-07-11 17:53:00 +0000965 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000966 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +0000967 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +0000968 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000969 err->lineno, err->offset, err->text);
970 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000971 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000972 err->text = NULL;
973 }
974 switch (err->error) {
975 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +0000976 errtype = PyExc_IndentationError;
977 if (err->expected == INDENT)
978 msg = "expected an indented block";
979 else if (err->token == INDENT)
980 msg = "unexpected indent";
981 else if (err->token == DEDENT)
982 msg = "unexpected unindent";
983 else {
984 errtype = PyExc_SyntaxError;
985 msg = "invalid syntax";
986 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000987 break;
988 case E_TOKEN:
989 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +0000990 break;
991 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000992 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +0000993 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000994 return;
995 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000996 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +0000997 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000998 return;
999 case E_EOF:
1000 msg = "unexpected EOF while parsing";
1001 break;
Fred Drake85f36392000-07-11 17:53:00 +00001002 case E_TABSPACE:
1003 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001004 msg = "inconsistent use of tabs and spaces in indentation";
1005 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001006 case E_OVERFLOW:
1007 msg = "expression too long";
1008 break;
Fred Drake85f36392000-07-11 17:53:00 +00001009 case E_DEDENT:
1010 errtype = PyExc_IndentationError;
1011 msg = "unindent does not match any outer indentation level";
1012 break;
1013 case E_TOODEEP:
1014 errtype = PyExc_IndentationError;
1015 msg = "too many levels of indentation";
1016 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001017 default:
1018 fprintf(stderr, "error=%d\n", err->error);
1019 msg = "unknown parsing error";
1020 break;
1021 }
Guido van Rossum82598051997-03-05 00:20:32 +00001022 w = Py_BuildValue("(sO)", msg, v);
Fred Drake85f36392000-07-11 17:53:00 +00001023 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001024 Py_XDECREF(w);
Fred Drake83cb7972000-08-15 15:49:03 +00001025
1026 if (v != NULL) {
1027 PyObject *exc, *tb;
1028
1029 PyErr_Fetch(&errtype, &exc, &tb);
1030 PyErr_NormalizeException(&errtype, &exc, &tb);
1031 if (PyObject_SetAttrString(exc, "filename",
1032 PyTuple_GET_ITEM(v, 0)))
1033 PyErr_Clear();
1034 if (PyObject_SetAttrString(exc, "lineno",
1035 PyTuple_GET_ITEM(v, 1)))
1036 PyErr_Clear();
1037 if (PyObject_SetAttrString(exc, "offset",
1038 PyTuple_GET_ITEM(v, 2)))
1039 PyErr_Clear();
1040 Py_DECREF(v);
1041 PyErr_Restore(errtype, exc, tb);
1042 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001043}
1044
1045/* Print fatal error message and abort */
1046
1047void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001048Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001049{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001050 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001051#ifdef macintosh
1052 for (;;);
1053#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001054#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001055 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001056 OutputDebugString(msg);
1057 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001058#ifdef _DEBUG
1059 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001060#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001061#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001062 abort();
1063}
1064
1065/* Clean up and exit */
1066
Guido van Rossuma110aa61994-08-29 12:50:44 +00001067#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001068#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001069int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001070#endif
1071
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001072#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001073static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001074static int nexitfuncs = 0;
1075
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001076int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001077{
1078 if (nexitfuncs >= NEXITFUNCS)
1079 return -1;
1080 exitfuncs[nexitfuncs++] = func;
1081 return 0;
1082}
1083
Guido van Rossumcc283f51997-08-05 02:22:03 +00001084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001085call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001086{
Guido van Rossum82598051997-03-05 00:20:32 +00001087 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001088
1089 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001090 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001091 Py_INCREF(exitfunc);
1092 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001093 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001094 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001095 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001096 if (f)
1097 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001098 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001099 }
Guido van Rossum82598051997-03-05 00:20:32 +00001100 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001101 }
1102
Guido van Rossum0829c751998-02-28 04:31:39 +00001103 if (Py_FlushLine())
1104 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001105}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001106
Guido van Rossumcc283f51997-08-05 02:22:03 +00001107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001108call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001109{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001110 while (nexitfuncs > 0)
1111 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001112
1113 fflush(stdout);
1114 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001115}
1116
1117void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001118Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001119{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001120 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001121
Jack Jansen66a89771995-10-27 13:22:14 +00001122#ifdef macintosh
1123 PyMac_Exit(sts);
1124#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001125 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001126#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001127}
1128
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001130initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001131{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001132#ifdef HAVE_SIGNAL_H
1133#ifdef SIGPIPE
1134 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001135#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001136#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001137 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001138}
1139
Guido van Rossumaae0d321996-05-22 16:35:33 +00001140#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001141/* Ask a yes/no question */
1142
Guido van Rossum59bff391992-09-03 20:28:00 +00001143int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001144_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001145{
1146 char buf[256];
1147
1148 printf("%s [ny] ", prompt);
1149 if (fgets(buf, sizeof buf, stdin) == NULL)
1150 return 0;
1151 return buf[0] == 'y' || buf[0] == 'Y';
1152}
1153#endif
1154
Guido van Rossuma110aa61994-08-29 12:50:44 +00001155#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001156
1157/* Check for file descriptor connected to interactive device.
1158 Pretend that stdin is always interactive, other files never. */
1159
1160int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001161isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001162{
1163 return fd == fileno(stdin);
1164}
1165
1166#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001167
1168/*
1169 * The file descriptor fd is considered ``interactive'' if either
1170 * a) isatty(fd) is TRUE, or
1171 * b) the -i flag was given, and the filename associated with
1172 * the descriptor is NULL or "<stdin>" or "???".
1173 */
1174int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001175Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001176{
1177 if (isatty((int)fileno(fp)))
1178 return 1;
1179 if (!Py_InteractiveFlag)
1180 return 0;
1181 return (filename == NULL) ||
1182 (strcmp(filename, "<stdin>") == 0) ||
1183 (strcmp(filename, "???") == 0);
1184}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001185
1186
1187#if defined(USE_STACKCHECK)
1188#if defined(WIN32) && defined(_MSC_VER)
1189
1190/* Stack checking for Microsoft C */
1191
1192#include <malloc.h>
1193#include <excpt.h>
1194
Fred Drakee8de31c2000-08-31 05:38:39 +00001195/*
1196 * Return non-zero when we run out of memory on the stack; zero otherwise.
1197 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001198int
Fred Drake399739f2000-08-31 05:52:44 +00001199PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001200{
1201 __try {
1202 /* _alloca throws a stack overflow exception if there's
1203 not enough space left on the stack */
1204 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1205 return 0;
1206 } __except (EXCEPTION_EXECUTE_HANDLER) {
1207 /* just ignore all errors */
1208 }
1209 return 1;
1210}
1211
1212#endif /* WIN32 && _MSC_VER */
1213
1214/* Alternate implementations can be added here... */
1215
1216#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001217
1218
1219/* Wrappers around sigaction() or signal(). */
1220
1221PyOS_sighandler_t
1222PyOS_getsig(int sig)
1223{
1224#ifdef HAVE_SIGACTION
1225 struct sigaction context;
1226 sigaction(sig, NULL, &context);
1227 return context.sa_handler;
1228#else
1229 PyOS_sighandler_t handler;
1230 handler = signal(sig, SIG_IGN);
1231 signal(sig, handler);
1232 return handler;
1233#endif
1234}
1235
1236PyOS_sighandler_t
1237PyOS_setsig(int sig, PyOS_sighandler_t handler)
1238{
1239#ifdef HAVE_SIGACTION
1240 struct sigaction context;
1241 PyOS_sighandler_t oldhandler;
1242 sigaction(sig, NULL, &context);
1243 oldhandler = context.sa_handler;
1244 context.sa_handler = handler;
1245 sigaction(sig, &context, NULL);
1246 return oldhandler;
1247#else
1248 return signal(sig, handler);
1249#endif
1250}