blob: 45d21dd772090b7b0f26a2fdf283cbb5ac7d4d24 [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
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000549/* Check whether a file maybe a pyc file: Look at the extension,
550 the file type, and, if we may close it, at the first few bytes. */
551
552static int
553maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
554{
555 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
556 return 1;
557
558#ifdef macintosh
559 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
560 if (PyMac_getfiletype(filename) == 'PYC '
561 || PyMac_getfiletype(filename) == 'APPL')
562 return 1;
563#endif /* macintosh */
564
565 /* Only look into the file if we are allowed to close it, since
566 it then should also be seekable. */
567 if (closeit) {
568 /* Read only two bytes of the magic. If the file was opened in
569 text mode, the bytes 3 and 4 of the magic (\r\n) might not
570 be read as they are on disk. */
571 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
572 unsigned char buf[2];
573 if (fread(buf, 1, 2, fp) == 2
574 && (buf[1]<<8 | buf[0]) == halfmagic)
575 return 1;
576 fseek(fp, 0, SEEK_SET);
577 }
578 return 0;
579}
580
Guido van Rossum0df002c2000-08-27 19:21:52 +0000581int
582PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
583{
Guido van Rossum82598051997-03-05 00:20:32 +0000584 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000585 char *ext;
586
Guido van Rossum82598051997-03-05 00:20:32 +0000587 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 Rossumfdef2711994-09-14 13:31:04 +0000591 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000592 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000593 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000594 if (closeit)
595 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000596 if( (fp = fopen(filename, "rb")) == NULL ) {
597 fprintf(stderr, "python: Can't reopen .pyc file\n");
598 return -1;
599 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000600 /* Turn on optimization if a .pyo file is given */
601 if (strcmp(ext, ".pyo") == 0)
602 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000603 v = run_pyc_file(fp, filename, d, d);
604 } else {
Guido van Rossum0df002c2000-08-27 19:21:52 +0000605 v = PyRun_FileEx(fp, filename, Py_file_input, d, d, closeit);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000606 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000608 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000609 return -1;
610 }
Guido van Rossum82598051997-03-05 00:20:32 +0000611 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000612 if (Py_FlushLine())
613 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000614 return 0;
615}
616
617int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000618PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619{
Guido van Rossum82598051997-03-05 00:20:32 +0000620 PyObject *m, *d, *v;
621 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000622 if (m == NULL)
623 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000624 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000625 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000627 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000628 return -1;
629 }
Guido van Rossum82598051997-03-05 00:20:32 +0000630 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000631 if (Py_FlushLine())
632 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633 return 0;
634}
635
Barry Warsaw035574d1997-08-29 22:07:17 +0000636static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000637parse_syntax_error(PyObject *err, PyObject **message, char **filename,
638 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000639{
640 long hold;
641 PyObject *v;
642
643 /* old style errors */
644 if (PyTuple_Check(err))
645 return PyArg_Parse(err, "(O(ziiz))", message, filename,
646 lineno, offset, text);
647
648 /* new style errors. `err' is an instance */
649
650 if (! (v = PyObject_GetAttrString(err, "msg")))
651 goto finally;
652 *message = v;
653
654 if (!(v = PyObject_GetAttrString(err, "filename")))
655 goto finally;
656 if (v == Py_None)
657 *filename = NULL;
658 else if (! (*filename = PyString_AsString(v)))
659 goto finally;
660
661 Py_DECREF(v);
662 if (!(v = PyObject_GetAttrString(err, "lineno")))
663 goto finally;
664 hold = PyInt_AsLong(v);
665 Py_DECREF(v);
666 v = NULL;
667 if (hold < 0 && PyErr_Occurred())
668 goto finally;
669 *lineno = (int)hold;
670
671 if (!(v = PyObject_GetAttrString(err, "offset")))
672 goto finally;
673 hold = PyInt_AsLong(v);
674 Py_DECREF(v);
675 v = NULL;
676 if (hold < 0 && PyErr_Occurred())
677 goto finally;
678 *offset = (int)hold;
679
680 if (!(v = PyObject_GetAttrString(err, "text")))
681 goto finally;
682 if (v == Py_None)
683 *text = NULL;
684 else if (! (*text = PyString_AsString(v)))
685 goto finally;
686 Py_DECREF(v);
687 return 1;
688
689finally:
690 Py_XDECREF(v);
691 return 0;
692}
693
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000694void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000695PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000696{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000697 PyErr_PrintEx(1);
698}
699
700void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000701PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000702{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000703 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000704 PyObject *exception, *v, *tb, *f;
705 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000706 PyErr_NormalizeException(&exception, &v, &tb);
707
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000708 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000709 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000710
Barry Warsaw36b8f941997-08-26 18:09:48 +0000711 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000712 if (Py_FlushLine())
713 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000714 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000715 if (v == NULL || v == Py_None)
716 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000717 if (PyInstance_Check(v)) {
718 /* we expect the error code to be store in the
719 `code' attribute
720 */
721 PyObject *code = PyObject_GetAttrString(v, "code");
722 if (code) {
723 Py_DECREF(v);
724 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000725 if (v == Py_None)
726 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000727 }
728 /* if we failed to dig out the "code" attribute,
729 then just let the else clause below print the
730 error
731 */
732 }
Guido van Rossum82598051997-03-05 00:20:32 +0000733 if (PyInt_Check(v))
734 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000735 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000736 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000738 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000739 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000740 }
741 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000742 if (set_sys_last_vars) {
743 PySys_SetObject("last_type", exception);
744 PySys_SetObject("last_value", v);
745 PySys_SetObject("last_traceback", tb);
746 }
Guido van Rossum82598051997-03-05 00:20:32 +0000747 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000748 if (f == NULL)
749 fprintf(stderr, "lost sys.stderr\n");
750 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000751 if (Py_FlushLine())
752 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000753 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000754 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000755 if (err == 0 &&
756 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
757 {
Guido van Rossum82598051997-03-05 00:20:32 +0000758 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 char *filename, *text;
760 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000761 if (!parse_syntax_error(v, &message, &filename,
762 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000763 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764 else {
765 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000767 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000768 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000769 else
Guido van Rossum82598051997-03-05 00:20:32 +0000770 PyFile_WriteString(filename, f);
771 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000772 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000773 PyFile_WriteString(buf, f);
774 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000775 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000776 char *nl;
777 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000778 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000779 offset--;
780 for (;;) {
781 nl = strchr(text, '\n');
782 if (nl == NULL ||
783 nl-text >= offset)
784 break;
785 offset -= (nl+1-text);
786 text = nl+1;
787 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788 while (*text == ' ' || *text == '\t') {
789 text++;
790 offset--;
791 }
Guido van Rossum82598051997-03-05 00:20:32 +0000792 PyFile_WriteString(" ", f);
793 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000794 if (*text == '\0' ||
795 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000796 PyFile_WriteString("\n", f);
797 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000798 offset--;
799 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000800 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000801 offset--;
802 }
Guido van Rossum82598051997-03-05 00:20:32 +0000803 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000804 }
Guido van Rossum82598051997-03-05 00:20:32 +0000805 Py_INCREF(message);
806 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000807 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000808 /* Can't be bothered to check all those
809 PyFile_WriteString() calls */
810 if (PyErr_Occurred())
811 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000812 }
813 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000814 if (err) {
815 /* Don't do anything else */
816 }
817 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000818 PyClassObject* exc = (PyClassObject*)exception;
819 PyObject* className = exc->cl_name;
820 PyObject* moduleName =
821 PyDict_GetItemString(exc->cl_dict, "__module__");
822
823 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000824 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000825 else {
826 char* modstr = PyString_AsString(moduleName);
827 if (modstr && strcmp(modstr, "exceptions"))
828 {
829 err = PyFile_WriteString(modstr, f);
830 err += PyFile_WriteString(".", f);
831 }
832 }
833 if (err == 0) {
834 if (className == NULL)
835 err = PyFile_WriteString("<unknown>", f);
836 else
837 err = PyFile_WriteObject(className, f,
838 Py_PRINT_RAW);
839 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000840 }
841 else
842 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
843 if (err == 0) {
844 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000845 PyObject *s = PyObject_Str(v);
846 /* only print colon if the str() of the
847 object is not the empty string
848 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000849 if (s == NULL)
850 err = -1;
851 else if (!PyString_Check(s) ||
852 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000853 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000854 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000855 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
856 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000857 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000858 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000859 if (err == 0)
860 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000861 }
Guido van Rossum82598051997-03-05 00:20:32 +0000862 Py_XDECREF(exception);
863 Py_XDECREF(v);
864 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000865 /* If an error happened here, don't show it.
866 XXX This is wrong, but too many callers rely on this behavior. */
867 if (err != 0)
868 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000869}
870
Guido van Rossum82598051997-03-05 00:20:32 +0000871PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000872PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873{
Guido van Rossum82598051997-03-05 00:20:32 +0000874 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000875 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000876}
877
Guido van Rossum82598051997-03-05 00:20:32 +0000878PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000879PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
880 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000881{
Tim Peterse8682112000-08-27 20:18:17 +0000882 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000883}
884
885PyObject *
886PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
887 PyObject *locals, int closeit)
888{
889 node *n = PyParser_SimpleParseFile(fp, filename, start);
890 if (closeit)
891 fclose(fp);
892 return run_err_node(n, filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000893}
894
Guido van Rossum82598051997-03-05 00:20:32 +0000895static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000896run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000897{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000898 if (n == NULL)
899 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000900 return run_node(n, filename, globals, locals);
901}
902
Guido van Rossum82598051997-03-05 00:20:32 +0000903static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000904run_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000905{
Guido van Rossum82598051997-03-05 00:20:32 +0000906 PyCodeObject *co;
907 PyObject *v;
908 co = PyNode_Compile(n, filename);
909 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000910 if (co == NULL)
911 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000912 v = PyEval_EvalCode(co, globals, locals);
913 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000914 return v;
915}
916
Guido van Rossum82598051997-03-05 00:20:32 +0000917static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000918run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossumfdef2711994-09-14 13:31:04 +0000919{
Guido van Rossum82598051997-03-05 00:20:32 +0000920 PyCodeObject *co;
921 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000922 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +0000923 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000924
Guido van Rossum82598051997-03-05 00:20:32 +0000925 magic = PyMarshal_ReadLongFromFile(fp);
926 if (magic != PyImport_GetMagicNumber()) {
927 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000928 "Bad magic number in .pyc file");
929 return NULL;
930 }
Guido van Rossum82598051997-03-05 00:20:32 +0000931 (void) PyMarshal_ReadLongFromFile(fp);
932 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000933 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000934 if (v == NULL || !PyCode_Check(v)) {
935 Py_XDECREF(v);
936 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000937 "Bad code object in .pyc file");
938 return NULL;
939 }
Guido van Rossum82598051997-03-05 00:20:32 +0000940 co = (PyCodeObject *)v;
941 v = PyEval_EvalCode(co, globals, locals);
942 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000943 return v;
944}
945
Guido van Rossum82598051997-03-05 00:20:32 +0000946PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000947Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000948{
949 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000950 PyCodeObject *co;
951 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000953 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000954 co = PyNode_Compile(n, filename);
955 PyNode_Free(n);
956 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000957}
958
Guido van Rossuma110aa61994-08-29 12:50:44 +0000959/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000960
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000962PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000963{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964 node *n;
965 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000966 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000967 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000968 if (n == NULL)
969 err_input(&err);
970 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000971}
972
Guido van Rossuma110aa61994-08-29 12:50:44 +0000973/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000974
Guido van Rossuma110aa61994-08-29 12:50:44 +0000975node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000976PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000977{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000978 node *n;
979 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000980 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000981 if (n == NULL)
982 err_input(&err);
983 return n;
984}
985
986/* Set the error appropriate to the given input error code (see errcode.h) */
987
988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000989err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000990{
Fred Drake85f36392000-07-11 17:53:00 +0000991 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000992 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +0000993 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +0000994 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000995 err->lineno, err->offset, err->text);
996 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000997 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000998 err->text = NULL;
999 }
1000 switch (err->error) {
1001 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001002 errtype = PyExc_IndentationError;
1003 if (err->expected == INDENT)
1004 msg = "expected an indented block";
1005 else if (err->token == INDENT)
1006 msg = "unexpected indent";
1007 else if (err->token == DEDENT)
1008 msg = "unexpected unindent";
1009 else {
1010 errtype = PyExc_SyntaxError;
1011 msg = "invalid syntax";
1012 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001013 break;
1014 case E_TOKEN:
1015 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001016 break;
1017 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001018 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001019 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001020 return;
1021 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001022 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001023 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001024 return;
1025 case E_EOF:
1026 msg = "unexpected EOF while parsing";
1027 break;
Fred Drake85f36392000-07-11 17:53:00 +00001028 case E_TABSPACE:
1029 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001030 msg = "inconsistent use of tabs and spaces in indentation";
1031 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001032 case E_OVERFLOW:
1033 msg = "expression too long";
1034 break;
Fred Drake85f36392000-07-11 17:53:00 +00001035 case E_DEDENT:
1036 errtype = PyExc_IndentationError;
1037 msg = "unindent does not match any outer indentation level";
1038 break;
1039 case E_TOODEEP:
1040 errtype = PyExc_IndentationError;
1041 msg = "too many levels of indentation";
1042 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001043 default:
1044 fprintf(stderr, "error=%d\n", err->error);
1045 msg = "unknown parsing error";
1046 break;
1047 }
Guido van Rossum82598051997-03-05 00:20:32 +00001048 w = Py_BuildValue("(sO)", msg, v);
Fred Drake85f36392000-07-11 17:53:00 +00001049 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001050 Py_XDECREF(w);
Fred Drake83cb7972000-08-15 15:49:03 +00001051
1052 if (v != NULL) {
1053 PyObject *exc, *tb;
1054
1055 PyErr_Fetch(&errtype, &exc, &tb);
1056 PyErr_NormalizeException(&errtype, &exc, &tb);
1057 if (PyObject_SetAttrString(exc, "filename",
1058 PyTuple_GET_ITEM(v, 0)))
1059 PyErr_Clear();
1060 if (PyObject_SetAttrString(exc, "lineno",
1061 PyTuple_GET_ITEM(v, 1)))
1062 PyErr_Clear();
1063 if (PyObject_SetAttrString(exc, "offset",
1064 PyTuple_GET_ITEM(v, 2)))
1065 PyErr_Clear();
1066 Py_DECREF(v);
1067 PyErr_Restore(errtype, exc, tb);
1068 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001069}
1070
1071/* Print fatal error message and abort */
1072
1073void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001075{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001076 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001077#ifdef macintosh
1078 for (;;);
1079#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001080#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001081 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001082 OutputDebugString(msg);
1083 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001084#ifdef _DEBUG
1085 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001086#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001087#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001088 abort();
1089}
1090
1091/* Clean up and exit */
1092
Guido van Rossuma110aa61994-08-29 12:50:44 +00001093#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001094#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001095int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001096#endif
1097
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001098#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001099static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001100static int nexitfuncs = 0;
1101
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001102int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001103{
1104 if (nexitfuncs >= NEXITFUNCS)
1105 return -1;
1106 exitfuncs[nexitfuncs++] = func;
1107 return 0;
1108}
1109
Guido van Rossumcc283f51997-08-05 02:22:03 +00001110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001111call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001112{
Guido van Rossum82598051997-03-05 00:20:32 +00001113 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001114
1115 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001116 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001117 Py_INCREF(exitfunc);
1118 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001119 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001120 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001121 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001122 if (f)
1123 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001124 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001125 }
Guido van Rossum82598051997-03-05 00:20:32 +00001126 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001127 }
1128
Guido van Rossum0829c751998-02-28 04:31:39 +00001129 if (Py_FlushLine())
1130 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001131}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001132
Guido van Rossumcc283f51997-08-05 02:22:03 +00001133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001134call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001135{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001136 while (nexitfuncs > 0)
1137 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001138
1139 fflush(stdout);
1140 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001141}
1142
1143void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001144Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001145{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001146 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001147
Jack Jansen66a89771995-10-27 13:22:14 +00001148#ifdef macintosh
1149 PyMac_Exit(sts);
1150#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001151 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001152#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001153}
1154
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001156initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001157{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001158#ifdef HAVE_SIGNAL_H
1159#ifdef SIGPIPE
1160 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001161#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001162#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001163 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001164}
1165
Guido van Rossumaae0d321996-05-22 16:35:33 +00001166#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001167/* Ask a yes/no question */
1168
Guido van Rossum59bff391992-09-03 20:28:00 +00001169int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001170_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001171{
1172 char buf[256];
1173
1174 printf("%s [ny] ", prompt);
1175 if (fgets(buf, sizeof buf, stdin) == NULL)
1176 return 0;
1177 return buf[0] == 'y' || buf[0] == 'Y';
1178}
1179#endif
1180
Guido van Rossuma110aa61994-08-29 12:50:44 +00001181#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001182
1183/* Check for file descriptor connected to interactive device.
1184 Pretend that stdin is always interactive, other files never. */
1185
1186int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001187isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001188{
1189 return fd == fileno(stdin);
1190}
1191
1192#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001193
1194/*
1195 * The file descriptor fd is considered ``interactive'' if either
1196 * a) isatty(fd) is TRUE, or
1197 * b) the -i flag was given, and the filename associated with
1198 * the descriptor is NULL or "<stdin>" or "???".
1199 */
1200int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001201Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001202{
1203 if (isatty((int)fileno(fp)))
1204 return 1;
1205 if (!Py_InteractiveFlag)
1206 return 0;
1207 return (filename == NULL) ||
1208 (strcmp(filename, "<stdin>") == 0) ||
1209 (strcmp(filename, "???") == 0);
1210}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001211
1212
1213#if defined(USE_STACKCHECK)
1214#if defined(WIN32) && defined(_MSC_VER)
1215
1216/* Stack checking for Microsoft C */
1217
1218#include <malloc.h>
1219#include <excpt.h>
1220
Fred Drakee8de31c2000-08-31 05:38:39 +00001221/*
1222 * Return non-zero when we run out of memory on the stack; zero otherwise.
1223 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001224int
Fred Drake399739f2000-08-31 05:52:44 +00001225PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001226{
1227 __try {
1228 /* _alloca throws a stack overflow exception if there's
1229 not enough space left on the stack */
1230 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1231 return 0;
1232 } __except (EXCEPTION_EXECUTE_HANDLER) {
1233 /* just ignore all errors */
1234 }
1235 return 1;
1236}
1237
1238#endif /* WIN32 && _MSC_VER */
1239
1240/* Alternate implementations can be added here... */
1241
1242#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001243
1244
1245/* Wrappers around sigaction() or signal(). */
1246
1247PyOS_sighandler_t
1248PyOS_getsig(int sig)
1249{
1250#ifdef HAVE_SIGACTION
1251 struct sigaction context;
1252 sigaction(sig, NULL, &context);
1253 return context.sa_handler;
1254#else
1255 PyOS_sighandler_t handler;
1256 handler = signal(sig, SIG_IGN);
1257 signal(sig, handler);
1258 return handler;
1259#endif
1260}
1261
1262PyOS_sighandler_t
1263PyOS_setsig(int sig, PyOS_sighandler_t handler)
1264{
1265#ifdef HAVE_SIGACTION
1266 struct sigaction context;
1267 PyOS_sighandler_t oldhandler;
1268 sigaction(sig, NULL, &context);
1269 oldhandler = context.sa_handler;
1270 context.sa_handler = handler;
1271 sigaction(sig, &context, NULL);
1272 return oldhandler;
1273#else
1274 return signal(sig, handler);
1275#endif
1276}