blob: 74dffae74e8b97553619443a0fc0a7c807255c74 [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"
17#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000018#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000019#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000020#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000021#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000022
Guido van Rossum80bb9651996-12-05 23:27:02 +000023#ifdef HAVE_UNISTD_H
24#include <unistd.h>
25#endif
26
Guido van Rossuma110aa61994-08-29 12:50:44 +000027#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000028#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000029#endif
30
Guido van Rossum9b38a141996-09-11 23:12:24 +000031#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000032#undef BYTE
33#include "windows.h"
34#endif
35
Guido van Rossum82598051997-03-05 00:20:32 +000036extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000037
Guido van Rossum82598051997-03-05 00:20:32 +000038extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000039
Guido van Rossumb73cc041993-11-01 16:28:59 +000040/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000041static void initmain(void);
42static void initsite(void);
43static PyObject *run_err_node(node *n, char *filename,
44 PyObject *globals, PyObject *locals);
45static PyObject *run_node(node *n, char *filename,
46 PyObject *globals, PyObject *locals);
47static PyObject *run_pyc_file(FILE *fp, char *filename,
48 PyObject *globals, PyObject *locals);
49static void err_input(perrdetail *);
50static void initsigs(void);
51static void call_sys_exitfunc(void);
52static void call_ll_exitfuncs(void);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000053
Guido van Rossumbffd6832000-01-20 22:32:56 +000054#ifdef Py_TRACE_REFS
55int _Py_AskYesNo(char *prompt);
56#endif
57
Guido van Rossumc94044c2000-03-10 23:03:54 +000058extern void _PyUnicode_Init();
59extern void _PyUnicode_Fini();
60extern void _PyCodecRegistry_Init();
61extern void _PyCodecRegistry_Fini();
62
63
Guido van Rossum82598051997-03-05 00:20:32 +000064int Py_DebugFlag; /* Needed by parser.c */
65int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000066int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000067int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000068int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000069int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000070int Py_UnicodeFlag = 0; /* Needed by compile.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000071
Guido van Rossum25ce5661997-08-02 03:10:38 +000072static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000073
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000074/* API to access the initialized flag -- useful for eroteric use */
75
76int
77Py_IsInitialized()
78{
79 return initialized;
80}
81
Guido van Rossum25ce5661997-08-02 03:10:38 +000082/* Global initializations. Can be undone by Py_Finalize(). Don't
83 call this twice without an intervening Py_Finalize() call. When
84 initializations fail, a fatal error is issued and the function does
85 not return. On return, the first thread and interpreter state have
86 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087
Guido van Rossum25ce5661997-08-02 03:10:38 +000088 Locking: you must hold the interpreter lock while calling this.
89 (If the lock has not yet been initialized, that's equivalent to
90 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000091
Guido van Rossum25ce5661997-08-02 03:10:38 +000092*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000093
94void
95Py_Initialize()
96{
Guido van Rossuma027efa1997-05-05 20:56:21 +000097 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000098 PyThreadState *tstate;
99 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000100 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000101
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000102 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000103 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000104 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000106 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
107 Py_DebugFlag = 1;
108 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
109 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000110 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
111 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113 interp = PyInterpreterState_New();
114 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000116
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 tstate = PyThreadState_New(interp);
118 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120 (void) PyThreadState_Swap(tstate);
121
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122 interp->modules = PyDict_New();
123 if (interp->modules == NULL)
124 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125
Guido van Rossumc94044c2000-03-10 23:03:54 +0000126 /* Init codec registry */
127 _PyCodecRegistry_Init();
128
129 /* Init Unicode implementation; relies on the codec registry */
130 _PyUnicode_Init();
131
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000132 _PyCompareState_Key = PyString_InternFromString("cmp_state");
133
Barry Warsawf242aa02000-05-25 23:09:49 +0000134 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135 if (bimod == NULL)
136 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000137 interp->builtins = PyModule_GetDict(bimod);
138 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000139
140 sysmod = _PySys_Init();
141 if (sysmod == NULL)
142 Py_FatalError("Py_Initialize: can't initialize sys");
143 interp->sysdict = PyModule_GetDict(sysmod);
144 Py_INCREF(interp->sysdict);
145 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000147 PyDict_SetItemString(interp->sysdict, "modules",
148 interp->modules);
149
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000150 _PyImport_Init();
151
Barry Warsawf242aa02000-05-25 23:09:49 +0000152 /* initialize builtin exceptions */
153 init_exceptions();
154
Barry Warsaw035574d1997-08-29 22:07:17 +0000155 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000156 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000157
Guido van Rossum25ce5661997-08-02 03:10:38 +0000158 initsigs(); /* Signal handling stuff, including initintr() */
159
160 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000161 if (!Py_NoSiteFlag)
162 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000163}
164
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000165#ifdef COUNT_ALLOCS
Tim Petersdbd9ba62000-07-09 03:09:57 +0000166extern void dump_counts(void);
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000167#endif
168
Guido van Rossum25ce5661997-08-02 03:10:38 +0000169/* Undo the effect of Py_Initialize().
170
171 Beware: if multiple interpreter and/or thread states exist, these
172 are not wiped out; only the current thread and interpreter state
173 are deleted. But since everything else is deleted, those other
174 interpreter and thread states should no longer be used.
175
176 (XXX We should do better, e.g. wipe out all interpreters and
177 threads.)
178
179 Locking: as above.
180
181*/
182
183void
184Py_Finalize()
185{
186 PyInterpreterState *interp;
187 PyThreadState *tstate;
188
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000189 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000190 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000191 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000192
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000193 call_sys_exitfunc();
194
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000195 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196 tstate = PyThreadState_Get();
197 interp = tstate->interp;
198
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000199 /* Disable signal handling */
200 PyOS_FiniInterrupts();
201
Guido van Rossumc94044c2000-03-10 23:03:54 +0000202 /* Cleanup Unicode implementation */
203 _PyUnicode_Fini();
204
205 /* Cleanup Codec registry */
206 _PyCodecRegistry_Fini();
207
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000208 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000209 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000210
Guido van Rossum1707aad1997-12-08 23:43:45 +0000211 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
212 _PyImport_Fini();
213
214 /* Debugging stuff */
215#ifdef COUNT_ALLOCS
216 dump_counts();
217#endif
218
219#ifdef Py_REF_DEBUG
220 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
221#endif
222
223#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000224 if (
225#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
226 getenv("PYTHONDUMPREFS") &&
227#endif /* MS_WINDOWS */
228 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000229 _Py_PrintReferences(stderr);
230 }
231#endif /* Py_TRACE_REFS */
232
Barry Warsaw035574d1997-08-29 22:07:17 +0000233 /* Now we decref the exception classes. After this point nothing
234 can raise an exception. That's okay, because each Fini() method
235 below has been checked to make sure no exceptions are ever
236 raised.
237 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000238 fini_exceptions();
239
240 /* Delete current thread */
241 PyInterpreterState_Clear(interp);
242 PyThreadState_Swap(NULL);
243 PyInterpreterState_Delete(interp);
244
Guido van Rossumcc283f51997-08-05 02:22:03 +0000245 PyMethod_Fini();
246 PyFrame_Fini();
247 PyCFunction_Fini();
248 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000249 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000250 PyInt_Fini();
251 PyFloat_Fini();
252
253 /* XXX Still allocated:
254 - various static ad-hoc pointers to interned strings
255 - int and float free list blocks
256 - whatever various modules and libraries allocate
257 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000258
259 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000260
261 call_ll_exitfuncs();
262
Guido van Rossumcc283f51997-08-05 02:22:03 +0000263#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000264 _Py_ResetReferences();
265#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266}
267
268/* Create and initialize a new interpreter and thread, and return the
269 new thread. This requires that Py_Initialize() has been called
270 first.
271
272 Unsuccessful initialization yields a NULL pointer. Note that *no*
273 exception information is available even in this case -- the
274 exception information is held in the thread, and there is no
275 thread.
276
277 Locking: as above.
278
279*/
280
281PyThreadState *
282Py_NewInterpreter()
283{
284 PyInterpreterState *interp;
285 PyThreadState *tstate, *save_tstate;
286 PyObject *bimod, *sysmod;
287
288 if (!initialized)
289 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
290
291 interp = PyInterpreterState_New();
292 if (interp == NULL)
293 return NULL;
294
295 tstate = PyThreadState_New(interp);
296 if (tstate == NULL) {
297 PyInterpreterState_Delete(interp);
298 return NULL;
299 }
300
301 save_tstate = PyThreadState_Swap(tstate);
302
303 /* XXX The following is lax in error checking */
304
305 interp->modules = PyDict_New();
306
307 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
308 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000309 interp->builtins = PyModule_GetDict(bimod);
310 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000311 }
312 sysmod = _PyImport_FindExtension("sys", "sys");
313 if (bimod != NULL && sysmod != NULL) {
314 interp->sysdict = PyModule_GetDict(sysmod);
315 Py_INCREF(interp->sysdict);
316 PySys_SetPath(Py_GetPath());
317 PyDict_SetItemString(interp->sysdict, "modules",
318 interp->modules);
319 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000320 if (!Py_NoSiteFlag)
321 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000322 }
323
324 if (!PyErr_Occurred())
325 return tstate;
326
327 /* Oops, it didn't work. Undo it all. */
328
329 PyErr_Print();
330 PyThreadState_Clear(tstate);
331 PyThreadState_Swap(save_tstate);
332 PyThreadState_Delete(tstate);
333 PyInterpreterState_Delete(interp);
334
335 return NULL;
336}
337
338/* Delete an interpreter and its last thread. This requires that the
339 given thread state is current, that the thread has no remaining
340 frames, and that it is its interpreter's only remaining thread.
341 It is a fatal error to violate these constraints.
342
343 (Py_Finalize() doesn't have these constraints -- it zaps
344 everything, regardless.)
345
346 Locking: as above.
347
348*/
349
350void
351Py_EndInterpreter(tstate)
352 PyThreadState *tstate;
353{
354 PyInterpreterState *interp = tstate->interp;
355
356 if (tstate != PyThreadState_Get())
357 Py_FatalError("Py_EndInterpreter: thread is not current");
358 if (tstate->frame != NULL)
359 Py_FatalError("Py_EndInterpreter: thread still has a frame");
360 if (tstate != interp->tstate_head || tstate->next != NULL)
361 Py_FatalError("Py_EndInterpreter: not the last thread");
362
363 PyImport_Cleanup();
364 PyInterpreterState_Clear(interp);
365 PyThreadState_Swap(NULL);
366 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000367}
368
369static char *progname = "python";
370
371void
372Py_SetProgramName(pn)
373 char *pn;
374{
375 if (pn && *pn)
376 progname = pn;
377}
378
379char *
380Py_GetProgramName()
381{
382 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000383}
384
Guido van Rossuma61691e1998-02-06 22:27:24 +0000385static char *default_home = NULL;
386
387void
388Py_SetPythonHome(home)
389 char *home;
390{
391 default_home = home;
392}
393
394char *
395Py_GetPythonHome()
396{
397 char *home = default_home;
398 if (home == NULL)
399 home = getenv("PYTHONHOME");
400 return home;
401}
402
Guido van Rossum6135a871995-01-09 17:53:26 +0000403/* Create __main__ module */
404
405static void
406initmain()
407{
Guido van Rossum82598051997-03-05 00:20:32 +0000408 PyObject *m, *d;
409 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000410 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000411 Py_FatalError("can't create __main__ module");
412 d = PyModule_GetDict(m);
413 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000414 PyObject *bimod = PyImport_ImportModule("__builtin__");
415 if (bimod == NULL ||
416 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000417 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000418 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000419 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000420}
421
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000422/* Import the site module (not into __main__ though) */
423
424static void
425initsite()
426{
427 PyObject *m, *f;
428 m = PyImport_ImportModule("site");
429 if (m == NULL) {
430 f = PySys_GetObject("stderr");
431 if (Py_VerboseFlag) {
432 PyFile_WriteString(
433 "'import site' failed; traceback:\n", f);
434 PyErr_Print();
435 }
436 else {
437 PyFile_WriteString(
438 "'import site' failed; use -v for traceback\n", f);
439 PyErr_Clear();
440 }
441 }
442 else {
443 Py_DECREF(m);
444 }
445}
446
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000447/* Parse input from a file and execute it */
448
449int
Guido van Rossum82598051997-03-05 00:20:32 +0000450PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451 FILE *fp;
452 char *filename;
453{
454 if (filename == NULL)
455 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000456 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000457 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000458 else
Guido van Rossum82598051997-03-05 00:20:32 +0000459 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460}
461
462int
Guido van Rossum82598051997-03-05 00:20:32 +0000463PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 FILE *fp;
465 char *filename;
466{
Guido van Rossum82598051997-03-05 00:20:32 +0000467 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000469 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000471 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
472 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000473 }
Guido van Rossum82598051997-03-05 00:20:32 +0000474 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000476 PySys_SetObject("ps2", v = PyString_FromString("... "));
477 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478 }
479 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000480 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000481#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000482 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000483#endif
484 if (ret == E_EOF)
485 return 0;
486 /*
487 if (ret == E_NOMEM)
488 return -1;
489 */
490 }
491}
492
493int
Guido van Rossum82598051997-03-05 00:20:32 +0000494PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 FILE *fp;
496 char *filename;
497{
Guido van Rossum82598051997-03-05 00:20:32 +0000498 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000501 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000502 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000503 if (v != NULL) {
504 v = PyObject_Str(v);
505 if (v == NULL)
506 PyErr_Clear();
507 else if (PyString_Check(v))
508 ps1 = PyString_AsString(v);
509 }
Guido van Rossum82598051997-03-05 00:20:32 +0000510 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000511 if (w != NULL) {
512 w = PyObject_Str(w);
513 if (w == NULL)
514 PyErr_Clear();
515 else if (PyString_Check(w))
516 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000517 }
Guido van Rossum82598051997-03-05 00:20:32 +0000518 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000519 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000520 Py_XDECREF(v);
521 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000522 if (n == NULL) {
523 if (err.error == E_EOF) {
524 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000525 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000526 return E_EOF;
527 }
528 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000529 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000530 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 }
Guido van Rossum82598051997-03-05 00:20:32 +0000532 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 if (m == NULL)
534 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000535 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000537 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000538 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000539 return -1;
540 }
Guido van Rossum82598051997-03-05 00:20:32 +0000541 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000542 if (Py_FlushLine())
543 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000544 return 0;
545}
546
547int
Guido van Rossum82598051997-03-05 00:20:32 +0000548PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000549 FILE *fp;
550 char *filename;
551{
Guido van Rossum82598051997-03-05 00:20:32 +0000552 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000553 char *ext;
554
Guido van Rossum82598051997-03-05 00:20:32 +0000555 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000556 if (m == NULL)
557 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000558 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000559 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000560 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000561#ifdef macintosh
562 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000563 || getfiletype(filename) == 'PYC '
564 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000565#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000566 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000567 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000568 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000569 if( (fp = fopen(filename, "rb")) == NULL ) {
570 fprintf(stderr, "python: Can't reopen .pyc file\n");
571 return -1;
572 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000573 /* Turn on optimization if a .pyo file is given */
574 if (strcmp(ext, ".pyo") == 0)
575 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000576 v = run_pyc_file(fp, filename, d, d);
577 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000578 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000579 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000580 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000581 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582 return -1;
583 }
Guido van Rossum82598051997-03-05 00:20:32 +0000584 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000585 if (Py_FlushLine())
586 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 return 0;
588}
589
590int
Guido van Rossum82598051997-03-05 00:20:32 +0000591PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592 char *command;
593{
Guido van Rossum82598051997-03-05 00:20:32 +0000594 PyObject *m, *d, *v;
595 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596 if (m == NULL)
597 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000598 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000599 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000600 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000601 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602 return -1;
603 }
Guido van Rossum82598051997-03-05 00:20:32 +0000604 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000605 if (Py_FlushLine())
606 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607 return 0;
608}
609
Barry Warsaw035574d1997-08-29 22:07:17 +0000610static int
611parse_syntax_error(err, message, filename, lineno, offset, text)
612 PyObject* err;
613 PyObject** message;
614 char** filename;
615 int* lineno;
616 int* offset;
617 char** text;
618{
619 long hold;
620 PyObject *v;
621
622 /* old style errors */
623 if (PyTuple_Check(err))
624 return PyArg_Parse(err, "(O(ziiz))", message, filename,
625 lineno, offset, text);
626
627 /* new style errors. `err' is an instance */
628
629 if (! (v = PyObject_GetAttrString(err, "msg")))
630 goto finally;
631 *message = v;
632
633 if (!(v = PyObject_GetAttrString(err, "filename")))
634 goto finally;
635 if (v == Py_None)
636 *filename = NULL;
637 else if (! (*filename = PyString_AsString(v)))
638 goto finally;
639
640 Py_DECREF(v);
641 if (!(v = PyObject_GetAttrString(err, "lineno")))
642 goto finally;
643 hold = PyInt_AsLong(v);
644 Py_DECREF(v);
645 v = NULL;
646 if (hold < 0 && PyErr_Occurred())
647 goto finally;
648 *lineno = (int)hold;
649
650 if (!(v = PyObject_GetAttrString(err, "offset")))
651 goto finally;
652 hold = PyInt_AsLong(v);
653 Py_DECREF(v);
654 v = NULL;
655 if (hold < 0 && PyErr_Occurred())
656 goto finally;
657 *offset = (int)hold;
658
659 if (!(v = PyObject_GetAttrString(err, "text")))
660 goto finally;
661 if (v == Py_None)
662 *text = NULL;
663 else if (! (*text = PyString_AsString(v)))
664 goto finally;
665 Py_DECREF(v);
666 return 1;
667
668finally:
669 Py_XDECREF(v);
670 return 0;
671}
672
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673void
Guido van Rossum82598051997-03-05 00:20:32 +0000674PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000676 PyErr_PrintEx(1);
677}
678
679void
680PyErr_PrintEx(set_sys_last_vars)
681 int set_sys_last_vars;
682{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000683 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000684 PyObject *exception, *v, *tb, *f;
685 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000686 PyErr_NormalizeException(&exception, &v, &tb);
687
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000688 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000689 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000690
Barry Warsaw36b8f941997-08-26 18:09:48 +0000691 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000692 if (Py_FlushLine())
693 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000694 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000695 if (v == NULL || v == Py_None)
696 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000697 if (PyInstance_Check(v)) {
698 /* we expect the error code to be store in the
699 `code' attribute
700 */
701 PyObject *code = PyObject_GetAttrString(v, "code");
702 if (code) {
703 Py_DECREF(v);
704 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000705 if (v == Py_None)
706 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000707 }
708 /* if we failed to dig out the "code" attribute,
709 then just let the else clause below print the
710 error
711 */
712 }
Guido van Rossum82598051997-03-05 00:20:32 +0000713 if (PyInt_Check(v))
714 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000715 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000716 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000717 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000719 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000720 }
721 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000722 if (set_sys_last_vars) {
723 PySys_SetObject("last_type", exception);
724 PySys_SetObject("last_value", v);
725 PySys_SetObject("last_traceback", tb);
726 }
Guido van Rossum82598051997-03-05 00:20:32 +0000727 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000728 if (f == NULL)
729 fprintf(stderr, "lost sys.stderr\n");
730 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000731 if (Py_FlushLine())
732 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000733 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000734 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000735 if (err == 0 &&
736 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
737 {
Guido van Rossum82598051997-03-05 00:20:32 +0000738 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 char *filename, *text;
740 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000741 if (!parse_syntax_error(v, &message, &filename,
742 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000743 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000744 else {
745 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000746 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000748 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749 else
Guido van Rossum82598051997-03-05 00:20:32 +0000750 PyFile_WriteString(filename, f);
751 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000752 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000753 PyFile_WriteString(buf, f);
754 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000755 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000756 char *nl;
757 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000758 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000759 offset--;
760 for (;;) {
761 nl = strchr(text, '\n');
762 if (nl == NULL ||
763 nl-text >= offset)
764 break;
765 offset -= (nl+1-text);
766 text = nl+1;
767 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000768 while (*text == ' ' || *text == '\t') {
769 text++;
770 offset--;
771 }
Guido van Rossum82598051997-03-05 00:20:32 +0000772 PyFile_WriteString(" ", f);
773 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774 if (*text == '\0' ||
775 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000776 PyFile_WriteString("\n", f);
777 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 offset--;
779 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000780 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000781 offset--;
782 }
Guido van Rossum82598051997-03-05 00:20:32 +0000783 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000784 }
Guido van Rossum82598051997-03-05 00:20:32 +0000785 Py_INCREF(message);
786 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000787 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000788 /* Can't be bothered to check all those
789 PyFile_WriteString() calls */
790 if (PyErr_Occurred())
791 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000792 }
793 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000794 if (err) {
795 /* Don't do anything else */
796 }
797 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000798 PyClassObject* exc = (PyClassObject*)exception;
799 PyObject* className = exc->cl_name;
800 PyObject* moduleName =
801 PyDict_GetItemString(exc->cl_dict, "__module__");
802
803 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000804 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000805 else {
806 char* modstr = PyString_AsString(moduleName);
807 if (modstr && strcmp(modstr, "exceptions"))
808 {
809 err = PyFile_WriteString(modstr, f);
810 err += PyFile_WriteString(".", f);
811 }
812 }
813 if (err == 0) {
814 if (className == NULL)
815 err = PyFile_WriteString("<unknown>", f);
816 else
817 err = PyFile_WriteObject(className, f,
818 Py_PRINT_RAW);
819 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000820 }
821 else
822 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
823 if (err == 0) {
824 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000825 PyObject *s = PyObject_Str(v);
826 /* only print colon if the str() of the
827 object is not the empty string
828 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000829 if (s == NULL)
830 err = -1;
831 else if (!PyString_Check(s) ||
832 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000833 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000834 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000835 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
836 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000837 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000838 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000839 if (err == 0)
840 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000841 }
Guido van Rossum82598051997-03-05 00:20:32 +0000842 Py_XDECREF(exception);
843 Py_XDECREF(v);
844 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000845 /* If an error happened here, don't show it.
846 XXX This is wrong, but too many callers rely on this behavior. */
847 if (err != 0)
848 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000849}
850
Guido van Rossum82598051997-03-05 00:20:32 +0000851PyObject *
852PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000853 char *str;
854 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000855 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000856{
Guido van Rossum82598051997-03-05 00:20:32 +0000857 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000858 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859}
860
Guido van Rossum82598051997-03-05 00:20:32 +0000861PyObject *
862PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000863 FILE *fp;
864 char *filename;
865 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000866 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867{
Guido van Rossum82598051997-03-05 00:20:32 +0000868 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000869 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000870}
871
Guido van Rossum82598051997-03-05 00:20:32 +0000872static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000873run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000874 node *n;
875 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000876 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000877{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000878 if (n == NULL)
879 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000880 return run_node(n, filename, globals, locals);
881}
882
Guido van Rossum82598051997-03-05 00:20:32 +0000883static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884run_node(n, filename, globals, locals)
885 node *n;
886 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000887 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000888{
Guido van Rossum82598051997-03-05 00:20:32 +0000889 PyCodeObject *co;
890 PyObject *v;
891 co = PyNode_Compile(n, filename);
892 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000893 if (co == NULL)
894 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000895 v = PyEval_EvalCode(co, globals, locals);
896 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000897 return v;
898}
899
Guido van Rossum82598051997-03-05 00:20:32 +0000900static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000901run_pyc_file(fp, filename, globals, locals)
902 FILE *fp;
903 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000904 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000905{
Guido van Rossum82598051997-03-05 00:20:32 +0000906 PyCodeObject *co;
907 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000908 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000909 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000910
Guido van Rossum82598051997-03-05 00:20:32 +0000911 magic = PyMarshal_ReadLongFromFile(fp);
912 if (magic != PyImport_GetMagicNumber()) {
913 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000914 "Bad magic number in .pyc file");
915 return NULL;
916 }
Guido van Rossum82598051997-03-05 00:20:32 +0000917 (void) PyMarshal_ReadLongFromFile(fp);
918 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000919 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000920 if (v == NULL || !PyCode_Check(v)) {
921 Py_XDECREF(v);
922 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000923 "Bad code object in .pyc file");
924 return NULL;
925 }
Guido van Rossum82598051997-03-05 00:20:32 +0000926 co = (PyCodeObject *)v;
927 v = PyEval_EvalCode(co, globals, locals);
928 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000929 return v;
930}
931
Guido van Rossum82598051997-03-05 00:20:32 +0000932PyObject *
933Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000934 char *str;
935 char *filename;
936 int start;
937{
938 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000939 PyCodeObject *co;
940 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000941 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000942 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000943 co = PyNode_Compile(n, filename);
944 PyNode_Free(n);
945 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000946}
947
Guido van Rossuma110aa61994-08-29 12:50:44 +0000948/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000949
Guido van Rossuma110aa61994-08-29 12:50:44 +0000950node *
Guido van Rossum82598051997-03-05 00:20:32 +0000951PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000952 FILE *fp;
953 char *filename;
954 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000955{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000956 node *n;
957 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000958 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000959 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000960 if (n == NULL)
961 err_input(&err);
962 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000963}
964
Guido van Rossuma110aa61994-08-29 12:50:44 +0000965/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000966
Guido van Rossuma110aa61994-08-29 12:50:44 +0000967node *
Guido van Rossum82598051997-03-05 00:20:32 +0000968PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000969 char *str;
970 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000971{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000972 node *n;
973 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000974 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000975 if (n == NULL)
976 err_input(&err);
977 return n;
978}
979
980/* Set the error appropriate to the given input error code (see errcode.h) */
981
982static void
983err_input(err)
984 perrdetail *err;
985{
Guido van Rossum82598051997-03-05 00:20:32 +0000986 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000987 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000988 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000989 err->lineno, err->offset, err->text);
990 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000991 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000992 err->text = NULL;
993 }
994 switch (err->error) {
995 case E_SYNTAX:
996 msg = "invalid syntax";
997 break;
998 case E_TOKEN:
999 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001000 break;
1001 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001002 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001003 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001004 return;
1005 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001006 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001007 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001008 return;
1009 case E_EOF:
1010 msg = "unexpected EOF while parsing";
1011 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001012 case E_INDENT:
1013 msg = "inconsistent use of tabs and spaces in indentation";
1014 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001015 case E_OVERFLOW:
1016 msg = "expression too long";
1017 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001018 default:
1019 fprintf(stderr, "error=%d\n", err->error);
1020 msg = "unknown parsing error";
1021 break;
1022 }
Guido van Rossum82598051997-03-05 00:20:32 +00001023 w = Py_BuildValue("(sO)", msg, v);
1024 Py_XDECREF(v);
1025 PyErr_SetObject(PyExc_SyntaxError, w);
1026 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001027}
1028
1029/* Print fatal error message and abort */
1030
1031void
Guido van Rossum82598051997-03-05 00:20:32 +00001032Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001033 char *msg;
1034{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001035 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001036#ifdef macintosh
1037 for (;;);
1038#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001039#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001040 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001041 OutputDebugString(msg);
1042 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001043#ifdef _DEBUG
1044 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001045#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001046#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001047 abort();
1048}
1049
1050/* Clean up and exit */
1051
Guido van Rossuma110aa61994-08-29 12:50:44 +00001052#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001053#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001054int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001055#endif
1056
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001057#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001058static void (*exitfuncs[NEXITFUNCS])();
1059static int nexitfuncs = 0;
1060
1061int Py_AtExit(func)
Tim Petersdbd9ba62000-07-09 03:09:57 +00001062 void (*func)(void);
Guido van Rossum1662dd51994-09-07 14:38:28 +00001063{
1064 if (nexitfuncs >= NEXITFUNCS)
1065 return -1;
1066 exitfuncs[nexitfuncs++] = func;
1067 return 0;
1068}
1069
Guido van Rossumcc283f51997-08-05 02:22:03 +00001070static void
1071call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001072{
Guido van Rossum82598051997-03-05 00:20:32 +00001073 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001074
1075 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001076 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001077 Py_INCREF(exitfunc);
1078 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001079 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001080 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001081 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001082 if (f)
1083 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001084 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001085 }
Guido van Rossum82598051997-03-05 00:20:32 +00001086 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001087 }
1088
Guido van Rossum0829c751998-02-28 04:31:39 +00001089 if (Py_FlushLine())
1090 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001091}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001092
Guido van Rossumcc283f51997-08-05 02:22:03 +00001093static void
1094call_ll_exitfuncs()
1095{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001096 while (nexitfuncs > 0)
1097 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001098
1099 fflush(stdout);
1100 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001101}
1102
1103void
Guido van Rossum82598051997-03-05 00:20:32 +00001104Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001105 int sts;
1106{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001107 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001108
Jack Jansen66a89771995-10-27 13:22:14 +00001109#ifdef macintosh
1110 PyMac_Exit(sts);
1111#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001112 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001113#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001114}
1115
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001116static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001117initsigs()
1118{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001119#ifdef HAVE_SIGNAL_H
1120#ifdef SIGPIPE
1121 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001122#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001123#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001124 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001125}
1126
Guido van Rossumaae0d321996-05-22 16:35:33 +00001127#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001128/* Ask a yes/no question */
1129
Guido van Rossum59bff391992-09-03 20:28:00 +00001130int
Guido van Rossum82598051997-03-05 00:20:32 +00001131_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001132 char *prompt;
1133{
1134 char buf[256];
1135
1136 printf("%s [ny] ", prompt);
1137 if (fgets(buf, sizeof buf, stdin) == NULL)
1138 return 0;
1139 return buf[0] == 'y' || buf[0] == 'Y';
1140}
1141#endif
1142
Guido van Rossuma110aa61994-08-29 12:50:44 +00001143#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001144
1145/* Check for file descriptor connected to interactive device.
1146 Pretend that stdin is always interactive, other files never. */
1147
1148int
1149isatty(fd)
1150 int fd;
1151{
1152 return fd == fileno(stdin);
1153}
1154
1155#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001156
1157/*
1158 * The file descriptor fd is considered ``interactive'' if either
1159 * a) isatty(fd) is TRUE, or
1160 * b) the -i flag was given, and the filename associated with
1161 * the descriptor is NULL or "<stdin>" or "???".
1162 */
1163int
1164Py_FdIsInteractive(fp, filename)
1165 FILE *fp;
1166 char *filename;
1167{
1168 if (isatty((int)fileno(fp)))
1169 return 1;
1170 if (!Py_InteractiveFlag)
1171 return 0;
1172 return (filename == NULL) ||
1173 (strcmp(filename, "<stdin>") == 0) ||
1174 (strcmp(filename, "???") == 0);
1175}