blob: afb9589a51956686e944e0738641e0b93cbb07c5 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009******************************************************************/
10
11/* Python interpreter top-level routines, including init/exit */
12
Guido van Rossum82598051997-03-05 00:20:32 +000013#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014
15#include "grammar.h"
16#include "node.h"
Fred Drake85f36392000-07-11 17:53:00 +000017#include "token.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000018#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000019#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000020#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000021#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000022#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000023
Guido van Rossum80bb9651996-12-05 23:27:02 +000024#ifdef HAVE_UNISTD_H
25#include <unistd.h>
26#endif
27
Guido van Rossuma110aa61994-08-29 12:50:44 +000028#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000029#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000030#endif
31
Guido van Rossum9b38a141996-09-11 23:12:24 +000032#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000033#undef BYTE
34#include "windows.h"
35#endif
36
Jack Jansencbf630f2000-07-11 21:59:16 +000037#ifdef macintosh
38#include "macglue.h"
39#endif
Guido van Rossum82598051997-03-05 00:20:32 +000040extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041
Guido van Rossum82598051997-03-05 00:20:32 +000042extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossumb73cc041993-11-01 16:28:59 +000044/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000045static void initmain(void);
46static void initsite(void);
47static PyObject *run_err_node(node *n, char *filename,
48 PyObject *globals, PyObject *locals);
49static PyObject *run_node(node *n, char *filename,
50 PyObject *globals, PyObject *locals);
51static PyObject *run_pyc_file(FILE *fp, char *filename,
52 PyObject *globals, PyObject *locals);
53static void err_input(perrdetail *);
54static void initsigs(void);
55static void call_sys_exitfunc(void);
56static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000057
Guido van Rossumbffd6832000-01-20 22:32:56 +000058#ifdef Py_TRACE_REFS
59int _Py_AskYesNo(char *prompt);
60#endif
61
Guido van Rossumc94044c2000-03-10 23:03:54 +000062extern void _PyUnicode_Init();
63extern void _PyUnicode_Fini();
64extern void _PyCodecRegistry_Init();
65extern void _PyCodecRegistry_Fini();
66
67
Guido van Rossum82598051997-03-05 00:20:32 +000068int Py_DebugFlag; /* Needed by parser.c */
69int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000070int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000071int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000072int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000073int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000074int Py_UnicodeFlag = 0; /* Needed by compile.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000075
Guido van Rossum25ce5661997-08-02 03:10:38 +000076static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000077
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000078/* API to access the initialized flag -- useful for eroteric use */
79
80int
81Py_IsInitialized()
82{
83 return initialized;
84}
85
Guido van Rossum25ce5661997-08-02 03:10:38 +000086/* Global initializations. Can be undone by Py_Finalize(). Don't
87 call this twice without an intervening Py_Finalize() call. When
88 initializations fail, a fatal error is issued and the function does
89 not return. On return, the first thread and interpreter state have
90 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000091
Guido van Rossum25ce5661997-08-02 03:10:38 +000092 Locking: you must hold the interpreter lock while calling this.
93 (If the lock has not yet been initialized, that's equivalent to
94 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000095
Guido van Rossum25ce5661997-08-02 03:10:38 +000096*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000097
98void
99Py_Initialize()
100{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102 PyThreadState *tstate;
103 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000104 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000105
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000106 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000107 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000108 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000109
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000110 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
111 Py_DebugFlag = 1;
112 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
113 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000114 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
115 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000116
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 interp = PyInterpreterState_New();
118 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 tstate = PyThreadState_New(interp);
122 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 (void) PyThreadState_Swap(tstate);
125
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 interp->modules = PyDict_New();
127 if (interp->modules == NULL)
128 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000129
Guido van Rossumc94044c2000-03-10 23:03:54 +0000130 /* Init codec registry */
131 _PyCodecRegistry_Init();
132
133 /* Init Unicode implementation; relies on the codec registry */
134 _PyUnicode_Init();
135
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000136 _PyCompareState_Key = PyString_InternFromString("cmp_state");
137
Barry Warsawf242aa02000-05-25 23:09:49 +0000138 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139 if (bimod == NULL)
140 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000141 interp->builtins = PyModule_GetDict(bimod);
142 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000143
144 sysmod = _PySys_Init();
145 if (sysmod == NULL)
146 Py_FatalError("Py_Initialize: can't initialize sys");
147 interp->sysdict = PyModule_GetDict(sysmod);
148 Py_INCREF(interp->sysdict);
149 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000150 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151 PyDict_SetItemString(interp->sysdict, "modules",
152 interp->modules);
153
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000154 _PyImport_Init();
155
Barry Warsawf242aa02000-05-25 23:09:49 +0000156 /* initialize builtin exceptions */
157 init_exceptions();
158
Barry Warsaw035574d1997-08-29 22:07:17 +0000159 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000160 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000161
Guido van Rossum25ce5661997-08-02 03:10:38 +0000162 initsigs(); /* Signal handling stuff, including initintr() */
163
164 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000165 if (!Py_NoSiteFlag)
166 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167}
168
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000169#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000170extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000171#endif
172
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173/* Undo the effect of Py_Initialize().
174
175 Beware: if multiple interpreter and/or thread states exist, these
176 are not wiped out; only the current thread and interpreter state
177 are deleted. But since everything else is deleted, those other
178 interpreter and thread states should no longer be used.
179
180 (XXX We should do better, e.g. wipe out all interpreters and
181 threads.)
182
183 Locking: as above.
184
185*/
186
187void
188Py_Finalize()
189{
190 PyInterpreterState *interp;
191 PyThreadState *tstate;
192
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000193 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000194 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000195 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000197 call_sys_exitfunc();
198
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000199 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200 tstate = PyThreadState_Get();
201 interp = tstate->interp;
202
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203 /* Disable signal handling */
204 PyOS_FiniInterrupts();
205
Guido van Rossumc94044c2000-03-10 23:03:54 +0000206 /* Cleanup Unicode implementation */
207 _PyUnicode_Fini();
208
209 /* Cleanup Codec registry */
210 _PyCodecRegistry_Fini();
211
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000212 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000214
Guido van Rossum1707aad1997-12-08 23:43:45 +0000215 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
216 _PyImport_Fini();
217
218 /* Debugging stuff */
219#ifdef COUNT_ALLOCS
220 dump_counts();
221#endif
222
223#ifdef Py_REF_DEBUG
224 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
225#endif
226
227#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000228 if (
229#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
230 getenv("PYTHONDUMPREFS") &&
231#endif /* MS_WINDOWS */
232 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000233 _Py_PrintReferences(stderr);
234 }
235#endif /* Py_TRACE_REFS */
236
Barry Warsaw035574d1997-08-29 22:07:17 +0000237 /* Now we decref the exception classes. After this point nothing
238 can raise an exception. That's okay, because each Fini() method
239 below has been checked to make sure no exceptions are ever
240 raised.
241 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000242 fini_exceptions();
243
244 /* Delete current thread */
245 PyInterpreterState_Clear(interp);
246 PyThreadState_Swap(NULL);
247 PyInterpreterState_Delete(interp);
248
Guido van Rossumcc283f51997-08-05 02:22:03 +0000249 PyMethod_Fini();
250 PyFrame_Fini();
251 PyCFunction_Fini();
252 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000253 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000254 PyInt_Fini();
255 PyFloat_Fini();
256
257 /* XXX Still allocated:
258 - various static ad-hoc pointers to interned strings
259 - int and float free list blocks
260 - whatever various modules and libraries allocate
261 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262
263 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000264
265 call_ll_exitfuncs();
266
Guido van Rossumcc283f51997-08-05 02:22:03 +0000267#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000268 _Py_ResetReferences();
269#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270}
271
272/* Create and initialize a new interpreter and thread, and return the
273 new thread. This requires that Py_Initialize() has been called
274 first.
275
276 Unsuccessful initialization yields a NULL pointer. Note that *no*
277 exception information is available even in this case -- the
278 exception information is held in the thread, and there is no
279 thread.
280
281 Locking: as above.
282
283*/
284
285PyThreadState *
286Py_NewInterpreter()
287{
288 PyInterpreterState *interp;
289 PyThreadState *tstate, *save_tstate;
290 PyObject *bimod, *sysmod;
291
292 if (!initialized)
293 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
294
295 interp = PyInterpreterState_New();
296 if (interp == NULL)
297 return NULL;
298
299 tstate = PyThreadState_New(interp);
300 if (tstate == NULL) {
301 PyInterpreterState_Delete(interp);
302 return NULL;
303 }
304
305 save_tstate = PyThreadState_Swap(tstate);
306
307 /* XXX The following is lax in error checking */
308
309 interp->modules = PyDict_New();
310
311 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
312 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000313 interp->builtins = PyModule_GetDict(bimod);
314 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315 }
316 sysmod = _PyImport_FindExtension("sys", "sys");
317 if (bimod != NULL && sysmod != NULL) {
318 interp->sysdict = PyModule_GetDict(sysmod);
319 Py_INCREF(interp->sysdict);
320 PySys_SetPath(Py_GetPath());
321 PyDict_SetItemString(interp->sysdict, "modules",
322 interp->modules);
323 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000324 if (!Py_NoSiteFlag)
325 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326 }
327
328 if (!PyErr_Occurred())
329 return tstate;
330
331 /* Oops, it didn't work. Undo it all. */
332
333 PyErr_Print();
334 PyThreadState_Clear(tstate);
335 PyThreadState_Swap(save_tstate);
336 PyThreadState_Delete(tstate);
337 PyInterpreterState_Delete(interp);
338
339 return NULL;
340}
341
342/* Delete an interpreter and its last thread. This requires that the
343 given thread state is current, that the thread has no remaining
344 frames, and that it is its interpreter's only remaining thread.
345 It is a fatal error to violate these constraints.
346
347 (Py_Finalize() doesn't have these constraints -- it zaps
348 everything, regardless.)
349
350 Locking: as above.
351
352*/
353
354void
355Py_EndInterpreter(tstate)
356 PyThreadState *tstate;
357{
358 PyInterpreterState *interp = tstate->interp;
359
360 if (tstate != PyThreadState_Get())
361 Py_FatalError("Py_EndInterpreter: thread is not current");
362 if (tstate->frame != NULL)
363 Py_FatalError("Py_EndInterpreter: thread still has a frame");
364 if (tstate != interp->tstate_head || tstate->next != NULL)
365 Py_FatalError("Py_EndInterpreter: not the last thread");
366
367 PyImport_Cleanup();
368 PyInterpreterState_Clear(interp);
369 PyThreadState_Swap(NULL);
370 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000371}
372
373static char *progname = "python";
374
375void
376Py_SetProgramName(pn)
377 char *pn;
378{
379 if (pn && *pn)
380 progname = pn;
381}
382
383char *
384Py_GetProgramName()
385{
386 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000387}
388
Guido van Rossuma61691e1998-02-06 22:27:24 +0000389static char *default_home = NULL;
390
391void
392Py_SetPythonHome(home)
393 char *home;
394{
395 default_home = home;
396}
397
398char *
399Py_GetPythonHome()
400{
401 char *home = default_home;
402 if (home == NULL)
403 home = getenv("PYTHONHOME");
404 return home;
405}
406
Guido van Rossum6135a871995-01-09 17:53:26 +0000407/* Create __main__ module */
408
409static void
410initmain()
411{
Guido van Rossum82598051997-03-05 00:20:32 +0000412 PyObject *m, *d;
413 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000414 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000415 Py_FatalError("can't create __main__ module");
416 d = PyModule_GetDict(m);
417 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000418 PyObject *bimod = PyImport_ImportModule("__builtin__");
419 if (bimod == NULL ||
420 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000421 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000422 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000423 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000424}
425
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000426/* Import the site module (not into __main__ though) */
427
428static void
429initsite()
430{
431 PyObject *m, *f;
432 m = PyImport_ImportModule("site");
433 if (m == NULL) {
434 f = PySys_GetObject("stderr");
435 if (Py_VerboseFlag) {
436 PyFile_WriteString(
437 "'import site' failed; traceback:\n", f);
438 PyErr_Print();
439 }
440 else {
441 PyFile_WriteString(
442 "'import site' failed; use -v for traceback\n", f);
443 PyErr_Clear();
444 }
445 }
446 else {
447 Py_DECREF(m);
448 }
449}
450
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451/* Parse input from a file and execute it */
452
453int
Guido van Rossum82598051997-03-05 00:20:32 +0000454PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000455 FILE *fp;
456 char *filename;
457{
458 if (filename == NULL)
459 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000460 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000461 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462 else
Guido van Rossum82598051997-03-05 00:20:32 +0000463 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464}
465
466int
Guido van Rossum82598051997-03-05 00:20:32 +0000467PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 FILE *fp;
469 char *filename;
470{
Guido van Rossum82598051997-03-05 00:20:32 +0000471 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000472 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000473 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000475 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
476 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000477 }
Guido van Rossum82598051997-03-05 00:20:32 +0000478 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000479 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000480 PySys_SetObject("ps2", v = PyString_FromString("... "));
481 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000482 }
483 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000484 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000485#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000486 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487#endif
488 if (ret == E_EOF)
489 return 0;
490 /*
491 if (ret == E_NOMEM)
492 return -1;
493 */
494 }
495}
496
497int
Guido van Rossum82598051997-03-05 00:20:32 +0000498PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499 FILE *fp;
500 char *filename;
501{
Guido van Rossum82598051997-03-05 00:20:32 +0000502 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000504 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000505 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000506 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000507 if (v != NULL) {
508 v = PyObject_Str(v);
509 if (v == NULL)
510 PyErr_Clear();
511 else if (PyString_Check(v))
512 ps1 = PyString_AsString(v);
513 }
Guido van Rossum82598051997-03-05 00:20:32 +0000514 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000515 if (w != NULL) {
516 w = PyObject_Str(w);
517 if (w == NULL)
518 PyErr_Clear();
519 else if (PyString_Check(w))
520 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000521 }
Guido van Rossum82598051997-03-05 00:20:32 +0000522 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000523 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000524 Py_XDECREF(v);
525 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000526 if (n == NULL) {
527 if (err.error == E_EOF) {
528 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000529 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000530 return E_EOF;
531 }
532 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000533 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000534 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535 }
Guido van Rossum82598051997-03-05 00:20:32 +0000536 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000537 if (m == NULL)
538 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000539 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000542 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543 return -1;
544 }
Guido van Rossum82598051997-03-05 00:20:32 +0000545 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000546 if (Py_FlushLine())
547 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000548 return 0;
549}
550
551int
Guido van Rossum82598051997-03-05 00:20:32 +0000552PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 FILE *fp;
554 char *filename;
555{
Guido van Rossum82598051997-03-05 00:20:32 +0000556 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000557 char *ext;
558
Guido van Rossum82598051997-03-05 00:20:32 +0000559 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560 if (m == NULL)
561 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000562 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000563 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000564 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000565#ifdef macintosh
566 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Jack Jansencbf630f2000-07-11 21:59:16 +0000567 || PyMac_getfiletype(filename) == 'PYC '
568 || PyMac_getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000569#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000570 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000571 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000572 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000573 if( (fp = fopen(filename, "rb")) == NULL ) {
574 fprintf(stderr, "python: Can't reopen .pyc file\n");
575 return -1;
576 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000577 /* Turn on optimization if a .pyo file is given */
578 if (strcmp(ext, ".pyo") == 0)
579 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000580 v = run_pyc_file(fp, filename, d, d);
581 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000582 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000583 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000585 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 return -1;
587 }
Guido van Rossum82598051997-03-05 00:20:32 +0000588 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000589 if (Py_FlushLine())
590 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 return 0;
592}
593
594int
Guido van Rossum82598051997-03-05 00:20:32 +0000595PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596 char *command;
597{
Guido van Rossum82598051997-03-05 00:20:32 +0000598 PyObject *m, *d, *v;
599 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000600 if (m == NULL)
601 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000602 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000603 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000604 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000605 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000606 return -1;
607 }
Guido van Rossum82598051997-03-05 00:20:32 +0000608 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000609 if (Py_FlushLine())
610 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000611 return 0;
612}
613
Barry Warsaw035574d1997-08-29 22:07:17 +0000614static int
615parse_syntax_error(err, message, filename, lineno, offset, text)
616 PyObject* err;
617 PyObject** message;
618 char** filename;
619 int* lineno;
620 int* offset;
621 char** text;
622{
623 long hold;
624 PyObject *v;
625
626 /* old style errors */
627 if (PyTuple_Check(err))
628 return PyArg_Parse(err, "(O(ziiz))", message, filename,
629 lineno, offset, text);
630
631 /* new style errors. `err' is an instance */
632
633 if (! (v = PyObject_GetAttrString(err, "msg")))
634 goto finally;
635 *message = v;
636
637 if (!(v = PyObject_GetAttrString(err, "filename")))
638 goto finally;
639 if (v == Py_None)
640 *filename = NULL;
641 else if (! (*filename = PyString_AsString(v)))
642 goto finally;
643
644 Py_DECREF(v);
645 if (!(v = PyObject_GetAttrString(err, "lineno")))
646 goto finally;
647 hold = PyInt_AsLong(v);
648 Py_DECREF(v);
649 v = NULL;
650 if (hold < 0 && PyErr_Occurred())
651 goto finally;
652 *lineno = (int)hold;
653
654 if (!(v = PyObject_GetAttrString(err, "offset")))
655 goto finally;
656 hold = PyInt_AsLong(v);
657 Py_DECREF(v);
658 v = NULL;
659 if (hold < 0 && PyErr_Occurred())
660 goto finally;
661 *offset = (int)hold;
662
663 if (!(v = PyObject_GetAttrString(err, "text")))
664 goto finally;
665 if (v == Py_None)
666 *text = NULL;
667 else if (! (*text = PyString_AsString(v)))
668 goto finally;
669 Py_DECREF(v);
670 return 1;
671
672finally:
673 Py_XDECREF(v);
674 return 0;
675}
676
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677void
Guido van Rossum82598051997-03-05 00:20:32 +0000678PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000680 PyErr_PrintEx(1);
681}
682
683void
684PyErr_PrintEx(set_sys_last_vars)
685 int set_sys_last_vars;
686{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000687 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000688 PyObject *exception, *v, *tb, *f;
689 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000690 PyErr_NormalizeException(&exception, &v, &tb);
691
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000692 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000693 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000694
Barry Warsaw36b8f941997-08-26 18:09:48 +0000695 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000696 if (Py_FlushLine())
697 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000698 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000699 if (v == NULL || v == Py_None)
700 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000701 if (PyInstance_Check(v)) {
702 /* we expect the error code to be store in the
703 `code' attribute
704 */
705 PyObject *code = PyObject_GetAttrString(v, "code");
706 if (code) {
707 Py_DECREF(v);
708 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000709 if (v == Py_None)
710 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000711 }
712 /* if we failed to dig out the "code" attribute,
713 then just let the else clause below print the
714 error
715 */
716 }
Guido van Rossum82598051997-03-05 00:20:32 +0000717 if (PyInt_Check(v))
718 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000720 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000721 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000722 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000723 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724 }
725 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000726 if (set_sys_last_vars) {
727 PySys_SetObject("last_type", exception);
728 PySys_SetObject("last_value", v);
729 PySys_SetObject("last_traceback", tb);
730 }
Guido van Rossum82598051997-03-05 00:20:32 +0000731 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000732 if (f == NULL)
733 fprintf(stderr, "lost sys.stderr\n");
734 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000735 if (Py_FlushLine())
736 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000737 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000738 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000739 if (err == 0 &&
740 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
741 {
Guido van Rossum82598051997-03-05 00:20:32 +0000742 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000743 char *filename, *text;
744 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000745 if (!parse_syntax_error(v, &message, &filename,
746 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000747 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000748 else {
749 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000750 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000751 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000752 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000753 else
Guido van Rossum82598051997-03-05 00:20:32 +0000754 PyFile_WriteString(filename, f);
755 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000756 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000757 PyFile_WriteString(buf, f);
758 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000760 char *nl;
761 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000762 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000763 offset--;
764 for (;;) {
765 nl = strchr(text, '\n');
766 if (nl == NULL ||
767 nl-text >= offset)
768 break;
769 offset -= (nl+1-text);
770 text = nl+1;
771 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000772 while (*text == ' ' || *text == '\t') {
773 text++;
774 offset--;
775 }
Guido van Rossum82598051997-03-05 00:20:32 +0000776 PyFile_WriteString(" ", f);
777 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 if (*text == '\0' ||
779 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000780 PyFile_WriteString("\n", f);
781 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000782 offset--;
783 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000784 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000785 offset--;
786 }
Guido van Rossum82598051997-03-05 00:20:32 +0000787 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788 }
Guido van Rossum82598051997-03-05 00:20:32 +0000789 Py_INCREF(message);
790 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000791 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000792 /* Can't be bothered to check all those
793 PyFile_WriteString() calls */
794 if (PyErr_Occurred())
795 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000796 }
797 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000798 if (err) {
799 /* Don't do anything else */
800 }
801 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000802 PyClassObject* exc = (PyClassObject*)exception;
803 PyObject* className = exc->cl_name;
804 PyObject* moduleName =
805 PyDict_GetItemString(exc->cl_dict, "__module__");
806
807 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000808 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000809 else {
810 char* modstr = PyString_AsString(moduleName);
811 if (modstr && strcmp(modstr, "exceptions"))
812 {
813 err = PyFile_WriteString(modstr, f);
814 err += PyFile_WriteString(".", f);
815 }
816 }
817 if (err == 0) {
818 if (className == NULL)
819 err = PyFile_WriteString("<unknown>", f);
820 else
821 err = PyFile_WriteObject(className, f,
822 Py_PRINT_RAW);
823 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000824 }
825 else
826 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
827 if (err == 0) {
828 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000829 PyObject *s = PyObject_Str(v);
830 /* only print colon if the str() of the
831 object is not the empty string
832 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000833 if (s == NULL)
834 err = -1;
835 else if (!PyString_Check(s) ||
836 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000837 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000838 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000839 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
840 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000841 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000842 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000843 if (err == 0)
844 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000845 }
Guido van Rossum82598051997-03-05 00:20:32 +0000846 Py_XDECREF(exception);
847 Py_XDECREF(v);
848 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000849 /* If an error happened here, don't show it.
850 XXX This is wrong, but too many callers rely on this behavior. */
851 if (err != 0)
852 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000853}
854
Guido van Rossum82598051997-03-05 00:20:32 +0000855PyObject *
856PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857 char *str;
858 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000859 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000860{
Guido van Rossum82598051997-03-05 00:20:32 +0000861 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000862 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000863}
864
Guido van Rossum82598051997-03-05 00:20:32 +0000865PyObject *
866PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867 FILE *fp;
868 char *filename;
869 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000870 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871{
Guido van Rossum82598051997-03-05 00:20:32 +0000872 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000873 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000874}
875
Guido van Rossum82598051997-03-05 00:20:32 +0000876static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000877run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000878 node *n;
879 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000880 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000881{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000882 if (n == NULL)
883 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884 return run_node(n, filename, globals, locals);
885}
886
Guido van Rossum82598051997-03-05 00:20:32 +0000887static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000888run_node(n, filename, globals, locals)
889 node *n;
890 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000891 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000892{
Guido van Rossum82598051997-03-05 00:20:32 +0000893 PyCodeObject *co;
894 PyObject *v;
895 co = PyNode_Compile(n, filename);
896 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000897 if (co == NULL)
898 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000899 v = PyEval_EvalCode(co, globals, locals);
900 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000901 return v;
902}
903
Guido van Rossum82598051997-03-05 00:20:32 +0000904static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000905run_pyc_file(fp, filename, globals, locals)
906 FILE *fp;
907 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000908 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000909{
Guido van Rossum82598051997-03-05 00:20:32 +0000910 PyCodeObject *co;
911 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000912 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000913 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000914
Guido van Rossum82598051997-03-05 00:20:32 +0000915 magic = PyMarshal_ReadLongFromFile(fp);
916 if (magic != PyImport_GetMagicNumber()) {
917 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000918 "Bad magic number in .pyc file");
919 return NULL;
920 }
Guido van Rossum82598051997-03-05 00:20:32 +0000921 (void) PyMarshal_ReadLongFromFile(fp);
922 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000923 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000924 if (v == NULL || !PyCode_Check(v)) {
925 Py_XDECREF(v);
926 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000927 "Bad code object in .pyc file");
928 return NULL;
929 }
Guido van Rossum82598051997-03-05 00:20:32 +0000930 co = (PyCodeObject *)v;
931 v = PyEval_EvalCode(co, globals, locals);
932 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000933 return v;
934}
935
Guido van Rossum82598051997-03-05 00:20:32 +0000936PyObject *
937Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000938 char *str;
939 char *filename;
940 int start;
941{
942 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000943 PyCodeObject *co;
944 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000945 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000946 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000947 co = PyNode_Compile(n, filename);
948 PyNode_Free(n);
949 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000950}
951
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000953
Guido van Rossuma110aa61994-08-29 12:50:44 +0000954node *
Guido van Rossum82598051997-03-05 00:20:32 +0000955PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000956 FILE *fp;
957 char *filename;
958 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000959{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000960 node *n;
961 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000962 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000963 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964 if (n == NULL)
965 err_input(&err);
966 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000967}
968
Guido van Rossuma110aa61994-08-29 12:50:44 +0000969/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000970
Guido van Rossuma110aa61994-08-29 12:50:44 +0000971node *
Guido van Rossum82598051997-03-05 00:20:32 +0000972PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000973 char *str;
974 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000975{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000976 node *n;
977 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000978 n = PyParser_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
987err_input(err)
988 perrdetail *err;
989{
Fred Drake85f36392000-07-11 17:53:00 +0000990 PyObject *v, *w, *errtype;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000991 char *msg = NULL;
Fred Drake85f36392000-07-11 17:53:00 +0000992 errtype = PyExc_SyntaxError;
Guido van Rossum82598051997-03-05 00:20:32 +0000993 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000994 err->lineno, err->offset, err->text);
995 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000996 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000997 err->text = NULL;
998 }
999 switch (err->error) {
1000 case E_SYNTAX:
Fred Drake85f36392000-07-11 17:53:00 +00001001 errtype = PyExc_IndentationError;
1002 if (err->expected == INDENT)
1003 msg = "expected an indented block";
1004 else if (err->token == INDENT)
1005 msg = "unexpected indent";
1006 else if (err->token == DEDENT)
1007 msg = "unexpected unindent";
1008 else {
1009 errtype = PyExc_SyntaxError;
1010 msg = "invalid syntax";
1011 }
Guido van Rossuma110aa61994-08-29 12:50:44 +00001012 break;
1013 case E_TOKEN:
1014 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001015 break;
1016 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001017 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001018 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001019 return;
1020 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001021 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001022 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001023 return;
1024 case E_EOF:
1025 msg = "unexpected EOF while parsing";
1026 break;
Fred Drake85f36392000-07-11 17:53:00 +00001027 case E_TABSPACE:
1028 errtype = PyExc_TabError;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001029 msg = "inconsistent use of tabs and spaces in indentation";
1030 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001031 case E_OVERFLOW:
1032 msg = "expression too long";
1033 break;
Fred Drake85f36392000-07-11 17:53:00 +00001034 case E_DEDENT:
1035 errtype = PyExc_IndentationError;
1036 msg = "unindent does not match any outer indentation level";
1037 break;
1038 case E_TOODEEP:
1039 errtype = PyExc_IndentationError;
1040 msg = "too many levels of indentation";
1041 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001042 default:
1043 fprintf(stderr, "error=%d\n", err->error);
1044 msg = "unknown parsing error";
1045 break;
1046 }
Guido van Rossum82598051997-03-05 00:20:32 +00001047 w = Py_BuildValue("(sO)", msg, v);
1048 Py_XDECREF(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);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001051}
1052
1053/* Print fatal error message and abort */
1054
1055void
Guido van Rossum82598051997-03-05 00:20:32 +00001056Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001057 char *msg;
1058{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001059 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001060#ifdef macintosh
1061 for (;;);
1062#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001063#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001064 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001065 OutputDebugString(msg);
1066 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001067#ifdef _DEBUG
1068 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001069#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001070#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001071 abort();
1072}
1073
1074/* Clean up and exit */
1075
Guido van Rossuma110aa61994-08-29 12:50:44 +00001076#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001077#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001078int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001079#endif
1080
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001081#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001082static void (*exitfuncs[NEXITFUNCS])();
1083static int nexitfuncs = 0;
1084
1085int Py_AtExit(func)
Tim Petersdbd9ba62000-07-09 03:09:57 +00001086 void (*func)(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001087{
1088 if (nexitfuncs >= NEXITFUNCS)
1089 return -1;
1090 exitfuncs[nexitfuncs++] = func;
1091 return 0;
1092}
1093
Guido van Rossumcc283f51997-08-05 02:22:03 +00001094static void
1095call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001096{
Guido van Rossum82598051997-03-05 00:20:32 +00001097 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001098
1099 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001100 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001101 Py_INCREF(exitfunc);
1102 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001103 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001104 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001105 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001106 if (f)
1107 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001108 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001109 }
Guido van Rossum82598051997-03-05 00:20:32 +00001110 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001111 }
1112
Guido van Rossum0829c751998-02-28 04:31:39 +00001113 if (Py_FlushLine())
1114 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001115}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001116
Guido van Rossumcc283f51997-08-05 02:22:03 +00001117static void
1118call_ll_exitfuncs()
1119{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001120 while (nexitfuncs > 0)
1121 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001122
1123 fflush(stdout);
1124 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001125}
1126
1127void
Guido van Rossum82598051997-03-05 00:20:32 +00001128Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001129 int sts;
1130{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001131 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001132
Jack Jansen66a89771995-10-27 13:22:14 +00001133#ifdef macintosh
1134 PyMac_Exit(sts);
1135#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001136 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001137#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001138}
1139
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001140static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001141initsigs()
1142{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001143#ifdef HAVE_SIGNAL_H
1144#ifdef SIGPIPE
1145 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001146#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001147#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001148 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001149}
1150
Guido van Rossumaae0d321996-05-22 16:35:33 +00001151#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001152/* Ask a yes/no question */
1153
Guido van Rossum59bff391992-09-03 20:28:00 +00001154int
Guido van Rossum82598051997-03-05 00:20:32 +00001155_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001156 char *prompt;
1157{
1158 char buf[256];
1159
1160 printf("%s [ny] ", prompt);
1161 if (fgets(buf, sizeof buf, stdin) == NULL)
1162 return 0;
1163 return buf[0] == 'y' || buf[0] == 'Y';
1164}
1165#endif
1166
Guido van Rossuma110aa61994-08-29 12:50:44 +00001167#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001168
1169/* Check for file descriptor connected to interactive device.
1170 Pretend that stdin is always interactive, other files never. */
1171
1172int
1173isatty(fd)
1174 int fd;
1175{
1176 return fd == fileno(stdin);
1177}
1178
1179#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001180
1181/*
1182 * The file descriptor fd is considered ``interactive'' if either
1183 * a) isatty(fd) is TRUE, or
1184 * b) the -i flag was given, and the filename associated with
1185 * the descriptor is NULL or "<stdin>" or "???".
1186 */
1187int
1188Py_FdIsInteractive(fp, filename)
1189 FILE *fp;
1190 char *filename;
1191{
1192 if (isatty((int)fileno(fp)))
1193 return 1;
1194 if (!Py_InteractiveFlag)
1195 return 0;
1196 return (filename == NULL) ||
1197 (strcmp(filename, "<stdin>") == 0) ||
1198 (strcmp(filename, "???") == 0);
1199}