blob: f5405a38346831e98ca21d5787d5d80ea625221d [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029
30******************************************************************/
31
32/* Python interpreter top-level routines, including init/exit */
33
Guido van Rossum82598051997-03-05 00:20:32 +000034#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
36#include "grammar.h"
37#include "node.h"
38#include "parsetok.h"
Guido van Rossumbefa14f1995-09-18 21:42:42 +000039#undef argument /* Avoid conflict on Mac */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000040#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000042#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000043#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000044
Guido van Rossum80bb9651996-12-05 23:27:02 +000045#ifdef HAVE_UNISTD_H
46#include <unistd.h>
47#endif
48
Guido van Rossuma110aa61994-08-29 12:50:44 +000049#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000050#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000051#endif
52
Guido van Rossum9b38a141996-09-11 23:12:24 +000053#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000054#undef BYTE
Guido van Rossum4f1c59b1996-04-09 02:37:03 +000055#undef arglist
Guido van Rossuma44823b1995-03-14 15:01:17 +000056#include "windows.h"
57#endif
58
Guido van Rossum478e7181997-05-06 15:24:59 +000059#ifdef HAVE_GETPID
60#ifndef MS_WINDOWS
61#define HAVE_KILL
62#endif
63#endif
64
Guido van Rossum82598051997-03-05 00:20:32 +000065extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000066
Guido van Rossum82598051997-03-05 00:20:32 +000067extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000068
Guido van Rossumb73cc041993-11-01 16:28:59 +000069/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000070static void initmain Py_PROTO((void));
71static PyObject *run_err_node Py_PROTO((node *n, char *filename,
72 PyObject *globals, PyObject *locals));
73static PyObject *run_node Py_PROTO((node *n, char *filename,
74 PyObject *globals, PyObject *locals));
75static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
76 PyObject *globals, PyObject *locals));
77static void err_input Py_PROTO((perrdetail *));
78static void initsigs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000079
Guido van Rossum82598051997-03-05 00:20:32 +000080int Py_DebugFlag; /* Needed by parser.c */
81int Py_VerboseFlag; /* Needed by import.c */
82int Py_SuppressPrintingFlag; /* Needed by ceval.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000083int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000084
Guido van Rossuma027efa1997-05-05 20:56:21 +000085/* Initialize the current interpreter; pass in the Python path. */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000086
87void
Guido van Rossuma027efa1997-05-05 20:56:21 +000088Py_Setup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +000089{
Guido van Rossum82598051997-03-05 00:20:32 +000090 PyImport_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000091
Guido van Rossuma110aa61994-08-29 12:50:44 +000092 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093 they are needed by random bits of the interpreter.
94 All other modules are optional and are initialized
95 when they are first imported. */
96
Guido van Rossum82598051997-03-05 00:20:32 +000097 PyBuiltin_Init(); /* Also initializes builtin exceptions */
98 PySys_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099
Guido van Rossum82598051997-03-05 00:20:32 +0000100 PySys_SetPath(Py_GetPath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000101
102 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +0000103
104 initmain();
105}
106
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107/* Create and interpreter and thread state and initialize them;
108 if we already have an interpreter and thread, do nothing.
109 Fatal error if the creation fails. */
110
111void
112Py_Initialize()
113{
114 PyThreadState *tstate;
115 PyInterpreterState *interp;
116 if (PyThreadState_Get())
117 return;
118 interp = PyInterpreterState_New();
119 if (interp == NULL)
120 Py_FatalError("PyInterpreterState_New() failed");
121 tstate = PyThreadState_New(interp);
122 if (tstate == NULL)
123 Py_FatalError("PyThreadState_New() failed");
124 (void) PyThreadState_Swap(tstate);
125
126 Py_Setup();
127
128 PySys_SetPath(Py_GetPath());
129}
130
131/*
132 Py_Initialize()
133 -- do everything, no-op on second call, call fatal on failure, set path
134
135 #2
136 -- create new interp+tstate & make it current, return NULL on failure,
137 make it current, do all setup, set path
138
139 #3
140 -- #2 without set path
141
142 #4
143 -- is there any point to #3 for caller-provided current interp+tstate?
144
145*/
146
Guido van Rossum6135a871995-01-09 17:53:26 +0000147/* Create __main__ module */
148
149static void
150initmain()
151{
Guido van Rossum82598051997-03-05 00:20:32 +0000152 PyObject *m, *d;
153 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000154 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000155 Py_FatalError("can't create __main__ module");
156 d = PyModule_GetDict(m);
157 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
158 if (PyDict_SetItemString(d, "__builtins__",
159 PyEval_GetBuiltins()))
160 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000161 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162}
163
164/* Parse input from a file and execute it */
165
166int
Guido van Rossum82598051997-03-05 00:20:32 +0000167PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168 FILE *fp;
169 char *filename;
170{
171 if (filename == NULL)
172 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000173 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000174 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000175 else
Guido van Rossum82598051997-03-05 00:20:32 +0000176 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177}
178
179int
Guido van Rossum82598051997-03-05 00:20:32 +0000180PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 FILE *fp;
182 char *filename;
183{
Guido van Rossum82598051997-03-05 00:20:32 +0000184 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000186 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000188 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
189 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190 }
Guido van Rossum82598051997-03-05 00:20:32 +0000191 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000193 PySys_SetObject("ps2", v = PyString_FromString("... "));
194 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195 }
196 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000197 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000198#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000199 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200#endif
201 if (ret == E_EOF)
202 return 0;
203 /*
204 if (ret == E_NOMEM)
205 return -1;
206 */
207 }
208}
209
210int
Guido van Rossum82598051997-03-05 00:20:32 +0000211PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212 FILE *fp;
213 char *filename;
214{
Guido van Rossum82598051997-03-05 00:20:32 +0000215 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000216 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000217 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000218 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000219 v = PySys_GetObject("ps1");
220 w = PySys_GetObject("ps2");
221 if (v != NULL && PyString_Check(v)) {
222 Py_INCREF(v);
223 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000224 }
225 else {
226 v = NULL;
227 ps1 = "";
228 }
Guido van Rossum82598051997-03-05 00:20:32 +0000229 if (w != NULL && PyString_Check(w)) {
230 Py_INCREF(w);
231 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000232 }
233 else {
234 w = NULL;
235 ps2 = "";
236 }
Guido van Rossum82598051997-03-05 00:20:32 +0000237 Py_BEGIN_ALLOW_THREADS
238 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000239 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000240 Py_END_ALLOW_THREADS
241 Py_XDECREF(v);
242 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000243 if (n == NULL) {
244 if (err.error == E_EOF) {
245 if (err.text)
246 free(err.text);
247 return E_EOF;
248 }
249 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000250 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000251 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252 }
Guido van Rossum82598051997-03-05 00:20:32 +0000253 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254 if (m == NULL)
255 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000256 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000257 v = run_node(n, filename, d, d);
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_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000269 FILE *fp;
270 char *filename;
271{
Guido van Rossum82598051997-03-05 00:20:32 +0000272 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000273 char *ext;
274
Guido van Rossum82598051997-03-05 00:20:32 +0000275 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276 if (m == NULL)
277 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000278 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000279 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000280 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000281#ifdef macintosh
282 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000283 || getfiletype(filename) == 'PYC '
284 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000285#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000286 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000287 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000288 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000289 if( (fp = fopen(filename, "rb")) == NULL ) {
290 fprintf(stderr, "python: Can't reopen .pyc file\n");
291 return -1;
292 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000293 /* Turn on optimization if a .pyo file is given */
294 if (strcmp(ext, ".pyo") == 0)
295 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000296 v = run_pyc_file(fp, filename, d, d);
297 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000298 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000299 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000301 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302 return -1;
303 }
Guido van Rossum82598051997-03-05 00:20:32 +0000304 Py_DECREF(v);
305 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000306 return 0;
307}
308
309int
Guido van Rossum82598051997-03-05 00:20:32 +0000310PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311 char *command;
312{
Guido van Rossum82598051997-03-05 00:20:32 +0000313 PyObject *m, *d, *v;
314 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315 if (m == NULL)
316 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000317 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000318 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000320 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000321 return -1;
322 }
Guido van Rossum82598051997-03-05 00:20:32 +0000323 Py_DECREF(v);
324 Py_FlushLine();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325 return 0;
326}
327
328void
Guido van Rossum82598051997-03-05 00:20:32 +0000329PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330{
Guido van Rossum82598051997-03-05 00:20:32 +0000331 PyObject *exception, *v, *tb, *f;
332 PyErr_Fetch(&exception, &v, &tb);
333 Py_FlushLine();
Guido van Rossum527c2641995-03-30 11:01:44 +0000334 fflush(stdout);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000335 if (exception == NULL)
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000336 Py_FatalError("PyErr_Print called but no exception");
Guido van Rossum82598051997-03-05 00:20:32 +0000337 if (exception == PyExc_SystemExit) {
338 if (v == NULL || v == Py_None)
339 Py_Exit(0);
340 if (PyInt_Check(v))
341 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000343 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000344 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000346 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347 }
348 }
Guido van Rossum82598051997-03-05 00:20:32 +0000349 PySys_SetObject("last_type", exception);
350 PySys_SetObject("last_value", v);
351 PySys_SetObject("last_traceback", tb);
352 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000353 if (f == NULL)
354 fprintf(stderr, "lost sys.stderr\n");
355 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000356 PyTraceBack_Print(tb, f);
357 if (exception == PyExc_SyntaxError) {
358 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000359 char *filename, *text;
360 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000361 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000362 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000363 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000364 else {
365 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000366 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000367 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000368 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000369 else
Guido van Rossum82598051997-03-05 00:20:32 +0000370 PyFile_WriteString(filename, f);
371 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000372 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000373 PyFile_WriteString(buf, f);
374 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000375 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000376 char *nl;
377 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000378 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000379 offset--;
380 for (;;) {
381 nl = strchr(text, '\n');
382 if (nl == NULL ||
383 nl-text >= offset)
384 break;
385 offset -= (nl+1-text);
386 text = nl+1;
387 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000388 while (*text == ' ' || *text == '\t') {
389 text++;
390 offset--;
391 }
Guido van Rossum82598051997-03-05 00:20:32 +0000392 PyFile_WriteString(" ", f);
393 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000394 if (*text == '\0' ||
395 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000396 PyFile_WriteString("\n", f);
397 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000398 offset--;
399 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000400 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000401 offset--;
402 }
Guido van Rossum82598051997-03-05 00:20:32 +0000403 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000404 }
Guido van Rossum82598051997-03-05 00:20:32 +0000405 Py_INCREF(message);
406 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000407 v = message;
408 }
409 }
Guido van Rossum82598051997-03-05 00:20:32 +0000410 if (PyClass_Check(exception)) {
411 PyObject* className =
412 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000413 if (className == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000414 PyFile_WriteString("<unknown>", f);
Guido van Rossum262e1241995-02-07 15:30:45 +0000415 else {
Guido van Rossum82598051997-03-05 00:20:32 +0000416 if (PyFile_WriteObject(className, f,
417 Py_PRINT_RAW) != 0)
418 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000419 }
420 } else {
Guido van Rossum82598051997-03-05 00:20:32 +0000421 if (PyFile_WriteObject(exception, f,
422 Py_PRINT_RAW) != 0)
423 PyErr_Clear();
Guido van Rossum262e1241995-02-07 15:30:45 +0000424 }
Guido van Rossum82598051997-03-05 00:20:32 +0000425 if (v != NULL && v != Py_None) {
426 PyFile_WriteString(": ", f);
427 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
428 PyErr_Clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000429 }
Guido van Rossum82598051997-03-05 00:20:32 +0000430 PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000431 }
Guido van Rossum82598051997-03-05 00:20:32 +0000432 Py_XDECREF(exception);
433 Py_XDECREF(v);
434 Py_XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000435}
436
Guido van Rossum82598051997-03-05 00:20:32 +0000437PyObject *
438PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439 char *str;
440 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000441 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000442{
Guido van Rossum82598051997-03-05 00:20:32 +0000443 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000444 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000445}
446
Guido van Rossum82598051997-03-05 00:20:32 +0000447PyObject *
448PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000449 FILE *fp;
450 char *filename;
451 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000452 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453{
Guido van Rossum82598051997-03-05 00:20:32 +0000454 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000455 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456}
457
Guido van Rossum82598051997-03-05 00:20:32 +0000458static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000459run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 node *n;
461 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000462 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000463{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000464 if (n == NULL)
465 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000466 return run_node(n, filename, globals, locals);
467}
468
Guido van Rossum82598051997-03-05 00:20:32 +0000469static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470run_node(n, filename, globals, locals)
471 node *n;
472 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000473 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000474{
Guido van Rossum82598051997-03-05 00:20:32 +0000475 PyCodeObject *co;
476 PyObject *v;
477 co = PyNode_Compile(n, filename);
478 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000479 if (co == NULL)
480 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000481 v = PyEval_EvalCode(co, globals, locals);
482 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000483 return v;
484}
485
Guido van Rossum82598051997-03-05 00:20:32 +0000486static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000487run_pyc_file(fp, filename, globals, locals)
488 FILE *fp;
489 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000490 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000491{
Guido van Rossum82598051997-03-05 00:20:32 +0000492 PyCodeObject *co;
493 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000494 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000495 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000496
Guido van Rossum82598051997-03-05 00:20:32 +0000497 magic = PyMarshal_ReadLongFromFile(fp);
498 if (magic != PyImport_GetMagicNumber()) {
499 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000500 "Bad magic number in .pyc file");
501 return NULL;
502 }
Guido van Rossum82598051997-03-05 00:20:32 +0000503 (void) PyMarshal_ReadLongFromFile(fp);
504 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000505 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000506 if (v == NULL || !PyCode_Check(v)) {
507 Py_XDECREF(v);
508 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000509 "Bad code object in .pyc file");
510 return NULL;
511 }
Guido van Rossum82598051997-03-05 00:20:32 +0000512 co = (PyCodeObject *)v;
513 v = PyEval_EvalCode(co, globals, locals);
514 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000515 return v;
516}
517
Guido van Rossum82598051997-03-05 00:20:32 +0000518PyObject *
519Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000520 char *str;
521 char *filename;
522 int start;
523{
524 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000525 PyCodeObject *co;
526 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000527 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000528 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000529 co = PyNode_Compile(n, filename);
530 PyNode_Free(n);
531 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000532}
533
Guido van Rossuma110aa61994-08-29 12:50:44 +0000534/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535
Guido van Rossuma110aa61994-08-29 12:50:44 +0000536node *
Guido van Rossum82598051997-03-05 00:20:32 +0000537PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000538 FILE *fp;
539 char *filename;
540 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000542 node *n;
543 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000544 Py_BEGIN_ALLOW_THREADS
545 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000546 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000547 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000548 if (n == NULL)
549 err_input(&err);
550 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000551}
552
Guido van Rossuma110aa61994-08-29 12:50:44 +0000553/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000554
Guido van Rossuma110aa61994-08-29 12:50:44 +0000555node *
Guido van Rossum82598051997-03-05 00:20:32 +0000556PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000557 char *str;
558 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000559{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000560 node *n;
561 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000562 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000563 if (n == NULL)
564 err_input(&err);
565 return n;
566}
567
568/* Set the error appropriate to the given input error code (see errcode.h) */
569
570static void
571err_input(err)
572 perrdetail *err;
573{
Guido van Rossum82598051997-03-05 00:20:32 +0000574 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000575 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000576 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000577 err->lineno, err->offset, err->text);
578 if (err->text != NULL) {
579 free(err->text);
580 err->text = NULL;
581 }
582 switch (err->error) {
583 case E_SYNTAX:
584 msg = "invalid syntax";
585 break;
586 case E_TOKEN:
587 msg = "invalid token";
588
589 break;
590 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000591 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000592 return;
593 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000594 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000595 return;
596 case E_EOF:
597 msg = "unexpected EOF while parsing";
598 break;
599 default:
600 fprintf(stderr, "error=%d\n", err->error);
601 msg = "unknown parsing error";
602 break;
603 }
Guido van Rossum82598051997-03-05 00:20:32 +0000604 w = Py_BuildValue("(sO)", msg, v);
605 Py_XDECREF(v);
606 PyErr_SetObject(PyExc_SyntaxError, w);
607 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000608}
609
610/* Print fatal error message and abort */
611
612void
Guido van Rossum82598051997-03-05 00:20:32 +0000613Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000614 char *msg;
615{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000616 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000617#ifdef macintosh
618 for (;;);
619#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000620#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000621 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000622 OutputDebugString(msg);
623 OutputDebugString("\n");
624#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625 abort();
626}
627
628/* Clean up and exit */
629
Guido van Rossuma110aa61994-08-29 12:50:44 +0000630#ifdef WITH_THREAD
631#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000632int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000633#endif
634
Guido van Rossum1662dd51994-09-07 14:38:28 +0000635#define NEXITFUNCS 32
636static void (*exitfuncs[NEXITFUNCS])();
637static int nexitfuncs = 0;
638
639int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000640 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000641{
642 if (nexitfuncs >= NEXITFUNCS)
643 return -1;
644 exitfuncs[nexitfuncs++] = func;
645 return 0;
646}
647
Guido van Rossuma110aa61994-08-29 12:50:44 +0000648void
Guido van Rossum82598051997-03-05 00:20:32 +0000649Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650{
Guido van Rossum82598051997-03-05 00:20:32 +0000651 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000652
653 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000654 PyObject *res;
655 Py_INCREF(exitfunc);
656 PySys_SetObject("exitfunc", (PyObject *)NULL);
657 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000658 if (res == NULL) {
659 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000660 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000661 }
Guido van Rossum82598051997-03-05 00:20:32 +0000662 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000663 }
664
Guido van Rossum82598051997-03-05 00:20:32 +0000665 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000666
667 while (nexitfuncs > 0)
668 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000669}
670
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000671#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000672extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000673#endif
674
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000675void
Guido van Rossum82598051997-03-05 00:20:32 +0000676Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000677 int sts;
678{
Guido van Rossum82598051997-03-05 00:20:32 +0000679 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000680
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000681#ifdef COUNT_ALLOCS
682 dump_counts();
683#endif
684
Guido van Rossuma110aa61994-08-29 12:50:44 +0000685#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000686
687 /* Other threads may still be active, so skip most of the
688 cleanup actions usually done (these are mostly for
689 debugging anyway). */
690
Guido van Rossum82598051997-03-05 00:20:32 +0000691 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000692#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000693 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000694 _exit_prog(sts);
695 else
696 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000697#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000698 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000699 _exit(sts);
700 else
701 exit(sts);
702#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000703
Guido van Rossuma110aa61994-08-29 12:50:44 +0000704#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705
Guido van Rossum82598051997-03-05 00:20:32 +0000706 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707
Guido van Rossum82598051997-03-05 00:20:32 +0000708 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000709
Guido van Rossumaae0d321996-05-22 16:35:33 +0000710#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000711 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000712#endif
713
Guido van Rossumaae0d321996-05-22 16:35:33 +0000714#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000715 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000716 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000717 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000718#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719
Jack Jansen66a89771995-10-27 13:22:14 +0000720#ifdef macintosh
721 PyMac_Exit(sts);
722#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000723 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000724#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000725#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000726 /*NOTREACHED*/
727}
728
Guido van Rossuma110aa61994-08-29 12:50:44 +0000729#ifdef HAVE_SIGNAL_H
730static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000731sighandler(sig)
732 int sig;
733{
734 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000735 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossum478e7181997-05-06 15:24:59 +0000736#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000737 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000738#else
739 exit(1);
740#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000741 /*NOTREACHED*/
742}
743#endif
744
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000745static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000746initsigs()
747{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000748 RETSIGTYPE (*t)();
749#ifdef HAVE_SIGNAL_H
750#ifdef SIGPIPE
751 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000752#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000753#ifdef SIGHUP
754 t = signal(SIGHUP, SIG_IGN);
755 if (t == SIG_DFL)
756 signal(SIGHUP, sighandler);
757 else
758 signal(SIGHUP, t);
759#endif
760#ifdef SIGTERM
761 t = signal(SIGTERM, SIG_IGN);
762 if (t == SIG_DFL)
763 signal(SIGTERM, sighandler);
764 else
765 signal(SIGTERM, t);
766#endif
767#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000768 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000769}
770
Guido van Rossumaae0d321996-05-22 16:35:33 +0000771#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000772/* Ask a yes/no question */
773
Guido van Rossum59bff391992-09-03 20:28:00 +0000774int
Guido van Rossum82598051997-03-05 00:20:32 +0000775_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000776 char *prompt;
777{
778 char buf[256];
779
780 printf("%s [ny] ", prompt);
781 if (fgets(buf, sizeof buf, stdin) == NULL)
782 return 0;
783 return buf[0] == 'y' || buf[0] == 'Y';
784}
785#endif
786
Guido van Rossuma110aa61994-08-29 12:50:44 +0000787#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000788
789/* Check for file descriptor connected to interactive device.
790 Pretend that stdin is always interactive, other files never. */
791
792int
793isatty(fd)
794 int fd;
795{
796 return fd == fileno(stdin);
797}
798
799#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000800
801/*
802 * The file descriptor fd is considered ``interactive'' if either
803 * a) isatty(fd) is TRUE, or
804 * b) the -i flag was given, and the filename associated with
805 * the descriptor is NULL or "<stdin>" or "???".
806 */
807int
808Py_FdIsInteractive(fp, filename)
809 FILE *fp;
810 char *filename;
811{
812 if (isatty((int)fileno(fp)))
813 return 1;
814 if (!Py_InteractiveFlag)
815 return 0;
816 return (filename == NULL) ||
817 (strcmp(filename, "<stdin>") == 0) ||
818 (strcmp(filename, "???") == 0);
819}