blob: bfed548674e91f35e478d0d17c22c580d2cb7d8f [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 Rossum1984f1e1992-08-04 12:41:02 +000080
Guido van Rossum25ce5661997-08-02 03:10:38 +000081static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000083/* API to access the initialized flag -- useful for eroteric use */
84
85int
86Py_IsInitialized()
87{
88 return initialized;
89}
90
Guido van Rossum25ce5661997-08-02 03:10:38 +000091/* Global initializations. Can be undone by Py_Finalize(). Don't
92 call this twice without an intervening Py_Finalize() call. When
93 initializations fail, a fatal error is issued and the function does
94 not return. On return, the first thread and interpreter state have
95 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000096
Guido van Rossum25ce5661997-08-02 03:10:38 +000097 Locking: you must hold the interpreter lock while calling this.
98 (If the lock has not yet been initialized, that's equivalent to
99 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000100
Guido van Rossum25ce5661997-08-02 03:10:38 +0000101*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102
103void
104Py_Initialize()
105{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000106 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000107 PyThreadState *tstate;
108 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000110
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000111 if (initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000112 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000113 initialized = 1;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000115 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
116 Py_DebugFlag = 1;
117 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
118 Py_VerboseFlag = 1;
119
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120 interp = PyInterpreterState_New();
121 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000123
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 tstate = PyThreadState_New(interp);
125 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127 (void) PyThreadState_Swap(tstate);
128
Guido van Rossum25ce5661997-08-02 03:10:38 +0000129 interp->modules = PyDict_New();
130 if (interp->modules == NULL)
131 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000132
Barry Warsaw035574d1997-08-29 22:07:17 +0000133 bimod = _PyBuiltin_Init_1();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134 if (bimod == NULL)
135 Py_FatalError("Py_Initialize: can't initialize __builtin__");
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000136 interp->builtins = PyModule_GetDict(bimod);
137 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000138
139 sysmod = _PySys_Init();
140 if (sysmod == NULL)
141 Py_FatalError("Py_Initialize: can't initialize sys");
142 interp->sysdict = PyModule_GetDict(sysmod);
143 Py_INCREF(interp->sysdict);
144 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000145 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000146 PyDict_SetItemString(interp->sysdict, "modules",
147 interp->modules);
148
Barry Warsaw035574d1997-08-29 22:07:17 +0000149 /* phase 2 of builtins */
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000150 _PyBuiltin_Init_2(interp->builtins);
Barry Warsaw963b8711997-09-18 16:42:02 +0000151 _PyImport_FixupExtension("__builtin__", "__builtin__");
Barry Warsaw035574d1997-08-29 22:07:17 +0000152
Guido van Rossum25ce5661997-08-02 03:10:38 +0000153 _PyImport_Init();
154
155 initsigs(); /* Signal handling stuff, including initintr() */
156
157 initmain(); /* Module __main__ */
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000158 if (!Py_NoSiteFlag)
159 initsite(); /* Module site */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160}
161
162/* Undo the effect of Py_Initialize().
163
164 Beware: if multiple interpreter and/or thread states exist, these
165 are not wiped out; only the current thread and interpreter state
166 are deleted. But since everything else is deleted, those other
167 interpreter and thread states should no longer be used.
168
169 (XXX We should do better, e.g. wipe out all interpreters and
170 threads.)
171
172 Locking: as above.
173
174*/
175
176void
177Py_Finalize()
178{
179 PyInterpreterState *interp;
180 PyThreadState *tstate;
181
Guido van Rossumcc283f51997-08-05 02:22:03 +0000182 call_sys_exitfunc();
183
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000184 if (!initialized)
Guido van Rossumaa615051997-08-20 22:40:18 +0000185 return;
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000186 initialized = 0;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000187
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000188 /* Get current thread state and interpreter pointer */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000189 tstate = PyThreadState_Get();
190 interp = tstate->interp;
191
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000192 /* Disable signal handling */
193 PyOS_FiniInterrupts();
194
195 /* Destroy PyExc_MemoryErrorInst */
196 _PyBuiltin_Fini_1();
197
198 /* Destroy all modules */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000199 PyImport_Cleanup();
Guido van Rossum3a44e1b1997-11-03 21:58:47 +0000200
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000201 /* Delete current thread */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000202 PyInterpreterState_Clear(interp);
203 PyThreadState_Swap(NULL);
204 PyInterpreterState_Delete(interp);
205
Guido van Rossum25ce5661997-08-02 03:10:38 +0000206 _PyImport_Fini();
Barry Warsaw035574d1997-08-29 22:07:17 +0000207
208 /* Now we decref the exception classes. After this point nothing
209 can raise an exception. That's okay, because each Fini() method
210 below has been checked to make sure no exceptions are ever
211 raised.
212 */
213 _PyBuiltin_Fini_2();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000214 PyMethod_Fini();
215 PyFrame_Fini();
216 PyCFunction_Fini();
217 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000218 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000219 PyInt_Fini();
220 PyFloat_Fini();
221
222 /* XXX Still allocated:
223 - various static ad-hoc pointers to interned strings
224 - int and float free list blocks
225 - whatever various modules and libraries allocate
226 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000227
228 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000229
230 call_ll_exitfuncs();
231
232#ifdef COUNT_ALLOCS
233 dump_counts();
234#endif
235
236#ifdef Py_REF_DEBUG
237 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
238#endif
239
240#ifdef Py_TRACE_REFS
241 if (_Py_AskYesNo("Print left references?")) {
242 _Py_PrintReferences(stderr);
243 }
244 _Py_ResetReferences();
245#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000246}
247
248/* Create and initialize a new interpreter and thread, and return the
249 new thread. This requires that Py_Initialize() has been called
250 first.
251
252 Unsuccessful initialization yields a NULL pointer. Note that *no*
253 exception information is available even in this case -- the
254 exception information is held in the thread, and there is no
255 thread.
256
257 Locking: as above.
258
259*/
260
261PyThreadState *
262Py_NewInterpreter()
263{
264 PyInterpreterState *interp;
265 PyThreadState *tstate, *save_tstate;
266 PyObject *bimod, *sysmod;
267
268 if (!initialized)
269 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
270
271 interp = PyInterpreterState_New();
272 if (interp == NULL)
273 return NULL;
274
275 tstate = PyThreadState_New(interp);
276 if (tstate == NULL) {
277 PyInterpreterState_Delete(interp);
278 return NULL;
279 }
280
281 save_tstate = PyThreadState_Swap(tstate);
282
283 /* XXX The following is lax in error checking */
284
285 interp->modules = PyDict_New();
286
287 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
288 if (bimod != NULL) {
Guido van Rossum4a1f39a1997-11-04 19:36:18 +0000289 interp->builtins = PyModule_GetDict(bimod);
290 Py_INCREF(interp->builtins);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291 }
292 sysmod = _PyImport_FindExtension("sys", "sys");
293 if (bimod != NULL && sysmod != NULL) {
294 interp->sysdict = PyModule_GetDict(sysmod);
295 Py_INCREF(interp->sysdict);
296 PySys_SetPath(Py_GetPath());
297 PyDict_SetItemString(interp->sysdict, "modules",
298 interp->modules);
299 initmain();
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000300 if (!Py_NoSiteFlag)
301 initsite();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000302 }
303
304 if (!PyErr_Occurred())
305 return tstate;
306
307 /* Oops, it didn't work. Undo it all. */
308
309 PyErr_Print();
310 PyThreadState_Clear(tstate);
311 PyThreadState_Swap(save_tstate);
312 PyThreadState_Delete(tstate);
313 PyInterpreterState_Delete(interp);
314
315 return NULL;
316}
317
318/* Delete an interpreter and its last thread. This requires that the
319 given thread state is current, that the thread has no remaining
320 frames, and that it is its interpreter's only remaining thread.
321 It is a fatal error to violate these constraints.
322
323 (Py_Finalize() doesn't have these constraints -- it zaps
324 everything, regardless.)
325
326 Locking: as above.
327
328*/
329
330void
331Py_EndInterpreter(tstate)
332 PyThreadState *tstate;
333{
334 PyInterpreterState *interp = tstate->interp;
335
336 if (tstate != PyThreadState_Get())
337 Py_FatalError("Py_EndInterpreter: thread is not current");
338 if (tstate->frame != NULL)
339 Py_FatalError("Py_EndInterpreter: thread still has a frame");
340 if (tstate != interp->tstate_head || tstate->next != NULL)
341 Py_FatalError("Py_EndInterpreter: not the last thread");
342
343 PyImport_Cleanup();
344 PyInterpreterState_Clear(interp);
345 PyThreadState_Swap(NULL);
346 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000347}
348
349static char *progname = "python";
350
351void
352Py_SetProgramName(pn)
353 char *pn;
354{
355 if (pn && *pn)
356 progname = pn;
357}
358
359char *
360Py_GetProgramName()
361{
362 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000363}
364
Guido van Rossum6135a871995-01-09 17:53:26 +0000365/* Create __main__ module */
366
367static void
368initmain()
369{
Guido van Rossum82598051997-03-05 00:20:32 +0000370 PyObject *m, *d;
371 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000372 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000373 Py_FatalError("can't create __main__ module");
374 d = PyModule_GetDict(m);
375 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
Guido van Rossum858cb731997-11-19 16:15:37 +0000376 PyObject *bimod = PyImport_ImportModule("__builtin__");
377 if (bimod == NULL ||
378 PyDict_SetItemString(d, "__builtins__", bimod) != 0)
Guido van Rossum82598051997-03-05 00:20:32 +0000379 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000380 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381}
382
Guido van Rossumdcc0c131997-08-29 22:32:42 +0000383/* Import the site module (not into __main__ though) */
384
385static void
386initsite()
387{
388 PyObject *m, *f;
389 m = PyImport_ImportModule("site");
390 if (m == NULL) {
391 f = PySys_GetObject("stderr");
392 if (Py_VerboseFlag) {
393 PyFile_WriteString(
394 "'import site' failed; traceback:\n", f);
395 PyErr_Print();
396 }
397 else {
398 PyFile_WriteString(
399 "'import site' failed; use -v for traceback\n", f);
400 PyErr_Clear();
401 }
402 }
403 else {
404 Py_DECREF(m);
405 }
406}
407
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000408/* Parse input from a file and execute it */
409
410int
Guido van Rossum82598051997-03-05 00:20:32 +0000411PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 FILE *fp;
413 char *filename;
414{
415 if (filename == NULL)
416 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000417 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000418 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000419 else
Guido van Rossum82598051997-03-05 00:20:32 +0000420 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421}
422
423int
Guido van Rossum82598051997-03-05 00:20:32 +0000424PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000425 FILE *fp;
426 char *filename;
427{
Guido van Rossum82598051997-03-05 00:20:32 +0000428 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000429 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000430 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000432 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
433 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 }
Guido van Rossum82598051997-03-05 00:20:32 +0000435 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000436 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000437 PySys_SetObject("ps2", v = PyString_FromString("... "));
438 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439 }
440 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000441 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000442#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000443 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000444#endif
445 if (ret == E_EOF)
446 return 0;
447 /*
448 if (ret == E_NOMEM)
449 return -1;
450 */
451 }
452}
453
454int
Guido van Rossum82598051997-03-05 00:20:32 +0000455PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456 FILE *fp;
457 char *filename;
458{
Guido van Rossum82598051997-03-05 00:20:32 +0000459 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000461 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000462 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000463 v = PySys_GetObject("ps1");
464 w = PySys_GetObject("ps2");
465 if (v != NULL && PyString_Check(v)) {
466 Py_INCREF(v);
467 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000468 }
469 else {
470 v = NULL;
471 ps1 = "";
472 }
Guido van Rossum82598051997-03-05 00:20:32 +0000473 if (w != NULL && PyString_Check(w)) {
474 Py_INCREF(w);
475 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000476 }
477 else {
478 w = NULL;
479 ps2 = "";
480 }
Guido van Rossum82598051997-03-05 00:20:32 +0000481 Py_BEGIN_ALLOW_THREADS
482 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000483 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000484 Py_END_ALLOW_THREADS
485 Py_XDECREF(v);
486 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000487 if (n == NULL) {
488 if (err.error == E_EOF) {
489 if (err.text)
490 free(err.text);
491 return E_EOF;
492 }
493 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000494 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496 }
Guido van Rossum82598051997-03-05 00:20:32 +0000497 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000498 if (m == NULL)
499 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000500 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000501 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000503 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000504 return -1;
505 }
Guido van Rossum82598051997-03-05 00:20:32 +0000506 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000507 if (Py_FlushLine())
508 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 return 0;
510}
511
512int
Guido van Rossum82598051997-03-05 00:20:32 +0000513PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000514 FILE *fp;
515 char *filename;
516{
Guido van Rossum82598051997-03-05 00:20:32 +0000517 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000518 char *ext;
519
Guido van Rossum82598051997-03-05 00:20:32 +0000520 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000521 if (m == NULL)
522 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000523 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000524 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000525 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000526#ifdef macintosh
527 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000528 || getfiletype(filename) == 'PYC '
529 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000530#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000531 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000532 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000533 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000534 if( (fp = fopen(filename, "rb")) == NULL ) {
535 fprintf(stderr, "python: Can't reopen .pyc file\n");
536 return -1;
537 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000538 /* Turn on optimization if a .pyo file is given */
539 if (strcmp(ext, ".pyo") == 0)
540 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000541 v = run_pyc_file(fp, filename, d, d);
542 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000543 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000544 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000546 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000547 return -1;
548 }
Guido van Rossum82598051997-03-05 00:20:32 +0000549 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000550 if (Py_FlushLine())
551 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552 return 0;
553}
554
555int
Guido van Rossum82598051997-03-05 00:20:32 +0000556PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000557 char *command;
558{
Guido van Rossum82598051997-03-05 00:20:32 +0000559 PyObject *m, *d, *v;
560 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000561 if (m == NULL)
562 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000563 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000564 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000565 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000566 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000567 return -1;
568 }
Guido van Rossum82598051997-03-05 00:20:32 +0000569 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000570 if (Py_FlushLine())
571 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 return 0;
573}
574
Barry Warsaw035574d1997-08-29 22:07:17 +0000575static int
576parse_syntax_error(err, message, filename, lineno, offset, text)
577 PyObject* err;
578 PyObject** message;
579 char** filename;
580 int* lineno;
581 int* offset;
582 char** text;
583{
584 long hold;
585 PyObject *v;
586
587 /* old style errors */
588 if (PyTuple_Check(err))
589 return PyArg_Parse(err, "(O(ziiz))", message, filename,
590 lineno, offset, text);
591
592 /* new style errors. `err' is an instance */
593
594 if (! (v = PyObject_GetAttrString(err, "msg")))
595 goto finally;
596 *message = v;
597
598 if (!(v = PyObject_GetAttrString(err, "filename")))
599 goto finally;
600 if (v == Py_None)
601 *filename = NULL;
602 else if (! (*filename = PyString_AsString(v)))
603 goto finally;
604
605 Py_DECREF(v);
606 if (!(v = PyObject_GetAttrString(err, "lineno")))
607 goto finally;
608 hold = PyInt_AsLong(v);
609 Py_DECREF(v);
610 v = NULL;
611 if (hold < 0 && PyErr_Occurred())
612 goto finally;
613 *lineno = (int)hold;
614
615 if (!(v = PyObject_GetAttrString(err, "offset")))
616 goto finally;
617 hold = PyInt_AsLong(v);
618 Py_DECREF(v);
619 v = NULL;
620 if (hold < 0 && PyErr_Occurred())
621 goto finally;
622 *offset = (int)hold;
623
624 if (!(v = PyObject_GetAttrString(err, "text")))
625 goto finally;
626 if (v == Py_None)
627 *text = NULL;
628 else if (! (*text = PyString_AsString(v)))
629 goto finally;
630 Py_DECREF(v);
631 return 1;
632
633finally:
634 Py_XDECREF(v);
635 return 0;
636}
637
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638void
Guido van Rossum82598051997-03-05 00:20:32 +0000639PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000640{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000641 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000642 PyObject *exception, *v, *tb, *f;
643 PyErr_Fetch(&exception, &v, &tb);
Barry Warsaw035574d1997-08-29 22:07:17 +0000644 PyErr_NormalizeException(&exception, &v, &tb);
645
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000647 return;
Barry Warsaw035574d1997-08-29 22:07:17 +0000648
Barry Warsaw36b8f941997-08-26 18:09:48 +0000649 if (PyErr_GivenExceptionMatches(exception, PyExc_SystemExit)) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000650 err = Py_FlushLine();
651 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000652 if (v == NULL || v == Py_None)
653 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000654 if (PyInstance_Check(v)) {
655 /* we expect the error code to be store in the
656 `code' attribute
657 */
658 PyObject *code = PyObject_GetAttrString(v, "code");
659 if (code) {
660 Py_DECREF(v);
661 v = code;
Guido van Rossumaa9606f1997-10-03 13:53:28 +0000662 if (v == Py_None)
663 Py_Exit(0);
Barry Warsaw035574d1997-08-29 22:07:17 +0000664 }
665 /* if we failed to dig out the "code" attribute,
666 then just let the else clause below print the
667 error
668 */
669 }
Guido van Rossum82598051997-03-05 00:20:32 +0000670 if (PyInt_Check(v))
671 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000673 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000674 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000676 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 }
678 }
Guido van Rossum82598051997-03-05 00:20:32 +0000679 PySys_SetObject("last_type", exception);
680 PySys_SetObject("last_value", v);
681 PySys_SetObject("last_traceback", tb);
682 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000683 if (f == NULL)
684 fprintf(stderr, "lost sys.stderr\n");
685 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000686 err = Py_FlushLine();
687 fflush(stdout);
688 if (err == 0)
689 err = PyTraceBack_Print(tb, f);
Barry Warsaw36b8f941997-08-26 18:09:48 +0000690 if (err == 0 &&
691 PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError))
692 {
Guido van Rossum82598051997-03-05 00:20:32 +0000693 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694 char *filename, *text;
695 int lineno, offset;
Barry Warsaw035574d1997-08-29 22:07:17 +0000696 if (!parse_syntax_error(v, &message, &filename,
697 &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000698 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699 else {
700 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000701 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000702 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000704 else
Guido van Rossum82598051997-03-05 00:20:32 +0000705 PyFile_WriteString(filename, f);
706 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000707 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000708 PyFile_WriteString(buf, f);
709 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000710 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000711 char *nl;
712 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000713 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000714 offset--;
715 for (;;) {
716 nl = strchr(text, '\n');
717 if (nl == NULL ||
718 nl-text >= offset)
719 break;
720 offset -= (nl+1-text);
721 text = nl+1;
722 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000723 while (*text == ' ' || *text == '\t') {
724 text++;
725 offset--;
726 }
Guido van Rossum82598051997-03-05 00:20:32 +0000727 PyFile_WriteString(" ", f);
728 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000729 if (*text == '\0' ||
730 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000731 PyFile_WriteString("\n", f);
732 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733 offset--;
734 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000735 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000736 offset--;
737 }
Guido van Rossum82598051997-03-05 00:20:32 +0000738 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739 }
Guido van Rossum82598051997-03-05 00:20:32 +0000740 Py_INCREF(message);
741 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000742 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000743 /* Can't be bothered to check all those
744 PyFile_WriteString() calls */
745 if (PyErr_Occurred())
746 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747 }
748 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000749 if (err) {
750 /* Don't do anything else */
751 }
752 else if (PyClass_Check(exception)) {
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000753 PyClassObject* exc = (PyClassObject*)exception;
754 PyObject* className = exc->cl_name;
755 PyObject* moduleName =
756 PyDict_GetItemString(exc->cl_dict, "__module__");
757
758 if (moduleName == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000759 err = PyFile_WriteString("<unknown>", f);
Barry Warsaw2f5f6a21997-09-16 21:42:03 +0000760 else {
761 char* modstr = PyString_AsString(moduleName);
762 if (modstr && strcmp(modstr, "exceptions"))
763 {
764 err = PyFile_WriteString(modstr, f);
765 err += PyFile_WriteString(".", f);
766 }
767 }
768 if (err == 0) {
769 if (className == NULL)
770 err = PyFile_WriteString("<unknown>", f);
771 else
772 err = PyFile_WriteObject(className, f,
773 Py_PRINT_RAW);
774 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000775 }
776 else
777 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
778 if (err == 0) {
779 if (v != NULL && v != Py_None) {
Barry Warsaw035574d1997-08-29 22:07:17 +0000780 PyObject *s = PyObject_Str(v);
781 /* only print colon if the str() of the
782 object is not the empty string
783 */
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000784 if (s == NULL)
785 err = -1;
786 else if (!PyString_Check(s) ||
787 PyString_GET_SIZE(s) != 0)
Barry Warsaw035574d1997-08-29 22:07:17 +0000788 err = PyFile_WriteString(": ", f);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000789 if (err == 0)
Guido van Rossumd6bf45b1997-09-05 19:11:53 +0000790 err = PyFile_WriteObject(s, f, Py_PRINT_RAW);
791 Py_XDECREF(s);
Guido van Rossum262e1241995-02-07 15:30:45 +0000792 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000793 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000794 if (err == 0)
795 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000796 }
Guido van Rossum82598051997-03-05 00:20:32 +0000797 Py_XDECREF(exception);
798 Py_XDECREF(v);
799 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000800 /* If an error happened here, don't show it.
801 XXX This is wrong, but too many callers rely on this behavior. */
802 if (err != 0)
803 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000804}
805
Guido van Rossum82598051997-03-05 00:20:32 +0000806PyObject *
807PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000808 char *str;
809 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000810 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000811{
Guido van Rossum82598051997-03-05 00:20:32 +0000812 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000813 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000814}
815
Guido van Rossum82598051997-03-05 00:20:32 +0000816PyObject *
817PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000818 FILE *fp;
819 char *filename;
820 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000821 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000822{
Guido van Rossum82598051997-03-05 00:20:32 +0000823 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000824 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000825}
826
Guido van Rossum82598051997-03-05 00:20:32 +0000827static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000828run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000829 node *n;
830 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000831 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000832{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000833 if (n == NULL)
834 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000835 return run_node(n, filename, globals, locals);
836}
837
Guido van Rossum82598051997-03-05 00:20:32 +0000838static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000839run_node(n, filename, globals, locals)
840 node *n;
841 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000842 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000843{
Guido van Rossum82598051997-03-05 00:20:32 +0000844 PyCodeObject *co;
845 PyObject *v;
846 co = PyNode_Compile(n, filename);
847 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000848 if (co == NULL)
849 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000850 v = PyEval_EvalCode(co, globals, locals);
851 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000852 return v;
853}
854
Guido van Rossum82598051997-03-05 00:20:32 +0000855static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000856run_pyc_file(fp, filename, globals, locals)
857 FILE *fp;
858 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000859 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000860{
Guido van Rossum82598051997-03-05 00:20:32 +0000861 PyCodeObject *co;
862 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000863 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000864 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000865
Guido van Rossum82598051997-03-05 00:20:32 +0000866 magic = PyMarshal_ReadLongFromFile(fp);
867 if (magic != PyImport_GetMagicNumber()) {
868 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000869 "Bad magic number in .pyc file");
870 return NULL;
871 }
Guido van Rossum82598051997-03-05 00:20:32 +0000872 (void) PyMarshal_ReadLongFromFile(fp);
873 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000874 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000875 if (v == NULL || !PyCode_Check(v)) {
876 Py_XDECREF(v);
877 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000878 "Bad code object in .pyc file");
879 return NULL;
880 }
Guido van Rossum82598051997-03-05 00:20:32 +0000881 co = (PyCodeObject *)v;
882 v = PyEval_EvalCode(co, globals, locals);
883 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000884 return v;
885}
886
Guido van Rossum82598051997-03-05 00:20:32 +0000887PyObject *
888Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000889 char *str;
890 char *filename;
891 int start;
892{
893 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000894 PyCodeObject *co;
895 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000896 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000897 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000898 co = PyNode_Compile(n, filename);
899 PyNode_Free(n);
900 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000901}
902
Guido van Rossuma110aa61994-08-29 12:50:44 +0000903/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904
Guido van Rossuma110aa61994-08-29 12:50:44 +0000905node *
Guido van Rossum82598051997-03-05 00:20:32 +0000906PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000907 FILE *fp;
908 char *filename;
909 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000910{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000911 node *n;
912 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000913 Py_BEGIN_ALLOW_THREADS
914 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000915 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000916 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000917 if (n == NULL)
918 err_input(&err);
919 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000920}
921
Guido van Rossuma110aa61994-08-29 12:50:44 +0000922/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000923
Guido van Rossuma110aa61994-08-29 12:50:44 +0000924node *
Guido van Rossum82598051997-03-05 00:20:32 +0000925PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000926 char *str;
927 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000928{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000929 node *n;
930 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000931 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000932 if (n == NULL)
933 err_input(&err);
934 return n;
935}
936
937/* Set the error appropriate to the given input error code (see errcode.h) */
938
939static void
940err_input(err)
941 perrdetail *err;
942{
Guido van Rossum82598051997-03-05 00:20:32 +0000943 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000944 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000945 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000946 err->lineno, err->offset, err->text);
947 if (err->text != NULL) {
948 free(err->text);
949 err->text = NULL;
950 }
951 switch (err->error) {
952 case E_SYNTAX:
953 msg = "invalid syntax";
954 break;
955 case E_TOKEN:
956 msg = "invalid token";
957
958 break;
959 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000960 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000961 return;
962 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000963 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964 return;
965 case E_EOF:
966 msg = "unexpected EOF while parsing";
967 break;
968 default:
969 fprintf(stderr, "error=%d\n", err->error);
970 msg = "unknown parsing error";
971 break;
972 }
Guido van Rossum82598051997-03-05 00:20:32 +0000973 w = Py_BuildValue("(sO)", msg, v);
974 Py_XDECREF(v);
975 PyErr_SetObject(PyExc_SyntaxError, w);
976 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000977}
978
979/* Print fatal error message and abort */
980
981void
Guido van Rossum82598051997-03-05 00:20:32 +0000982Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000983 char *msg;
984{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000985 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000986#ifdef macintosh
987 for (;;);
988#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000989#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000990 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000991 OutputDebugString(msg);
992 OutputDebugString("\n");
993#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000994 abort();
995}
996
997/* Clean up and exit */
998
Guido van Rossuma110aa61994-08-29 12:50:44 +0000999#ifdef WITH_THREAD
1000#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +00001001int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +00001002#endif
1003
Guido van Rossum1662dd51994-09-07 14:38:28 +00001004#define NEXITFUNCS 32
1005static void (*exitfuncs[NEXITFUNCS])();
1006static int nexitfuncs = 0;
1007
1008int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +00001009 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +00001010{
1011 if (nexitfuncs >= NEXITFUNCS)
1012 return -1;
1013 exitfuncs[nexitfuncs++] = func;
1014 return 0;
1015}
1016
Guido van Rossumcc283f51997-08-05 02:22:03 +00001017static void
1018call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001019{
Guido van Rossum82598051997-03-05 00:20:32 +00001020 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +00001021
1022 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +00001023 PyObject *res;
1024 Py_INCREF(exitfunc);
1025 PySys_SetObject("exitfunc", (PyObject *)NULL);
1026 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +00001027 if (res == NULL) {
1028 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +00001029 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +00001030 }
Guido van Rossum82598051997-03-05 00:20:32 +00001031 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +00001032 }
1033
Guido van Rossum82598051997-03-05 00:20:32 +00001034 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +00001035}
Guido van Rossum1662dd51994-09-07 14:38:28 +00001036
Guido van Rossumcc283f51997-08-05 02:22:03 +00001037static void
1038call_ll_exitfuncs()
1039{
Guido van Rossum1662dd51994-09-07 14:38:28 +00001040 while (nexitfuncs > 0)
1041 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +00001042
1043 fflush(stdout);
1044 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001045}
1046
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001047#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +00001048extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +00001049#endif
1050
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001051void
Guido van Rossum82598051997-03-05 00:20:32 +00001052Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001053 int sts;
1054{
Guido van Rossumcc283f51997-08-05 02:22:03 +00001055 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001056
Jack Jansen66a89771995-10-27 13:22:14 +00001057#ifdef macintosh
1058 PyMac_Exit(sts);
1059#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001060 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +00001061#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001062}
1063
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001064static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001065initsigs()
1066{
Guido van Rossuma110aa61994-08-29 12:50:44 +00001067#ifdef HAVE_SIGNAL_H
1068#ifdef SIGPIPE
1069 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001070#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +00001071#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +00001072 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001073}
1074
Guido van Rossumaae0d321996-05-22 16:35:33 +00001075#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001076/* Ask a yes/no question */
1077
Guido van Rossum59bff391992-09-03 20:28:00 +00001078int
Guido van Rossum82598051997-03-05 00:20:32 +00001079_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001080 char *prompt;
1081{
1082 char buf[256];
1083
1084 printf("%s [ny] ", prompt);
1085 if (fgets(buf, sizeof buf, stdin) == NULL)
1086 return 0;
1087 return buf[0] == 'y' || buf[0] == 'Y';
1088}
1089#endif
1090
Guido van Rossuma110aa61994-08-29 12:50:44 +00001091#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001092
1093/* Check for file descriptor connected to interactive device.
1094 Pretend that stdin is always interactive, other files never. */
1095
1096int
1097isatty(fd)
1098 int fd;
1099{
1100 return fd == fileno(stdin);
1101}
1102
1103#endif
Guido van Rossum7433b121997-02-14 19:45:36 +00001104
1105/*
1106 * The file descriptor fd is considered ``interactive'' if either
1107 * a) isatty(fd) is TRUE, or
1108 * b) the -i flag was given, and the filename associated with
1109 * the descriptor is NULL or "<stdin>" or "???".
1110 */
1111int
1112Py_FdIsInteractive(fp, filename)
1113 FILE *fp;
1114 char *filename;
1115{
1116 if (isatty((int)fileno(fp)))
1117 return 1;
1118 if (!Py_InteractiveFlag)
1119 return 0;
1120 return (filename == NULL) ||
1121 (strcmp(filename, "<stdin>") == 0) ||
1122 (strcmp(filename, "???") == 0);
1123}