blob: 1e26efcc712ea53d3921c9b42785b2610a94251c [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 Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029
30******************************************************************/
31
32/* Python interpreter top-level routines, including init/exit */
33
Guido van Rossum82598051997-03-05 00:20:32 +000034#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
36#include "grammar.h"
37#include "node.h"
38#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000039#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000040#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000042#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossum80bb9651996-12-05 23:27:02 +000044#ifdef HAVE_UNISTD_H
45#include <unistd.h>
46#endif
47
Guido van Rossuma110aa61994-08-29 12:50:44 +000048#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000049#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000050#endif
51
Guido van Rossum9b38a141996-09-11 23:12:24 +000052#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000053#undef BYTE
54#include "windows.h"
55#endif
56
Guido van Rossum82598051997-03-05 00:20:32 +000057extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000058
Guido van Rossum82598051997-03-05 00:20:32 +000059extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060
Guido van Rossumb73cc041993-11-01 16:28:59 +000061/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000062static void initmain Py_PROTO((void));
Guido van Rossumdcc0c131997-08-29 22:32:42 +000063static void initsite Py_PROTO((void));
Guido van Rossum82598051997-03-05 00:20:32 +000064static PyObject *run_err_node Py_PROTO((node *n, char *filename,
65 PyObject *globals, PyObject *locals));
66static PyObject *run_node Py_PROTO((node *n, char *filename,
67 PyObject *globals, PyObject *locals));
68static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
69 PyObject *globals, PyObject *locals));
70static void err_input Py_PROTO((perrdetail *));
71static void initsigs Py_PROTO((void));
Guido van Rossumcc283f51997-08-05 02:22:03 +000072static void call_sys_exitfunc Py_PROTO((void));
73static void call_ll_exitfuncs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000074
Guido van Rossum82598051997-03-05 00:20:32 +000075int Py_DebugFlag; /* Needed by parser.c */
76int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000077int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossumdcc0c131997-08-29 22:32:42 +000078int Py_NoSiteFlag; /* Suppress 'import site' */
Guido van Rossum999e5e91997-10-03 19:46:02 +000079int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c */
Guido van Rossuma61691e1998-02-06 22:27:24 +000080int Py_FrozenFlag; /* Needed by getpath.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000081
Guido van Rossum25ce5661997-08-02 03:10:38 +000082static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000084/* API to access the initialized flag -- useful for eroteric use */
85
86int
87Py_IsInitialized()
88{
89 return initialized;
90}
91
Guido van Rossum25ce5661997-08-02 03:10:38 +000092/* Global initializations. Can be undone by Py_Finalize(). Don't
93 call this twice without an intervening Py_Finalize() call. When
94 initializations fail, a fatal error is issued and the function does
95 not return. On return, the first thread and interpreter state have
96 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097
Guido van Rossum25ce5661997-08-02 03:10:38 +000098 Locking: you must hold the interpreter lock while calling this.
99 (If the lock has not yet been initialized, that's equivalent to
100 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000101
Guido van Rossum25ce5661997-08-02 03:10:38 +0000102*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000103
104void
105Py_Initialize()
106{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000108 PyThreadState *tstate;
109 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000110 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000111
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000112 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000113 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000114 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000116 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
117 Py_DebugFlag = 1;
118 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
119 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000120 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
121 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000122
Guido van Rossuma027efa1997-05-05 20:56:21 +0000123 interp = PyInterpreterState_New();
124 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000126
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127 tstate = PyThreadState_New(interp);
128 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000130 (void) PyThreadState_Swap(tstate);
131
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132 interp->modules = PyDict_New();
133 if (interp->modules == NULL)
134 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135
Barry Warsaw035574d1997-08-29 22:07:17 +0000136 bimod = _PyBuiltin_Init_1();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000137 if (bimod == NULL)
138 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000139 interp->builtins = PyModule_GetDict(bimod);
140 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000141
142 sysmod = _PySys_Init();
143 if (sysmod == NULL)
144 Py_FatalError("Py_Initialize: can't initialize sys");
145 interp->sysdict = PyModule_GetDict(sysmod);
146 Py_INCREF(interp->sysdict);
147 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000148 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000149 PyDict_SetItemString(interp->sysdict, "modules",
150 interp->modules);
151
Barry Warsaw035574d1997-08-29 22:07:17 +0000152 /* phase 2 of builtins */
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000153 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000154 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000155
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156 _PyImport_Init();
157
158 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
165/* Undo the effect of Py_Initialize().
166
167 Beware: if multiple interpreter and/or thread states exist, these
168 are not wiped out; only the current thread and interpreter state
169 are deleted. But since everything else is deleted, those other
170 interpreter and thread states should no longer be used.
171
172 (XXX We should do better, e.g. wipe out all interpreters and
173 threads.)
174
175 Locking: as above.
176
177*/
178
179void
180Py_Finalize()
181{
182 PyInterpreterState *interp;
183 PyThreadState *tstate;
184
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000185 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000186 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000187 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000189 call_sys_exitfunc();
190
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000191 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000192 tstate = PyThreadState_Get();
193 interp = tstate->interp;
194
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000195 /* Disable signal handling */
196 PyOS_FiniInterrupts();
197
198 /* Destroy PyExc_MemoryErrorInst */
199 _PyBuiltin_Fini_1();
200
201 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203
Guido van Rossum1707aad1997-12-08 23:43:45 +0000204 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
205 _PyImport_Fini();
206
207 /* Debugging stuff */
208#ifdef COUNT_ALLOCS
209 dump_counts();
210#endif
211
212#ifdef Py_REF_DEBUG
213 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
214#endif
215
216#ifdef Py_TRACE_REFS
217 if (_Py_AskYesNo("Print left references?")) {
218 _Py_PrintReferences(stderr);
219 }
220#endif /* Py_TRACE_REFS */
221
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000222 /* Delete current thread */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000223 PyInterpreterState_Clear(interp);
224 PyThreadState_Swap(NULL);
225 PyInterpreterState_Delete(interp);
226
Barry Warsaw035574d1997-08-29 22:07:17 +0000227 /* Now we decref the exception classes. After this point nothing
228 can raise an exception. That's okay, because each Fini() method
229 below has been checked to make sure no exceptions are ever
230 raised.
231 */
232 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000233 PyMethod_Fini();
234 PyFrame_Fini();
235 PyCFunction_Fini();
236 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000237 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000238 PyInt_Fini();
239 PyFloat_Fini();
240
241 /* XXX Still allocated:
242 - various static ad-hoc pointers to interned strings
243 - int and float free list blocks
244 - whatever various modules and libraries allocate
245 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246
247 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000248
249 call_ll_exitfuncs();
250
Guido van Rossumcc283f51997-08-05 02:22:03 +0000251#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000252 _Py_ResetReferences();
253#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000254}
255
256/* Create and initialize a new interpreter and thread, and return the
257 new thread. This requires that Py_Initialize() has been called
258 first.
259
260 Unsuccessful initialization yields a NULL pointer. Note that *no*
261 exception information is available even in this case -- the
262 exception information is held in the thread, and there is no
263 thread.
264
265 Locking: as above.
266
267*/
268
269PyThreadState *
270Py_NewInterpreter()
271{
272 PyInterpreterState *interp;
273 PyThreadState *tstate, *save_tstate;
274 PyObject *bimod, *sysmod;
275
276 if (!initialized)
277 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
278
279 interp = PyInterpreterState_New();
280 if (interp == NULL)
281 return NULL;
282
283 tstate = PyThreadState_New(interp);
284 if (tstate == NULL) {
285 PyInterpreterState_Delete(interp);
286 return NULL;
287 }
288
289 save_tstate = PyThreadState_Swap(tstate);
290
291 /* XXX The following is lax in error checking */
292
293 interp->modules = PyDict_New();
294
295 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
296 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000297 interp->builtins = PyModule_GetDict(bimod);
298 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000299 }
300 sysmod = _PyImport_FindExtension("sys", "sys");
301 if (bimod != NULL && sysmod != NULL) {
302 interp->sysdict = PyModule_GetDict(sysmod);
303 Py_INCREF(interp->sysdict);
304 PySys_SetPath(Py_GetPath());
305 PyDict_SetItemString(interp->sysdict, "modules",
306 interp->modules);
307 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000308 if (!Py_NoSiteFlag)
309 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000310 }
311
312 if (!PyErr_Occurred())
313 return tstate;
314
315 /* Oops, it didn't work. Undo it all. */
316
317 PyErr_Print();
318 PyThreadState_Clear(tstate);
319 PyThreadState_Swap(save_tstate);
320 PyThreadState_Delete(tstate);
321 PyInterpreterState_Delete(interp);
322
323 return NULL;
324}
325
326/* Delete an interpreter and its last thread. This requires that the
327 given thread state is current, that the thread has no remaining
328 frames, and that it is its interpreter's only remaining thread.
329 It is a fatal error to violate these constraints.
330
331 (Py_Finalize() doesn't have these constraints -- it zaps
332 everything, regardless.)
333
334 Locking: as above.
335
336*/
337
338void
339Py_EndInterpreter(tstate)
340 PyThreadState *tstate;
341{
342 PyInterpreterState *interp = tstate->interp;
343
344 if (tstate != PyThreadState_Get())
345 Py_FatalError("Py_EndInterpreter: thread is not current");
346 if (tstate->frame != NULL)
347 Py_FatalError("Py_EndInterpreter: thread still has a frame");
348 if (tstate != interp->tstate_head || tstate->next != NULL)
349 Py_FatalError("Py_EndInterpreter: not the last thread");
350
351 PyImport_Cleanup();
352 PyInterpreterState_Clear(interp);
353 PyThreadState_Swap(NULL);
354 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000355}
356
357static char *progname = "python";
358
359void
360Py_SetProgramName(pn)
361 char *pn;
362{
363 if (pn && *pn)
364 progname = pn;
365}
366
367char *
368Py_GetProgramName()
369{
370 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000371}
372
Guido van Rossuma61691e1998-02-06 22:27:24 +0000373static char *default_home = NULL;
374
375void
376Py_SetPythonHome(home)
377 char *home;
378{
379 default_home = home;
380}
381
382char *
383Py_GetPythonHome()
384{
385 char *home = default_home;
386 if (home == NULL)
387 home = getenv("PYTHONHOME");
388 return home;
389}
390
Guido van Rossum6135a871995-01-09 17:53:26 +0000391/* Create __main__ module */
392
393static void
394initmain()
395{
Guido van Rossum82598051997-03-05 00:20:32 +0000396 PyObject *m, *d;
397 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000398 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000399 Py_FatalError("can't create __main__ module");
400 d = PyModule_GetDict(m);
401 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000402 PyObject *bimod = PyImport_ImportModule("__builtin__");
403 if (bimod == NULL ||
404 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000405 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000406 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000407}
408
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000409/* Import the site module (not into __main__ though) */
410
411static void
412initsite()
413{
414 PyObject *m, *f;
415 m = PyImport_ImportModule("site");
416 if (m == NULL) {
417 f = PySys_GetObject("stderr");
418 if (Py_VerboseFlag) {
419 PyFile_WriteString(
420 "'import site' failed; traceback:\n", f);
421 PyErr_Print();
422 }
423 else {
424 PyFile_WriteString(
425 "'import site' failed; use -v for traceback\n", f);
426 PyErr_Clear();
427 }
428 }
429 else {
430 Py_DECREF(m);
431 }
432}
433
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434/* Parse input from a file and execute it */
435
436int
Guido van Rossum82598051997-03-05 00:20:32 +0000437PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000438 FILE *fp;
439 char *filename;
440{
441 if (filename == NULL)
442 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000443 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000444 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000445 else
Guido van Rossum82598051997-03-05 00:20:32 +0000446 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000447}
448
449int
Guido van Rossum82598051997-03-05 00:20:32 +0000450PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451 FILE *fp;
452 char *filename;
453{
Guido van Rossum82598051997-03-05 00:20:32 +0000454 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000455 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000456 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000458 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
459 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 }
Guido van Rossum82598051997-03-05 00:20:32 +0000461 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000463 PySys_SetObject("ps2", v = PyString_FromString("... "));
464 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000465 }
466 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000467 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000468#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000469 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470#endif
471 if (ret == E_EOF)
472 return 0;
473 /*
474 if (ret == E_NOMEM)
475 return -1;
476 */
477 }
478}
479
480int
Guido van Rossum82598051997-03-05 00:20:32 +0000481PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000482 FILE *fp;
483 char *filename;
484{
Guido van Rossum82598051997-03-05 00:20:32 +0000485 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000486 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000487 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000488 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000489 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000490 if (v != NULL) {
491 v = PyObject_Str(v);
492 if (v == NULL)
493 PyErr_Clear();
494 else if (PyString_Check(v))
495 ps1 = PyString_AsString(v);
496 }
Guido van Rossum82598051997-03-05 00:20:32 +0000497 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000498 if (w != NULL) {
499 w = PyObject_Str(w);
500 if (w == NULL)
501 PyErr_Clear();
502 else if (PyString_Check(w))
503 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504 }
Guido van Rossum82598051997-03-05 00:20:32 +0000505 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000506 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000507 Py_XDECREF(v);
508 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000509 if (n == NULL) {
510 if (err.error == E_EOF) {
511 if (err.text)
512 free(err.text);
513 return E_EOF;
514 }
515 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000516 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000517 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 }
Guido van Rossum82598051997-03-05 00:20:32 +0000519 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000520 if (m == NULL)
521 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000522 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000523 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000524 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000525 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000526 return -1;
527 }
Guido van Rossum82598051997-03-05 00:20:32 +0000528 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000529 if (Py_FlushLine())
530 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 return 0;
532}
533
534int
Guido van Rossum82598051997-03-05 00:20:32 +0000535PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536 FILE *fp;
537 char *filename;
538{
Guido van Rossum82598051997-03-05 00:20:32 +0000539 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000540 char *ext;
541
Guido van Rossum82598051997-03-05 00:20:32 +0000542 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543 if (m == NULL)
544 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000545 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000546 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000547 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000548#ifdef macintosh
549 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000550 || getfiletype(filename) == 'PYC '
551 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000552#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000553 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000554 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000555 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000556 if( (fp = fopen(filename, "rb")) == NULL ) {
557 fprintf(stderr, "python: Can't reopen .pyc file\n");
558 return -1;
559 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000560 /* Turn on optimization if a .pyo file is given */
561 if (strcmp(ext, ".pyo") == 0)
562 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000563 v = run_pyc_file(fp, filename, d, d);
564 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000565 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000566 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000567 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000568 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000569 return -1;
570 }
Guido van Rossum82598051997-03-05 00:20:32 +0000571 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000572 if (Py_FlushLine())
573 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000574 return 0;
575}
576
577int
Guido van Rossum82598051997-03-05 00:20:32 +0000578PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000579 char *command;
580{
Guido van Rossum82598051997-03-05 00:20:32 +0000581 PyObject *m, *d, *v;
582 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583 if (m == NULL)
584 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000585 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000586 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000588 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589 return -1;
590 }
Guido van Rossum82598051997-03-05 00:20:32 +0000591 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000592 if (Py_FlushLine())
593 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000594 return 0;
595}
596
Barry Warsaw035574d1997-08-29 22:07:17 +0000597static int
598parse_syntax_error(err, message, filename, lineno, offset, text)
599 PyObject* err;
600 PyObject** message;
601 char** filename;
602 int* lineno;
603 int* offset;
604 char** text;
605{
606 long hold;
607 PyObject *v;
608
609 /* old style errors */
610 if (PyTuple_Check(err))
611 return PyArg_Parse(err, "(O(ziiz))", message, filename,
612 lineno, offset, text);
613
614 /* new style errors. `err' is an instance */
615
616 if (! (v = PyObject_GetAttrString(err, "msg")))
617 goto finally;
618 *message = v;
619
620 if (!(v = PyObject_GetAttrString(err, "filename")))
621 goto finally;
622 if (v == Py_None)
623 *filename = NULL;
624 else if (! (*filename = PyString_AsString(v)))
625 goto finally;
626
627 Py_DECREF(v);
628 if (!(v = PyObject_GetAttrString(err, "lineno")))
629 goto finally;
630 hold = PyInt_AsLong(v);
631 Py_DECREF(v);
632 v = NULL;
633 if (hold < 0 && PyErr_Occurred())
634 goto finally;
635 *lineno = (int)hold;
636
637 if (!(v = PyObject_GetAttrString(err, "offset")))
638 goto finally;
639 hold = PyInt_AsLong(v);
640 Py_DECREF(v);
641 v = NULL;
642 if (hold < 0 && PyErr_Occurred())
643 goto finally;
644 *offset = (int)hold;
645
646 if (!(v = PyObject_GetAttrString(err, "text")))
647 goto finally;
648 if (v == Py_None)
649 *text = NULL;
650 else if (! (*text = PyString_AsString(v)))
651 goto finally;
652 Py_DECREF(v);
653 return 1;
654
655finally:
656 Py_XDECREF(v);
657 return 0;
658}
659
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660void
Guido van Rossum82598051997-03-05 00:20:32 +0000661PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000662{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000663 PyErr_PrintEx(1);
664}
665
666void
667PyErr_PrintEx(set_sys_last_vars)
668 int set_sys_last_vars;
669{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000670 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000671 PyObject *exception, *v, *tb, *f;
672 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000673 PyErr_NormalizeException(&exception, &v, &tb);
674
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000675 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000676 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000677
Barry Warsaw36b8f941997-08-26 18:09:48 +0000678 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000679 if (Py_FlushLine())
680 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000681 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000682 if (v == NULL || v == Py_None)
683 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000684 if (PyInstance_Check(v)) {
685 /* we expect the error code to be store in the
686 `code' attribute
687 */
688 PyObject *code = PyObject_GetAttrString(v, "code");
689 if (code) {
690 Py_DECREF(v);
691 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000692 if (v == Py_None)
693 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000694 }
695 /* if we failed to dig out the "code" attribute,
696 then just let the else clause below print the
697 error
698 */
699 }
Guido van Rossum82598051997-03-05 00:20:32 +0000700 if (PyInt_Check(v))
701 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000703 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000704 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000706 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707 }
708 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000709 if (set_sys_last_vars) {
710 PySys_SetObject("last_type", exception);
711 PySys_SetObject("last_value", v);
712 PySys_SetObject("last_traceback", tb);
713 }
Guido van Rossum82598051997-03-05 00:20:32 +0000714 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000715 if (f == NULL)
716 fprintf(stderr, "lost sys.stderr\n");
717 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000718 if (Py_FlushLine())
719 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000720 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000721 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000722 if (err == 0 &&
723 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
724 {
Guido van Rossum82598051997-03-05 00:20:32 +0000725 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000726 char *filename, *text;
727 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000728 if (!parse_syntax_error(v, &message, &filename,
729 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000730 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000731 else {
732 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000733 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000736 else
Guido van Rossum82598051997-03-05 00:20:32 +0000737 PyFile_WriteString(filename, f);
738 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000740 PyFile_WriteString(buf, f);
741 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000743 char *nl;
744 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000745 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000746 offset--;
747 for (;;) {
748 nl = strchr(text, '\n');
749 if (nl == NULL ||
750 nl-text >= offset)
751 break;
752 offset -= (nl+1-text);
753 text = nl+1;
754 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000755 while (*text == ' ' || *text == '\t') {
756 text++;
757 offset--;
758 }
Guido van Rossum82598051997-03-05 00:20:32 +0000759 PyFile_WriteString(" ", f);
760 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000761 if (*text == '\0' ||
762 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000763 PyFile_WriteString("\n", f);
764 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000765 offset--;
766 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000767 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000768 offset--;
769 }
Guido van Rossum82598051997-03-05 00:20:32 +0000770 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000771 }
Guido van Rossum82598051997-03-05 00:20:32 +0000772 Py_INCREF(message);
773 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000775 /* Can't be bothered to check all those
776 PyFile_WriteString() calls */
777 if (PyErr_Occurred())
778 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000779 }
780 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000781 if (err) {
782 /* Don't do anything else */
783 }
784 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000785 PyClassObject* exc = (PyClassObject*)exception;
786 PyObject* className = exc->cl_name;
787 PyObject* moduleName =
788 PyDict_GetItemString(exc->cl_dict, "__module__");
789
790 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000791 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000792 else {
793 char* modstr = PyString_AsString(moduleName);
794 if (modstr && strcmp(modstr, "exceptions"))
795 {
796 err = PyFile_WriteString(modstr, f);
797 err += PyFile_WriteString(".", f);
798 }
799 }
800 if (err == 0) {
801 if (className == NULL)
802 err = PyFile_WriteString("<unknown>", f);
803 else
804 err = PyFile_WriteObject(className, f,
805 Py_PRINT_RAW);
806 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000807 }
808 else
809 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
810 if (err == 0) {
811 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000812 PyObject *s = PyObject_Str(v);
813 /* only print colon if the str() of the
814 object is not the empty string
815 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000816 if (s == NULL)
817 err = -1;
818 else if (!PyString_Check(s) ||
819 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000820 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000821 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000822 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
823 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000824 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000825 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000826 if (err == 0)
827 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000828 }
Guido van Rossum82598051997-03-05 00:20:32 +0000829 Py_XDECREF(exception);
830 Py_XDECREF(v);
831 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000832 /* If an error happened here, don't show it.
833 XXX This is wrong, but too many callers rely on this behavior. */
834 if (err != 0)
835 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836}
837
Guido van Rossum82598051997-03-05 00:20:32 +0000838PyObject *
839PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000840 char *str;
841 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000842 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843{
Guido van Rossum82598051997-03-05 00:20:32 +0000844 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000845 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000846}
847
Guido van Rossum82598051997-03-05 00:20:32 +0000848PyObject *
849PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000850 FILE *fp;
851 char *filename;
852 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000853 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000854{
Guido van Rossum82598051997-03-05 00:20:32 +0000855 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000856 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000857}
858
Guido van Rossum82598051997-03-05 00:20:32 +0000859static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000860run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000861 node *n;
862 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000863 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000864{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000865 if (n == NULL)
866 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000867 return run_node(n, filename, globals, locals);
868}
869
Guido van Rossum82598051997-03-05 00:20:32 +0000870static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000871run_node(n, filename, globals, locals)
872 node *n;
873 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000874 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000875{
Guido van Rossum82598051997-03-05 00:20:32 +0000876 PyCodeObject *co;
877 PyObject *v;
878 co = PyNode_Compile(n, filename);
879 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000880 if (co == NULL)
881 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000882 v = PyEval_EvalCode(co, globals, locals);
883 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884 return v;
885}
886
Guido van Rossum82598051997-03-05 00:20:32 +0000887static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000888run_pyc_file(fp, filename, globals, locals)
889 FILE *fp;
890 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000891 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000892{
Guido van Rossum82598051997-03-05 00:20:32 +0000893 PyCodeObject *co;
894 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000895 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000896 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000897
Guido van Rossum82598051997-03-05 00:20:32 +0000898 magic = PyMarshal_ReadLongFromFile(fp);
899 if (magic != PyImport_GetMagicNumber()) {
900 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000901 "Bad magic number in .pyc file");
902 return NULL;
903 }
Guido van Rossum82598051997-03-05 00:20:32 +0000904 (void) PyMarshal_ReadLongFromFile(fp);
905 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000906 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000907 if (v == NULL || !PyCode_Check(v)) {
908 Py_XDECREF(v);
909 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000910 "Bad code object in .pyc file");
911 return NULL;
912 }
Guido van Rossum82598051997-03-05 00:20:32 +0000913 co = (PyCodeObject *)v;
914 v = PyEval_EvalCode(co, globals, locals);
915 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000916 return v;
917}
918
Guido van Rossum82598051997-03-05 00:20:32 +0000919PyObject *
920Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000921 char *str;
922 char *filename;
923 int start;
924{
925 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000926 PyCodeObject *co;
927 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000928 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000929 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000930 co = PyNode_Compile(n, filename);
931 PyNode_Free(n);
932 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000933}
934
Guido van Rossuma110aa61994-08-29 12:50:44 +0000935/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000936
Guido van Rossuma110aa61994-08-29 12:50:44 +0000937node *
Guido van Rossum82598051997-03-05 00:20:32 +0000938PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000939 FILE *fp;
940 char *filename;
941 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000942{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000943 node *n;
944 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000945 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000946 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000947 if (n == NULL)
948 err_input(&err);
949 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000950}
951
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000953
Guido van Rossuma110aa61994-08-29 12:50:44 +0000954node *
Guido van Rossum82598051997-03-05 00:20:32 +0000955PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000956 char *str;
957 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000959 node *n;
960 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000961 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000962 if (n == NULL)
963 err_input(&err);
964 return n;
965}
966
967/* Set the error appropriate to the given input error code (see errcode.h) */
968
969static void
970err_input(err)
971 perrdetail *err;
972{
Guido van Rossum82598051997-03-05 00:20:32 +0000973 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000974 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000975 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000976 err->lineno, err->offset, err->text);
977 if (err->text != NULL) {
978 free(err->text);
979 err->text = NULL;
980 }
981 switch (err->error) {
982 case E_SYNTAX:
983 msg = "invalid syntax";
984 break;
985 case E_TOKEN:
986 msg = "invalid token";
987
988 break;
989 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000990 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000991 return;
992 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000993 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000994 return;
995 case E_EOF:
996 msg = "unexpected EOF while parsing";
997 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +0000998 case E_INDENT:
999 msg = "inconsistent use of tabs and spaces in indentation";
1000 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001001 default:
1002 fprintf(stderr, "error=%d\n", err->error);
1003 msg = "unknown parsing error";
1004 break;
1005 }
Guido van Rossum82598051997-03-05 00:20:32 +00001006 w = Py_BuildValue("(sO)", msg, v);
1007 Py_XDECREF(v);
1008 PyErr_SetObject(PyExc_SyntaxError, w);
1009 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001010}
1011
1012/* Print fatal error message and abort */
1013
1014void
Guido van Rossum82598051997-03-05 00:20:32 +00001015Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001016 char *msg;
1017{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001018 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001019#ifdef macintosh
1020 for (;;);
1021#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001022#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001023 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001024 OutputDebugString(msg);
1025 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001026#ifdef _DEBUG
1027 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001028#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001029#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001030 abort();
1031}
1032
1033/* Clean up and exit */
1034
Guido van Rossuma110aa61994-08-29 12:50:44 +00001035#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001036#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001037int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001038#endif
1039
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001040#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001041static void (*exitfuncs[NEXITFUNCS])();
1042static int nexitfuncs = 0;
1043
1044int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001045 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001046{
1047 if (nexitfuncs >= NEXITFUNCS)
1048 return -1;
1049 exitfuncs[nexitfuncs++] = func;
1050 return 0;
1051}
1052
Guido van Rossumcc283f51997-08-05 02:22:03 +00001053static void
1054call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001055{
Guido van Rossum82598051997-03-05 00:20:32 +00001056 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001057
1058 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001059 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001060 Py_INCREF(exitfunc);
1061 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001062 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001063 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001064 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001065 if (f)
1066 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001067 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001068 }
Guido van Rossum82598051997-03-05 00:20:32 +00001069 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001070 }
1071
Guido van Rossum0829c751998-02-28 04:31:39 +00001072 if (Py_FlushLine())
1073 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001074}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001075
Guido van Rossumcc283f51997-08-05 02:22:03 +00001076static void
1077call_ll_exitfuncs()
1078{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001079 while (nexitfuncs > 0)
1080 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001081
1082 fflush(stdout);
1083 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001084}
1085
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001086#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001087extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001088#endif
1089
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001090void
Guido van Rossum82598051997-03-05 00:20:32 +00001091Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001092 int sts;
1093{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001094 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001095
Jack Jansen66a89771995-10-27 13:22:14 +00001096#ifdef macintosh
1097 PyMac_Exit(sts);
1098#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001099 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001100#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001101}
1102
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001103static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001104initsigs()
1105{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001106#ifdef HAVE_SIGNAL_H
1107#ifdef SIGPIPE
1108 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001109#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001110#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001111 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001112}
1113
Guido van Rossumaae0d321996-05-22 16:35:33 +00001114#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001115/* Ask a yes/no question */
1116
Guido van Rossum59bff391992-09-03 20:28:00 +00001117int
Guido van Rossum82598051997-03-05 00:20:32 +00001118_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001119 char *prompt;
1120{
1121 char buf[256];
1122
1123 printf("%s [ny] ", prompt);
1124 if (fgets(buf, sizeof buf, stdin) == NULL)
1125 return 0;
1126 return buf[0] == 'y' || buf[0] == 'Y';
1127}
1128#endif
1129
Guido van Rossuma110aa61994-08-29 12:50:44 +00001130#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001131
1132/* Check for file descriptor connected to interactive device.
1133 Pretend that stdin is always interactive, other files never. */
1134
1135int
1136isatty(fd)
1137 int fd;
1138{
1139 return fd == fileno(stdin);
1140}
1141
1142#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001143
1144/*
1145 * The file descriptor fd is considered ``interactive'' if either
1146 * a) isatty(fd) is TRUE, or
1147 * b) the -i flag was given, and the filename associated with
1148 * the descriptor is NULL or "<stdin>" or "???".
1149 */
1150int
1151Py_FdIsInteractive(fp, filename)
1152 FILE *fp;
1153 char *filename;
1154{
1155 if (isatty((int)fileno(fp)))
1156 return 1;
1157 if (!Py_InteractiveFlag)
1158 return 0;
1159 return (filename == NULL) ||
1160 (strcmp(filename, "<stdin>") == 0) ||
1161 (strcmp(filename, "???") == 0);
1162}