blob: 4d6b918bffee4187cc7ca4c45d38054655e6dfb3 [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"
39#include "graminit.h"
Guido van Rossumbefa14f1995-09-18 21:42:42 +000040#undef argument /* Avoid conflict on Mac */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000042#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000043#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000044#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000045
Guido van Rossum80bb9651996-12-05 23:27:02 +000046#ifdef HAVE_UNISTD_H
47#include <unistd.h>
48#endif
49
Guido van Rossuma110aa61994-08-29 12:50:44 +000050#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000051#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000052#endif
53
Guido van Rossum9b38a141996-09-11 23:12:24 +000054#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000055#undef BYTE
Guido van Rossum4f1c59b1996-04-09 02:37:03 +000056#undef arglist
Guido van Rossuma44823b1995-03-14 15:01:17 +000057#include "windows.h"
58#endif
59
Guido van Rossum82598051997-03-05 00:20:32 +000060extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000061
Guido van Rossum82598051997-03-05 00:20:32 +000062extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000063
Guido van Rossumb73cc041993-11-01 16:28:59 +000064/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000065static void initmain Py_PROTO((void));
66static PyObject *run_err_node Py_PROTO((node *n, char *filename,
67 PyObject *globals, PyObject *locals));
68static PyObject *run_node Py_PROTO((node *n, char *filename,
69 PyObject *globals, PyObject *locals));
70static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
71 PyObject *globals, PyObject *locals));
72static void err_input Py_PROTO((perrdetail *));
73static void initsigs 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 */
77int Py_SuppressPrintingFlag; /* Needed by ceval.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000078int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079
80/* Initialize all */
81
82void
Guido van Rossum82598051997-03-05 00:20:32 +000083Py_Initialize()
Guido van Rossum1984f1e1992-08-04 12:41:02 +000084{
85 static int inited;
86
87 if (inited)
88 return;
89 inited = 1;
90
Guido van Rossum82598051997-03-05 00:20:32 +000091 PyImport_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092
Guido van Rossuma110aa61994-08-29 12:50:44 +000093 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094 they are needed by random bits of the interpreter.
95 All other modules are optional and are initialized
96 when they are first imported. */
97
Guido van Rossum82598051997-03-05 00:20:32 +000098 PyBuiltin_Init(); /* Also initializes builtin exceptions */
99 PySys_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100
Guido van Rossum82598051997-03-05 00:20:32 +0000101 PySys_SetPath(Py_GetPath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000102
103 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000104
105 initmain();
106}
107
108/* Create __main__ module */
109
110static void
111initmain()
112{
Guido van Rossum82598051997-03-05 00:20:32 +0000113 PyObject *m, *d;
114 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000115 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000116 Py_FatalError("can't create __main__ module");
117 d = PyModule_GetDict(m);
118 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
119 if (PyDict_SetItemString(d, "__builtins__",
120 PyEval_GetBuiltins()))
121 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000122 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123}
124
125/* Parse input from a file and execute it */
126
127int
Guido van Rossum82598051997-03-05 00:20:32 +0000128PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129 FILE *fp;
130 char *filename;
131{
132 if (filename == NULL)
133 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000134 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000135 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136 else
Guido van Rossum82598051997-03-05 00:20:32 +0000137 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138}
139
140int
Guido van Rossum82598051997-03-05 00:20:32 +0000141PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142 FILE *fp;
143 char *filename;
144{
Guido van Rossum82598051997-03-05 00:20:32 +0000145 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000147 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000149 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
150 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000151 }
Guido van Rossum82598051997-03-05 00:20:32 +0000152 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000154 PySys_SetObject("ps2", v = PyString_FromString("... "));
155 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156 }
157 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000158 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000159#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000160 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161#endif
162 if (ret == E_EOF)
163 return 0;
164 /*
165 if (ret == E_NOMEM)
166 return -1;
167 */
168 }
169}
170
171int
Guido van Rossum82598051997-03-05 00:20:32 +0000172PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173 FILE *fp;
174 char *filename;
175{
Guido van Rossum82598051997-03-05 00:20:32 +0000176 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000178 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000180 v = PySys_GetObject("ps1");
181 w = PySys_GetObject("ps2");
182 if (v != NULL && PyString_Check(v)) {
183 Py_INCREF(v);
184 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185 }
186 else {
187 v = NULL;
188 ps1 = "";
189 }
Guido van Rossum82598051997-03-05 00:20:32 +0000190 if (w != NULL && PyString_Check(w)) {
191 Py_INCREF(w);
192 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 }
194 else {
195 w = NULL;
196 ps2 = "";
197 }
Guido van Rossum82598051997-03-05 00:20:32 +0000198 Py_BEGIN_ALLOW_THREADS
199 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
200 single_input, ps1, ps2, &err);
201 Py_END_ALLOW_THREADS
202 Py_XDECREF(v);
203 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000204 if (n == NULL) {
205 if (err.error == E_EOF) {
206 if (err.text)
207 free(err.text);
208 return E_EOF;
209 }
210 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000211 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000212 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213 }
Guido van Rossum82598051997-03-05 00:20:32 +0000214 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000215 if (m == NULL)
216 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000217 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000218 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000220 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000221 return -1;
222 }
Guido van Rossum82598051997-03-05 00:20:32 +0000223 Py_DECREF(v);
224 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000225 return 0;
226}
227
228int
Guido van Rossum82598051997-03-05 00:20:32 +0000229PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000230 FILE *fp;
231 char *filename;
232{
Guido van Rossum82598051997-03-05 00:20:32 +0000233 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000234 char *ext;
235
Guido van Rossum82598051997-03-05 00:20:32 +0000236 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000237 if (m == NULL)
238 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000239 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000240 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000241 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000242#ifdef macintosh
243 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000244 || getfiletype(filename) == 'PYC '
245 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000246#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000247 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000248 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000249 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000250 if( (fp = fopen(filename, "rb")) == NULL ) {
251 fprintf(stderr, "python: Can't reopen .pyc file\n");
252 return -1;
253 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000254 /* Turn on optimization if a .pyo file is given */
255 if (strcmp(ext, ".pyo") == 0)
256 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000257 v = run_pyc_file(fp, filename, d, d);
258 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000259 v = PyRun_File(fp, filename, file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000260 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000262 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000263 return -1;
264 }
Guido van Rossum82598051997-03-05 00:20:32 +0000265 Py_DECREF(v);
266 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000267 return 0;
268}
269
270int
Guido van Rossum82598051997-03-05 00:20:32 +0000271PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000272 char *command;
273{
Guido van Rossum82598051997-03-05 00:20:32 +0000274 PyObject *m, *d, *v;
275 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276 if (m == NULL)
277 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000278 d = PyModule_GetDict(m);
279 v = PyRun_String(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000280 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000281 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282 return -1;
283 }
Guido van Rossum82598051997-03-05 00:20:32 +0000284 Py_DECREF(v);
285 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000286 return 0;
287}
288
289void
Guido van Rossum82598051997-03-05 00:20:32 +0000290PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000291{
Guido van Rossum82598051997-03-05 00:20:32 +0000292 PyObject *exception, *v, *tb, *f;
293 PyErr_Fetch(&exception, &v, &tb);
294 Py_FlushLine();
Guido van Rossum527c2641995-03-30 11:01:44 +0000295 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000296 if (exception == NULL)
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000297 Py_FatalError("PyErr_Print called but no exception");
Guido van Rossum82598051997-03-05 00:20:32 +0000298 if (exception == PyExc_SystemExit) {
299 if (v == NULL || v == Py_None)
300 Py_Exit(0);
301 if (PyInt_Check(v))
302 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000304 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000305 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000306 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000307 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308 }
309 }
Guido van Rossum82598051997-03-05 00:20:32 +0000310 PySys_SetObject("last_type", exception);
311 PySys_SetObject("last_value", v);
312 PySys_SetObject("last_traceback", tb);
313 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000314 if (f == NULL)
315 fprintf(stderr, "lost sys.stderr\n");
316 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000317 PyTraceBack_Print(tb, f);
318 if (exception == PyExc_SyntaxError) {
319 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000320 char *filename, *text;
321 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000322 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000323 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000324 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000325 else {
326 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000327 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000328 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000329 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000330 else
Guido van Rossum82598051997-03-05 00:20:32 +0000331 PyFile_WriteString(filename, f);
332 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000333 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000334 PyFile_WriteString(buf, f);
335 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000336 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000337 char *nl;
338 if (offset > 0 &&
339 offset == strlen(text))
340 offset--;
341 for (;;) {
342 nl = strchr(text, '\n');
343 if (nl == NULL ||
344 nl-text >= offset)
345 break;
346 offset -= (nl+1-text);
347 text = nl+1;
348 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000349 while (*text == ' ' || *text == '\t') {
350 text++;
351 offset--;
352 }
Guido van Rossum82598051997-03-05 00:20:32 +0000353 PyFile_WriteString(" ", f);
354 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000355 if (*text == '\0' ||
356 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000357 PyFile_WriteString("\n", f);
358 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000359 offset--;
360 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000361 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000362 offset--;
363 }
Guido van Rossum82598051997-03-05 00:20:32 +0000364 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000365 }
Guido van Rossum82598051997-03-05 00:20:32 +0000366 Py_INCREF(message);
367 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000368 v = message;
369 }
370 }
Guido van Rossum82598051997-03-05 00:20:32 +0000371 if (PyClass_Check(exception)) {
372 PyObject* className =
373 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000374 if (className == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000375 PyFile_WriteString("<unknown>", f);
Guido van Rossum262e1241995-02-07 15:30:45 +0000376 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000377 if (PyFile_WriteObject(className, f,
378 Py_PRINT_RAW) != 0)
379 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000380 }
381 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000382 if (PyFile_WriteObject(exception, f,
383 Py_PRINT_RAW) != 0)
384 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000385 }
Guido van Rossum82598051997-03-05 00:20:32 +0000386 if (v != NULL && v != Py_None) {
387 PyFile_WriteString(": ", f);
388 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
389 PyErr_Clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000390 }
Guido van Rossum82598051997-03-05 00:20:32 +0000391 PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000392 }
Guido van Rossum82598051997-03-05 00:20:32 +0000393 Py_XDECREF(exception);
394 Py_XDECREF(v);
395 Py_XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000396}
397
Guido van Rossum82598051997-03-05 00:20:32 +0000398PyObject *
399PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000400 char *str;
401 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000402 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000403{
Guido van Rossum82598051997-03-05 00:20:32 +0000404 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000405 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406}
407
Guido van Rossum82598051997-03-05 00:20:32 +0000408PyObject *
409PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410 FILE *fp;
411 char *filename;
412 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000413 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000414{
Guido van Rossum82598051997-03-05 00:20:32 +0000415 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000416 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000417}
418
Guido van Rossum82598051997-03-05 00:20:32 +0000419static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000420run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421 node *n;
422 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000423 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000424{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000425 if (n == NULL)
426 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 return run_node(n, filename, globals, locals);
428}
429
Guido van Rossum82598051997-03-05 00:20:32 +0000430static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431run_node(n, filename, globals, locals)
432 node *n;
433 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000434 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000435{
Guido van Rossum82598051997-03-05 00:20:32 +0000436 PyCodeObject *co;
437 PyObject *v;
438 co = PyNode_Compile(n, filename);
439 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440 if (co == NULL)
441 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000442 v = PyEval_EvalCode(co, globals, locals);
443 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000444 return v;
445}
446
Guido van Rossum82598051997-03-05 00:20:32 +0000447static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000448run_pyc_file(fp, filename, globals, locals)
449 FILE *fp;
450 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000451 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000452{
Guido van Rossum82598051997-03-05 00:20:32 +0000453 PyCodeObject *co;
454 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000455 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000456 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000457
Guido van Rossum82598051997-03-05 00:20:32 +0000458 magic = PyMarshal_ReadLongFromFile(fp);
459 if (magic != PyImport_GetMagicNumber()) {
460 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000461 "Bad magic number in .pyc file");
462 return NULL;
463 }
Guido van Rossum82598051997-03-05 00:20:32 +0000464 (void) PyMarshal_ReadLongFromFile(fp);
465 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000466 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000467 if (v == NULL || !PyCode_Check(v)) {
468 Py_XDECREF(v);
469 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000470 "Bad code object in .pyc file");
471 return NULL;
472 }
Guido van Rossum82598051997-03-05 00:20:32 +0000473 co = (PyCodeObject *)v;
474 v = PyEval_EvalCode(co, globals, locals);
475 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000476 return v;
477}
478
Guido van Rossum82598051997-03-05 00:20:32 +0000479PyObject *
480Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000481 char *str;
482 char *filename;
483 int start;
484{
485 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000486 PyCodeObject *co;
487 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000488 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000489 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000490 co = PyNode_Compile(n, filename);
491 PyNode_Free(n);
492 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000493}
494
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496
Guido van Rossuma110aa61994-08-29 12:50:44 +0000497node *
Guido van Rossum82598051997-03-05 00:20:32 +0000498PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499 FILE *fp;
500 char *filename;
501 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000503 node *n;
504 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000505 Py_BEGIN_ALLOW_THREADS
506 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000507 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000508 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000509 if (n == NULL)
510 err_input(&err);
511 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512}
513
Guido van Rossuma110aa61994-08-29 12:50:44 +0000514/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515
Guido van Rossuma110aa61994-08-29 12:50:44 +0000516node *
Guido van Rossum82598051997-03-05 00:20:32 +0000517PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 char *str;
519 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000520{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000521 node *n;
522 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000523 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000524 if (n == NULL)
525 err_input(&err);
526 return n;
527}
528
529/* Set the error appropriate to the given input error code (see errcode.h) */
530
531static void
532err_input(err)
533 perrdetail *err;
534{
Guido van Rossum82598051997-03-05 00:20:32 +0000535 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000536 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000537 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000538 err->lineno, err->offset, err->text);
539 if (err->text != NULL) {
540 free(err->text);
541 err->text = NULL;
542 }
543 switch (err->error) {
544 case E_SYNTAX:
545 msg = "invalid syntax";
546 break;
547 case E_TOKEN:
548 msg = "invalid token";
549
550 break;
551 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000552 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000553 return;
554 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000555 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000556 return;
557 case E_EOF:
558 msg = "unexpected EOF while parsing";
559 break;
560 default:
561 fprintf(stderr, "error=%d\n", err->error);
562 msg = "unknown parsing error";
563 break;
564 }
Guido van Rossum82598051997-03-05 00:20:32 +0000565 w = Py_BuildValue("(sO)", msg, v);
566 Py_XDECREF(v);
567 PyErr_SetObject(PyExc_SyntaxError, w);
568 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000569}
570
571/* Print fatal error message and abort */
572
573void
Guido van Rossum82598051997-03-05 00:20:32 +0000574Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000575 char *msg;
576{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000577 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000578#ifdef macintosh
579 for (;;);
580#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000581#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000582 OutputDebugString("Fatal Python error:");
583 OutputDebugString(msg);
584 OutputDebugString("\n");
585#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 abort();
587}
588
589/* Clean up and exit */
590
Guido van Rossuma110aa61994-08-29 12:50:44 +0000591#ifdef WITH_THREAD
592#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000593int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000594#endif
595
Guido van Rossum1662dd51994-09-07 14:38:28 +0000596#define NEXITFUNCS 32
597static void (*exitfuncs[NEXITFUNCS])();
598static int nexitfuncs = 0;
599
600int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000601 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000602{
603 if (nexitfuncs >= NEXITFUNCS)
604 return -1;
605 exitfuncs[nexitfuncs++] = func;
606 return 0;
607}
608
Guido van Rossuma110aa61994-08-29 12:50:44 +0000609void
Guido van Rossum82598051997-03-05 00:20:32 +0000610Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000611{
Guido van Rossum82598051997-03-05 00:20:32 +0000612 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000613
614 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000615 PyObject *res;
616 Py_INCREF(exitfunc);
617 PySys_SetObject("exitfunc", (PyObject *)NULL);
618 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000619 if (res == NULL) {
620 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000621 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000622 }
Guido van Rossum82598051997-03-05 00:20:32 +0000623 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000624 }
625
Guido van Rossum82598051997-03-05 00:20:32 +0000626 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000627
628 while (nexitfuncs > 0)
629 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000630}
631
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000632#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000633extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000634#endif
635
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000636void
Guido van Rossum82598051997-03-05 00:20:32 +0000637Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000638 int sts;
639{
Guido van Rossum82598051997-03-05 00:20:32 +0000640 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000641
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000642#ifdef COUNT_ALLOCS
643 dump_counts();
644#endif
645
Guido van Rossuma110aa61994-08-29 12:50:44 +0000646#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000647
648 /* Other threads may still be active, so skip most of the
649 cleanup actions usually done (these are mostly for
650 debugging anyway). */
651
Guido van Rossum82598051997-03-05 00:20:32 +0000652 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000653#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000654 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000655 _exit_prog(sts);
656 else
657 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000658#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000659 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000660 _exit(sts);
661 else
662 exit(sts);
663#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000664
Guido van Rossuma110aa61994-08-29 12:50:44 +0000665#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666
Guido van Rossum82598051997-03-05 00:20:32 +0000667 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668
Guido van Rossum82598051997-03-05 00:20:32 +0000669 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670
Guido van Rossumaae0d321996-05-22 16:35:33 +0000671#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000672 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673#endif
674
Guido van Rossumaae0d321996-05-22 16:35:33 +0000675#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000676 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000677 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000679#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
Jack Jansen66a89771995-10-27 13:22:14 +0000681#ifdef macintosh
682 PyMac_Exit(sts);
683#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000684 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000685#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000686#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000687 /*NOTREACHED*/
688}
689
Guido van Rossuma110aa61994-08-29 12:50:44 +0000690#ifdef HAVE_SIGNAL_H
691static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000692sighandler(sig)
693 int sig;
694{
695 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000696 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000697#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000698 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699#else
700 exit(1);
701#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000702 /*NOTREACHED*/
703}
704#endif
705
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000706static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000707initsigs()
708{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000709 RETSIGTYPE (*t)();
710#ifdef HAVE_SIGNAL_H
711#ifdef SIGPIPE
712 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000713#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000714#ifdef SIGHUP
715 t = signal(SIGHUP, SIG_IGN);
716 if (t == SIG_DFL)
717 signal(SIGHUP, sighandler);
718 else
719 signal(SIGHUP, t);
720#endif
721#ifdef SIGTERM
722 t = signal(SIGTERM, SIG_IGN);
723 if (t == SIG_DFL)
724 signal(SIGTERM, sighandler);
725 else
726 signal(SIGTERM, t);
727#endif
728#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000729 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000730}
731
Guido van Rossumaae0d321996-05-22 16:35:33 +0000732#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000733/* Ask a yes/no question */
734
Guido van Rossum59bff391992-09-03 20:28:00 +0000735int
Guido van Rossum82598051997-03-05 00:20:32 +0000736_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000737 char *prompt;
738{
739 char buf[256];
740
741 printf("%s [ny] ", prompt);
742 if (fgets(buf, sizeof buf, stdin) == NULL)
743 return 0;
744 return buf[0] == 'y' || buf[0] == 'Y';
745}
746#endif
747
Guido van Rossuma110aa61994-08-29 12:50:44 +0000748#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000749
750/* Check for file descriptor connected to interactive device.
751 Pretend that stdin is always interactive, other files never. */
752
753int
754isatty(fd)
755 int fd;
756{
757 return fd == fileno(stdin);
758}
759
760#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000761
762/*
763 * The file descriptor fd is considered ``interactive'' if either
764 * a) isatty(fd) is TRUE, or
765 * b) the -i flag was given, and the filename associated with
766 * the descriptor is NULL or "<stdin>" or "???".
767 */
768int
769Py_FdIsInteractive(fp, filename)
770 FILE *fp;
771 char *filename;
772{
773 if (isatty((int)fileno(fp)))
774 return 1;
775 if (!Py_InteractiveFlag)
776 return 0;
777 return (filename == NULL) ||
778 (strcmp(filename, "<stdin>") == 0) ||
779 (strcmp(filename, "???") == 0);
780}