blob: 9c9897d46a9bb2fa3984f6db247e8bec9b912d05 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000014
15******************************************************************/
16
17/* Python interpreter top-level routines, including init/exit */
18
Guido van Rossum82598051997-03-05 00:20:32 +000019#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000020
21#include "grammar.h"
22#include "node.h"
23#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000024#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000025#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000026#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000027#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000028
Guido van Rossum80bb9651996-12-05 23:27:02 +000029#ifdef HAVE_UNISTD_H
30#include <unistd.h>
31#endif
32
Guido van Rossuma110aa61994-08-29 12:50:44 +000033#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000034#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000035#endif
36
Guido van Rossum9b38a141996-09-11 23:12:24 +000037#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000038#undef BYTE
39#include "windows.h"
40#endif
41
Guido van Rossum82598051997-03-05 00:20:32 +000042extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossum82598051997-03-05 00:20:32 +000044extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000045
Guido van Rossumb73cc041993-11-01 16:28:59 +000046/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000047static void initmain Py_PROTO((void));
Guido van Rossumdcc0c131997-08-29 22:32:42 +000048static void initsite Py_PROTO((void));
Guido van Rossum82598051997-03-05 00:20:32 +000049static PyObject *run_err_node Py_PROTO((node *n, char *filename,
50 PyObject *globals, PyObject *locals));
51static PyObject *run_node Py_PROTO((node *n, char *filename,
52 PyObject *globals, PyObject *locals));
53static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
54 PyObject *globals, PyObject *locals));
55static void err_input Py_PROTO((perrdetail *));
56static void initsigs Py_PROTO((void));
Guido van Rossumcc283f51997-08-05 02:22:03 +000057static void call_sys_exitfunc Py_PROTO((void));
58static void call_ll_exitfuncs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000059
Guido van Rossumbffd6832000-01-20 22:32:56 +000060#ifdef Py_TRACE_REFS
61int _Py_AskYesNo(char *prompt);
62#endif
63
Guido van Rossumc94044c2000-03-10 23:03:54 +000064extern void _PyUnicode_Init();
65extern void _PyUnicode_Fini();
66extern void _PyCodecRegistry_Init();
67extern void _PyCodecRegistry_Fini();
68
69
Guido van Rossum82598051997-03-05 00:20:32 +000070int Py_DebugFlag; /* Needed by parser.c */
71int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000072int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000073int Py_NoSiteFlag; /* Suppress 'import site' */
Barry Warsaw3ce09642000-05-02 19:18:59 +000074int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
Guido van Rossuma61691e1998-02-06 22:27:24 +000075int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossumb16d1972000-05-01 17:55:15 +000076int Py_UnicodeFlag = 0; /* Needed by compile.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000077
Guido van Rossum25ce5661997-08-02 03:10:38 +000078static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000080/* API to access the initialized flag -- useful for eroteric use */
81
82int
83Py_IsInitialized()
84{
85 return initialized;
86}
87
Guido van Rossum25ce5661997-08-02 03:10:38 +000088/* Global initializations. Can be undone by Py_Finalize(). Don't
89 call this twice without an intervening Py_Finalize() call. When
90 initializations fail, a fatal error is issued and the function does
91 not return. On return, the first thread and interpreter state have
92 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093
Guido van Rossum25ce5661997-08-02 03:10:38 +000094 Locking: you must hold the interpreter lock while calling this.
95 (If the lock has not yet been initialized, that's equivalent to
96 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000097
Guido van Rossum25ce5661997-08-02 03:10:38 +000098*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000099
100void
101Py_Initialize()
102{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000103 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000104 PyThreadState *tstate;
105 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000106 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000107
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000108 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000109 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000110 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
113 Py_DebugFlag = 1;
114 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
115 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000116 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
117 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000118
Guido van Rossuma027efa1997-05-05 20:56:21 +0000119 interp = PyInterpreterState_New();
120 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000122
Guido van Rossuma027efa1997-05-05 20:56:21 +0000123 tstate = PyThreadState_New(interp);
124 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 (void) PyThreadState_Swap(tstate);
127
Guido van Rossum25ce5661997-08-02 03:10:38 +0000128 interp->modules = PyDict_New();
129 if (interp->modules == NULL)
130 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000131
Guido van Rossumc94044c2000-03-10 23:03:54 +0000132 /* Init codec registry */
133 _PyCodecRegistry_Init();
134
135 /* Init Unicode implementation; relies on the codec registry */
136 _PyUnicode_Init();
137
Jeremy Hylton4a3dd2d2000-04-14 19:13:24 +0000138 _PyCompareState_Key = PyString_InternFromString("cmp_state");
139
Barry Warsawf242aa02000-05-25 23:09:49 +0000140 bimod = _PyBuiltin_Init();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000141 if (bimod == NULL)
142 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000143 interp->builtins = PyModule_GetDict(bimod);
144 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145
146 sysmod = _PySys_Init();
147 if (sysmod == NULL)
148 Py_FatalError("Py_Initialize: can't initialize sys");
149 interp->sysdict = PyModule_GetDict(sysmod);
150 Py_INCREF(interp->sysdict);
151 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000152 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000153 PyDict_SetItemString(interp->sysdict, "modules",
154 interp->modules);
155
Guido van Rossum7c85ab81999-07-08 17:26:56 +0000156 _PyImport_Init();
157
Barry Warsawf242aa02000-05-25 23:09:49 +0000158 /* initialize builtin exceptions */
159 init_exceptions();
160
Barry Warsaw035574d1997-08-29 22:07:17 +0000161 /* phase 2 of builtins */
Barry Warsaw963b8711997-09-18 16:42:02 +0000162 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000163
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164 initsigs(); /* Signal handling stuff, including initintr() */
165
166 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000167 if (!Py_NoSiteFlag)
168 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000169}
170
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000171#ifdef COUNT_ALLOCS
172extern void dump_counts Py_PROTO((void));
173#endif
174
Guido van Rossum25ce5661997-08-02 03:10:38 +0000175/* Undo the effect of Py_Initialize().
176
177 Beware: if multiple interpreter and/or thread states exist, these
178 are not wiped out; only the current thread and interpreter state
179 are deleted. But since everything else is deleted, those other
180 interpreter and thread states should no longer be used.
181
182 (XXX We should do better, e.g. wipe out all interpreters and
183 threads.)
184
185 Locking: as above.
186
187*/
188
189void
190Py_Finalize()
191{
192 PyInterpreterState *interp;
193 PyThreadState *tstate;
194
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000195 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000196 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000197 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000198
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000199 call_sys_exitfunc();
200
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000201 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 tstate = PyThreadState_Get();
203 interp = tstate->interp;
204
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000205 /* Disable signal handling */
206 PyOS_FiniInterrupts();
207
Guido van Rossumc94044c2000-03-10 23:03:54 +0000208 /* Cleanup Unicode implementation */
209 _PyUnicode_Fini();
210
211 /* Cleanup Codec registry */
212 _PyCodecRegistry_Fini();
213
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000214 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000215 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000216
Guido van Rossum1707aad1997-12-08 23:43:45 +0000217 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
218 _PyImport_Fini();
219
220 /* Debugging stuff */
221#ifdef COUNT_ALLOCS
222 dump_counts();
223#endif
224
225#ifdef Py_REF_DEBUG
226 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
227#endif
228
229#ifdef Py_TRACE_REFS
Guido van Rossumeca47842000-04-27 23:44:15 +0000230 if (
231#ifdef MS_WINDOWS /* Only ask on Windows if env var set */
232 getenv("PYTHONDUMPREFS") &&
233#endif /* MS_WINDOWS */
234 _Py_AskYesNo("Print left references?")) {
Guido van Rossum1707aad1997-12-08 23:43:45 +0000235 _Py_PrintReferences(stderr);
236 }
237#endif /* Py_TRACE_REFS */
238
Barry Warsaw035574d1997-08-29 22:07:17 +0000239 /* Now we decref the exception classes. After this point nothing
240 can raise an exception. That's okay, because each Fini() method
241 below has been checked to make sure no exceptions are ever
242 raised.
243 */
Barry Warsawf242aa02000-05-25 23:09:49 +0000244 fini_exceptions();
245
246 /* Delete current thread */
247 PyInterpreterState_Clear(interp);
248 PyThreadState_Swap(NULL);
249 PyInterpreterState_Delete(interp);
250
Guido van Rossumcc283f51997-08-05 02:22:03 +0000251 PyMethod_Fini();
252 PyFrame_Fini();
253 PyCFunction_Fini();
254 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000255 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000256 PyInt_Fini();
257 PyFloat_Fini();
258
259 /* XXX Still allocated:
260 - various static ad-hoc pointers to interned strings
261 - int and float free list blocks
262 - whatever various modules and libraries allocate
263 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264
265 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000266
267 call_ll_exitfuncs();
268
Guido van Rossumcc283f51997-08-05 02:22:03 +0000269#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000270 _Py_ResetReferences();
271#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272}
273
274/* Create and initialize a new interpreter and thread, and return the
275 new thread. This requires that Py_Initialize() has been called
276 first.
277
278 Unsuccessful initialization yields a NULL pointer. Note that *no*
279 exception information is available even in this case -- the
280 exception information is held in the thread, and there is no
281 thread.
282
283 Locking: as above.
284
285*/
286
287PyThreadState *
288Py_NewInterpreter()
289{
290 PyInterpreterState *interp;
291 PyThreadState *tstate, *save_tstate;
292 PyObject *bimod, *sysmod;
293
294 if (!initialized)
295 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
296
297 interp = PyInterpreterState_New();
298 if (interp == NULL)
299 return NULL;
300
301 tstate = PyThreadState_New(interp);
302 if (tstate == NULL) {
303 PyInterpreterState_Delete(interp);
304 return NULL;
305 }
306
307 save_tstate = PyThreadState_Swap(tstate);
308
309 /* XXX The following is lax in error checking */
310
311 interp->modules = PyDict_New();
312
313 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
314 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000315 interp->builtins = PyModule_GetDict(bimod);
316 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000317 }
318 sysmod = _PyImport_FindExtension("sys", "sys");
319 if (bimod != NULL && sysmod != NULL) {
320 interp->sysdict = PyModule_GetDict(sysmod);
321 Py_INCREF(interp->sysdict);
322 PySys_SetPath(Py_GetPath());
323 PyDict_SetItemString(interp->sysdict, "modules",
324 interp->modules);
325 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000326 if (!Py_NoSiteFlag)
327 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000328 }
329
330 if (!PyErr_Occurred())
331 return tstate;
332
333 /* Oops, it didn't work. Undo it all. */
334
335 PyErr_Print();
336 PyThreadState_Clear(tstate);
337 PyThreadState_Swap(save_tstate);
338 PyThreadState_Delete(tstate);
339 PyInterpreterState_Delete(interp);
340
341 return NULL;
342}
343
344/* Delete an interpreter and its last thread. This requires that the
345 given thread state is current, that the thread has no remaining
346 frames, and that it is its interpreter's only remaining thread.
347 It is a fatal error to violate these constraints.
348
349 (Py_Finalize() doesn't have these constraints -- it zaps
350 everything, regardless.)
351
352 Locking: as above.
353
354*/
355
356void
357Py_EndInterpreter(tstate)
358 PyThreadState *tstate;
359{
360 PyInterpreterState *interp = tstate->interp;
361
362 if (tstate != PyThreadState_Get())
363 Py_FatalError("Py_EndInterpreter: thread is not current");
364 if (tstate->frame != NULL)
365 Py_FatalError("Py_EndInterpreter: thread still has a frame");
366 if (tstate != interp->tstate_head || tstate->next != NULL)
367 Py_FatalError("Py_EndInterpreter: not the last thread");
368
369 PyImport_Cleanup();
370 PyInterpreterState_Clear(interp);
371 PyThreadState_Swap(NULL);
372 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000373}
374
375static char *progname = "python";
376
377void
378Py_SetProgramName(pn)
379 char *pn;
380{
381 if (pn && *pn)
382 progname = pn;
383}
384
385char *
386Py_GetProgramName()
387{
388 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389}
390
Guido van Rossuma61691e1998-02-06 22:27:24 +0000391static char *default_home = NULL;
392
393void
394Py_SetPythonHome(home)
395 char *home;
396{
397 default_home = home;
398}
399
400char *
401Py_GetPythonHome()
402{
403 char *home = default_home;
404 if (home == NULL)
405 home = getenv("PYTHONHOME");
406 return home;
407}
408
Guido van Rossum6135a871995-01-09 17:53:26 +0000409/* Create __main__ module */
410
411static void
412initmain()
413{
Guido van Rossum82598051997-03-05 00:20:32 +0000414 PyObject *m, *d;
415 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000416 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000417 Py_FatalError("can't create __main__ module");
418 d = PyModule_GetDict(m);
419 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000420 PyObject *bimod = PyImport_ImportModule("__builtin__");
421 if (bimod == NULL ||
422 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000423 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000424 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000425 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426}
427
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000428/* Import the site module (not into __main__ though) */
429
430static void
431initsite()
432{
433 PyObject *m, *f;
434 m = PyImport_ImportModule("site");
435 if (m == NULL) {
436 f = PySys_GetObject("stderr");
437 if (Py_VerboseFlag) {
438 PyFile_WriteString(
439 "'import site' failed; traceback:\n", f);
440 PyErr_Print();
441 }
442 else {
443 PyFile_WriteString(
444 "'import site' failed; use -v for traceback\n", f);
445 PyErr_Clear();
446 }
447 }
448 else {
449 Py_DECREF(m);
450 }
451}
452
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453/* Parse input from a file and execute it */
454
455int
Guido van Rossum82598051997-03-05 00:20:32 +0000456PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457 FILE *fp;
458 char *filename;
459{
460 if (filename == NULL)
461 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000462 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000463 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 else
Guido van Rossum82598051997-03-05 00:20:32 +0000465 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000466}
467
468int
Guido van Rossum82598051997-03-05 00:20:32 +0000469PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470 FILE *fp;
471 char *filename;
472{
Guido van Rossum82598051997-03-05 00:20:32 +0000473 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000475 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000476 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000477 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
478 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000479 }
Guido van Rossum82598051997-03-05 00:20:32 +0000480 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000482 PySys_SetObject("ps2", v = PyString_FromString("... "));
483 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000484 }
485 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000486 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000487#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000488 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000489#endif
490 if (ret == E_EOF)
491 return 0;
492 /*
493 if (ret == E_NOMEM)
494 return -1;
495 */
496 }
497}
498
499int
Guido van Rossum82598051997-03-05 00:20:32 +0000500PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501 FILE *fp;
502 char *filename;
503{
Guido van Rossum82598051997-03-05 00:20:32 +0000504 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000505 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000506 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000507 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000508 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000509 if (v != NULL) {
510 v = PyObject_Str(v);
511 if (v == NULL)
512 PyErr_Clear();
513 else if (PyString_Check(v))
514 ps1 = PyString_AsString(v);
515 }
Guido van Rossum82598051997-03-05 00:20:32 +0000516 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000517 if (w != NULL) {
518 w = PyObject_Str(w);
519 if (w == NULL)
520 PyErr_Clear();
521 else if (PyString_Check(w))
522 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000523 }
Guido van Rossum82598051997-03-05 00:20:32 +0000524 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000525 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000526 Py_XDECREF(v);
527 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000528 if (n == NULL) {
529 if (err.error == E_EOF) {
530 if (err.text)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000531 PyMem_DEL(err.text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000532 return E_EOF;
533 }
534 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000535 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000536 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000537 }
Guido van Rossum82598051997-03-05 00:20:32 +0000538 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000539 if (m == NULL)
540 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000541 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000542 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000544 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545 return -1;
546 }
Guido van Rossum82598051997-03-05 00:20:32 +0000547 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000548 if (Py_FlushLine())
549 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000550 return 0;
551}
552
553int
Guido van Rossum82598051997-03-05 00:20:32 +0000554PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000555 FILE *fp;
556 char *filename;
557{
Guido van Rossum82598051997-03-05 00:20:32 +0000558 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000559 char *ext;
560
Guido van Rossum82598051997-03-05 00:20:32 +0000561 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000562 if (m == NULL)
563 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000564 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000565 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000566 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000567#ifdef macintosh
568 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000569 || getfiletype(filename) == 'PYC '
570 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000571#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000572 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000573 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000574 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000575 if( (fp = fopen(filename, "rb")) == NULL ) {
576 fprintf(stderr, "python: Can't reopen .pyc file\n");
577 return -1;
578 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000579 /* Turn on optimization if a .pyo file is given */
580 if (strcmp(ext, ".pyo") == 0)
581 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000582 v = run_pyc_file(fp, filename, d, d);
583 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000584 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000585 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000587 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588 return -1;
589 }
Guido van Rossum82598051997-03-05 00:20:32 +0000590 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000591 if (Py_FlushLine())
592 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000593 return 0;
594}
595
596int
Guido van Rossum82598051997-03-05 00:20:32 +0000597PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000598 char *command;
599{
Guido van Rossum82598051997-03-05 00:20:32 +0000600 PyObject *m, *d, *v;
601 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602 if (m == NULL)
603 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000604 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000605 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000606 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000607 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000608 return -1;
609 }
Guido van Rossum82598051997-03-05 00:20:32 +0000610 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000611 if (Py_FlushLine())
612 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000613 return 0;
614}
615
Barry Warsaw035574d1997-08-29 22:07:17 +0000616static int
617parse_syntax_error(err, message, filename, lineno, offset, text)
618 PyObject* err;
619 PyObject** message;
620 char** filename;
621 int* lineno;
622 int* offset;
623 char** text;
624{
625 long hold;
626 PyObject *v;
627
628 /* old style errors */
629 if (PyTuple_Check(err))
630 return PyArg_Parse(err, "(O(ziiz))", message, filename,
631 lineno, offset, text);
632
633 /* new style errors. `err' is an instance */
634
635 if (! (v = PyObject_GetAttrString(err, "msg")))
636 goto finally;
637 *message = v;
638
639 if (!(v = PyObject_GetAttrString(err, "filename")))
640 goto finally;
641 if (v == Py_None)
642 *filename = NULL;
643 else if (! (*filename = PyString_AsString(v)))
644 goto finally;
645
646 Py_DECREF(v);
647 if (!(v = PyObject_GetAttrString(err, "lineno")))
648 goto finally;
649 hold = PyInt_AsLong(v);
650 Py_DECREF(v);
651 v = NULL;
652 if (hold < 0 && PyErr_Occurred())
653 goto finally;
654 *lineno = (int)hold;
655
656 if (!(v = PyObject_GetAttrString(err, "offset")))
657 goto finally;
658 hold = PyInt_AsLong(v);
659 Py_DECREF(v);
660 v = NULL;
661 if (hold < 0 && PyErr_Occurred())
662 goto finally;
663 *offset = (int)hold;
664
665 if (!(v = PyObject_GetAttrString(err, "text")))
666 goto finally;
667 if (v == Py_None)
668 *text = NULL;
669 else if (! (*text = PyString_AsString(v)))
670 goto finally;
671 Py_DECREF(v);
672 return 1;
673
674finally:
675 Py_XDECREF(v);
676 return 0;
677}
678
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000679void
Guido van Rossum82598051997-03-05 00:20:32 +0000680PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000682 PyErr_PrintEx(1);
683}
684
685void
686PyErr_PrintEx(set_sys_last_vars)
687 int set_sys_last_vars;
688{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000689 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000690 PyObject *exception, *v, *tb, *f;
691 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000692 PyErr_NormalizeException(&exception, &v, &tb);
693
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000694 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000695 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000696
Barry Warsaw36b8f941997-08-26 18:09:48 +0000697 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000698 if (Py_FlushLine())
699 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000700 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000701 if (v == NULL || v == Py_None)
702 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000703 if (PyInstance_Check(v)) {
704 /* we expect the error code to be store in the
705 `code' attribute
706 */
707 PyObject *code = PyObject_GetAttrString(v, "code");
708 if (code) {
709 Py_DECREF(v);
710 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000711 if (v == Py_None)
712 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000713 }
714 /* if we failed to dig out the "code" attribute,
715 then just let the else clause below print the
716 error
717 */
718 }
Guido van Rossum82598051997-03-05 00:20:32 +0000719 if (PyInt_Check(v))
720 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000721 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000722 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000723 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000725 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000726 }
727 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000728 if (set_sys_last_vars) {
729 PySys_SetObject("last_type", exception);
730 PySys_SetObject("last_value", v);
731 PySys_SetObject("last_traceback", tb);
732 }
Guido van Rossum82598051997-03-05 00:20:32 +0000733 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000734 if (f == NULL)
735 fprintf(stderr, "lost sys.stderr\n");
736 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000737 if (Py_FlushLine())
738 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000739 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000740 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000741 if (err == 0 &&
742 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
743 {
Guido van Rossum82598051997-03-05 00:20:32 +0000744 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000745 char *filename, *text;
746 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000747 if (!parse_syntax_error(v, &message, &filename,
748 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000749 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000750 else {
751 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000752 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000753 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000754 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000755 else
Guido van Rossum82598051997-03-05 00:20:32 +0000756 PyFile_WriteString(filename, f);
757 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000758 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000759 PyFile_WriteString(buf, f);
760 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000761 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000762 char *nl;
763 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000764 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000765 offset--;
766 for (;;) {
767 nl = strchr(text, '\n');
768 if (nl == NULL ||
769 nl-text >= offset)
770 break;
771 offset -= (nl+1-text);
772 text = nl+1;
773 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774 while (*text == ' ' || *text == '\t') {
775 text++;
776 offset--;
777 }
Guido van Rossum82598051997-03-05 00:20:32 +0000778 PyFile_WriteString(" ", f);
779 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000780 if (*text == '\0' ||
781 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000782 PyFile_WriteString("\n", f);
783 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000784 offset--;
785 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000786 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000787 offset--;
788 }
Guido van Rossum82598051997-03-05 00:20:32 +0000789 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000790 }
Guido van Rossum82598051997-03-05 00:20:32 +0000791 Py_INCREF(message);
792 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000793 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000794 /* Can't be bothered to check all those
795 PyFile_WriteString() calls */
796 if (PyErr_Occurred())
797 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000798 }
799 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000800 if (err) {
801 /* Don't do anything else */
802 }
803 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000804 PyClassObject* exc = (PyClassObject*)exception;
805 PyObject* className = exc->cl_name;
806 PyObject* moduleName =
807 PyDict_GetItemString(exc->cl_dict, "__module__");
808
809 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000810 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000811 else {
812 char* modstr = PyString_AsString(moduleName);
813 if (modstr && strcmp(modstr, "exceptions"))
814 {
815 err = PyFile_WriteString(modstr, f);
816 err += PyFile_WriteString(".", f);
817 }
818 }
819 if (err == 0) {
820 if (className == NULL)
821 err = PyFile_WriteString("<unknown>", f);
822 else
823 err = PyFile_WriteObject(className, f,
824 Py_PRINT_RAW);
825 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000826 }
827 else
828 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
829 if (err == 0) {
830 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000831 PyObject *s = PyObject_Str(v);
832 /* only print colon if the str() of the
833 object is not the empty string
834 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000835 if (s == NULL)
836 err = -1;
837 else if (!PyString_Check(s) ||
838 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000839 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000840 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000841 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
842 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000843 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000844 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000845 if (err == 0)
846 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000847 }
Guido van Rossum82598051997-03-05 00:20:32 +0000848 Py_XDECREF(exception);
849 Py_XDECREF(v);
850 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000851 /* If an error happened here, don't show it.
852 XXX This is wrong, but too many callers rely on this behavior. */
853 if (err != 0)
854 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855}
856
Guido van Rossum82598051997-03-05 00:20:32 +0000857PyObject *
858PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 char *str;
860 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000861 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000862{
Guido van Rossum82598051997-03-05 00:20:32 +0000863 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000864 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000865}
866
Guido van Rossum82598051997-03-05 00:20:32 +0000867PyObject *
868PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000869 FILE *fp;
870 char *filename;
871 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000872 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873{
Guido van Rossum82598051997-03-05 00:20:32 +0000874 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000875 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000876}
877
Guido van Rossum82598051997-03-05 00:20:32 +0000878static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000879run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000880 node *n;
881 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000882 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000884 if (n == NULL)
885 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000886 return run_node(n, filename, globals, locals);
887}
888
Guido van Rossum82598051997-03-05 00:20:32 +0000889static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000890run_node(n, filename, globals, locals)
891 node *n;
892 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000893 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000894{
Guido van Rossum82598051997-03-05 00:20:32 +0000895 PyCodeObject *co;
896 PyObject *v;
897 co = PyNode_Compile(n, filename);
898 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000899 if (co == NULL)
900 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000901 v = PyEval_EvalCode(co, globals, locals);
902 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000903 return v;
904}
905
Guido van Rossum82598051997-03-05 00:20:32 +0000906static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000907run_pyc_file(fp, filename, globals, locals)
908 FILE *fp;
909 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000910 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000911{
Guido van Rossum82598051997-03-05 00:20:32 +0000912 PyCodeObject *co;
913 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000914 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000915 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000916
Guido van Rossum82598051997-03-05 00:20:32 +0000917 magic = PyMarshal_ReadLongFromFile(fp);
918 if (magic != PyImport_GetMagicNumber()) {
919 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000920 "Bad magic number in .pyc file");
921 return NULL;
922 }
Guido van Rossum82598051997-03-05 00:20:32 +0000923 (void) PyMarshal_ReadLongFromFile(fp);
924 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000925 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000926 if (v == NULL || !PyCode_Check(v)) {
927 Py_XDECREF(v);
928 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000929 "Bad code object in .pyc file");
930 return NULL;
931 }
Guido van Rossum82598051997-03-05 00:20:32 +0000932 co = (PyCodeObject *)v;
933 v = PyEval_EvalCode(co, globals, locals);
934 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000935 return v;
936}
937
Guido van Rossum82598051997-03-05 00:20:32 +0000938PyObject *
939Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000940 char *str;
941 char *filename;
942 int start;
943{
944 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000945 PyCodeObject *co;
946 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000947 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000948 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000949 co = PyNode_Compile(n, filename);
950 PyNode_Free(n);
951 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000952}
953
Guido van Rossuma110aa61994-08-29 12:50:44 +0000954/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000955
Guido van Rossuma110aa61994-08-29 12:50:44 +0000956node *
Guido van Rossum82598051997-03-05 00:20:32 +0000957PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958 FILE *fp;
959 char *filename;
960 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000961{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000962 node *n;
963 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000964 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000965 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000966 if (n == NULL)
967 err_input(&err);
968 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000969}
970
Guido van Rossuma110aa61994-08-29 12:50:44 +0000971/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000972
Guido van Rossuma110aa61994-08-29 12:50:44 +0000973node *
Guido van Rossum82598051997-03-05 00:20:32 +0000974PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000975 char *str;
976 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000977{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000978 node *n;
979 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000980 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000981 if (n == NULL)
982 err_input(&err);
983 return n;
984}
985
986/* Set the error appropriate to the given input error code (see errcode.h) */
987
988static void
989err_input(err)
990 perrdetail *err;
991{
Guido van Rossum82598051997-03-05 00:20:32 +0000992 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000993 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000994 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000995 err->lineno, err->offset, err->text);
996 if (err->text != NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000997 PyMem_DEL(err->text);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000998 err->text = NULL;
999 }
1000 switch (err->error) {
1001 case E_SYNTAX:
1002 msg = "invalid syntax";
1003 break;
1004 case E_TOKEN:
1005 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +00001006 break;
1007 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +00001008 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +00001009 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001010 return;
1011 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001012 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001013 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001014 return;
1015 case E_EOF:
1016 msg = "unexpected EOF while parsing";
1017 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001018 case E_INDENT:
1019 msg = "inconsistent use of tabs and spaces in indentation";
1020 break;
Jeremy Hylton94988062000-06-20 19:10:44 +00001021 case E_OVERFLOW:
1022 msg = "expression too long";
1023 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001024 default:
1025 fprintf(stderr, "error=%d\n", err->error);
1026 msg = "unknown parsing error";
1027 break;
1028 }
Guido van Rossum82598051997-03-05 00:20:32 +00001029 w = Py_BuildValue("(sO)", msg, v);
1030 Py_XDECREF(v);
1031 PyErr_SetObject(PyExc_SyntaxError, w);
1032 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001033}
1034
1035/* Print fatal error message and abort */
1036
1037void
Guido van Rossum82598051997-03-05 00:20:32 +00001038Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001039 char *msg;
1040{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001041 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001042#ifdef macintosh
1043 for (;;);
1044#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001045#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001046 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001047 OutputDebugString(msg);
1048 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001049#ifdef _DEBUG
1050 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001051#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001052#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001053 abort();
1054}
1055
1056/* Clean up and exit */
1057
Guido van Rossuma110aa61994-08-29 12:50:44 +00001058#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001059#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001060int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001061#endif
1062
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001063#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001064static void (*exitfuncs[NEXITFUNCS])();
1065static int nexitfuncs = 0;
1066
1067int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001068 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001069{
1070 if (nexitfuncs >= NEXITFUNCS)
1071 return -1;
1072 exitfuncs[nexitfuncs++] = func;
1073 return 0;
1074}
1075
Guido van Rossumcc283f51997-08-05 02:22:03 +00001076static void
1077call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001078{
Guido van Rossum82598051997-03-05 00:20:32 +00001079 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001080
1081 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001082 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001083 Py_INCREF(exitfunc);
1084 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001085 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001086 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001087 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001088 if (f)
1089 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001090 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001091 }
Guido van Rossum82598051997-03-05 00:20:32 +00001092 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001093 }
1094
Guido van Rossum0829c751998-02-28 04:31:39 +00001095 if (Py_FlushLine())
1096 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001097}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001098
Guido van Rossumcc283f51997-08-05 02:22:03 +00001099static void
1100call_ll_exitfuncs()
1101{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001102 while (nexitfuncs > 0)
1103 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001104
1105 fflush(stdout);
1106 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001107}
1108
1109void
Guido van Rossum82598051997-03-05 00:20:32 +00001110Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001111 int sts;
1112{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001113 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001114
Jack Jansen66a89771995-10-27 13:22:14 +00001115#ifdef macintosh
1116 PyMac_Exit(sts);
1117#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001118 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001119#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001120}
1121
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001122static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001123initsigs()
1124{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001125#ifdef HAVE_SIGNAL_H
1126#ifdef SIGPIPE
1127 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001128#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001129#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001130 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001131}
1132
Guido van Rossumaae0d321996-05-22 16:35:33 +00001133#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001134/* Ask a yes/no question */
1135
Guido van Rossum59bff391992-09-03 20:28:00 +00001136int
Guido van Rossum82598051997-03-05 00:20:32 +00001137_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001138 char *prompt;
1139{
1140 char buf[256];
1141
1142 printf("%s [ny] ", prompt);
1143 if (fgets(buf, sizeof buf, stdin) == NULL)
1144 return 0;
1145 return buf[0] == 'y' || buf[0] == 'Y';
1146}
1147#endif
1148
Guido van Rossuma110aa61994-08-29 12:50:44 +00001149#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001150
1151/* Check for file descriptor connected to interactive device.
1152 Pretend that stdin is always interactive, other files never. */
1153
1154int
1155isatty(fd)
1156 int fd;
1157{
1158 return fd == fileno(stdin);
1159}
1160
1161#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001162
1163/*
1164 * The file descriptor fd is considered ``interactive'' if either
1165 * a) isatty(fd) is TRUE, or
1166 * b) the -i flag was given, and the filename associated with
1167 * the descriptor is NULL or "<stdin>" or "???".
1168 */
1169int
1170Py_FdIsInteractive(fp, filename)
1171 FILE *fp;
1172 char *filename;
1173{
1174 if (isatty((int)fileno(fp)))
1175 return 1;
1176 if (!Py_InteractiveFlag)
1177 return 0;
1178 return (filename == NULL) ||
1179 (strcmp(filename, "<stdin>") == 0) ||
1180 (strcmp(filename, "???") == 0);
1181}