blob: ff2142b807dbcca92c068f519a71645b0c0e5873 [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
Barry Warsawf242aa02000-05-25 23:09:49 +0000127 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000128 if (bimod == NULL)
129 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000130 interp->builtins = PyModule_GetDict(bimod);
131 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132
133 sysmod = _PySys_Init();
134 if (sysmod == NULL)
135 Py_FatalError("Py_Initialize: can't initialize sys");
136 interp->sysdict = PyModule_GetDict(sysmod);
137 Py_INCREF(interp->sysdict);
138 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140 PyDict_SetItemString(interp->sysdict, "modules",
141 interp->modules);
142
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000143 _PyImport_Init();
144
Barry Warsawf242aa02000-05-25 23:09:49 +0000145 /* initialize builtin exceptions */
146 init_exceptions();
147
Barry Warsaw035574d1997-08-29 22:07:17 +0000148 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000149 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000150
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151 initsigs(); /* Signal handling stuff, including initintr() */
152
153 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000154 if (!Py_NoSiteFlag)
155 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156}
157
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000158#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000159extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000160#endif
161
Guido van Rossum25ce5661997-08-02 03:10:38 +0000162/* Undo the effect of Py_Initialize().
163
164 Beware: if multiple interpreter and/or thread states exist, these
165 are not wiped out; only the current thread and interpreter state
166 are deleted. But since everything else is deleted, those other
167 interpreter and thread states should no longer be used.
168
169 (XXX We should do better, e.g. wipe out all interpreters and
170 threads.)
171
172 Locking: as above.
173
174*/
175
176void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000177Py_Finalize(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000178{
179 PyInterpreterState *interp;
180 PyThreadState *tstate;
181
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000182 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000183 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000184 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000185
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000186 call_sys_exitfunc();
187
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000188 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189 tstate = PyThreadState_Get();
190 interp = tstate->interp;
191
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000192 /* Disable signal handling */
193 PyOS_FiniInterrupts();
194
Guido van Rossumc94044c2000-03-10 23:03:54 +0000195 /* Cleanup Unicode implementation */
196 _PyUnicode_Fini();
197
198 /* Cleanup Codec registry */
199 _PyCodecRegistry_Fini();
200
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000201 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203
Guido van Rossum1707aad1997-12-08 23:43:45 +0000204 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
205 _PyImport_Fini();
206
207 /* Debugging stuff */
208#ifdef COUNT_ALLOCS
209 dump_counts();
210#endif
211
212#ifdef Py_REF_DEBUG
213 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
214#endif
215
216#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000217 if (
218#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
219 getenv("PYTHONDUMPREFS") &&
220#endif /* MS_WINDOWS */
221 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000222 _Py_PrintReferences(stderr);
223 }
224#endif /* Py_TRACE_REFS */
225
Barry Warsaw035574d1997-08-29 22:07:17 +0000226 /* Now we decref the exception classes. After this point nothing
227 can raise an exception. That's okay, because each Fini() method
228 below has been checked to make sure no exceptions are ever
229 raised.
230 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000231 fini_exceptions();
232
233 /* Delete current thread */
234 PyInterpreterState_Clear(interp);
235 PyThreadState_Swap(NULL);
236 PyInterpreterState_Delete(interp);
237
Guido van Rossumcc283f51997-08-05 02:22:03 +0000238 PyMethod_Fini();
239 PyFrame_Fini();
240 PyCFunction_Fini();
241 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000242 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000243 PyInt_Fini();
244 PyFloat_Fini();
245
246 /* XXX Still allocated:
247 - various static ad-hoc pointers to interned strings
248 - int and float free list blocks
249 - whatever various modules and libraries allocate
250 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000251
252 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000253
254 call_ll_exitfuncs();
255
Guido van Rossumcc283f51997-08-05 02:22:03 +0000256#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000257 _Py_ResetReferences();
258#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000259}
260
261/* Create and initialize a new interpreter and thread, and return the
262 new thread. This requires that Py_Initialize() has been called
263 first.
264
265 Unsuccessful initialization yields a NULL pointer. Note that *no*
266 exception information is available even in this case -- the
267 exception information is held in the thread, and there is no
268 thread.
269
270 Locking: as above.
271
272*/
273
274PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000275Py_NewInterpreter(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276{
277 PyInterpreterState *interp;
278 PyThreadState *tstate, *save_tstate;
279 PyObject *bimod, *sysmod;
280
281 if (!initialized)
282 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
283
284 interp = PyInterpreterState_New();
285 if (interp == NULL)
286 return NULL;
287
288 tstate = PyThreadState_New(interp);
289 if (tstate == NULL) {
290 PyInterpreterState_Delete(interp);
291 return NULL;
292 }
293
294 save_tstate = PyThreadState_Swap(tstate);
295
296 /* XXX The following is lax in error checking */
297
298 interp->modules = PyDict_New();
299
300 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
301 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000302 interp->builtins = PyModule_GetDict(bimod);
303 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000304 }
305 sysmod = _PyImport_FindExtension("sys", "sys");
306 if (bimod != NULL && sysmod != NULL) {
307 interp->sysdict = PyModule_GetDict(sysmod);
308 Py_INCREF(interp->sysdict);
309 PySys_SetPath(Py_GetPath());
310 PyDict_SetItemString(interp->sysdict, "modules",
311 interp->modules);
312 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000313 if (!Py_NoSiteFlag)
314 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315 }
316
317 if (!PyErr_Occurred())
318 return tstate;
319
320 /* Oops, it didn't work. Undo it all. */
321
322 PyErr_Print();
323 PyThreadState_Clear(tstate);
324 PyThreadState_Swap(save_tstate);
325 PyThreadState_Delete(tstate);
326 PyInterpreterState_Delete(interp);
327
328 return NULL;
329}
330
331/* Delete an interpreter and its last thread. This requires that the
332 given thread state is current, that the thread has no remaining
333 frames, and that it is its interpreter's only remaining thread.
334 It is a fatal error to violate these constraints.
335
336 (Py_Finalize() doesn't have these constraints -- it zaps
337 everything, regardless.)
338
339 Locking: as above.
340
341*/
342
343void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000344Py_EndInterpreter(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000345{
346 PyInterpreterState *interp = tstate->interp;
347
348 if (tstate != PyThreadState_Get())
349 Py_FatalError("Py_EndInterpreter: thread is not current");
350 if (tstate->frame != NULL)
351 Py_FatalError("Py_EndInterpreter: thread still has a frame");
352 if (tstate != interp->tstate_head || tstate->next != NULL)
353 Py_FatalError("Py_EndInterpreter: not the last thread");
354
355 PyImport_Cleanup();
356 PyInterpreterState_Clear(interp);
357 PyThreadState_Swap(NULL);
358 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000359}
360
361static char *progname = "python";
362
363void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000364Py_SetProgramName(char *pn)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000365{
366 if (pn && *pn)
367 progname = pn;
368}
369
370char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000371Py_GetProgramName(void)
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000372{
373 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000374}
375
Guido van Rossuma61691e1998-02-06 22:27:24 +0000376static char *default_home = NULL;
377
378void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000379Py_SetPythonHome(char *home)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000380{
381 default_home = home;
382}
383
384char *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000385Py_GetPythonHome(void)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000386{
387 char *home = default_home;
388 if (home == NULL)
389 home = getenv("PYTHONHOME");
390 return home;
391}
392
Guido van Rossum6135a871995-01-09 17:53:26 +0000393/* Create __main__ module */
394
395static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000396initmain(void)
Guido van Rossum6135a871995-01-09 17:53:26 +0000397{
Guido van Rossum82598051997-03-05 00:20:32 +0000398 PyObject *m, *d;
399 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000400 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000401 Py_FatalError("can't create __main__ module");
402 d = PyModule_GetDict(m);
403 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000404 PyObject *bimod = PyImport_ImportModule("__builtin__");
405 if (bimod == NULL ||
406 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000407 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000408 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000409 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410}
411
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000412/* Import the site module (not into __main__ though) */
413
414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000415initsite(void)
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000416{
417 PyObject *m, *f;
418 m = PyImport_ImportModule("site");
419 if (m == NULL) {
420 f = PySys_GetObject("stderr");
421 if (Py_VerboseFlag) {
422 PyFile_WriteString(
423 "'import site' failed; traceback:\n", f);
424 PyErr_Print();
425 }
426 else {
427 PyFile_WriteString(
428 "'import site' failed; use -v for traceback\n", f);
429 PyErr_Clear();
430 }
431 }
432 else {
433 Py_DECREF(m);
434 }
435}
436
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000437/* Parse input from a file and execute it */
438
439int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000440PyRun_AnyFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000441{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000442 return PyRun_AnyFileEx(fp, filename, 0);
443}
444
445int
446PyRun_AnyFileEx(FILE *fp, char *filename, int closeit)
447{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000448 if (filename == NULL)
449 filename = "???";
Guido van Rossum0df002c2000-08-27 19:21:52 +0000450 if (Py_FdIsInteractive(fp, filename)) {
451 int err = PyRun_InteractiveLoop(fp, filename);
452 if (closeit)
453 fclose(fp);
454 return err;
455 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456 else
Guido van Rossum0df002c2000-08-27 19:21:52 +0000457 return PyRun_SimpleFileEx(fp, filename, closeit);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000458}
459
460int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000461PyRun_InteractiveLoop(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462{
Guido van Rossum82598051997-03-05 00:20:32 +0000463 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000465 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000466 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000467 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
468 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000469 }
Guido van Rossum82598051997-03-05 00:20:32 +0000470 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000472 PySys_SetObject("ps2", v = PyString_FromString("... "));
473 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474 }
475 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000476 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000477#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000478 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000479#endif
480 if (ret == E_EOF)
481 return 0;
482 /*
483 if (ret == E_NOMEM)
484 return -1;
485 */
486 }
487}
488
489int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000490PyRun_InteractiveOne(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000491{
Guido van Rossum82598051997-03-05 00:20:32 +0000492 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000494 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000495 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000496 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000497 if (v != NULL) {
498 v = PyObject_Str(v);
499 if (v == NULL)
500 PyErr_Clear();
501 else if (PyString_Check(v))
502 ps1 = PyString_AsString(v);
503 }
Guido van Rossum82598051997-03-05 00:20:32 +0000504 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000505 if (w != NULL) {
506 w = PyObject_Str(w);
507 if (w == NULL)
508 PyErr_Clear();
509 else if (PyString_Check(w))
510 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511 }
Guido van Rossum82598051997-03-05 00:20:32 +0000512 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000513 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000514 Py_XDECREF(v);
515 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000516 if (n == NULL) {
517 if (err.error == E_EOF) {
518 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000519 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000520 return E_EOF;
521 }
522 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000523 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000524 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000525 }
Guido van Rossum82598051997-03-05 00:20:32 +0000526 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527 if (m == NULL)
528 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000529 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000530 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000532 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 return -1;
534 }
Guido van Rossum82598051997-03-05 00:20:32 +0000535 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000536 if (Py_FlushLine())
537 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000538 return 0;
539}
540
541int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000542PyRun_SimpleFile(FILE *fp, char *filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543{
Guido van Rossum0df002c2000-08-27 19:21:52 +0000544 return PyRun_SimpleFileEx(fp, filename, 0);
545}
546
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000547/* Check whether a file maybe a pyc file: Look at the extension,
548 the file type, and, if we may close it, at the first few bytes. */
549
550static int
551maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit)
552{
553 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0)
554 return 1;
555
556#ifdef macintosh
557 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
558 if (PyMac_getfiletype(filename) == 'PYC '
559 || PyMac_getfiletype(filename) == 'APPL')
560 return 1;
561#endif /* macintosh */
562
563 /* Only look into the file if we are allowed to close it, since
564 it then should also be seekable. */
565 if (closeit) {
566 /* Read only two bytes of the magic. If the file was opened in
567 text mode, the bytes 3 and 4 of the magic (\r\n) might not
568 be read as they are on disk. */
569 unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF;
570 unsigned char buf[2];
Tim Petersb8584e02001-01-05 00:54:29 +0000571 if (fread(buf, 1, 2, fp) == 2
572 && ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic)
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000573 return 1;
574 fseek(fp, 0, SEEK_SET);
575 }
576 return 0;
577}
578
Guido van Rossum0df002c2000-08-27 19:21:52 +0000579int
580PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit)
581{
Guido van Rossum82598051997-03-05 00:20:32 +0000582 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000583 char *ext;
584
Guido van Rossum82598051997-03-05 00:20:32 +0000585 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 if (m == NULL)
587 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000588 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000589 ext = filename + strlen(filename) - 4;
Martin v. Löwisbe4c0f52001-01-04 20:30:56 +0000590 if (maybe_pyc_file(fp, filename, ext, closeit)) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000591 /* Try to run a pyc file. First, re-open in binary */
Guido van Rossum0df002c2000-08-27 19:21:52 +0000592 if (closeit)
593 fclose(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000594 if( (fp = fopen(filename, "rb")) == NULL ) {
595 fprintf(stderr, "python: Can't reopen .pyc file\n");
596 return -1;
597 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000598 /* Turn on optimization if a .pyo file is given */
599 if (strcmp(ext, ".pyo") == 0)
600 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000601 v = run_pyc_file(fp, filename, d, d);
602 } else {
Guido van Rossum0df002c2000-08-27 19:21:52 +0000603 v = PyRun_FileEx(fp, filename, Py_file_input, d, d, closeit);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000604 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000605 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000606 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607 return -1;
608 }
Guido van Rossum82598051997-03-05 00:20:32 +0000609 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000610 if (Py_FlushLine())
611 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000612 return 0;
613}
614
615int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000616PyRun_SimpleString(char *command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617{
Guido van Rossum82598051997-03-05 00:20:32 +0000618 PyObject *m, *d, *v;
619 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 if (m == NULL)
621 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000622 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000623 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000625 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 return -1;
627 }
Guido van Rossum82598051997-03-05 00:20:32 +0000628 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000629 if (Py_FlushLine())
630 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000631 return 0;
632}
633
Barry Warsaw035574d1997-08-29 22:07:17 +0000634static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000635parse_syntax_error(PyObject *err, PyObject **message, char **filename,
636 int *lineno, int *offset, char **text)
Barry Warsaw035574d1997-08-29 22:07:17 +0000637{
638 long hold;
639 PyObject *v;
640
641 /* old style errors */
642 if (PyTuple_Check(err))
643 return PyArg_Parse(err, "(O(ziiz))", message, filename,
644 lineno, offset, text);
645
646 /* new style errors. `err' is an instance */
647
648 if (! (v = PyObject_GetAttrString(err, "msg")))
649 goto finally;
650 *message = v;
651
652 if (!(v = PyObject_GetAttrString(err, "filename")))
653 goto finally;
654 if (v == Py_None)
655 *filename = NULL;
656 else if (! (*filename = PyString_AsString(v)))
657 goto finally;
658
659 Py_DECREF(v);
660 if (!(v = PyObject_GetAttrString(err, "lineno")))
661 goto finally;
662 hold = PyInt_AsLong(v);
663 Py_DECREF(v);
664 v = NULL;
665 if (hold < 0 && PyErr_Occurred())
666 goto finally;
667 *lineno = (int)hold;
668
669 if (!(v = PyObject_GetAttrString(err, "offset")))
670 goto finally;
671 hold = PyInt_AsLong(v);
672 Py_DECREF(v);
673 v = NULL;
674 if (hold < 0 && PyErr_Occurred())
675 goto finally;
676 *offset = (int)hold;
677
678 if (!(v = PyObject_GetAttrString(err, "text")))
679 goto finally;
680 if (v == Py_None)
681 *text = NULL;
682 else if (! (*text = PyString_AsString(v)))
683 goto finally;
684 Py_DECREF(v);
685 return 1;
686
687finally:
688 Py_XDECREF(v);
689 return 0;
690}
691
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000692void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000693PyErr_Print(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000694{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000695 PyErr_PrintEx(1);
696}
697
698void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000699PyErr_PrintEx(int set_sys_last_vars)
Guido van Rossuma61691e1998-02-06 22:27:24 +0000700{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000701 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000702 PyObject *exception, *v, *tb, *f;
703 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000704 PyErr_NormalizeException(&exception, &v, &tb);
705
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000706 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000707 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000708
Barry Warsaw36b8f941997-08-26 18:09:48 +0000709 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000710 if (Py_FlushLine())
711 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000712 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000713 if (v == NULL || v == Py_None)
714 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000715 if (PyInstance_Check(v)) {
716 /* we expect the error code to be store in the
717 `code' attribute
718 */
719 PyObject *code = PyObject_GetAttrString(v, "code");
720 if (code) {
721 Py_DECREF(v);
722 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000723 if (v == Py_None)
724 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000725 }
726 /* if we failed to dig out the "code" attribute,
727 then just let the else clause below print the
728 error
729 */
730 }
Guido van Rossum82598051997-03-05 00:20:32 +0000731 if (PyInt_Check(v))
732 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000733 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000734 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000736 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000737 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000738 }
739 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000740 if (set_sys_last_vars) {
741 PySys_SetObject("last_type", exception);
742 PySys_SetObject("last_value", v);
743 PySys_SetObject("last_traceback", tb);
744 }
Guido van Rossum82598051997-03-05 00:20:32 +0000745 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000746 if (f == NULL)
747 fprintf(stderr, "lost sys.stderr\n");
748 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000749 if (Py_FlushLine())
750 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000751 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000752 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000753 if (err == 0 &&
754 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
755 {
Guido van Rossum82598051997-03-05 00:20:32 +0000756 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000757 char *filename, *text;
758 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000759 if (!parse_syntax_error(v, &message, &filename,
760 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000761 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000762 else {
763 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000764 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000765 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000766 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000767 else
Guido van Rossum82598051997-03-05 00:20:32 +0000768 PyFile_WriteString(filename, f);
769 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000770 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000771 PyFile_WriteString(buf, f);
772 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000773 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000774 char *nl;
775 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000776 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000777 offset--;
778 for (;;) {
779 nl = strchr(text, '\n');
780 if (nl == NULL ||
781 nl-text >= offset)
782 break;
783 offset -= (nl+1-text);
784 text = nl+1;
785 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000786 while (*text == ' ' || *text == '\t') {
787 text++;
788 offset--;
789 }
Guido van Rossum82598051997-03-05 00:20:32 +0000790 PyFile_WriteString(" ", f);
791 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000792 if (*text == '\0' ||
793 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000794 PyFile_WriteString("\n", f);
795 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000796 offset--;
797 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000798 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000799 offset--;
800 }
Guido van Rossum82598051997-03-05 00:20:32 +0000801 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000802 }
Guido van Rossum82598051997-03-05 00:20:32 +0000803 Py_INCREF(message);
804 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000805 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000806 /* Can't be bothered to check all those
807 PyFile_WriteString() calls */
808 if (PyErr_Occurred())
809 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000810 }
811 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000812 if (err) {
813 /* Don't do anything else */
814 }
815 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000816 PyClassObject* exc = (PyClassObject*)exception;
817 PyObject* className = exc->cl_name;
818 PyObject* moduleName =
819 PyDict_GetItemString(exc->cl_dict, "__module__");
820
821 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000822 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000823 else {
824 char* modstr = PyString_AsString(moduleName);
825 if (modstr && strcmp(modstr, "exceptions"))
826 {
827 err = PyFile_WriteString(modstr, f);
828 err += PyFile_WriteString(".", f);
829 }
830 }
831 if (err == 0) {
832 if (className == NULL)
833 err = PyFile_WriteString("<unknown>", f);
834 else
835 err = PyFile_WriteObject(className, f,
836 Py_PRINT_RAW);
837 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000838 }
839 else
840 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
841 if (err == 0) {
842 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000843 PyObject *s = PyObject_Str(v);
844 /* only print colon if the str() of the
845 object is not the empty string
846 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000847 if (s == NULL)
848 err = -1;
849 else if (!PyString_Check(s) ||
850 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000851 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000852 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000853 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
854 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000855 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000856 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000857 if (err == 0)
858 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 }
Guido van Rossum82598051997-03-05 00:20:32 +0000860 Py_XDECREF(exception);
861 Py_XDECREF(v);
862 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000863 /* If an error happened here, don't show it.
864 XXX This is wrong, but too many callers rely on this behavior. */
865 if (err != 0)
866 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867}
868
Guido van Rossum82598051997-03-05 00:20:32 +0000869PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000870PyRun_String(char *str, int start, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871{
Guido van Rossum82598051997-03-05 00:20:32 +0000872 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000873 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000874}
875
Guido van Rossum82598051997-03-05 00:20:32 +0000876PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000877PyRun_File(FILE *fp, char *filename, int start, PyObject *globals,
878 PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000879{
Tim Peterse8682112000-08-27 20:18:17 +0000880 return PyRun_FileEx(fp, filename, start, globals, locals, 0);
Guido van Rossum0df002c2000-08-27 19:21:52 +0000881}
882
883PyObject *
884PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals,
885 PyObject *locals, int closeit)
886{
887 node *n = PyParser_SimpleParseFile(fp, filename, start);
888 if (closeit)
889 fclose(fp);
890 return run_err_node(n, filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000891}
892
Guido van Rossum82598051997-03-05 00:20:32 +0000893static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000894run_err_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000895{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000896 if (n == NULL)
897 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000898 return run_node(n, filename, globals, locals);
899}
900
Guido van Rossum82598051997-03-05 00:20:32 +0000901static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000902run_node(node *n, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000903{
Guido van Rossum82598051997-03-05 00:20:32 +0000904 PyCodeObject *co;
905 PyObject *v;
906 co = PyNode_Compile(n, filename);
907 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000908 if (co == NULL)
909 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000910 v = PyEval_EvalCode(co, globals, locals);
911 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000912 return v;
913}
914
Guido van Rossum82598051997-03-05 00:20:32 +0000915static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000916run_pyc_file(FILE *fp, char *filename, PyObject *globals, PyObject *locals)
Guido van Rossumfdef2711994-09-14 13:31:04 +0000917{
Guido van Rossum82598051997-03-05 00:20:32 +0000918 PyCodeObject *co;
919 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000920 long magic;
Fred Drakee8de31c2000-08-31 05:38:39 +0000921 long PyImport_GetMagicNumber(void);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000922
Guido van Rossum82598051997-03-05 00:20:32 +0000923 magic = PyMarshal_ReadLongFromFile(fp);
924 if (magic != PyImport_GetMagicNumber()) {
925 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000926 "Bad magic number in .pyc file");
927 return NULL;
928 }
Guido van Rossum82598051997-03-05 00:20:32 +0000929 (void) PyMarshal_ReadLongFromFile(fp);
930 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000931 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000932 if (v == NULL || !PyCode_Check(v)) {
933 Py_XDECREF(v);
934 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000935 "Bad code object in .pyc file");
936 return NULL;
937 }
Guido van Rossum82598051997-03-05 00:20:32 +0000938 co = (PyCodeObject *)v;
939 v = PyEval_EvalCode(co, globals, locals);
940 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000941 return v;
942}
943
Guido van Rossum82598051997-03-05 00:20:32 +0000944PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000945Py_CompileString(char *str, char *filename, int start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000946{
947 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000948 PyCodeObject *co;
949 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000950 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000951 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000952 co = PyNode_Compile(n, filename);
953 PyNode_Free(n);
954 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000955}
956
Guido van Rossuma110aa61994-08-29 12:50:44 +0000957/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958
Guido van Rossuma110aa61994-08-29 12:50:44 +0000959node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000960PyParser_SimpleParseFile(FILE *fp, char *filename, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000961{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000962 node *n;
963 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000964 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000965 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000966 if (n == NULL)
967 err_input(&err);
968 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000969}
970
Guido van Rossuma110aa61994-08-29 12:50:44 +0000971/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000972
Guido van Rossuma110aa61994-08-29 12:50:44 +0000973node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000974PyParser_SimpleParseString(char *str, int start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000975{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000976 node *n;
977 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000978 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000979 if (n == NULL)
980 err_input(&err);
981 return n;
982}
983
984/* Set the error appropriate to the given input error code (see errcode.h) */
985
986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000987err_input(perrdetail *err)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000988{
Fred Drake85f36392000-07-11 17:53:00 +0000989 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000990 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +0000991 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +0000992 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000993 err->lineno, err->offset, err->text);
994 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000995 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000996 err->text = NULL;
997 }
998 switch (err->error) {
999 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001000 errtype = PyExc_IndentationError;
1001 if (err->expected == INDENT)
1002 msg = "expected an indented block";
1003 else if (err->token == INDENT)
1004 msg = "unexpected indent";
1005 else if (err->token == DEDENT)
1006 msg = "unexpected unindent";
1007 else {
1008 errtype = PyExc_SyntaxError;
1009 msg = "invalid syntax";
1010 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001011 break;
1012 case E_TOKEN:
1013 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001014 break;
1015 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001016 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001017 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001018 return;
1019 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001020 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001021 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001022 return;
1023 case E_EOF:
1024 msg = "unexpected EOF while parsing";
1025 break;
Fred Drake85f36392000-07-11 17:53:00 +00001026 case E_TABSPACE:
1027 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001028 msg = "inconsistent use of tabs and spaces in indentation";
1029 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001030 case E_OVERFLOW:
1031 msg = "expression too long";
1032 break;
Fred Drake85f36392000-07-11 17:53:00 +00001033 case E_DEDENT:
1034 errtype = PyExc_IndentationError;
1035 msg = "unindent does not match any outer indentation level";
1036 break;
1037 case E_TOODEEP:
1038 errtype = PyExc_IndentationError;
1039 msg = "too many levels of indentation";
1040 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001041 default:
1042 fprintf(stderr, "error=%d\n", err->error);
1043 msg = "unknown parsing error";
1044 break;
1045 }
Guido van Rossum82598051997-03-05 00:20:32 +00001046 w = Py_BuildValue("(sO)", msg, v);
Fred Drake85f36392000-07-11 17:53:00 +00001047 PyErr_SetObject(errtype, w);
Guido van Rossum82598051997-03-05 00:20:32 +00001048 Py_XDECREF(w);
Fred Drake83cb7972000-08-15 15:49:03 +00001049
1050 if (v != NULL) {
1051 PyObject *exc, *tb;
1052
1053 PyErr_Fetch(&errtype, &exc, &tb);
1054 PyErr_NormalizeException(&errtype, &exc, &tb);
1055 if (PyObject_SetAttrString(exc, "filename",
1056 PyTuple_GET_ITEM(v, 0)))
1057 PyErr_Clear();
1058 if (PyObject_SetAttrString(exc, "lineno",
1059 PyTuple_GET_ITEM(v, 1)))
1060 PyErr_Clear();
1061 if (PyObject_SetAttrString(exc, "offset",
1062 PyTuple_GET_ITEM(v, 2)))
1063 PyErr_Clear();
1064 Py_DECREF(v);
1065 PyErr_Restore(errtype, exc, tb);
1066 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001067}
1068
1069/* Print fatal error message and abort */
1070
1071void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001072Py_FatalError(char *msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001073{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001074 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001075#ifdef macintosh
1076 for (;;);
1077#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001078#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001079 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001080 OutputDebugString(msg);
1081 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001082#ifdef _DEBUG
1083 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001084#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001085#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001086 abort();
1087}
1088
1089/* Clean up and exit */
1090
Guido van Rossuma110aa61994-08-29 12:50:44 +00001091#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001092#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001093int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001094#endif
1095
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001096#define NEXITFUNCS 32
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001097static void (*exitfuncs[NEXITFUNCS])(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001098static int nexitfuncs = 0;
1099
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001100int Py_AtExit(void (*func)(void))
Guido van Rossum1662dd51994-09-07 14:38:28 +00001101{
1102 if (nexitfuncs >= NEXITFUNCS)
1103 return -1;
1104 exitfuncs[nexitfuncs++] = func;
1105 return 0;
1106}
1107
Guido van Rossumcc283f51997-08-05 02:22:03 +00001108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001109call_sys_exitfunc(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001110{
Guido van Rossum82598051997-03-05 00:20:32 +00001111 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001112
1113 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001114 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001115 Py_INCREF(exitfunc);
1116 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001117 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001118 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001119 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001120 if (f)
1121 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001122 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001123 }
Guido van Rossum82598051997-03-05 00:20:32 +00001124 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001125 }
1126
Guido van Rossum0829c751998-02-28 04:31:39 +00001127 if (Py_FlushLine())
1128 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001129}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001130
Guido van Rossumcc283f51997-08-05 02:22:03 +00001131static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001132call_ll_exitfuncs(void)
Guido van Rossumcc283f51997-08-05 02:22:03 +00001133{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001134 while (nexitfuncs > 0)
1135 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001136
1137 fflush(stdout);
1138 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001139}
1140
1141void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001142Py_Exit(int sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001143{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001144 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001145
Jack Jansen66a89771995-10-27 13:22:14 +00001146#ifdef macintosh
1147 PyMac_Exit(sts);
1148#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001149 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001150#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001151}
1152
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001154initsigs(void)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001155{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001156#ifdef HAVE_SIGNAL_H
1157#ifdef SIGPIPE
1158 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001159#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001160#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001161 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001162}
1163
Guido van Rossumaae0d321996-05-22 16:35:33 +00001164#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001165/* Ask a yes/no question */
1166
Guido van Rossum59bff391992-09-03 20:28:00 +00001167int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001168_Py_AskYesNo(char *prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001169{
1170 char buf[256];
1171
1172 printf("%s [ny] ", prompt);
1173 if (fgets(buf, sizeof buf, stdin) == NULL)
1174 return 0;
1175 return buf[0] == 'y' || buf[0] == 'Y';
1176}
1177#endif
1178
Guido van Rossuma110aa61994-08-29 12:50:44 +00001179#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001180
1181/* Check for file descriptor connected to interactive device.
1182 Pretend that stdin is always interactive, other files never. */
1183
1184int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001185isatty(int fd)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001186{
1187 return fd == fileno(stdin);
1188}
1189
1190#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001191
1192/*
1193 * The file descriptor fd is considered ``interactive'' if either
1194 * a) isatty(fd) is TRUE, or
1195 * b) the -i flag was given, and the filename associated with
1196 * the descriptor is NULL or "<stdin>" or "???".
1197 */
1198int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001199Py_FdIsInteractive(FILE *fp, char *filename)
Guido van Rossum7433b121997-02-14 19:45:36 +00001200{
1201 if (isatty((int)fileno(fp)))
1202 return 1;
1203 if (!Py_InteractiveFlag)
1204 return 0;
1205 return (filename == NULL) ||
1206 (strcmp(filename, "<stdin>") == 0) ||
1207 (strcmp(filename, "???") == 0);
1208}
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001209
1210
1211#if defined(USE_STACKCHECK)
1212#if defined(WIN32) && defined(_MSC_VER)
1213
1214/* Stack checking for Microsoft C */
1215
1216#include <malloc.h>
1217#include <excpt.h>
1218
Fred Drakee8de31c2000-08-31 05:38:39 +00001219/*
1220 * Return non-zero when we run out of memory on the stack; zero otherwise.
1221 */
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001222int
Fred Drake399739f2000-08-31 05:52:44 +00001223PyOS_CheckStack(void)
Fredrik Lundh2f15b252000-08-27 19:15:31 +00001224{
1225 __try {
1226 /* _alloca throws a stack overflow exception if there's
1227 not enough space left on the stack */
1228 _alloca(PYOS_STACK_MARGIN * sizeof(void*));
1229 return 0;
1230 } __except (EXCEPTION_EXECUTE_HANDLER) {
1231 /* just ignore all errors */
1232 }
1233 return 1;
1234}
1235
1236#endif /* WIN32 && _MSC_VER */
1237
1238/* Alternate implementations can be added here... */
1239
1240#endif /* USE_STACKCHECK */
Guido van Rossum6f256182000-09-16 16:32:19 +00001241
1242
1243/* Wrappers around sigaction() or signal(). */
1244
1245PyOS_sighandler_t
1246PyOS_getsig(int sig)
1247{
1248#ifdef HAVE_SIGACTION
1249 struct sigaction context;
1250 sigaction(sig, NULL, &context);
1251 return context.sa_handler;
1252#else
1253 PyOS_sighandler_t handler;
1254 handler = signal(sig, SIG_IGN);
1255 signal(sig, handler);
1256 return handler;
1257#endif
1258}
1259
1260PyOS_sighandler_t
1261PyOS_setsig(int sig, PyOS_sighandler_t handler)
1262{
1263#ifdef HAVE_SIGACTION
1264 struct sigaction context;
1265 PyOS_sighandler_t oldhandler;
1266 sigaction(sig, NULL, &context);
1267 oldhandler = context.sa_handler;
1268 context.sa_handler = handler;
1269 sigaction(sig, &context, NULL);
1270 return oldhandler;
1271#else
1272 return signal(sig, handler);
1273#endif
1274}