blob: fdfb8c66995ef9999f8f99bb8953fdc1015b910b [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 Rossum82598051997-03-05 00:20:32 +000059extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060
Guido van Rossum82598051997-03-05 00:20:32 +000061extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000062
Guido van Rossumb73cc041993-11-01 16:28:59 +000063/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000064static void initmain Py_PROTO((void));
65static PyObject *run_err_node Py_PROTO((node *n, char *filename,
66 PyObject *globals, PyObject *locals));
67static PyObject *run_node Py_PROTO((node *n, char *filename,
68 PyObject *globals, PyObject *locals));
69static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
70 PyObject *globals, PyObject *locals));
71static void err_input Py_PROTO((perrdetail *));
72static void initsigs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000073
Guido van Rossum82598051997-03-05 00:20:32 +000074int Py_DebugFlag; /* Needed by parser.c */
75int Py_VerboseFlag; /* Needed by import.c */
76int Py_SuppressPrintingFlag; /* Needed by ceval.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000077int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
Guido van Rossuma027efa1997-05-05 20:56:21 +000079/* Initialize the current interpreter; pass in the Python path. */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000080
81void
Guido van Rossuma027efa1997-05-05 20:56:21 +000082Py_Setup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +000083{
Guido van Rossum82598051997-03-05 00:20:32 +000084 PyImport_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000085
Guido van Rossuma110aa61994-08-29 12:50:44 +000086 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087 they are needed by random bits of the interpreter.
88 All other modules are optional and are initialized
89 when they are first imported. */
90
Guido van Rossum82598051997-03-05 00:20:32 +000091 PyBuiltin_Init(); /* Also initializes builtin exceptions */
92 PySys_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093
Guido van Rossum82598051997-03-05 00:20:32 +000094 PySys_SetPath(Py_GetPath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000095
96 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +000097
98 initmain();
99}
100
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101/* Create and interpreter and thread state and initialize them;
102 if we already have an interpreter and thread, do nothing.
103 Fatal error if the creation fails. */
104
105void
106Py_Initialize()
107{
108 PyThreadState *tstate;
109 PyInterpreterState *interp;
110 if (PyThreadState_Get())
111 return;
112 interp = PyInterpreterState_New();
113 if (interp == NULL)
114 Py_FatalError("PyInterpreterState_New() failed");
115 tstate = PyThreadState_New(interp);
116 if (tstate == NULL)
117 Py_FatalError("PyThreadState_New() failed");
118 (void) PyThreadState_Swap(tstate);
119
120 Py_Setup();
121
122 PySys_SetPath(Py_GetPath());
123}
124
125/*
126 Py_Initialize()
127 -- do everything, no-op on second call, call fatal on failure, set path
128
129 #2
130 -- create new interp+tstate & make it current, return NULL on failure,
131 make it current, do all setup, set path
132
133 #3
134 -- #2 without set path
135
136 #4
137 -- is there any point to #3 for caller-provided current interp+tstate?
138
139*/
140
Guido van Rossum6135a871995-01-09 17:53:26 +0000141/* Create __main__ module */
142
143static void
144initmain()
145{
Guido van Rossum82598051997-03-05 00:20:32 +0000146 PyObject *m, *d;
147 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000148 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000149 Py_FatalError("can't create __main__ module");
150 d = PyModule_GetDict(m);
151 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
152 if (PyDict_SetItemString(d, "__builtins__",
153 PyEval_GetBuiltins()))
154 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000155 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156}
157
158/* Parse input from a file and execute it */
159
160int
Guido van Rossum82598051997-03-05 00:20:32 +0000161PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162 FILE *fp;
163 char *filename;
164{
165 if (filename == NULL)
166 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000167 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000168 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169 else
Guido van Rossum82598051997-03-05 00:20:32 +0000170 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171}
172
173int
Guido van Rossum82598051997-03-05 00:20:32 +0000174PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000175 FILE *fp;
176 char *filename;
177{
Guido van Rossum82598051997-03-05 00:20:32 +0000178 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000180 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000182 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
183 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000184 }
Guido van Rossum82598051997-03-05 00:20:32 +0000185 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000187 PySys_SetObject("ps2", v = PyString_FromString("... "));
188 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189 }
190 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000191 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000192#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000193 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194#endif
195 if (ret == E_EOF)
196 return 0;
197 /*
198 if (ret == E_NOMEM)
199 return -1;
200 */
201 }
202}
203
204int
Guido van Rossum82598051997-03-05 00:20:32 +0000205PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206 FILE *fp;
207 char *filename;
208{
Guido van Rossum82598051997-03-05 00:20:32 +0000209 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000210 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000211 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000213 v = PySys_GetObject("ps1");
214 w = PySys_GetObject("ps2");
215 if (v != NULL && PyString_Check(v)) {
216 Py_INCREF(v);
217 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000218 }
219 else {
220 v = NULL;
221 ps1 = "";
222 }
Guido van Rossum82598051997-03-05 00:20:32 +0000223 if (w != NULL && PyString_Check(w)) {
224 Py_INCREF(w);
225 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000226 }
227 else {
228 w = NULL;
229 ps2 = "";
230 }
Guido van Rossum82598051997-03-05 00:20:32 +0000231 Py_BEGIN_ALLOW_THREADS
232 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000233 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000234 Py_END_ALLOW_THREADS
235 Py_XDECREF(v);
236 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000237 if (n == NULL) {
238 if (err.error == E_EOF) {
239 if (err.text)
240 free(err.text);
241 return E_EOF;
242 }
243 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000244 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000245 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000246 }
Guido van Rossum82598051997-03-05 00:20:32 +0000247 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000248 if (m == NULL)
249 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000250 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000252 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000253 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254 return -1;
255 }
Guido van Rossum82598051997-03-05 00:20:32 +0000256 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000257 if (Py_FlushLine())
258 PyErr_Clear();
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 Rossumb05a5c71997-05-07 17:46:13 +0000293 v = PyRun_File(fp, filename, Py_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);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000300 if (Py_FlushLine())
301 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302 return 0;
303}
304
305int
Guido van Rossum82598051997-03-05 00:20:32 +0000306PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307 char *command;
308{
Guido van Rossum82598051997-03-05 00:20:32 +0000309 PyObject *m, *d, *v;
310 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311 if (m == NULL)
312 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000313 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000314 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000316 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317 return -1;
318 }
Guido van Rossum82598051997-03-05 00:20:32 +0000319 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000320 if (Py_FlushLine())
321 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322 return 0;
323}
324
325void
Guido van Rossum82598051997-03-05 00:20:32 +0000326PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000328 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000329 PyObject *exception, *v, *tb, *f;
330 PyErr_Fetch(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000331 if (exception == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000332 return 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000333 if (exception == PyExc_SystemExit) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000334 err = Py_FlushLine();
335 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000336 if (v == NULL || v == Py_None)
337 Py_Exit(0);
338 if (PyInt_Check(v))
339 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000341 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000342 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000344 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345 }
346 }
Guido van Rossum82598051997-03-05 00:20:32 +0000347 PySys_SetObject("last_type", exception);
348 PySys_SetObject("last_value", v);
349 PySys_SetObject("last_traceback", tb);
350 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000351 if (f == NULL)
352 fprintf(stderr, "lost sys.stderr\n");
353 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000354 err = Py_FlushLine();
355 fflush(stdout);
356 if (err == 0)
357 err = PyTraceBack_Print(tb, f);
358 if (err == 0 && exception == PyExc_SyntaxError) {
Guido van Rossum82598051997-03-05 00:20:32 +0000359 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;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000409 /* Can't be bothered to check all those
410 PyFile_WriteString() calls */
411 if (PyErr_Occurred())
412 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000413 }
414 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000415 if (err) {
416 /* Don't do anything else */
417 }
418 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000419 PyObject* className =
420 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000421 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000422 err = PyFile_WriteString("<unknown>", f);
423 else
424 err = PyFile_WriteObject(className, f,
425 Py_PRINT_RAW);
426 }
427 else
428 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
429 if (err == 0) {
430 if (v != NULL && v != Py_None) {
431 err = PyFile_WriteString(": ", f);
432 if (err == 0)
433 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000434 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000435 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000436 if (err == 0)
437 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000438 }
Guido van Rossum82598051997-03-05 00:20:32 +0000439 Py_XDECREF(exception);
440 Py_XDECREF(v);
441 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000442 /* If an error happened here, don't show it.
443 XXX This is wrong, but too many callers rely on this behavior. */
444 if (err != 0)
445 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446}
447
Guido van Rossum82598051997-03-05 00:20:32 +0000448PyObject *
449PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000450 char *str;
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_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000455 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456}
457
Guido van Rossum82598051997-03-05 00:20:32 +0000458PyObject *
459PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000460 FILE *fp;
461 char *filename;
462 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000463 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464{
Guido van Rossum82598051997-03-05 00:20:32 +0000465 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000466 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000467}
468
Guido van Rossum82598051997-03-05 00:20:32 +0000469static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000470run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 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 Rossuma110aa61994-08-29 12:50:44 +0000475 if (n == NULL)
476 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000477 return run_node(n, filename, globals, locals);
478}
479
Guido van Rossum82598051997-03-05 00:20:32 +0000480static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481run_node(n, filename, globals, locals)
482 node *n;
483 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000484 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000485{
Guido van Rossum82598051997-03-05 00:20:32 +0000486 PyCodeObject *co;
487 PyObject *v;
488 co = PyNode_Compile(n, filename);
489 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000490 if (co == NULL)
491 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000492 v = PyEval_EvalCode(co, globals, locals);
493 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 return v;
495}
496
Guido van Rossum82598051997-03-05 00:20:32 +0000497static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000498run_pyc_file(fp, filename, globals, locals)
499 FILE *fp;
500 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000501 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000502{
Guido van Rossum82598051997-03-05 00:20:32 +0000503 PyCodeObject *co;
504 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000505 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000506 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000507
Guido van Rossum82598051997-03-05 00:20:32 +0000508 magic = PyMarshal_ReadLongFromFile(fp);
509 if (magic != PyImport_GetMagicNumber()) {
510 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000511 "Bad magic number in .pyc file");
512 return NULL;
513 }
Guido van Rossum82598051997-03-05 00:20:32 +0000514 (void) PyMarshal_ReadLongFromFile(fp);
515 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000516 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000517 if (v == NULL || !PyCode_Check(v)) {
518 Py_XDECREF(v);
519 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000520 "Bad code object in .pyc file");
521 return NULL;
522 }
Guido van Rossum82598051997-03-05 00:20:32 +0000523 co = (PyCodeObject *)v;
524 v = PyEval_EvalCode(co, globals, locals);
525 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000526 return v;
527}
528
Guido van Rossum82598051997-03-05 00:20:32 +0000529PyObject *
530Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000531 char *str;
532 char *filename;
533 int start;
534{
535 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000536 PyCodeObject *co;
537 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000538 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000539 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000540 co = PyNode_Compile(n, filename);
541 PyNode_Free(n);
542 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000543}
544
Guido van Rossuma110aa61994-08-29 12:50:44 +0000545/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000546
Guido van Rossuma110aa61994-08-29 12:50:44 +0000547node *
Guido van Rossum82598051997-03-05 00:20:32 +0000548PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000549 FILE *fp;
550 char *filename;
551 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000552{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000553 node *n;
554 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000555 Py_BEGIN_ALLOW_THREADS
556 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000557 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000558 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000559 if (n == NULL)
560 err_input(&err);
561 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000562}
563
Guido van Rossuma110aa61994-08-29 12:50:44 +0000564/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000565
Guido van Rossuma110aa61994-08-29 12:50:44 +0000566node *
Guido van Rossum82598051997-03-05 00:20:32 +0000567PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000568 char *str;
569 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000570{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000571 node *n;
572 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000573 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000574 if (n == NULL)
575 err_input(&err);
576 return n;
577}
578
579/* Set the error appropriate to the given input error code (see errcode.h) */
580
581static void
582err_input(err)
583 perrdetail *err;
584{
Guido van Rossum82598051997-03-05 00:20:32 +0000585 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000586 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000587 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000588 err->lineno, err->offset, err->text);
589 if (err->text != NULL) {
590 free(err->text);
591 err->text = NULL;
592 }
593 switch (err->error) {
594 case E_SYNTAX:
595 msg = "invalid syntax";
596 break;
597 case E_TOKEN:
598 msg = "invalid token";
599
600 break;
601 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000602 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000603 return;
604 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000605 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000606 return;
607 case E_EOF:
608 msg = "unexpected EOF while parsing";
609 break;
610 default:
611 fprintf(stderr, "error=%d\n", err->error);
612 msg = "unknown parsing error";
613 break;
614 }
Guido van Rossum82598051997-03-05 00:20:32 +0000615 w = Py_BuildValue("(sO)", msg, v);
616 Py_XDECREF(v);
617 PyErr_SetObject(PyExc_SyntaxError, w);
618 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619}
620
621/* Print fatal error message and abort */
622
623void
Guido van Rossum82598051997-03-05 00:20:32 +0000624Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625 char *msg;
626{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000627 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000628#ifdef macintosh
629 for (;;);
630#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000631#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000632 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000633 OutputDebugString(msg);
634 OutputDebugString("\n");
635#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636 abort();
637}
638
639/* Clean up and exit */
640
Guido van Rossuma110aa61994-08-29 12:50:44 +0000641#ifdef WITH_THREAD
642#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000643int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000644#endif
645
Guido van Rossum1662dd51994-09-07 14:38:28 +0000646#define NEXITFUNCS 32
647static void (*exitfuncs[NEXITFUNCS])();
648static int nexitfuncs = 0;
649
650int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000651 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000652{
653 if (nexitfuncs >= NEXITFUNCS)
654 return -1;
655 exitfuncs[nexitfuncs++] = func;
656 return 0;
657}
658
Guido van Rossuma110aa61994-08-29 12:50:44 +0000659void
Guido van Rossum82598051997-03-05 00:20:32 +0000660Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661{
Guido van Rossum82598051997-03-05 00:20:32 +0000662 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000663
664 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000665 PyObject *res;
666 Py_INCREF(exitfunc);
667 PySys_SetObject("exitfunc", (PyObject *)NULL);
668 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000669 if (res == NULL) {
670 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000671 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000672 }
Guido van Rossum82598051997-03-05 00:20:32 +0000673 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000674 }
675
Guido van Rossum82598051997-03-05 00:20:32 +0000676 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000677
678 while (nexitfuncs > 0)
679 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000680}
681
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000682#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000683extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000684#endif
685
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000686void
Guido van Rossum82598051997-03-05 00:20:32 +0000687Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000688 int sts;
689{
Guido van Rossum82598051997-03-05 00:20:32 +0000690 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000691
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000692#ifdef COUNT_ALLOCS
693 dump_counts();
694#endif
695
Guido van Rossuma110aa61994-08-29 12:50:44 +0000696#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000697
698 /* Other threads may still be active, so skip most of the
699 cleanup actions usually done (these are mostly for
700 debugging anyway). */
701
Guido van Rossum82598051997-03-05 00:20:32 +0000702 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000703#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000704 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000705 _exit_prog(sts);
706 else
707 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000708#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000709 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000710 _exit(sts);
711 else
712 exit(sts);
713#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000714
Guido van Rossuma110aa61994-08-29 12:50:44 +0000715#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000716
Guido van Rossum82598051997-03-05 00:20:32 +0000717 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000718
Guido van Rossum82598051997-03-05 00:20:32 +0000719 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000720
Guido van Rossumaae0d321996-05-22 16:35:33 +0000721#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000722 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000723#endif
724
Guido van Rossumaae0d321996-05-22 16:35:33 +0000725#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000726 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000727 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000728 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000729#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000730
Jack Jansen66a89771995-10-27 13:22:14 +0000731#ifdef macintosh
732 PyMac_Exit(sts);
733#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000734 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000735#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000736#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000737 /*NOTREACHED*/
738}
739
Guido van Rossuma110aa61994-08-29 12:50:44 +0000740#ifdef HAVE_SIGNAL_H
741static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000742sighandler(sig)
743 int sig;
744{
745 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000746 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossum478e7181997-05-06 15:24:59 +0000747#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000748 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749#else
750 exit(1);
751#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000752 /*NOTREACHED*/
753}
754#endif
755
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000756static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000757initsigs()
758{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 RETSIGTYPE (*t)();
760#ifdef HAVE_SIGNAL_H
761#ifdef SIGPIPE
762 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000763#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764#ifdef SIGHUP
765 t = signal(SIGHUP, SIG_IGN);
766 if (t == SIG_DFL)
767 signal(SIGHUP, sighandler);
768 else
769 signal(SIGHUP, t);
770#endif
771#ifdef SIGTERM
772 t = signal(SIGTERM, SIG_IGN);
773 if (t == SIG_DFL)
774 signal(SIGTERM, sighandler);
775 else
776 signal(SIGTERM, t);
777#endif
778#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000779 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000780}
781
Guido van Rossumaae0d321996-05-22 16:35:33 +0000782#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000783/* Ask a yes/no question */
784
Guido van Rossum59bff391992-09-03 20:28:00 +0000785int
Guido van Rossum82598051997-03-05 00:20:32 +0000786_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000787 char *prompt;
788{
789 char buf[256];
790
791 printf("%s [ny] ", prompt);
792 if (fgets(buf, sizeof buf, stdin) == NULL)
793 return 0;
794 return buf[0] == 'y' || buf[0] == 'Y';
795}
796#endif
797
Guido van Rossuma110aa61994-08-29 12:50:44 +0000798#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000799
800/* Check for file descriptor connected to interactive device.
801 Pretend that stdin is always interactive, other files never. */
802
803int
804isatty(fd)
805 int fd;
806{
807 return fd == fileno(stdin);
808}
809
810#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000811
812/*
813 * The file descriptor fd is considered ``interactive'' if either
814 * a) isatty(fd) is TRUE, or
815 * b) the -i flag was given, and the filename associated with
816 * the descriptor is NULL or "<stdin>" or "???".
817 */
818int
819Py_FdIsInteractive(fp, filename)
820 FILE *fp;
821 char *filename;
822{
823 if (isatty((int)fileno(fp)))
824 return 1;
825 if (!Py_InteractiveFlag)
826 return 0;
827 return (filename == NULL) ||
828 (strcmp(filename, "<stdin>") == 0) ||
829 (strcmp(filename, "???") == 0);
830}