blob: f08a2c4a6eb32b0d930f45a905525c5faad99dcb [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
Guido van Rossuma027efa1997-05-05 20:56:21 +000080/* Initialize the current interpreter; pass in the Python path. */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000081
82void
Guido van Rossuma027efa1997-05-05 20:56:21 +000083Py_Setup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +000084{
Guido van Rossum82598051997-03-05 00:20:32 +000085 PyImport_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000086
Guido van Rossuma110aa61994-08-29 12:50:44 +000087 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000088 they are needed by random bits of the interpreter.
89 All other modules are optional and are initialized
90 when they are first imported. */
91
Guido van Rossum82598051997-03-05 00:20:32 +000092 PyBuiltin_Init(); /* Also initializes builtin exceptions */
93 PySys_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094
Guido van Rossum82598051997-03-05 00:20:32 +000095 PySys_SetPath(Py_GetPath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000096
97 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +000098
99 initmain();
100}
101
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102/* Create and interpreter and thread state and initialize them;
103 if we already have an interpreter and thread, do nothing.
104 Fatal error if the creation fails. */
105
106void
107Py_Initialize()
108{
109 PyThreadState *tstate;
110 PyInterpreterState *interp;
111 if (PyThreadState_Get())
112 return;
113 interp = PyInterpreterState_New();
114 if (interp == NULL)
115 Py_FatalError("PyInterpreterState_New() failed");
116 tstate = PyThreadState_New(interp);
117 if (tstate == NULL)
118 Py_FatalError("PyThreadState_New() failed");
119 (void) PyThreadState_Swap(tstate);
120
121 Py_Setup();
122
123 PySys_SetPath(Py_GetPath());
124}
125
126/*
127 Py_Initialize()
128 -- do everything, no-op on second call, call fatal on failure, set path
129
130 #2
131 -- create new interp+tstate & make it current, return NULL on failure,
132 make it current, do all setup, set path
133
134 #3
135 -- #2 without set path
136
137 #4
138 -- is there any point to #3 for caller-provided current interp+tstate?
139
140*/
141
Guido van Rossum6135a871995-01-09 17:53:26 +0000142/* Create __main__ module */
143
144static void
145initmain()
146{
Guido van Rossum82598051997-03-05 00:20:32 +0000147 PyObject *m, *d;
148 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000149 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000150 Py_FatalError("can't create __main__ module");
151 d = PyModule_GetDict(m);
152 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
153 if (PyDict_SetItemString(d, "__builtins__",
154 PyEval_GetBuiltins()))
155 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000156 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157}
158
159/* Parse input from a file and execute it */
160
161int
Guido van Rossum82598051997-03-05 00:20:32 +0000162PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163 FILE *fp;
164 char *filename;
165{
166 if (filename == NULL)
167 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000168 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000169 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170 else
Guido van Rossum82598051997-03-05 00:20:32 +0000171 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172}
173
174int
Guido van Rossum82598051997-03-05 00:20:32 +0000175PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176 FILE *fp;
177 char *filename;
178{
Guido van Rossum82598051997-03-05 00:20:32 +0000179 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000180 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000181 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000183 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
184 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185 }
Guido van Rossum82598051997-03-05 00:20:32 +0000186 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000188 PySys_SetObject("ps2", v = PyString_FromString("... "));
189 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190 }
191 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000192 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000193#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000194 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195#endif
196 if (ret == E_EOF)
197 return 0;
198 /*
199 if (ret == E_NOMEM)
200 return -1;
201 */
202 }
203}
204
205int
Guido van Rossum82598051997-03-05 00:20:32 +0000206PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000207 FILE *fp;
208 char *filename;
209{
Guido van Rossum82598051997-03-05 00:20:32 +0000210 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000212 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000214 v = PySys_GetObject("ps1");
215 w = PySys_GetObject("ps2");
216 if (v != NULL && PyString_Check(v)) {
217 Py_INCREF(v);
218 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219 }
220 else {
221 v = NULL;
222 ps1 = "";
223 }
Guido van Rossum82598051997-03-05 00:20:32 +0000224 if (w != NULL && PyString_Check(w)) {
225 Py_INCREF(w);
226 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000227 }
228 else {
229 w = NULL;
230 ps2 = "";
231 }
Guido van Rossum82598051997-03-05 00:20:32 +0000232 Py_BEGIN_ALLOW_THREADS
233 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
234 single_input, ps1, ps2, &err);
235 Py_END_ALLOW_THREADS
236 Py_XDECREF(v);
237 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000238 if (n == NULL) {
239 if (err.error == E_EOF) {
240 if (err.text)
241 free(err.text);
242 return E_EOF;
243 }
244 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000245 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000246 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000247 }
Guido van Rossum82598051997-03-05 00:20:32 +0000248 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249 if (m == NULL)
250 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000251 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000253 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000254 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 return -1;
256 }
Guido van Rossum82598051997-03-05 00:20:32 +0000257 Py_DECREF(v);
258 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000259 return 0;
260}
261
262int
Guido van Rossum82598051997-03-05 00:20:32 +0000263PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264 FILE *fp;
265 char *filename;
266{
Guido van Rossum82598051997-03-05 00:20:32 +0000267 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000268 char *ext;
269
Guido van Rossum82598051997-03-05 00:20:32 +0000270 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000271 if (m == NULL)
272 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000273 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000274 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000275 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000276#ifdef macintosh
277 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000278 || getfiletype(filename) == 'PYC '
279 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000280#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000281 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000282 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000283 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000284 if( (fp = fopen(filename, "rb")) == NULL ) {
285 fprintf(stderr, "python: Can't reopen .pyc file\n");
286 return -1;
287 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000288 /* Turn on optimization if a .pyo file is given */
289 if (strcmp(ext, ".pyo") == 0)
290 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000291 v = run_pyc_file(fp, filename, d, d);
292 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000293 v = PyRun_File(fp, filename, file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000294 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000295 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000296 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297 return -1;
298 }
Guido van Rossum82598051997-03-05 00:20:32 +0000299 Py_DECREF(v);
300 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000301 return 0;
302}
303
304int
Guido van Rossum82598051997-03-05 00:20:32 +0000305PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000306 char *command;
307{
Guido van Rossum82598051997-03-05 00:20:32 +0000308 PyObject *m, *d, *v;
309 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000310 if (m == NULL)
311 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000312 d = PyModule_GetDict(m);
313 v = PyRun_String(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000315 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000316 return -1;
317 }
Guido van Rossum82598051997-03-05 00:20:32 +0000318 Py_DECREF(v);
319 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000320 return 0;
321}
322
323void
Guido van Rossum82598051997-03-05 00:20:32 +0000324PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325{
Guido van Rossum82598051997-03-05 00:20:32 +0000326 PyObject *exception, *v, *tb, *f;
327 PyErr_Fetch(&exception, &v, &tb);
328 Py_FlushLine();
Guido van Rossum527c2641995-03-30 11:01:44 +0000329 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000330 if (exception == NULL)
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000331 Py_FatalError("PyErr_Print called but no exception");
Guido van Rossum82598051997-03-05 00:20:32 +0000332 if (exception == PyExc_SystemExit) {
333 if (v == NULL || v == Py_None)
334 Py_Exit(0);
335 if (PyInt_Check(v))
336 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000337 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000338 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000339 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000341 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 }
343 }
Guido van Rossum82598051997-03-05 00:20:32 +0000344 PySys_SetObject("last_type", exception);
345 PySys_SetObject("last_value", v);
346 PySys_SetObject("last_traceback", tb);
347 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000348 if (f == NULL)
349 fprintf(stderr, "lost sys.stderr\n");
350 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000351 PyTraceBack_Print(tb, f);
352 if (exception == PyExc_SyntaxError) {
353 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000354 char *filename, *text;
355 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000356 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000357 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000358 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000359 else {
360 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000361 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000362 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000363 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000364 else
Guido van Rossum82598051997-03-05 00:20:32 +0000365 PyFile_WriteString(filename, f);
366 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000367 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000368 PyFile_WriteString(buf, f);
369 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000370 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000371 char *nl;
372 if (offset > 0 &&
373 offset == strlen(text))
374 offset--;
375 for (;;) {
376 nl = strchr(text, '\n');
377 if (nl == NULL ||
378 nl-text >= offset)
379 break;
380 offset -= (nl+1-text);
381 text = nl+1;
382 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000383 while (*text == ' ' || *text == '\t') {
384 text++;
385 offset--;
386 }
Guido van Rossum82598051997-03-05 00:20:32 +0000387 PyFile_WriteString(" ", f);
388 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000389 if (*text == '\0' ||
390 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000391 PyFile_WriteString("\n", f);
392 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000393 offset--;
394 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000395 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000396 offset--;
397 }
Guido van Rossum82598051997-03-05 00:20:32 +0000398 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000399 }
Guido van Rossum82598051997-03-05 00:20:32 +0000400 Py_INCREF(message);
401 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000402 v = message;
403 }
404 }
Guido van Rossum82598051997-03-05 00:20:32 +0000405 if (PyClass_Check(exception)) {
406 PyObject* className =
407 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000408 if (className == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000409 PyFile_WriteString("<unknown>", f);
Guido van Rossum262e1241995-02-07 15:30:45 +0000410 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000411 if (PyFile_WriteObject(className, f,
412 Py_PRINT_RAW) != 0)
413 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000414 }
415 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000416 if (PyFile_WriteObject(exception, f,
417 Py_PRINT_RAW) != 0)
418 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000419 }
Guido van Rossum82598051997-03-05 00:20:32 +0000420 if (v != NULL && v != Py_None) {
421 PyFile_WriteString(": ", f);
422 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
423 PyErr_Clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000424 }
Guido van Rossum82598051997-03-05 00:20:32 +0000425 PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 }
Guido van Rossum82598051997-03-05 00:20:32 +0000427 Py_XDECREF(exception);
428 Py_XDECREF(v);
429 Py_XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000430}
431
Guido van Rossum82598051997-03-05 00:20:32 +0000432PyObject *
433PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 char *str;
435 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000436 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000437{
Guido van Rossum82598051997-03-05 00:20:32 +0000438 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000439 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440}
441
Guido van Rossum82598051997-03-05 00:20:32 +0000442PyObject *
443PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000444 FILE *fp;
445 char *filename;
446 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000447 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000448{
Guido van Rossum82598051997-03-05 00:20:32 +0000449 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000450 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451}
452
Guido van Rossum82598051997-03-05 00:20:32 +0000453static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000454run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000455 node *n;
456 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000457 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000458{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000459 if (n == NULL)
460 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000461 return run_node(n, filename, globals, locals);
462}
463
Guido van Rossum82598051997-03-05 00:20:32 +0000464static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000465run_node(n, filename, globals, locals)
466 node *n;
467 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000468 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000469{
Guido van Rossum82598051997-03-05 00:20:32 +0000470 PyCodeObject *co;
471 PyObject *v;
472 co = PyNode_Compile(n, filename);
473 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474 if (co == NULL)
475 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000476 v = PyEval_EvalCode(co, globals, locals);
477 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478 return v;
479}
480
Guido van Rossum82598051997-03-05 00:20:32 +0000481static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000482run_pyc_file(fp, filename, globals, locals)
483 FILE *fp;
484 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000485 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000486{
Guido van Rossum82598051997-03-05 00:20:32 +0000487 PyCodeObject *co;
488 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000489 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000490 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000491
Guido van Rossum82598051997-03-05 00:20:32 +0000492 magic = PyMarshal_ReadLongFromFile(fp);
493 if (magic != PyImport_GetMagicNumber()) {
494 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000495 "Bad magic number in .pyc file");
496 return NULL;
497 }
Guido van Rossum82598051997-03-05 00:20:32 +0000498 (void) PyMarshal_ReadLongFromFile(fp);
499 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000500 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000501 if (v == NULL || !PyCode_Check(v)) {
502 Py_XDECREF(v);
503 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000504 "Bad code object in .pyc file");
505 return NULL;
506 }
Guido van Rossum82598051997-03-05 00:20:32 +0000507 co = (PyCodeObject *)v;
508 v = PyEval_EvalCode(co, globals, locals);
509 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000510 return v;
511}
512
Guido van Rossum82598051997-03-05 00:20:32 +0000513PyObject *
514Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000515 char *str;
516 char *filename;
517 int start;
518{
519 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000520 PyCodeObject *co;
521 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000522 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000523 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000524 co = PyNode_Compile(n, filename);
525 PyNode_Free(n);
526 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000527}
528
Guido van Rossuma110aa61994-08-29 12:50:44 +0000529/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000530
Guido van Rossuma110aa61994-08-29 12:50:44 +0000531node *
Guido van Rossum82598051997-03-05 00:20:32 +0000532PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 FILE *fp;
534 char *filename;
535 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000537 node *n;
538 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000539 Py_BEGIN_ALLOW_THREADS
540 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000541 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000542 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000543 if (n == NULL)
544 err_input(&err);
545 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000546}
547
Guido van Rossuma110aa61994-08-29 12:50:44 +0000548/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000549
Guido van Rossuma110aa61994-08-29 12:50:44 +0000550node *
Guido van Rossum82598051997-03-05 00:20:32 +0000551PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552 char *str;
553 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000554{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000555 node *n;
556 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000557 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000558 if (n == NULL)
559 err_input(&err);
560 return n;
561}
562
563/* Set the error appropriate to the given input error code (see errcode.h) */
564
565static void
566err_input(err)
567 perrdetail *err;
568{
Guido van Rossum82598051997-03-05 00:20:32 +0000569 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000571 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000572 err->lineno, err->offset, err->text);
573 if (err->text != NULL) {
574 free(err->text);
575 err->text = NULL;
576 }
577 switch (err->error) {
578 case E_SYNTAX:
579 msg = "invalid syntax";
580 break;
581 case E_TOKEN:
582 msg = "invalid token";
583
584 break;
585 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000586 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000587 return;
588 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000589 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000590 return;
591 case E_EOF:
592 msg = "unexpected EOF while parsing";
593 break;
594 default:
595 fprintf(stderr, "error=%d\n", err->error);
596 msg = "unknown parsing error";
597 break;
598 }
Guido van Rossum82598051997-03-05 00:20:32 +0000599 w = Py_BuildValue("(sO)", msg, v);
600 Py_XDECREF(v);
601 PyErr_SetObject(PyExc_SyntaxError, w);
602 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603}
604
605/* Print fatal error message and abort */
606
607void
Guido van Rossum82598051997-03-05 00:20:32 +0000608Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000609 char *msg;
610{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000611 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000612#ifdef macintosh
613 for (;;);
614#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000615#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000616 OutputDebugString("Fatal Python error:");
617 OutputDebugString(msg);
618 OutputDebugString("\n");
619#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 abort();
621}
622
623/* Clean up and exit */
624
Guido van Rossuma110aa61994-08-29 12:50:44 +0000625#ifdef WITH_THREAD
626#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000627int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000628#endif
629
Guido van Rossum1662dd51994-09-07 14:38:28 +0000630#define NEXITFUNCS 32
631static void (*exitfuncs[NEXITFUNCS])();
632static int nexitfuncs = 0;
633
634int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000635 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000636{
637 if (nexitfuncs >= NEXITFUNCS)
638 return -1;
639 exitfuncs[nexitfuncs++] = func;
640 return 0;
641}
642
Guido van Rossuma110aa61994-08-29 12:50:44 +0000643void
Guido van Rossum82598051997-03-05 00:20:32 +0000644Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000645{
Guido van Rossum82598051997-03-05 00:20:32 +0000646 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000647
648 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000649 PyObject *res;
650 Py_INCREF(exitfunc);
651 PySys_SetObject("exitfunc", (PyObject *)NULL);
652 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000653 if (res == NULL) {
654 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000655 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000656 }
Guido van Rossum82598051997-03-05 00:20:32 +0000657 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000658 }
659
Guido van Rossum82598051997-03-05 00:20:32 +0000660 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000661
662 while (nexitfuncs > 0)
663 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000664}
665
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000666#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000667extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000668#endif
669
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000670void
Guido van Rossum82598051997-03-05 00:20:32 +0000671Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000672 int sts;
673{
Guido van Rossum82598051997-03-05 00:20:32 +0000674 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000675
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000676#ifdef COUNT_ALLOCS
677 dump_counts();
678#endif
679
Guido van Rossuma110aa61994-08-29 12:50:44 +0000680#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000681
682 /* Other threads may still be active, so skip most of the
683 cleanup actions usually done (these are mostly for
684 debugging anyway). */
685
Guido van Rossum82598051997-03-05 00:20:32 +0000686 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000687#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000688 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000689 _exit_prog(sts);
690 else
691 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000692#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000693 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000694 _exit(sts);
695 else
696 exit(sts);
697#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000698
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000700
Guido van Rossum82598051997-03-05 00:20:32 +0000701 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000702
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000704
Guido van Rossumaae0d321996-05-22 16:35:33 +0000705#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000706 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707#endif
708
Guido van Rossumaae0d321996-05-22 16:35:33 +0000709#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000710 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000711 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000712 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000713#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000714
Jack Jansen66a89771995-10-27 13:22:14 +0000715#ifdef macintosh
716 PyMac_Exit(sts);
717#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000719#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000720#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000721 /*NOTREACHED*/
722}
723
Guido van Rossuma110aa61994-08-29 12:50:44 +0000724#ifdef HAVE_SIGNAL_H
725static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000726sighandler(sig)
727 int sig;
728{
729 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000730 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000731#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000732 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733#else
734 exit(1);
735#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000736 /*NOTREACHED*/
737}
738#endif
739
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000740static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000741initsigs()
742{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000743 RETSIGTYPE (*t)();
744#ifdef HAVE_SIGNAL_H
745#ifdef SIGPIPE
746 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000747#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000748#ifdef SIGHUP
749 t = signal(SIGHUP, SIG_IGN);
750 if (t == SIG_DFL)
751 signal(SIGHUP, sighandler);
752 else
753 signal(SIGHUP, t);
754#endif
755#ifdef SIGTERM
756 t = signal(SIGTERM, SIG_IGN);
757 if (t == SIG_DFL)
758 signal(SIGTERM, sighandler);
759 else
760 signal(SIGTERM, t);
761#endif
762#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000763 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000764}
765
Guido van Rossumaae0d321996-05-22 16:35:33 +0000766#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000767/* Ask a yes/no question */
768
Guido van Rossum59bff391992-09-03 20:28:00 +0000769int
Guido van Rossum82598051997-03-05 00:20:32 +0000770_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000771 char *prompt;
772{
773 char buf[256];
774
775 printf("%s [ny] ", prompt);
776 if (fgets(buf, sizeof buf, stdin) == NULL)
777 return 0;
778 return buf[0] == 'y' || buf[0] == 'Y';
779}
780#endif
781
Guido van Rossuma110aa61994-08-29 12:50:44 +0000782#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000783
784/* Check for file descriptor connected to interactive device.
785 Pretend that stdin is always interactive, other files never. */
786
787int
788isatty(fd)
789 int fd;
790{
791 return fd == fileno(stdin);
792}
793
794#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000795
796/*
797 * The file descriptor fd is considered ``interactive'' if either
798 * a) isatty(fd) is TRUE, or
799 * b) the -i flag was given, and the filename associated with
800 * the descriptor is NULL or "<stdin>" or "???".
801 */
802int
803Py_FdIsInteractive(fp, filename)
804 FILE *fp;
805 char *filename;
806{
807 if (isatty((int)fileno(fp)))
808 return 1;
809 if (!Py_InteractiveFlag)
810 return 0;
811 return (filename == NULL) ||
812 (strcmp(filename, "<stdin>") == 0) ||
813 (strcmp(filename, "???") == 0);
814}