blob: 2d065cf22dcfd4899cb997aa4e17792af47ec186 [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
Guido van Rossum2c1f6be1999-01-08 15:56:28 +0000104extern void win_pre_init(), win_pre_exit();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000105void
106Py_Initialize()
107{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000108 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000109 PyThreadState *tstate;
110 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000111 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000113 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000114 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000115 initialized = 1;
Guido van Rossum2c1f6be1999-01-08 15:56:28 +0000116#ifdef MS_WINDOWS
117 win_pre_init();
118#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
121 Py_DebugFlag = 1;
122 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
123 Py_VerboseFlag = 1;
Guido van Rossum562f5b11998-10-07 14:50:42 +0000124 if ((p = getenv("PYTHONOPTIMIZE")) && *p != '\0')
125 Py_OptimizeFlag = 1;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000126
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127 interp = PyInterpreterState_New();
128 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000130
Guido van Rossuma027efa1997-05-05 20:56:21 +0000131 tstate = PyThreadState_New(interp);
132 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134 (void) PyThreadState_Swap(tstate);
135
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136 interp->modules = PyDict_New();
137 if (interp->modules == NULL)
138 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000139
Barry Warsaw035574d1997-08-29 22:07:17 +0000140 bimod = _PyBuiltin_Init_1();
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
Barry Warsaw035574d1997-08-29 22:07:17 +0000156 /* phase 2 of builtins */
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000157 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000158 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000159
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160 _PyImport_Init();
161
162 initsigs(); /* Signal handling stuff, including initintr() */
163
164 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000165 if (!Py_NoSiteFlag)
166 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000167}
168
Guido van Rossum2edcf0d1998-12-15 16:12:00 +0000169#ifdef COUNT_ALLOCS
170extern void dump_counts Py_PROTO((void));
171#endif
172
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173/* Undo the effect of Py_Initialize().
174
175 Beware: if multiple interpreter and/or thread states exist, these
176 are not wiped out; only the current thread and interpreter state
177 are deleted. But since everything else is deleted, those other
178 interpreter and thread states should no longer be used.
179
180 (XXX We should do better, e.g. wipe out all interpreters and
181 threads.)
182
183 Locking: as above.
184
185*/
186
187void
188Py_Finalize()
189{
190 PyInterpreterState *interp;
191 PyThreadState *tstate;
192
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000193 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000194 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000195 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196
Guido van Rossum4cc462e1998-01-19 22:00:38 +0000197 call_sys_exitfunc();
198
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000199 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000200 tstate = PyThreadState_Get();
201 interp = tstate->interp;
202
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000203 /* Disable signal handling */
204 PyOS_FiniInterrupts();
205
206 /* Destroy PyExc_MemoryErrorInst */
207 _PyBuiltin_Fini_1();
208
209 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000210 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000211
Guido van Rossum1707aad1997-12-08 23:43:45 +0000212 /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
213 _PyImport_Fini();
214
215 /* Debugging stuff */
216#ifdef COUNT_ALLOCS
217 dump_counts();
218#endif
219
220#ifdef Py_REF_DEBUG
221 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
222#endif
223
224#ifdef Py_TRACE_REFS
225 if (_Py_AskYesNo("Print left references?")) {
226 _Py_PrintReferences(stderr);
227 }
228#endif /* Py_TRACE_REFS */
229
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000230 /* Delete current thread */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231 PyInterpreterState_Clear(interp);
232 PyThreadState_Swap(NULL);
233 PyInterpreterState_Delete(interp);
234
Barry Warsaw035574d1997-08-29 22:07:17 +0000235 /* Now we decref the exception classes. After this point nothing
236 can raise an exception. That's okay, because each Fini() method
237 below has been checked to make sure no exceptions are ever
238 raised.
239 */
240 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000241 PyMethod_Fini();
242 PyFrame_Fini();
243 PyCFunction_Fini();
244 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000245 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000246 PyInt_Fini();
247 PyFloat_Fini();
248
249 /* XXX Still allocated:
250 - various static ad-hoc pointers to interned strings
251 - int and float free list blocks
252 - whatever various modules and libraries allocate
253 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000254
255 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000256
257 call_ll_exitfuncs();
258
Guido van Rossumcc283f51997-08-05 02:22:03 +0000259#ifdef Py_TRACE_REFS
Guido van Rossumcc283f51997-08-05 02:22:03 +0000260 _Py_ResetReferences();
261#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262}
263
264/* Create and initialize a new interpreter and thread, and return the
265 new thread. This requires that Py_Initialize() has been called
266 first.
267
268 Unsuccessful initialization yields a NULL pointer. Note that *no*
269 exception information is available even in this case -- the
270 exception information is held in the thread, and there is no
271 thread.
272
273 Locking: as above.
274
275*/
276
277PyThreadState *
278Py_NewInterpreter()
279{
280 PyInterpreterState *interp;
281 PyThreadState *tstate, *save_tstate;
282 PyObject *bimod, *sysmod;
283
284 if (!initialized)
285 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
286
287 interp = PyInterpreterState_New();
288 if (interp == NULL)
289 return NULL;
290
291 tstate = PyThreadState_New(interp);
292 if (tstate == NULL) {
293 PyInterpreterState_Delete(interp);
294 return NULL;
295 }
296
297 save_tstate = PyThreadState_Swap(tstate);
298
299 /* XXX The following is lax in error checking */
300
301 interp->modules = PyDict_New();
302
303 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
304 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000305 interp->builtins = PyModule_GetDict(bimod);
306 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000307 }
308 sysmod = _PyImport_FindExtension("sys", "sys");
309 if (bimod != NULL && sysmod != NULL) {
310 interp->sysdict = PyModule_GetDict(sysmod);
311 Py_INCREF(interp->sysdict);
312 PySys_SetPath(Py_GetPath());
313 PyDict_SetItemString(interp->sysdict, "modules",
314 interp->modules);
315 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000316 if (!Py_NoSiteFlag)
317 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000318 }
319
320 if (!PyErr_Occurred())
321 return tstate;
322
323 /* Oops, it didn't work. Undo it all. */
324
325 PyErr_Print();
326 PyThreadState_Clear(tstate);
327 PyThreadState_Swap(save_tstate);
328 PyThreadState_Delete(tstate);
329 PyInterpreterState_Delete(interp);
330
331 return NULL;
332}
333
334/* Delete an interpreter and its last thread. This requires that the
335 given thread state is current, that the thread has no remaining
336 frames, and that it is its interpreter's only remaining thread.
337 It is a fatal error to violate these constraints.
338
339 (Py_Finalize() doesn't have these constraints -- it zaps
340 everything, regardless.)
341
342 Locking: as above.
343
344*/
345
346void
347Py_EndInterpreter(tstate)
348 PyThreadState *tstate;
349{
350 PyInterpreterState *interp = tstate->interp;
351
352 if (tstate != PyThreadState_Get())
353 Py_FatalError("Py_EndInterpreter: thread is not current");
354 if (tstate->frame != NULL)
355 Py_FatalError("Py_EndInterpreter: thread still has a frame");
356 if (tstate != interp->tstate_head || tstate->next != NULL)
357 Py_FatalError("Py_EndInterpreter: not the last thread");
358
359 PyImport_Cleanup();
360 PyInterpreterState_Clear(interp);
361 PyThreadState_Swap(NULL);
362 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000363}
364
365static char *progname = "python";
366
367void
368Py_SetProgramName(pn)
369 char *pn;
370{
371 if (pn && *pn)
372 progname = pn;
373}
374
375char *
376Py_GetProgramName()
377{
378 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000379}
380
Guido van Rossuma61691e1998-02-06 22:27:24 +0000381static char *default_home = NULL;
382
383void
384Py_SetPythonHome(home)
385 char *home;
386{
387 default_home = home;
388}
389
390char *
391Py_GetPythonHome()
392{
393 char *home = default_home;
394 if (home == NULL)
395 home = getenv("PYTHONHOME");
396 return home;
397}
398
Guido van Rossum6135a871995-01-09 17:53:26 +0000399/* Create __main__ module */
400
401static void
402initmain()
403{
Guido van Rossum82598051997-03-05 00:20:32 +0000404 PyObject *m, *d;
405 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000406 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000407 Py_FatalError("can't create __main__ module");
408 d = PyModule_GetDict(m);
409 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000410 PyObject *bimod = PyImport_ImportModule("__builtin__");
411 if (bimod == NULL ||
412 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000413 Py_FatalError("can't add __builtins__ to __main__");
Barry Warsaw3d05b1a1999-01-29 21:30:22 +0000414 Py_DECREF(bimod);
Guido van Rossum6135a871995-01-09 17:53:26 +0000415 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000416}
417
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000418/* Import the site module (not into __main__ though) */
419
420static void
421initsite()
422{
423 PyObject *m, *f;
424 m = PyImport_ImportModule("site");
425 if (m == NULL) {
426 f = PySys_GetObject("stderr");
427 if (Py_VerboseFlag) {
428 PyFile_WriteString(
429 "'import site' failed; traceback:\n", f);
430 PyErr_Print();
431 }
432 else {
433 PyFile_WriteString(
434 "'import site' failed; use -v for traceback\n", f);
435 PyErr_Clear();
436 }
437 }
438 else {
439 Py_DECREF(m);
440 }
441}
442
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000443/* Parse input from a file and execute it */
444
445int
Guido van Rossum82598051997-03-05 00:20:32 +0000446PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000447 FILE *fp;
448 char *filename;
449{
450 if (filename == NULL)
451 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000452 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000453 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454 else
Guido van Rossum82598051997-03-05 00:20:32 +0000455 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456}
457
458int
Guido van Rossum82598051997-03-05 00:20:32 +0000459PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 FILE *fp;
461 char *filename;
462{
Guido van Rossum82598051997-03-05 00:20:32 +0000463 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000465 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000466 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000467 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
468 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000469 }
Guido van Rossum82598051997-03-05 00:20:32 +0000470 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000472 PySys_SetObject("ps2", v = PyString_FromString("... "));
473 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474 }
475 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000476 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000477#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000478 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000479#endif
480 if (ret == E_EOF)
481 return 0;
482 /*
483 if (ret == E_NOMEM)
484 return -1;
485 */
486 }
487}
488
489int
Guido van Rossum82598051997-03-05 00:20:32 +0000490PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000491 FILE *fp;
492 char *filename;
493{
Guido van Rossum82598051997-03-05 00:20:32 +0000494 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000496 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000497 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000498 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000499 if (v != NULL) {
500 v = PyObject_Str(v);
501 if (v == NULL)
502 PyErr_Clear();
503 else if (PyString_Check(v))
504 ps1 = PyString_AsString(v);
505 }
Guido van Rossum82598051997-03-05 00:20:32 +0000506 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000507 if (w != NULL) {
508 w = PyObject_Str(w);
509 if (w == NULL)
510 PyErr_Clear();
511 else if (PyString_Check(w))
512 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000513 }
Guido van Rossum82598051997-03-05 00:20:32 +0000514 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000515 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000516 Py_XDECREF(v);
517 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000518 if (n == NULL) {
519 if (err.error == E_EOF) {
520 if (err.text)
521 free(err.text);
522 return E_EOF;
523 }
524 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000525 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000526 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527 }
Guido van Rossum82598051997-03-05 00:20:32 +0000528 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000529 if (m == NULL)
530 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000531 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000534 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535 return -1;
536 }
Guido van Rossum82598051997-03-05 00:20:32 +0000537 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000538 if (Py_FlushLine())
539 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 return 0;
541}
542
543int
Guido van Rossum82598051997-03-05 00:20:32 +0000544PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545 FILE *fp;
546 char *filename;
547{
Guido van Rossum82598051997-03-05 00:20:32 +0000548 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000549 char *ext;
550
Guido van Rossum82598051997-03-05 00:20:32 +0000551 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552 if (m == NULL)
553 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000554 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000555 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000556 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000557#ifdef macintosh
558 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000559 || getfiletype(filename) == 'PYC '
560 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000561#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000562 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000563 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000564 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000565 if( (fp = fopen(filename, "rb")) == NULL ) {
566 fprintf(stderr, "python: Can't reopen .pyc file\n");
567 return -1;
568 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000569 /* Turn on optimization if a .pyo file is given */
570 if (strcmp(ext, ".pyo") == 0)
571 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000572 v = run_pyc_file(fp, filename, d, d);
573 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000574 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000575 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000576 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000577 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000578 return -1;
579 }
Guido van Rossum82598051997-03-05 00:20:32 +0000580 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000581 if (Py_FlushLine())
582 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583 return 0;
584}
585
586int
Guido van Rossum82598051997-03-05 00:20:32 +0000587PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588 char *command;
589{
Guido van Rossum82598051997-03-05 00:20:32 +0000590 PyObject *m, *d, *v;
591 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592 if (m == NULL)
593 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000594 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000595 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000597 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000598 return -1;
599 }
Guido van Rossum82598051997-03-05 00:20:32 +0000600 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000601 if (Py_FlushLine())
602 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603 return 0;
604}
605
Barry Warsaw035574d1997-08-29 22:07:17 +0000606static int
607parse_syntax_error(err, message, filename, lineno, offset, text)
608 PyObject* err;
609 PyObject** message;
610 char** filename;
611 int* lineno;
612 int* offset;
613 char** text;
614{
615 long hold;
616 PyObject *v;
617
618 /* old style errors */
619 if (PyTuple_Check(err))
620 return PyArg_Parse(err, "(O(ziiz))", message, filename,
621 lineno, offset, text);
622
623 /* new style errors. `err' is an instance */
624
625 if (! (v = PyObject_GetAttrString(err, "msg")))
626 goto finally;
627 *message = v;
628
629 if (!(v = PyObject_GetAttrString(err, "filename")))
630 goto finally;
631 if (v == Py_None)
632 *filename = NULL;
633 else if (! (*filename = PyString_AsString(v)))
634 goto finally;
635
636 Py_DECREF(v);
637 if (!(v = PyObject_GetAttrString(err, "lineno")))
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 *lineno = (int)hold;
645
646 if (!(v = PyObject_GetAttrString(err, "offset")))
647 goto finally;
648 hold = PyInt_AsLong(v);
649 Py_DECREF(v);
650 v = NULL;
651 if (hold < 0 && PyErr_Occurred())
652 goto finally;
653 *offset = (int)hold;
654
655 if (!(v = PyObject_GetAttrString(err, "text")))
656 goto finally;
657 if (v == Py_None)
658 *text = NULL;
659 else if (! (*text = PyString_AsString(v)))
660 goto finally;
661 Py_DECREF(v);
662 return 1;
663
664finally:
665 Py_XDECREF(v);
666 return 0;
667}
668
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669void
Guido van Rossum82598051997-03-05 00:20:32 +0000670PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000672 PyErr_PrintEx(1);
673}
674
675void
676PyErr_PrintEx(set_sys_last_vars)
677 int set_sys_last_vars;
678{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000679 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000680 PyObject *exception, *v, *tb, *f;
681 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000682 PyErr_NormalizeException(&exception, &v, &tb);
683
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000684 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000685 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000686
Barry Warsaw36b8f941997-08-26 18:09:48 +0000687 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000688 if (Py_FlushLine())
689 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000690 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000691 if (v == NULL || v == Py_None)
692 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000693 if (PyInstance_Check(v)) {
694 /* we expect the error code to be store in the
695 `code' attribute
696 */
697 PyObject *code = PyObject_GetAttrString(v, "code");
698 if (code) {
699 Py_DECREF(v);
700 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000701 if (v == Py_None)
702 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000703 }
704 /* if we failed to dig out the "code" attribute,
705 then just let the else clause below print the
706 error
707 */
708 }
Guido van Rossum82598051997-03-05 00:20:32 +0000709 if (PyInt_Check(v))
710 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000711 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000712 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000713 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000714 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000715 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716 }
717 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000718 if (set_sys_last_vars) {
719 PySys_SetObject("last_type", exception);
720 PySys_SetObject("last_value", v);
721 PySys_SetObject("last_traceback", tb);
722 }
Guido van Rossum82598051997-03-05 00:20:32 +0000723 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000724 if (f == NULL)
725 fprintf(stderr, "lost sys.stderr\n");
726 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000727 if (Py_FlushLine())
728 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000729 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000730 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000731 if (err == 0 &&
732 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
733 {
Guido van Rossum82598051997-03-05 00:20:32 +0000734 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000735 char *filename, *text;
736 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000737 if (!parse_syntax_error(v, &message, &filename,
738 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000739 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000740 else {
741 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000742 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000743 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000744 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000745 else
Guido van Rossum82598051997-03-05 00:20:32 +0000746 PyFile_WriteString(filename, f);
747 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000748 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000749 PyFile_WriteString(buf, f);
750 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000751 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000752 char *nl;
753 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000754 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000755 offset--;
756 for (;;) {
757 nl = strchr(text, '\n');
758 if (nl == NULL ||
759 nl-text >= offset)
760 break;
761 offset -= (nl+1-text);
762 text = nl+1;
763 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764 while (*text == ' ' || *text == '\t') {
765 text++;
766 offset--;
767 }
Guido van Rossum82598051997-03-05 00:20:32 +0000768 PyFile_WriteString(" ", f);
769 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000770 if (*text == '\0' ||
771 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000772 PyFile_WriteString("\n", f);
773 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774 offset--;
775 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000776 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000777 offset--;
778 }
Guido van Rossum82598051997-03-05 00:20:32 +0000779 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000780 }
Guido van Rossum82598051997-03-05 00:20:32 +0000781 Py_INCREF(message);
782 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000783 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000784 /* Can't be bothered to check all those
785 PyFile_WriteString() calls */
786 if (PyErr_Occurred())
787 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788 }
789 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000790 if (err) {
791 /* Don't do anything else */
792 }
793 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000794 PyClassObject* exc = (PyClassObject*)exception;
795 PyObject* className = exc->cl_name;
796 PyObject* moduleName =
797 PyDict_GetItemString(exc->cl_dict, "__module__");
798
799 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000800 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000801 else {
802 char* modstr = PyString_AsString(moduleName);
803 if (modstr && strcmp(modstr, "exceptions"))
804 {
805 err = PyFile_WriteString(modstr, f);
806 err += PyFile_WriteString(".", f);
807 }
808 }
809 if (err == 0) {
810 if (className == NULL)
811 err = PyFile_WriteString("<unknown>", f);
812 else
813 err = PyFile_WriteObject(className, f,
814 Py_PRINT_RAW);
815 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000816 }
817 else
818 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
819 if (err == 0) {
820 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000821 PyObject *s = PyObject_Str(v);
822 /* only print colon if the str() of the
823 object is not the empty string
824 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000825 if (s == NULL)
826 err = -1;
827 else if (!PyString_Check(s) ||
828 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000829 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000830 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000831 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
832 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000833 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000834 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000835 if (err == 0)
836 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000837 }
Guido van Rossum82598051997-03-05 00:20:32 +0000838 Py_XDECREF(exception);
839 Py_XDECREF(v);
840 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000841 /* If an error happened here, don't show it.
842 XXX This is wrong, but too many callers rely on this behavior. */
843 if (err != 0)
844 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000845}
846
Guido van Rossum82598051997-03-05 00:20:32 +0000847PyObject *
848PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000849 char *str;
850 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000851 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000852{
Guido van Rossum82598051997-03-05 00:20:32 +0000853 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000854 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000855}
856
Guido van Rossum82598051997-03-05 00:20:32 +0000857PyObject *
858PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000859 FILE *fp;
860 char *filename;
861 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000862 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000863{
Guido van Rossum82598051997-03-05 00:20:32 +0000864 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000865 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000866}
867
Guido van Rossum82598051997-03-05 00:20:32 +0000868static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000869run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000870 node *n;
871 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000872 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000873{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000874 if (n == NULL)
875 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000876 return run_node(n, filename, globals, locals);
877}
878
Guido van Rossum82598051997-03-05 00:20:32 +0000879static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000880run_node(n, filename, globals, locals)
881 node *n;
882 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000883 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000884{
Guido van Rossum82598051997-03-05 00:20:32 +0000885 PyCodeObject *co;
886 PyObject *v;
887 co = PyNode_Compile(n, filename);
888 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000889 if (co == NULL)
890 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000891 v = PyEval_EvalCode(co, globals, locals);
892 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000893 return v;
894}
895
Guido van Rossum82598051997-03-05 00:20:32 +0000896static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000897run_pyc_file(fp, filename, globals, locals)
898 FILE *fp;
899 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000900 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000901{
Guido van Rossum82598051997-03-05 00:20:32 +0000902 PyCodeObject *co;
903 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000904 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000905 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000906
Guido van Rossum82598051997-03-05 00:20:32 +0000907 magic = PyMarshal_ReadLongFromFile(fp);
908 if (magic != PyImport_GetMagicNumber()) {
909 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000910 "Bad magic number in .pyc file");
911 return NULL;
912 }
Guido van Rossum82598051997-03-05 00:20:32 +0000913 (void) PyMarshal_ReadLongFromFile(fp);
914 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000915 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000916 if (v == NULL || !PyCode_Check(v)) {
917 Py_XDECREF(v);
918 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000919 "Bad code object in .pyc file");
920 return NULL;
921 }
Guido van Rossum82598051997-03-05 00:20:32 +0000922 co = (PyCodeObject *)v;
923 v = PyEval_EvalCode(co, globals, locals);
924 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000925 return v;
926}
927
Guido van Rossum82598051997-03-05 00:20:32 +0000928PyObject *
929Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000930 char *str;
931 char *filename;
932 int start;
933{
934 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000935 PyCodeObject *co;
936 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000937 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000938 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000939 co = PyNode_Compile(n, filename);
940 PyNode_Free(n);
941 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000942}
943
Guido van Rossuma110aa61994-08-29 12:50:44 +0000944/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000945
Guido van Rossuma110aa61994-08-29 12:50:44 +0000946node *
Guido van Rossum82598051997-03-05 00:20:32 +0000947PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000948 FILE *fp;
949 char *filename;
950 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000951{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000952 node *n;
953 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000954 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000955 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000956 if (n == NULL)
957 err_input(&err);
958 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000959}
960
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000962
Guido van Rossuma110aa61994-08-29 12:50:44 +0000963node *
Guido van Rossum82598051997-03-05 00:20:32 +0000964PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000965 char *str;
966 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000967{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000968 node *n;
969 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000970 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000971 if (n == NULL)
972 err_input(&err);
973 return n;
974}
975
976/* Set the error appropriate to the given input error code (see errcode.h) */
977
978static void
979err_input(err)
980 perrdetail *err;
981{
Guido van Rossum82598051997-03-05 00:20:32 +0000982 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000983 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000984 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000985 err->lineno, err->offset, err->text);
986 if (err->text != NULL) {
987 free(err->text);
988 err->text = NULL;
989 }
990 switch (err->error) {
991 case E_SYNTAX:
992 msg = "invalid syntax";
993 break;
994 case E_TOKEN:
995 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +0000996 break;
997 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000998 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +0000999 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001000 return;
1001 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001002 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001003 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001004 return;
1005 case E_EOF:
1006 msg = "unexpected EOF while parsing";
1007 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001008 case E_INDENT:
1009 msg = "inconsistent use of tabs and spaces in indentation";
1010 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001011 default:
1012 fprintf(stderr, "error=%d\n", err->error);
1013 msg = "unknown parsing error";
1014 break;
1015 }
Guido van Rossum82598051997-03-05 00:20:32 +00001016 w = Py_BuildValue("(sO)", msg, v);
1017 Py_XDECREF(v);
1018 PyErr_SetObject(PyExc_SyntaxError, w);
1019 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001020}
1021
1022/* Print fatal error message and abort */
1023
1024void
Guido van Rossum82598051997-03-05 00:20:32 +00001025Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001026 char *msg;
1027{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001028 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001029#ifdef macintosh
1030 for (;;);
1031#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001032#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001033 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001034 OutputDebugString(msg);
1035 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001036#ifdef _DEBUG
1037 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001038#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001039#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001040 abort();
1041}
1042
1043/* Clean up and exit */
1044
Guido van Rossuma110aa61994-08-29 12:50:44 +00001045#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001046#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001047int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001048#endif
1049
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001050#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001051static void (*exitfuncs[NEXITFUNCS])();
1052static int nexitfuncs = 0;
1053
1054int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001055 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001056{
1057 if (nexitfuncs >= NEXITFUNCS)
1058 return -1;
1059 exitfuncs[nexitfuncs++] = func;
1060 return 0;
1061}
1062
Guido van Rossumcc283f51997-08-05 02:22:03 +00001063static void
1064call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001065{
Guido van Rossum82598051997-03-05 00:20:32 +00001066 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001067
1068 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001069 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001070 Py_INCREF(exitfunc);
1071 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001072 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001073 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001074 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001075 if (f)
1076 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001077 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001078 }
Guido van Rossum82598051997-03-05 00:20:32 +00001079 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001080 }
1081
Guido van Rossum0829c751998-02-28 04:31:39 +00001082 if (Py_FlushLine())
1083 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001084}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001085
Guido van Rossumcc283f51997-08-05 02:22:03 +00001086static void
1087call_ll_exitfuncs()
1088{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001089 while (nexitfuncs > 0)
1090 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001091
1092 fflush(stdout);
1093 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001094}
1095
1096void
Guido van Rossum82598051997-03-05 00:20:32 +00001097Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001098 int sts;
1099{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001100 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001101
Jack Jansen66a89771995-10-27 13:22:14 +00001102#ifdef macintosh
1103 PyMac_Exit(sts);
1104#else
Guido van Rossum2c1f6be1999-01-08 15:56:28 +00001105#ifdef MS_WINDOWS
1106 win_pre_exit(sts);
1107#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001108 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001109#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001110}
1111
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001112static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001113initsigs()
1114{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001115#ifdef HAVE_SIGNAL_H
1116#ifdef SIGPIPE
1117 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001118#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001119#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001120 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001121}
1122
Guido van Rossumaae0d321996-05-22 16:35:33 +00001123#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001124/* Ask a yes/no question */
1125
Guido van Rossum59bff391992-09-03 20:28:00 +00001126int
Guido van Rossum82598051997-03-05 00:20:32 +00001127_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001128 char *prompt;
1129{
1130 char buf[256];
1131
1132 printf("%s [ny] ", prompt);
1133 if (fgets(buf, sizeof buf, stdin) == NULL)
1134 return 0;
1135 return buf[0] == 'y' || buf[0] == 'Y';
1136}
1137#endif
1138
Guido van Rossuma110aa61994-08-29 12:50:44 +00001139#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001140
1141/* Check for file descriptor connected to interactive device.
1142 Pretend that stdin is always interactive, other files never. */
1143
1144int
1145isatty(fd)
1146 int fd;
1147{
1148 return fd == fileno(stdin);
1149}
1150
1151#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001152
1153/*
1154 * The file descriptor fd is considered ``interactive'' if either
1155 * a) isatty(fd) is TRUE, or
1156 * b) the -i flag was given, and the filename associated with
1157 * the descriptor is NULL or "<stdin>" or "???".
1158 */
1159int
1160Py_FdIsInteractive(fp, filename)
1161 FILE *fp;
1162 char *filename;
1163{
1164 if (isatty((int)fileno(fp)))
1165 return 1;
1166 if (!Py_InteractiveFlag)
1167 return 0;
1168 return (filename == NULL) ||
1169 (strcmp(filename, "<stdin>") == 0) ||
1170 (strcmp(filename, "???") == 0);
1171}
Guido van Rossum2c1f6be1999-01-08 15:56:28 +00001172
1173#ifdef MS_WINDOWS
1174
1175#include <windows.h>
1176#include <conio.h>
1177
1178static int its_my_console = -1;
1179
1180static void
1181win_pre_init()
1182{
1183 HANDLE console;
1184 CONSOLE_SCREEN_BUFFER_INFO info;
1185 if (its_my_console >= 0)
1186 return;
1187 its_my_console = 0;
1188 console = GetStdHandle(STD_OUTPUT_HANDLE);
1189 if (console == INVALID_HANDLE_VALUE)
1190 return;
1191 if (!GetConsoleScreenBufferInfo(console, &info)) {
1192 return;
1193 }
1194 if (info.dwCursorPosition.Y == 0)
1195 its_my_console = 1;
1196}
1197
1198static void
1199win_pre_exit(sts)
1200 int sts;
1201{
1202 if (sts == 0)
1203 return;
1204 if (its_my_console <= 0)
1205 return;
1206 fprintf(stderr, "Hit any key to exit...");
1207 fflush(stderr);
1208 _getch();
1209}
1210
1211#endif