blob: 78c56247fac464610703df613cdd6bbf56919f3d [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";
995
996 break;
997 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000998 PyErr_SetNone(PyExc_KeyboardInterrupt);
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();
Guido van Rossuma110aa61994-08-29 12:50:44 +00001002 return;
1003 case E_EOF:
1004 msg = "unexpected EOF while parsing";
1005 break;
Guido van Rossum560e8ad1998-04-10 19:43:42 +00001006 case E_INDENT:
1007 msg = "inconsistent use of tabs and spaces in indentation";
1008 break;
Guido van Rossuma110aa61994-08-29 12:50:44 +00001009 default:
1010 fprintf(stderr, "error=%d\n", err->error);
1011 msg = "unknown parsing error";
1012 break;
1013 }
Guido van Rossum82598051997-03-05 00:20:32 +00001014 w = Py_BuildValue("(sO)", msg, v);
1015 Py_XDECREF(v);
1016 PyErr_SetObject(PyExc_SyntaxError, w);
1017 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001018}
1019
1020/* Print fatal error message and abort */
1021
1022void
Guido van Rossum82598051997-03-05 00:20:32 +00001023Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001024 char *msg;
1025{
Guido van Rossum83dd6c31994-09-29 09:38:33 +00001026 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +00001027#ifdef macintosh
1028 for (;;);
1029#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +00001030#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +00001031 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +00001032 OutputDebugString(msg);
1033 OutputDebugString("\n");
Guido van Rossum0ba35361998-08-13 13:33:16 +00001034#ifdef _DEBUG
1035 DebugBreak();
Guido van Rossuma44823b1995-03-14 15:01:17 +00001036#endif
Guido van Rossum0ba35361998-08-13 13:33:16 +00001037#endif /* MS_WIN32 */
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001038 abort();
1039}
1040
1041/* Clean up and exit */
1042
Guido van Rossuma110aa61994-08-29 12:50:44 +00001043#ifdef WITH_THREAD
Guido van Rossum49b56061998-10-01 20:42:43 +00001044#include "pythread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001045int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001046#endif
1047
Guido van Rossum2dcfc961998-10-01 16:01:57 +00001048#define NEXITFUNCS 32
Guido van Rossum1662dd51994-09-07 14:38:28 +00001049static void (*exitfuncs[NEXITFUNCS])();
1050static int nexitfuncs = 0;
1051
1052int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001053 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001054{
1055 if (nexitfuncs >= NEXITFUNCS)
1056 return -1;
1057 exitfuncs[nexitfuncs++] = func;
1058 return 0;
1059}
1060
Guido van Rossumcc283f51997-08-05 02:22:03 +00001061static void
1062call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001063{
Guido van Rossum82598051997-03-05 00:20:32 +00001064 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001065
1066 if (exitfunc) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001067 PyObject *res, *f;
Guido van Rossum82598051997-03-05 00:20:32 +00001068 Py_INCREF(exitfunc);
1069 PySys_SetObject("exitfunc", (PyObject *)NULL);
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001070 f = PySys_GetObject("stderr");
Guido van Rossum82598051997-03-05 00:20:32 +00001071 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001072 if (res == NULL) {
Guido van Rossumbf02fb21998-04-03 21:12:12 +00001073 if (f)
1074 PyFile_WriteString("Error in sys.exitfunc:\n", f);
Guido van Rossum82598051997-03-05 00:20:32 +00001075 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001076 }
Guido van Rossum82598051997-03-05 00:20:32 +00001077 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001078 }
1079
Guido van Rossum0829c751998-02-28 04:31:39 +00001080 if (Py_FlushLine())
1081 PyErr_Clear();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001082}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001083
Guido van Rossumcc283f51997-08-05 02:22:03 +00001084static void
1085call_ll_exitfuncs()
1086{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001087 while (nexitfuncs > 0)
1088 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001089
1090 fflush(stdout);
1091 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001092}
1093
1094void
Guido van Rossum82598051997-03-05 00:20:32 +00001095Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001096 int sts;
1097{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001098 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001099
Jack Jansen66a89771995-10-27 13:22:14 +00001100#ifdef macintosh
1101 PyMac_Exit(sts);
1102#else
Guido van Rossum2c1f6be1999-01-08 15:56:28 +00001103#ifdef MS_WINDOWS
1104 win_pre_exit(sts);
1105#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001106 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001107#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001108}
1109
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001110static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001111initsigs()
1112{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001113#ifdef HAVE_SIGNAL_H
1114#ifdef SIGPIPE
1115 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001116#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001117#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001118 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001119}
1120
Guido van Rossumaae0d321996-05-22 16:35:33 +00001121#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001122/* Ask a yes/no question */
1123
Guido van Rossum59bff391992-09-03 20:28:00 +00001124int
Guido van Rossum82598051997-03-05 00:20:32 +00001125_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001126 char *prompt;
1127{
1128 char buf[256];
1129
1130 printf("%s [ny] ", prompt);
1131 if (fgets(buf, sizeof buf, stdin) == NULL)
1132 return 0;
1133 return buf[0] == 'y' || buf[0] == 'Y';
1134}
1135#endif
1136
Guido van Rossuma110aa61994-08-29 12:50:44 +00001137#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001138
1139/* Check for file descriptor connected to interactive device.
1140 Pretend that stdin is always interactive, other files never. */
1141
1142int
1143isatty(fd)
1144 int fd;
1145{
1146 return fd == fileno(stdin);
1147}
1148
1149#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001150
1151/*
1152 * The file descriptor fd is considered ``interactive'' if either
1153 * a) isatty(fd) is TRUE, or
1154 * b) the -i flag was given, and the filename associated with
1155 * the descriptor is NULL or "<stdin>" or "???".
1156 */
1157int
1158Py_FdIsInteractive(fp, filename)
1159 FILE *fp;
1160 char *filename;
1161{
1162 if (isatty((int)fileno(fp)))
1163 return 1;
1164 if (!Py_InteractiveFlag)
1165 return 0;
1166 return (filename == NULL) ||
1167 (strcmp(filename, "<stdin>") == 0) ||
1168 (strcmp(filename, "???") == 0);
1169}
Guido van Rossum2c1f6be1999-01-08 15:56:28 +00001170
1171#ifdef MS_WINDOWS
1172
1173#include <windows.h>
1174#include <conio.h>
1175
1176static int its_my_console = -1;
1177
1178static void
1179win_pre_init()
1180{
1181 HANDLE console;
1182 CONSOLE_SCREEN_BUFFER_INFO info;
1183 if (its_my_console >= 0)
1184 return;
1185 its_my_console = 0;
1186 console = GetStdHandle(STD_OUTPUT_HANDLE);
1187 if (console == INVALID_HANDLE_VALUE)
1188 return;
1189 if (!GetConsoleScreenBufferInfo(console, &info)) {
1190 return;
1191 }
1192 if (info.dwCursorPosition.Y == 0)
1193 its_my_console = 1;
1194}
1195
1196static void
1197win_pre_exit(sts)
1198 int sts;
1199{
1200 if (sts == 0)
1201 return;
1202 if (its_my_console <= 0)
1203 return;
1204 fprintf(stderr, "Hit any key to exit...");
1205 fflush(stderr);
1206 _getch();
1207}
1208
1209#endif