blob: 8bb7565fb6b40a8d3bd8cc60c8852364ff4da2f5 [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 Rossum478e7181997-05-06 15:24:59 +000060#ifdef HAVE_GETPID
61#ifndef MS_WINDOWS
62#define HAVE_KILL
63#endif
64#endif
65
Guido van Rossum82598051997-03-05 00:20:32 +000066extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000067
Guido van Rossum82598051997-03-05 00:20:32 +000068extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000069
Guido van Rossumb73cc041993-11-01 16:28:59 +000070/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000071static void initmain Py_PROTO((void));
72static PyObject *run_err_node Py_PROTO((node *n, char *filename,
73 PyObject *globals, PyObject *locals));
74static PyObject *run_node Py_PROTO((node *n, char *filename,
75 PyObject *globals, PyObject *locals));
76static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
77 PyObject *globals, PyObject *locals));
78static void err_input Py_PROTO((perrdetail *));
79static void initsigs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000080
Guido van Rossum82598051997-03-05 00:20:32 +000081int Py_DebugFlag; /* Needed by parser.c */
82int Py_VerboseFlag; /* Needed by import.c */
83int Py_SuppressPrintingFlag; /* Needed by ceval.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000084int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000085
Guido van Rossuma027efa1997-05-05 20:56:21 +000086/* Initialize the current interpreter; pass in the Python path. */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087
88void
Guido van Rossuma027efa1997-05-05 20:56:21 +000089Py_Setup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +000090{
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
Guido van Rossuma027efa1997-05-05 20:56:21 +0000108/* Create and interpreter and thread state and initialize them;
109 if we already have an interpreter and thread, do nothing.
110 Fatal error if the creation fails. */
111
112void
113Py_Initialize()
114{
115 PyThreadState *tstate;
116 PyInterpreterState *interp;
117 if (PyThreadState_Get())
118 return;
119 interp = PyInterpreterState_New();
120 if (interp == NULL)
121 Py_FatalError("PyInterpreterState_New() failed");
122 tstate = PyThreadState_New(interp);
123 if (tstate == NULL)
124 Py_FatalError("PyThreadState_New() failed");
125 (void) PyThreadState_Swap(tstate);
126
127 Py_Setup();
128
129 PySys_SetPath(Py_GetPath());
130}
131
132/*
133 Py_Initialize()
134 -- do everything, no-op on second call, call fatal on failure, set path
135
136 #2
137 -- create new interp+tstate & make it current, return NULL on failure,
138 make it current, do all setup, set path
139
140 #3
141 -- #2 without set path
142
143 #4
144 -- is there any point to #3 for caller-provided current interp+tstate?
145
146*/
147
Guido van Rossum6135a871995-01-09 17:53:26 +0000148/* Create __main__ module */
149
150static void
151initmain()
152{
Guido van Rossum82598051997-03-05 00:20:32 +0000153 PyObject *m, *d;
154 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000155 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000156 Py_FatalError("can't create __main__ module");
157 d = PyModule_GetDict(m);
158 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
159 if (PyDict_SetItemString(d, "__builtins__",
160 PyEval_GetBuiltins()))
161 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000162 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163}
164
165/* Parse input from a file and execute it */
166
167int
Guido van Rossum82598051997-03-05 00:20:32 +0000168PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169 FILE *fp;
170 char *filename;
171{
172 if (filename == NULL)
173 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000174 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000175 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176 else
Guido van Rossum82598051997-03-05 00:20:32 +0000177 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178}
179
180int
Guido van Rossum82598051997-03-05 00:20:32 +0000181PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 FILE *fp;
183 char *filename;
184{
Guido van Rossum82598051997-03-05 00:20:32 +0000185 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000187 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000188 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000189 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
190 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191 }
Guido van Rossum82598051997-03-05 00:20:32 +0000192 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000194 PySys_SetObject("ps2", v = PyString_FromString("... "));
195 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 }
197 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000198 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000199#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000200 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000201#endif
202 if (ret == E_EOF)
203 return 0;
204 /*
205 if (ret == E_NOMEM)
206 return -1;
207 */
208 }
209}
210
211int
Guido van Rossum82598051997-03-05 00:20:32 +0000212PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000213 FILE *fp;
214 char *filename;
215{
Guido van Rossum82598051997-03-05 00:20:32 +0000216 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000217 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000218 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000220 v = PySys_GetObject("ps1");
221 w = PySys_GetObject("ps2");
222 if (v != NULL && PyString_Check(v)) {
223 Py_INCREF(v);
224 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000225 }
226 else {
227 v = NULL;
228 ps1 = "";
229 }
Guido van Rossum82598051997-03-05 00:20:32 +0000230 if (w != NULL && PyString_Check(w)) {
231 Py_INCREF(w);
232 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000233 }
234 else {
235 w = NULL;
236 ps2 = "";
237 }
Guido van Rossum82598051997-03-05 00:20:32 +0000238 Py_BEGIN_ALLOW_THREADS
239 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
240 single_input, ps1, ps2, &err);
241 Py_END_ALLOW_THREADS
242 Py_XDECREF(v);
243 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000244 if (n == NULL) {
245 if (err.error == E_EOF) {
246 if (err.text)
247 free(err.text);
248 return E_EOF;
249 }
250 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000251 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000252 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000253 }
Guido van Rossum82598051997-03-05 00:20:32 +0000254 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000255 if (m == NULL)
256 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000257 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000258 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000259 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000260 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000261 return -1;
262 }
Guido van Rossum82598051997-03-05 00:20:32 +0000263 Py_DECREF(v);
264 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000265 return 0;
266}
267
268int
Guido van Rossum82598051997-03-05 00:20:32 +0000269PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000270 FILE *fp;
271 char *filename;
272{
Guido van Rossum82598051997-03-05 00:20:32 +0000273 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000274 char *ext;
275
Guido van Rossum82598051997-03-05 00:20:32 +0000276 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000277 if (m == NULL)
278 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000279 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000280 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000281 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000282#ifdef macintosh
283 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000284 || getfiletype(filename) == 'PYC '
285 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000286#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000287 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000288 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000289 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000290 if( (fp = fopen(filename, "rb")) == NULL ) {
291 fprintf(stderr, "python: Can't reopen .pyc file\n");
292 return -1;
293 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000294 /* Turn on optimization if a .pyo file is given */
295 if (strcmp(ext, ".pyo") == 0)
296 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000297 v = run_pyc_file(fp, filename, d, d);
298 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000299 v = PyRun_File(fp, filename, file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000300 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000301 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000302 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303 return -1;
304 }
Guido van Rossum82598051997-03-05 00:20:32 +0000305 Py_DECREF(v);
306 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307 return 0;
308}
309
310int
Guido van Rossum82598051997-03-05 00:20:32 +0000311PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312 char *command;
313{
Guido van Rossum82598051997-03-05 00:20:32 +0000314 PyObject *m, *d, *v;
315 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000316 if (m == NULL)
317 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000318 d = PyModule_GetDict(m);
319 v = PyRun_String(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000320 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000321 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322 return -1;
323 }
Guido van Rossum82598051997-03-05 00:20:32 +0000324 Py_DECREF(v);
325 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000326 return 0;
327}
328
329void
Guido van Rossum82598051997-03-05 00:20:32 +0000330PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331{
Guido van Rossum82598051997-03-05 00:20:32 +0000332 PyObject *exception, *v, *tb, *f;
333 PyErr_Fetch(&exception, &v, &tb);
334 Py_FlushLine();
Guido van Rossum527c2641995-03-30 11:01:44 +0000335 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336 if (exception == NULL)
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000337 Py_FatalError("PyErr_Print called but no exception");
Guido van Rossum82598051997-03-05 00:20:32 +0000338 if (exception == PyExc_SystemExit) {
339 if (v == NULL || v == Py_None)
340 Py_Exit(0);
341 if (PyInt_Check(v))
342 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000344 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000345 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000347 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348 }
349 }
Guido van Rossum82598051997-03-05 00:20:32 +0000350 PySys_SetObject("last_type", exception);
351 PySys_SetObject("last_value", v);
352 PySys_SetObject("last_traceback", tb);
353 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000354 if (f == NULL)
355 fprintf(stderr, "lost sys.stderr\n");
356 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000357 PyTraceBack_Print(tb, f);
358 if (exception == PyExc_SyntaxError) {
359 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000360 char *filename, *text;
361 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000362 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000363 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000364 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000365 else {
366 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000367 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000368 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000369 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000370 else
Guido van Rossum82598051997-03-05 00:20:32 +0000371 PyFile_WriteString(filename, f);
372 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000373 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000374 PyFile_WriteString(buf, f);
375 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000376 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000377 char *nl;
378 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000379 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000380 offset--;
381 for (;;) {
382 nl = strchr(text, '\n');
383 if (nl == NULL ||
384 nl-text >= offset)
385 break;
386 offset -= (nl+1-text);
387 text = nl+1;
388 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000389 while (*text == ' ' || *text == '\t') {
390 text++;
391 offset--;
392 }
Guido van Rossum82598051997-03-05 00:20:32 +0000393 PyFile_WriteString(" ", f);
394 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000395 if (*text == '\0' ||
396 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000397 PyFile_WriteString("\n", f);
398 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000399 offset--;
400 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000401 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000402 offset--;
403 }
Guido van Rossum82598051997-03-05 00:20:32 +0000404 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000405 }
Guido van Rossum82598051997-03-05 00:20:32 +0000406 Py_INCREF(message);
407 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000408 v = message;
409 }
410 }
Guido van Rossum82598051997-03-05 00:20:32 +0000411 if (PyClass_Check(exception)) {
412 PyObject* className =
413 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000414 if (className == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000415 PyFile_WriteString("<unknown>", f);
Guido van Rossum262e1241995-02-07 15:30:45 +0000416 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000417 if (PyFile_WriteObject(className, f,
418 Py_PRINT_RAW) != 0)
419 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000420 }
421 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000422 if (PyFile_WriteObject(exception, f,
423 Py_PRINT_RAW) != 0)
424 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000425 }
Guido van Rossum82598051997-03-05 00:20:32 +0000426 if (v != NULL && v != Py_None) {
427 PyFile_WriteString(": ", f);
428 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
429 PyErr_Clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000430 }
Guido van Rossum82598051997-03-05 00:20:32 +0000431 PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000432 }
Guido van Rossum82598051997-03-05 00:20:32 +0000433 Py_XDECREF(exception);
434 Py_XDECREF(v);
435 Py_XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000436}
437
Guido van Rossum82598051997-03-05 00:20:32 +0000438PyObject *
439PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440 char *str;
441 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000442 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000443{
Guido van Rossum82598051997-03-05 00:20:32 +0000444 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000445 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446}
447
Guido van Rossum82598051997-03-05 00:20:32 +0000448PyObject *
449PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000450 FILE *fp;
451 char *filename;
452 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000453 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454{
Guido van Rossum82598051997-03-05 00:20:32 +0000455 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000456 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457}
458
Guido van Rossum82598051997-03-05 00:20:32 +0000459static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000460run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000461 node *n;
462 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000463 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000465 if (n == NULL)
466 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000467 return run_node(n, filename, globals, locals);
468}
469
Guido van Rossum82598051997-03-05 00:20:32 +0000470static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471run_node(n, filename, globals, locals)
472 node *n;
473 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000474 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475{
Guido van Rossum82598051997-03-05 00:20:32 +0000476 PyCodeObject *co;
477 PyObject *v;
478 co = PyNode_Compile(n, filename);
479 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000480 if (co == NULL)
481 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000482 v = PyEval_EvalCode(co, globals, locals);
483 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000484 return v;
485}
486
Guido van Rossum82598051997-03-05 00:20:32 +0000487static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000488run_pyc_file(fp, filename, globals, locals)
489 FILE *fp;
490 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000491 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000492{
Guido van Rossum82598051997-03-05 00:20:32 +0000493 PyCodeObject *co;
494 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000495 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000496 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000497
Guido van Rossum82598051997-03-05 00:20:32 +0000498 magic = PyMarshal_ReadLongFromFile(fp);
499 if (magic != PyImport_GetMagicNumber()) {
500 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000501 "Bad magic number in .pyc file");
502 return NULL;
503 }
Guido van Rossum82598051997-03-05 00:20:32 +0000504 (void) PyMarshal_ReadLongFromFile(fp);
505 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000506 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000507 if (v == NULL || !PyCode_Check(v)) {
508 Py_XDECREF(v);
509 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000510 "Bad code object in .pyc file");
511 return NULL;
512 }
Guido van Rossum82598051997-03-05 00:20:32 +0000513 co = (PyCodeObject *)v;
514 v = PyEval_EvalCode(co, globals, locals);
515 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000516 return v;
517}
518
Guido van Rossum82598051997-03-05 00:20:32 +0000519PyObject *
520Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000521 char *str;
522 char *filename;
523 int start;
524{
525 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000526 PyCodeObject *co;
527 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000528 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000529 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000530 co = PyNode_Compile(n, filename);
531 PyNode_Free(n);
532 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000533}
534
Guido van Rossuma110aa61994-08-29 12:50:44 +0000535/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000536
Guido van Rossuma110aa61994-08-29 12:50:44 +0000537node *
Guido van Rossum82598051997-03-05 00:20:32 +0000538PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000539 FILE *fp;
540 char *filename;
541 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000542{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000543 node *n;
544 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000545 Py_BEGIN_ALLOW_THREADS
546 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000547 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000548 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000549 if (n == NULL)
550 err_input(&err);
551 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552}
553
Guido van Rossuma110aa61994-08-29 12:50:44 +0000554/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000555
Guido van Rossuma110aa61994-08-29 12:50:44 +0000556node *
Guido van Rossum82598051997-03-05 00:20:32 +0000557PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000558 char *str;
559 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000561 node *n;
562 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000563 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000564 if (n == NULL)
565 err_input(&err);
566 return n;
567}
568
569/* Set the error appropriate to the given input error code (see errcode.h) */
570
571static void
572err_input(err)
573 perrdetail *err;
574{
Guido van Rossum82598051997-03-05 00:20:32 +0000575 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000576 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000577 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000578 err->lineno, err->offset, err->text);
579 if (err->text != NULL) {
580 free(err->text);
581 err->text = NULL;
582 }
583 switch (err->error) {
584 case E_SYNTAX:
585 msg = "invalid syntax";
586 break;
587 case E_TOKEN:
588 msg = "invalid token";
589
590 break;
591 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000592 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000593 return;
594 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000595 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000596 return;
597 case E_EOF:
598 msg = "unexpected EOF while parsing";
599 break;
600 default:
601 fprintf(stderr, "error=%d\n", err->error);
602 msg = "unknown parsing error";
603 break;
604 }
Guido van Rossum82598051997-03-05 00:20:32 +0000605 w = Py_BuildValue("(sO)", msg, v);
606 Py_XDECREF(v);
607 PyErr_SetObject(PyExc_SyntaxError, w);
608 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000609}
610
611/* Print fatal error message and abort */
612
613void
Guido van Rossum82598051997-03-05 00:20:32 +0000614Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000615 char *msg;
616{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000617 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000618#ifdef macintosh
619 for (;;);
620#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000621#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +0000622 OutputDebugString("Fatal Python error:");
623 OutputDebugString(msg);
624 OutputDebugString("\n");
625#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 abort();
627}
628
629/* Clean up and exit */
630
Guido van Rossuma110aa61994-08-29 12:50:44 +0000631#ifdef WITH_THREAD
632#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000633int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000634#endif
635
Guido van Rossum1662dd51994-09-07 14:38:28 +0000636#define NEXITFUNCS 32
637static void (*exitfuncs[NEXITFUNCS])();
638static int nexitfuncs = 0;
639
640int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000641 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000642{
643 if (nexitfuncs >= NEXITFUNCS)
644 return -1;
645 exitfuncs[nexitfuncs++] = func;
646 return 0;
647}
648
Guido van Rossuma110aa61994-08-29 12:50:44 +0000649void
Guido van Rossum82598051997-03-05 00:20:32 +0000650Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000651{
Guido van Rossum82598051997-03-05 00:20:32 +0000652 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000653
654 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000655 PyObject *res;
656 Py_INCREF(exitfunc);
657 PySys_SetObject("exitfunc", (PyObject *)NULL);
658 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000659 if (res == NULL) {
660 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000661 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000662 }
Guido van Rossum82598051997-03-05 00:20:32 +0000663 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000664 }
665
Guido van Rossum82598051997-03-05 00:20:32 +0000666 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000667
668 while (nexitfuncs > 0)
669 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000670}
671
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000672#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000673extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000674#endif
675
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000676void
Guido van Rossum82598051997-03-05 00:20:32 +0000677Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000678 int sts;
679{
Guido van Rossum82598051997-03-05 00:20:32 +0000680 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000681
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000682#ifdef COUNT_ALLOCS
683 dump_counts();
684#endif
685
Guido van Rossuma110aa61994-08-29 12:50:44 +0000686#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000687
688 /* Other threads may still be active, so skip most of the
689 cleanup actions usually done (these are mostly for
690 debugging anyway). */
691
Guido van Rossum82598051997-03-05 00:20:32 +0000692 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000693#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000694 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000695 _exit_prog(sts);
696 else
697 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000698#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000699 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000700 _exit(sts);
701 else
702 exit(sts);
703#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000704
Guido van Rossuma110aa61994-08-29 12:50:44 +0000705#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000706
Guido van Rossum82598051997-03-05 00:20:32 +0000707 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000708
Guido van Rossum82598051997-03-05 00:20:32 +0000709 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000710
Guido van Rossumaae0d321996-05-22 16:35:33 +0000711#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000712 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000713#endif
714
Guido van Rossumaae0d321996-05-22 16:35:33 +0000715#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000716 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000717 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000719#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000720
Jack Jansen66a89771995-10-27 13:22:14 +0000721#ifdef macintosh
722 PyMac_Exit(sts);
723#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000725#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000726#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000727 /*NOTREACHED*/
728}
729
Guido van Rossuma110aa61994-08-29 12:50:44 +0000730#ifdef HAVE_SIGNAL_H
731static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000732sighandler(sig)
733 int sig;
734{
735 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000736 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossum478e7181997-05-06 15:24:59 +0000737#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000738 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739#else
740 exit(1);
741#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000742 /*NOTREACHED*/
743}
744#endif
745
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000746static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000747initsigs()
748{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749 RETSIGTYPE (*t)();
750#ifdef HAVE_SIGNAL_H
751#ifdef SIGPIPE
752 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000753#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000754#ifdef SIGHUP
755 t = signal(SIGHUP, SIG_IGN);
756 if (t == SIG_DFL)
757 signal(SIGHUP, sighandler);
758 else
759 signal(SIGHUP, t);
760#endif
761#ifdef SIGTERM
762 t = signal(SIGTERM, SIG_IGN);
763 if (t == SIG_DFL)
764 signal(SIGTERM, sighandler);
765 else
766 signal(SIGTERM, t);
767#endif
768#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000769 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000770}
771
Guido van Rossumaae0d321996-05-22 16:35:33 +0000772#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000773/* Ask a yes/no question */
774
Guido van Rossum59bff391992-09-03 20:28:00 +0000775int
Guido van Rossum82598051997-03-05 00:20:32 +0000776_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000777 char *prompt;
778{
779 char buf[256];
780
781 printf("%s [ny] ", prompt);
782 if (fgets(buf, sizeof buf, stdin) == NULL)
783 return 0;
784 return buf[0] == 'y' || buf[0] == 'Y';
785}
786#endif
787
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000789
790/* Check for file descriptor connected to interactive device.
791 Pretend that stdin is always interactive, other files never. */
792
793int
794isatty(fd)
795 int fd;
796{
797 return fd == fileno(stdin);
798}
799
800#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000801
802/*
803 * The file descriptor fd is considered ``interactive'' if either
804 * a) isatty(fd) is TRUE, or
805 * b) the -i flag was given, and the filename associated with
806 * the descriptor is NULL or "<stdin>" or "???".
807 */
808int
809Py_FdIsInteractive(fp, filename)
810 FILE *fp;
811 char *filename;
812{
813 if (isatty((int)fileno(fp)))
814 return 1;
815 if (!Py_InteractiveFlag)
816 return 0;
817 return (filename == NULL) ||
818 (strcmp(filename, "<stdin>") == 0) ||
819 (strcmp(filename, "???") == 0);
820}