blob: b78e6f54a7b478c7ac63662309a22ad081477000 [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;
Jack Jansenbd06e961995-02-13 11:44:56 +0000241#ifdef macintosh
242 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
243 if ( strcmp(ext, ".pyc") == 0 || getfiletype(filename) == 'PYC ' ||
244 getfiletype(filename) == 'APPL' ) {
245#else
Guido van Rossumfdef2711994-09-14 13:31:04 +0000246 if ( strcmp(ext, ".pyc") == 0 ) {
Jack Jansenbd06e961995-02-13 11:44:56 +0000247#endif /* macintosh */
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 }
254 v = run_pyc_file(fp, filename, d, d);
255 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000256 v = PyRun_File(fp, filename, file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000257 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000258 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000259 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000260 return -1;
261 }
Guido van Rossum82598051997-03-05 00:20:32 +0000262 Py_DECREF(v);
263 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264 return 0;
265}
266
267int
Guido van Rossum82598051997-03-05 00:20:32 +0000268PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269 char *command;
270{
Guido van Rossum82598051997-03-05 00:20:32 +0000271 PyObject *m, *d, *v;
272 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 if (m == NULL)
274 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000275 d = PyModule_GetDict(m);
276 v = PyRun_String(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000277 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000278 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279 return -1;
280 }
Guido van Rossum82598051997-03-05 00:20:32 +0000281 Py_DECREF(v);
282 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000283 return 0;
284}
285
286void
Guido van Rossum82598051997-03-05 00:20:32 +0000287PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000288{
Guido van Rossum82598051997-03-05 00:20:32 +0000289 PyObject *exception, *v, *tb, *f;
290 PyErr_Fetch(&exception, &v, &tb);
291 Py_FlushLine();
Guido van Rossum527c2641995-03-30 11:01:44 +0000292 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000293 if (exception == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000294 Py_FatalError("print_error called but no exception");
295 if (exception == PyExc_SystemExit) {
296 if (v == NULL || v == Py_None)
297 Py_Exit(0);
298 if (PyInt_Check(v))
299 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000301 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000302 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000304 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000305 }
306 }
Guido van Rossum82598051997-03-05 00:20:32 +0000307 PySys_SetObject("last_type", exception);
308 PySys_SetObject("last_value", v);
309 PySys_SetObject("last_traceback", tb);
310 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000311 if (f == NULL)
312 fprintf(stderr, "lost sys.stderr\n");
313 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000314 PyTraceBack_Print(tb, f);
315 if (exception == PyExc_SyntaxError) {
316 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000317 char *filename, *text;
318 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000319 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000320 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000321 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000322 else {
323 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000324 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000325 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000326 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000327 else
Guido van Rossum82598051997-03-05 00:20:32 +0000328 PyFile_WriteString(filename, f);
329 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000330 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000331 PyFile_WriteString(buf, f);
332 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000333 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000334 char *nl;
335 if (offset > 0 &&
336 offset == strlen(text))
337 offset--;
338 for (;;) {
339 nl = strchr(text, '\n');
340 if (nl == NULL ||
341 nl-text >= offset)
342 break;
343 offset -= (nl+1-text);
344 text = nl+1;
345 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000346 while (*text == ' ' || *text == '\t') {
347 text++;
348 offset--;
349 }
Guido van Rossum82598051997-03-05 00:20:32 +0000350 PyFile_WriteString(" ", f);
351 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000352 if (*text == '\0' ||
353 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000354 PyFile_WriteString("\n", f);
355 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000356 offset--;
357 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000358 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000359 offset--;
360 }
Guido van Rossum82598051997-03-05 00:20:32 +0000361 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000362 }
Guido van Rossum82598051997-03-05 00:20:32 +0000363 Py_INCREF(message);
364 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000365 v = message;
366 }
367 }
Guido van Rossum82598051997-03-05 00:20:32 +0000368 if (PyClass_Check(exception)) {
369 PyObject* className =
370 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000371 if (className == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000372 PyFile_WriteString("<unknown>", f);
Guido van Rossum262e1241995-02-07 15:30:45 +0000373 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000374 if (PyFile_WriteObject(className, f,
375 Py_PRINT_RAW) != 0)
376 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000377 }
378 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000379 if (PyFile_WriteObject(exception, f,
380 Py_PRINT_RAW) != 0)
381 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000382 }
Guido van Rossum82598051997-03-05 00:20:32 +0000383 if (v != NULL && v != Py_None) {
384 PyFile_WriteString(": ", f);
385 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
386 PyErr_Clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000387 }
Guido van Rossum82598051997-03-05 00:20:32 +0000388 PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000389 }
Guido van Rossum82598051997-03-05 00:20:32 +0000390 Py_XDECREF(exception);
391 Py_XDECREF(v);
392 Py_XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000393}
394
Guido van Rossum82598051997-03-05 00:20:32 +0000395PyObject *
396PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000397 char *str;
398 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000399 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000400{
Guido van Rossum82598051997-03-05 00:20:32 +0000401 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000402 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000403}
404
Guido van Rossum82598051997-03-05 00:20:32 +0000405PyObject *
406PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000407 FILE *fp;
408 char *filename;
409 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000410 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000411{
Guido van Rossum82598051997-03-05 00:20:32 +0000412 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000413 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000414}
415
Guido van Rossum82598051997-03-05 00:20:32 +0000416static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000417run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 node *n;
419 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000420 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000422 if (n == NULL)
423 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000424 return run_node(n, filename, globals, locals);
425}
426
Guido van Rossum82598051997-03-05 00:20:32 +0000427static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428run_node(n, filename, globals, locals)
429 node *n;
430 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000431 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000432{
Guido van Rossum82598051997-03-05 00:20:32 +0000433 PyCodeObject *co;
434 PyObject *v;
435 co = PyNode_Compile(n, filename);
436 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000437 if (co == NULL)
438 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000439 v = PyEval_EvalCode(co, globals, locals);
440 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000441 return v;
442}
443
Guido van Rossum82598051997-03-05 00:20:32 +0000444static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000445run_pyc_file(fp, filename, globals, locals)
446 FILE *fp;
447 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000448 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000449{
Guido van Rossum82598051997-03-05 00:20:32 +0000450 PyCodeObject *co;
451 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000452 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000453 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000454
Guido van Rossum82598051997-03-05 00:20:32 +0000455 magic = PyMarshal_ReadLongFromFile(fp);
456 if (magic != PyImport_GetMagicNumber()) {
457 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000458 "Bad magic number in .pyc file");
459 return NULL;
460 }
Guido van Rossum82598051997-03-05 00:20:32 +0000461 (void) PyMarshal_ReadLongFromFile(fp);
462 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000463 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000464 if (v == NULL || !PyCode_Check(v)) {
465 Py_XDECREF(v);
466 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000467 "Bad code object in .pyc file");
468 return NULL;
469 }
Guido van Rossum82598051997-03-05 00:20:32 +0000470 co = (PyCodeObject *)v;
471 v = PyEval_EvalCode(co, globals, locals);
472 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000473 return v;
474}
475
Guido van Rossum82598051997-03-05 00:20:32 +0000476PyObject *
477Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000478 char *str;
479 char *filename;
480 int start;
481{
482 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000483 PyCodeObject *co;
484 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000485 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000486 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000487 co = PyNode_Compile(n, filename);
488 PyNode_Free(n);
489 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000490}
491
Guido van Rossuma110aa61994-08-29 12:50:44 +0000492/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000493
Guido van Rossuma110aa61994-08-29 12:50:44 +0000494node *
Guido van Rossum82598051997-03-05 00:20:32 +0000495PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496 FILE *fp;
497 char *filename;
498 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500 node *n;
501 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000502 Py_BEGIN_ALLOW_THREADS
503 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000504 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000505 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000506 if (n == NULL)
507 err_input(&err);
508 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509}
510
Guido van Rossuma110aa61994-08-29 12:50:44 +0000511/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000512
Guido van Rossuma110aa61994-08-29 12:50:44 +0000513node *
Guido van Rossum82598051997-03-05 00:20:32 +0000514PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 char *str;
516 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000517{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000518 node *n;
519 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000520 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000521 if (n == NULL)
522 err_input(&err);
523 return n;
524}
525
526/* Set the error appropriate to the given input error code (see errcode.h) */
527
528static void
529err_input(err)
530 perrdetail *err;
531{
Guido van Rossum82598051997-03-05 00:20:32 +0000532 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000533 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000534 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000535 err->lineno, err->offset, err->text);
536 if (err->text != NULL) {
537 free(err->text);
538 err->text = NULL;
539 }
540 switch (err->error) {
541 case E_SYNTAX:
542 msg = "invalid syntax";
543 break;
544 case E_TOKEN:
545 msg = "invalid token";
546
547 break;
548 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000549 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000550 return;
551 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000552 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000553 return;
554 case E_EOF:
555 msg = "unexpected EOF while parsing";
556 break;
557 default:
558 fprintf(stderr, "error=%d\n", err->error);
559 msg = "unknown parsing error";
560 break;
561 }
Guido van Rossum82598051997-03-05 00:20:32 +0000562 w = Py_BuildValue("(sO)", msg, v);
563 Py_XDECREF(v);
564 PyErr_SetObject(PyExc_SyntaxError, w);
565 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000566}
567
568/* Print fatal error message and abort */
569
570void
Guido van Rossum82598051997-03-05 00:20:32 +0000571Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 char *msg;
573{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000574 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000575#ifdef macintosh
576 for (;;);
577#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000578#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000579 OutputDebugString("Fatal Python error:");
580 OutputDebugString(msg);
581 OutputDebugString("\n");
582#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583 abort();
584}
585
586/* Clean up and exit */
587
Guido van Rossuma110aa61994-08-29 12:50:44 +0000588#ifdef WITH_THREAD
589#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000590int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000591#endif
592
Guido van Rossum1662dd51994-09-07 14:38:28 +0000593#define NEXITFUNCS 32
594static void (*exitfuncs[NEXITFUNCS])();
595static int nexitfuncs = 0;
596
597int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000598 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000599{
600 if (nexitfuncs >= NEXITFUNCS)
601 return -1;
602 exitfuncs[nexitfuncs++] = func;
603 return 0;
604}
605
Guido van Rossuma110aa61994-08-29 12:50:44 +0000606void
Guido van Rossum82598051997-03-05 00:20:32 +0000607Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000608{
Guido van Rossum82598051997-03-05 00:20:32 +0000609 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000610
611 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000612 PyObject *res;
613 Py_INCREF(exitfunc);
614 PySys_SetObject("exitfunc", (PyObject *)NULL);
615 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000616 if (res == NULL) {
617 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000618 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000619 }
Guido van Rossum82598051997-03-05 00:20:32 +0000620 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000621 }
622
Guido van Rossum82598051997-03-05 00:20:32 +0000623 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000624
625 while (nexitfuncs > 0)
626 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000627}
628
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000629#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000630extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000631#endif
632
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000633void
Guido van Rossum82598051997-03-05 00:20:32 +0000634Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000635 int sts;
636{
Guido van Rossum82598051997-03-05 00:20:32 +0000637 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000638
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000639#ifdef COUNT_ALLOCS
640 dump_counts();
641#endif
642
Guido van Rossuma110aa61994-08-29 12:50:44 +0000643#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000644
645 /* Other threads may still be active, so skip most of the
646 cleanup actions usually done (these are mostly for
647 debugging anyway). */
648
Guido van Rossum82598051997-03-05 00:20:32 +0000649 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000650#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000651 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000652 _exit_prog(sts);
653 else
654 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000655#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000656 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000657 _exit(sts);
658 else
659 exit(sts);
660#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000661
Guido van Rossuma110aa61994-08-29 12:50:44 +0000662#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663
Guido van Rossum82598051997-03-05 00:20:32 +0000664 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665
Guido van Rossum82598051997-03-05 00:20:32 +0000666 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667
Guido van Rossumaae0d321996-05-22 16:35:33 +0000668#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000669 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000670#endif
671
Guido van Rossumaae0d321996-05-22 16:35:33 +0000672#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000673 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000674 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000676#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677
Jack Jansen66a89771995-10-27 13:22:14 +0000678#ifdef macintosh
679 PyMac_Exit(sts);
680#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000682#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000683#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000684 /*NOTREACHED*/
685}
686
Guido van Rossuma110aa61994-08-29 12:50:44 +0000687#ifdef HAVE_SIGNAL_H
688static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000689sighandler(sig)
690 int sig;
691{
692 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000693 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000695 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000696#else
697 exit(1);
698#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000699 /*NOTREACHED*/
700}
701#endif
702
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000703static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000704initsigs()
705{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000706 RETSIGTYPE (*t)();
707#ifdef HAVE_SIGNAL_H
708#ifdef SIGPIPE
709 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000710#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000711#ifdef SIGHUP
712 t = signal(SIGHUP, SIG_IGN);
713 if (t == SIG_DFL)
714 signal(SIGHUP, sighandler);
715 else
716 signal(SIGHUP, t);
717#endif
718#ifdef SIGTERM
719 t = signal(SIGTERM, SIG_IGN);
720 if (t == SIG_DFL)
721 signal(SIGTERM, sighandler);
722 else
723 signal(SIGTERM, t);
724#endif
725#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000726 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000727}
728
Guido van Rossumaae0d321996-05-22 16:35:33 +0000729#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000730/* Ask a yes/no question */
731
Guido van Rossum59bff391992-09-03 20:28:00 +0000732int
Guido van Rossum82598051997-03-05 00:20:32 +0000733_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000734 char *prompt;
735{
736 char buf[256];
737
738 printf("%s [ny] ", prompt);
739 if (fgets(buf, sizeof buf, stdin) == NULL)
740 return 0;
741 return buf[0] == 'y' || buf[0] == 'Y';
742}
743#endif
744
Guido van Rossuma110aa61994-08-29 12:50:44 +0000745#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000746
747/* Check for file descriptor connected to interactive device.
748 Pretend that stdin is always interactive, other files never. */
749
750int
751isatty(fd)
752 int fd;
753{
754 return fd == fileno(stdin);
755}
756
757#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000758
759/*
760 * The file descriptor fd is considered ``interactive'' if either
761 * a) isatty(fd) is TRUE, or
762 * b) the -i flag was given, and the filename associated with
763 * the descriptor is NULL or "<stdin>" or "???".
764 */
765int
766Py_FdIsInteractive(fp, filename)
767 FILE *fp;
768 char *filename;
769{
770 if (isatty((int)fileno(fp)))
771 return 1;
772 if (!Py_InteractiveFlag)
773 return 0;
774 return (filename == NULL) ||
775 (strcmp(filename, "<stdin>") == 0) ||
776 (strcmp(filename, "???") == 0);
777}