blob: 6948829418cfec51b393f41ddd6d30fe0bab6a02 [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__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000414 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415}
416
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000417/* Import the site module (not into __main__ though) */
418
419static void
420initsite()
421{
422 PyObject *m, *f;
423 m = PyImport_ImportModule("site");
424 if (m == NULL) {
425 f = PySys_GetObject("stderr");
426 if (Py_VerboseFlag) {
427 PyFile_WriteString(
428 "'import site' failed; traceback:\n", f);
429 PyErr_Print();
430 }
431 else {
432 PyFile_WriteString(
433 "'import site' failed; use -v for traceback\n", f);
434 PyErr_Clear();
435 }
436 }
437 else {
438 Py_DECREF(m);
439 }
440}
441
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000442/* Parse input from a file and execute it */
443
444int
Guido van Rossum82598051997-03-05 00:20:32 +0000445PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446 FILE *fp;
447 char *filename;
448{
449 if (filename == NULL)
450 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000451 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000452 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453 else
Guido van Rossum82598051997-03-05 00:20:32 +0000454 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000455}
456
457int
Guido van Rossum82598051997-03-05 00:20:32 +0000458PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459 FILE *fp;
460 char *filename;
461{
Guido van Rossum82598051997-03-05 00:20:32 +0000462 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000463 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000464 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000465 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000466 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
467 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 }
Guido van Rossum82598051997-03-05 00:20:32 +0000469 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000471 PySys_SetObject("ps2", v = PyString_FromString("... "));
472 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000473 }
474 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000475 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000476#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000477 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478#endif
479 if (ret == E_EOF)
480 return 0;
481 /*
482 if (ret == E_NOMEM)
483 return -1;
484 */
485 }
486}
487
488int
Guido van Rossum82598051997-03-05 00:20:32 +0000489PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000490 FILE *fp;
491 char *filename;
492{
Guido van Rossum82598051997-03-05 00:20:32 +0000493 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495 perrdetail err;
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000496 char *ps1 = "", *ps2 = "";
Guido van Rossum82598051997-03-05 00:20:32 +0000497 v = PySys_GetObject("ps1");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000498 if (v != NULL) {
499 v = PyObject_Str(v);
500 if (v == NULL)
501 PyErr_Clear();
502 else if (PyString_Check(v))
503 ps1 = PyString_AsString(v);
504 }
Guido van Rossum82598051997-03-05 00:20:32 +0000505 w = PySys_GetObject("ps2");
Guido van Rossumddc3fb51997-11-25 20:58:13 +0000506 if (w != NULL) {
507 w = PyObject_Str(w);
508 if (w == NULL)
509 PyErr_Clear();
510 else if (PyString_Check(w))
511 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512 }
Guido van Rossum82598051997-03-05 00:20:32 +0000513 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000514 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000515 Py_XDECREF(v);
516 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000517 if (n == NULL) {
518 if (err.error == E_EOF) {
519 if (err.text)
520 free(err.text);
521 return E_EOF;
522 }
523 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000524 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000525 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000526 }
Guido van Rossum82598051997-03-05 00:20:32 +0000527 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000528 if (m == NULL)
529 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000530 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000531 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000533 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000534 return -1;
535 }
Guido van Rossum82598051997-03-05 00:20:32 +0000536 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000537 if (Py_FlushLine())
538 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000539 return 0;
540}
541
542int
Guido van Rossum82598051997-03-05 00:20:32 +0000543PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000544 FILE *fp;
545 char *filename;
546{
Guido van Rossum82598051997-03-05 00:20:32 +0000547 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000548 char *ext;
549
Guido van Rossum82598051997-03-05 00:20:32 +0000550 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000551 if (m == NULL)
552 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000553 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000554 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000555 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000556#ifdef macintosh
557 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000558 || getfiletype(filename) == 'PYC '
559 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000560#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000561 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000562 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000563 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000564 if( (fp = fopen(filename, "rb")) == NULL ) {
565 fprintf(stderr, "python: Can't reopen .pyc file\n");
566 return -1;
567 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000568 /* Turn on optimization if a .pyo file is given */
569 if (strcmp(ext, ".pyo") == 0)
570 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000571 v = run_pyc_file(fp, filename, d, d);
572 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000573 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000574 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000575 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000576 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577 return -1;
578 }
Guido van Rossum82598051997-03-05 00:20:32 +0000579 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000580 if (Py_FlushLine())
581 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582 return 0;
583}
584
585int
Guido van Rossum82598051997-03-05 00:20:32 +0000586PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 char *command;
588{
Guido van Rossum82598051997-03-05 00:20:32 +0000589 PyObject *m, *d, *v;
590 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 if (m == NULL)
592 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000593 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000594 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000595 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000596 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000597 return -1;
598 }
Guido van Rossum82598051997-03-05 00:20:32 +0000599 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000600 if (Py_FlushLine())
601 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602 return 0;
603}
604
Barry Warsaw035574d1997-08-29 22:07:17 +0000605static int
606parse_syntax_error(err, message, filename, lineno, offset, text)
607 PyObject* err;
608 PyObject** message;
609 char** filename;
610 int* lineno;
611 int* offset;
612 char** text;
613{
614 long hold;
615 PyObject *v;
616
617 /* old style errors */
618 if (PyTuple_Check(err))
619 return PyArg_Parse(err, "(O(ziiz))", message, filename,
620 lineno, offset, text);
621
622 /* new style errors. `err' is an instance */
623
624 if (! (v = PyObject_GetAttrString(err, "msg")))
625 goto finally;
626 *message = v;
627
628 if (!(v = PyObject_GetAttrString(err, "filename")))
629 goto finally;
630 if (v == Py_None)
631 *filename = NULL;
632 else if (! (*filename = PyString_AsString(v)))
633 goto finally;
634
635 Py_DECREF(v);
636 if (!(v = PyObject_GetAttrString(err, "lineno")))
637 goto finally;
638 hold = PyInt_AsLong(v);
639 Py_DECREF(v);
640 v = NULL;
641 if (hold < 0 && PyErr_Occurred())
642 goto finally;
643 *lineno = (int)hold;
644
645 if (!(v = PyObject_GetAttrString(err, "offset")))
646 goto finally;
647 hold = PyInt_AsLong(v);
648 Py_DECREF(v);
649 v = NULL;
650 if (hold < 0 && PyErr_Occurred())
651 goto finally;
652 *offset = (int)hold;
653
654 if (!(v = PyObject_GetAttrString(err, "text")))
655 goto finally;
656 if (v == Py_None)
657 *text = NULL;
658 else if (! (*text = PyString_AsString(v)))
659 goto finally;
660 Py_DECREF(v);
661 return 1;
662
663finally:
664 Py_XDECREF(v);
665 return 0;
666}
667
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668void
Guido van Rossum82598051997-03-05 00:20:32 +0000669PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670{
Guido van Rossuma61691e1998-02-06 22:27:24 +0000671 PyErr_PrintEx(1);
672}
673
674void
675PyErr_PrintEx(set_sys_last_vars)
676 int set_sys_last_vars;
677{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000678 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000679 PyObject *exception, *v, *tb, *f;
680 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000681 PyErr_NormalizeException(&exception, &v, &tb);
682
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000683 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000684 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000685
Barry Warsaw36b8f941997-08-26 18:09:48 +0000686 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum0829c751998-02-28 04:31:39 +0000687 if (Py_FlushLine())
688 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000689 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000690 if (v == NULL || v == Py_None)
691 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000692 if (PyInstance_Check(v)) {
693 /* we expect the error code to be store in the
694 `code' attribute
695 */
696 PyObject *code = PyObject_GetAttrString(v, "code");
697 if (code) {
698 Py_DECREF(v);
699 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000700 if (v == Py_None)
701 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000702 }
703 /* if we failed to dig out the "code" attribute,
704 then just let the else clause below print the
705 error
706 */
707 }
Guido van Rossum82598051997-03-05 00:20:32 +0000708 if (PyInt_Check(v))
709 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000711 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000712 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000713 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000714 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000715 }
716 }
Guido van Rossuma61691e1998-02-06 22:27:24 +0000717 if (set_sys_last_vars) {
718 PySys_SetObject("last_type", exception);
719 PySys_SetObject("last_value", v);
720 PySys_SetObject("last_traceback", tb);
721 }
Guido van Rossum82598051997-03-05 00:20:32 +0000722 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000723 if (f == NULL)
724 fprintf(stderr, "lost sys.stderr\n");
725 else {
Guido van Rossum0829c751998-02-28 04:31:39 +0000726 if (Py_FlushLine())
727 PyErr_Clear();
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000728 fflush(stdout);
Guido van Rossum0829c751998-02-28 04:31:39 +0000729 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000730 if (err == 0 &&
731 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
732 {
Guido van Rossum82598051997-03-05 00:20:32 +0000733 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734 char *filename, *text;
735 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000736 if (!parse_syntax_error(v, &message, &filename,
737 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000738 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 else {
740 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000741 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000743 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000744 else
Guido van Rossum82598051997-03-05 00:20:32 +0000745 PyFile_WriteString(filename, f);
746 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000748 PyFile_WriteString(buf, f);
749 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000750 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000751 char *nl;
752 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000753 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000754 offset--;
755 for (;;) {
756 nl = strchr(text, '\n');
757 if (nl == NULL ||
758 nl-text >= offset)
759 break;
760 offset -= (nl+1-text);
761 text = nl+1;
762 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000763 while (*text == ' ' || *text == '\t') {
764 text++;
765 offset--;
766 }
Guido van Rossum82598051997-03-05 00:20:32 +0000767 PyFile_WriteString(" ", f);
768 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000769 if (*text == '\0' ||
770 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000771 PyFile_WriteString("\n", f);
772 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000773 offset--;
774 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000775 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000776 offset--;
777 }
Guido van Rossum82598051997-03-05 00:20:32 +0000778 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000779 }
Guido van Rossum82598051997-03-05 00:20:32 +0000780 Py_INCREF(message);
781 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000782 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000783 /* Can't be bothered to check all those
784 PyFile_WriteString() calls */
785 if (PyErr_Occurred())
786 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000787 }
788 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000789 if (err) {
790 /* Don't do anything else */
791 }
792 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000793 PyClassObject* exc = (PyClassObject*)exception;
794 PyObject* className = exc->cl_name;
795 PyObject* moduleName =
796 PyDict_GetItemString(exc->cl_dict, "__module__");
797
798 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000799 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000800 else {
801 char* modstr = PyString_AsString(moduleName);
802 if (modstr && strcmp(modstr, "exceptions"))
803 {
804 err = PyFile_WriteString(modstr, f);
805 err += PyFile_WriteString(".", f);
806 }
807 }
808 if (err == 0) {
809 if (className == NULL)
810 err = PyFile_WriteString("<unknown>", f);
811 else
812 err = PyFile_WriteObject(className, f,
813 Py_PRINT_RAW);
814 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000815 }
816 else
817 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
818 if (err == 0) {
819 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000820 PyObject *s = PyObject_Str(v);
821 /* only print colon if the str() of the
822 object is not the empty string
823 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000824 if (s == NULL)
825 err = -1;
826 else if (!PyString_Check(s) ||
827 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000828 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000829 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000830 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
831 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000832 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000833 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000834 if (err == 0)
835 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836 }
Guido van Rossum82598051997-03-05 00:20:32 +0000837 Py_XDECREF(exception);
838 Py_XDECREF(v);
839 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000840 /* If an error happened here, don't show it.
841 XXX This is wrong, but too many callers rely on this behavior. */
842 if (err != 0)
843 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000844}
845
Guido van Rossum82598051997-03-05 00:20:32 +0000846PyObject *
847PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000848 char *str;
849 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000850 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000851{
Guido van Rossum82598051997-03-05 00:20:32 +0000852 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000853 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000854}
855
Guido van Rossum82598051997-03-05 00:20:32 +0000856PyObject *
857PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000858 FILE *fp;
859 char *filename;
860 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000861 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000862{
Guido van Rossum82598051997-03-05 00:20:32 +0000863 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000864 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000865}
866
Guido van Rossum82598051997-03-05 00:20:32 +0000867static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000868run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000869 node *n;
870 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000871 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000872{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000873 if (n == NULL)
874 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000875 return run_node(n, filename, globals, locals);
876}
877
Guido van Rossum82598051997-03-05 00:20:32 +0000878static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000879run_node(n, filename, globals, locals)
880 node *n;
881 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000882 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883{
Guido van Rossum82598051997-03-05 00:20:32 +0000884 PyCodeObject *co;
885 PyObject *v;
886 co = PyNode_Compile(n, filename);
887 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000888 if (co == NULL)
889 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000890 v = PyEval_EvalCode(co, globals, locals);
891 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000892 return v;
893}
894
Guido van Rossum82598051997-03-05 00:20:32 +0000895static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000896run_pyc_file(fp, filename, globals, locals)
897 FILE *fp;
898 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000899 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000900{
Guido van Rossum82598051997-03-05 00:20:32 +0000901 PyCodeObject *co;
902 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000903 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000904 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000905
Guido van Rossum82598051997-03-05 00:20:32 +0000906 magic = PyMarshal_ReadLongFromFile(fp);
907 if (magic != PyImport_GetMagicNumber()) {
908 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000909 "Bad magic number in .pyc file");
910 return NULL;
911 }
Guido van Rossum82598051997-03-05 00:20:32 +0000912 (void) PyMarshal_ReadLongFromFile(fp);
913 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000914 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000915 if (v == NULL || !PyCode_Check(v)) {
916 Py_XDECREF(v);
917 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000918 "Bad code object in .pyc file");
919 return NULL;
920 }
Guido van Rossum82598051997-03-05 00:20:32 +0000921 co = (PyCodeObject *)v;
922 v = PyEval_EvalCode(co, globals, locals);
923 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000924 return v;
925}
926
Guido van Rossum82598051997-03-05 00:20:32 +0000927PyObject *
928Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000929 char *str;
930 char *filename;
931 int start;
932{
933 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000934 PyCodeObject *co;
935 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000936 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000937 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000938 co = PyNode_Compile(n, filename);
939 PyNode_Free(n);
940 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000941}
942
Guido van Rossuma110aa61994-08-29 12:50:44 +0000943/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000944
Guido van Rossuma110aa61994-08-29 12:50:44 +0000945node *
Guido van Rossum82598051997-03-05 00:20:32 +0000946PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000947 FILE *fp;
948 char *filename;
949 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000950{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000951 node *n;
952 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000953 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000954 (char *)0, (char *)0, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000955 if (n == NULL)
956 err_input(&err);
957 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958}
959
Guido van Rossuma110aa61994-08-29 12:50:44 +0000960/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000961
Guido van Rossuma110aa61994-08-29 12:50:44 +0000962node *
Guido van Rossum82598051997-03-05 00:20:32 +0000963PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000964 char *str;
965 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000966{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000967 node *n;
968 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000969 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000970 if (n == NULL)
971 err_input(&err);
972 return n;
973}
974
975/* Set the error appropriate to the given input error code (see errcode.h) */
976
977static void
978err_input(err)
979 perrdetail *err;
980{
Guido van Rossum82598051997-03-05 00:20:32 +0000981 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000982 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000983 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000984 err->lineno, err->offset, err->text);
985 if (err->text != NULL) {
986 free(err->text);
987 err->text = NULL;
988 }
989 switch (err->error) {
990 case E_SYNTAX:
991 msg = "invalid syntax";
992 break;
993 case E_TOKEN:
994 msg = "invalid token";
Guido van Rossuma110aa61994-08-29 12:50:44 +0000995 break;
996 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000997 PyErr_SetNone(PyExc_KeyboardInterrupt);
Barry Warsawc80baa31999-01-27 16:39:40 +0000998 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000999 return;
1000 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +00001001 PyErr_NoMemory();
Barry Warsawc80baa31999-01-27 16:39:40 +00001002 Py_XDECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +00001003 return;
1004 case E_EOF:
1005 msg = "unexpected EOF while parsing";
1006 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001007 case E_INDENT:
1008 msg = "inconsistent use of tabs and spaces in indentation";
1009 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001010 default:
1011 fprintf(stderr, "error=%d\n", err->error);
1012 msg = "unknown parsing error";
1013 break;
1014 }
Guido van Rossum82598051997-03-05 00:20:32 +00001015 w = Py_BuildValue("(sO)", msg, v);
1016 Py_XDECREF(v);
1017 PyErr_SetObject(PyExc_SyntaxError, w);
1018 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001019}
1020
1021/* Print fatal error message and abort */
1022
1023void
Guido van Rossum82598051997-03-05 00:20:32 +00001024Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001025 char *msg;
1026{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001027 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001028#ifdef macintosh
1029 for (;;);
1030#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001031#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001032 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001033 OutputDebugString(msg);
1034 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001035#ifdef _DEBUG
1036 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001037#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001038#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001039 abort();
1040}
1041
1042/* Clean up and exit */
1043
Guido van Rossuma110aa61994-08-29 12:50:44 +00001044#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001045#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001046int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001047#endif
1048
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001049#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001050static void (*exitfuncs[NEXITFUNCS])();
1051static int nexitfuncs = 0;
1052
1053int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001054 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001055{
1056 if (nexitfuncs >= NEXITFUNCS)
1057 return -1;
1058 exitfuncs[nexitfuncs++] = func;
1059 return 0;
1060}
1061
Guido van Rossumcc283f51997-08-05 02:22:03 +00001062static void
1063call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001064{
Guido van Rossum82598051997-03-05 00:20:32 +00001065 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001066
1067 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001068 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001069 Py_INCREF(exitfunc);
1070 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001071 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001072 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001073 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001074 if (f)
1075 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001076 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001077 }
Guido van Rossum82598051997-03-05 00:20:32 +00001078 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001079 }
1080
Guido van Rossum0829c751998-02-28 04:31:39 +00001081 if (Py_FlushLine())
1082 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001083}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001084
Guido van Rossumcc283f51997-08-05 02:22:03 +00001085static void
1086call_ll_exitfuncs()
1087{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001088 while (nexitfuncs > 0)
1089 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001090
1091 fflush(stdout);
1092 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001093}
1094
1095void
Guido van Rossum82598051997-03-05 00:20:32 +00001096Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001097 int sts;
1098{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001099 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001100
Jack Jansen66a89771995-10-27 13:22:14 +00001101#ifdef macintosh
1102 PyMac_Exit(sts);
1103#else
Guido van Rossum2c1f6be1999-01-08 15:56:28 +00001104#ifdef MS_WINDOWS
1105 win_pre_exit(sts);
1106#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001107 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001108#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001109}
1110
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001111static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001112initsigs()
1113{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001114#ifdef HAVE_SIGNAL_H
1115#ifdef SIGPIPE
1116 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001117#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001118#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001119 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001120}
1121
Guido van Rossumaae0d321996-05-22 16:35:33 +00001122#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001123/* Ask a yes/no question */
1124
Guido van Rossum59bff391992-09-03 20:28:00 +00001125int
Guido van Rossum82598051997-03-05 00:20:32 +00001126_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001127 char *prompt;
1128{
1129 char buf[256];
1130
1131 printf("%s [ny] ", prompt);
1132 if (fgets(buf, sizeof buf, stdin) == NULL)
1133 return 0;
1134 return buf[0] == 'y' || buf[0] == 'Y';
1135}
1136#endif
1137
Guido van Rossuma110aa61994-08-29 12:50:44 +00001138#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001139
1140/* Check for file descriptor connected to interactive device.
1141 Pretend that stdin is always interactive, other files never. */
1142
1143int
1144isatty(fd)
1145 int fd;
1146{
1147 return fd == fileno(stdin);
1148}
1149
1150#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001151
1152/*
1153 * The file descriptor fd is considered ``interactive'' if either
1154 * a) isatty(fd) is TRUE, or
1155 * b) the -i flag was given, and the filename associated with
1156 * the descriptor is NULL or "<stdin>" or "???".
1157 */
1158int
1159Py_FdIsInteractive(fp, filename)
1160 FILE *fp;
1161 char *filename;
1162{
1163 if (isatty((int)fileno(fp)))
1164 return 1;
1165 if (!Py_InteractiveFlag)
1166 return 0;
1167 return (filename == NULL) ||
1168 (strcmp(filename, "<stdin>") == 0) ||
1169 (strcmp(filename, "???") == 0);
1170}
Guido van Rossum2c1f6be1999-01-08 15:56:28 +00001171
1172#ifdef MS_WINDOWS
1173
1174#include <windows.h>
1175#include <conio.h>
1176
1177static int its_my_console = -1;
1178
1179static void
1180win_pre_init()
1181{
1182 HANDLE console;
1183 CONSOLE_SCREEN_BUFFER_INFO info;
1184 if (its_my_console >= 0)
1185 return;
1186 its_my_console = 0;
1187 console = GetStdHandle(STD_OUTPUT_HANDLE);
1188 if (console == INVALID_HANDLE_VALUE)
1189 return;
1190 if (!GetConsoleScreenBufferInfo(console, &info)) {
1191 return;
1192 }
1193 if (info.dwCursorPosition.Y == 0)
1194 its_my_console = 1;
1195}
1196
1197static void
1198win_pre_exit(sts)
1199 int sts;
1200{
1201 if (sts == 0)
1202 return;
1203 if (its_my_console <= 0)
1204 return;
1205 fprintf(stderr, "Hit any key to exit...");
1206 fflush(stderr);
1207 _getch();
1208}
1209
1210#endif